From bf036cbb8898a0c0725ff579be5a5ed029cd4b0a Mon Sep 17 00:00:00 2001 From: Russ Date: Sun, 5 Jan 2020 17:48:43 -0500 Subject: [PATCH 001/914] fix ipv6 resolver setup for nginx (#246) --- rootfs/etc/services.d/nginx/run | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rootfs/etc/services.d/nginx/run b/rootfs/etc/services.d/nginx/run index f6b59fd66..a72046b92 100755 --- a/rootfs/etc/services.d/nginx/run +++ b/rootfs/etc/services.d/nginx/run @@ -21,8 +21,8 @@ mkdir -p /tmp/nginx/body \ touch /var/log/nginx/error.log && chmod 777 /var/log/nginx/error.log && chmod -R 777 /var/cache/nginx chown root /tmp/nginx -# Dynamically generate resolvers file -echo resolver $(awk 'BEGIN{ORS=" "} $1=="nameserver" {print $2}' /etc/resolv.conf) ";" > /etc/nginx/conf.d/include/resolvers.conf +# Dynamically generate resolvers file, if resolver is IPv6, enclose in `[]` +echo resolver $(awk 'BEGIN{ORS=" "} $1=="nameserver" {print ($2 ~ ":")? "["$2"]": $2}' /etc/resolv.conf) ";" > /etc/nginx/conf.d/include/resolvers.conf # Generate dummy self-signed certificate. if [ ! -f /data/nginx/dummycert.pem ] || [ ! -f /data/nginx/dummykey.pem ] From bb0f4bfa626bfa30e3ad2fa31b5d759c9de98559 Mon Sep 17 00:00:00 2001 From: jc21 Date: Wed, 19 Feb 2020 15:55:06 +1100 Subject: [PATCH 002/914] v2.1.0 (#293) * Fix wrapping when too many hosts are shown (#207) * Update npm packages, fixes CVE-2019-10757 * Revert some breaking packages * Major overhaul - Docker buildx support in CI - Cypress API Testing in CI - Restructured folder layout (insert clean face meme) - Added Swagger documentation and validate API against that (to be completed) - Use common base image for all supported archs, which includes updated nginx with ipv6 support - Updated certbot and changes required for it - Large amount of Hosts names will wrap in UI - Updated packages for frontend - Version bump 2.1.0 * Updated documentation * Fix JWT expire time going crazy. Now set to 1day * Backend JS formatting rules * Remove v1 importer, I doubt anyone is using v1 anymore * Added backend formatting rules and enforce them in Jenkins builds * Fix CI, doesn't need a tty * Thanks bcrypt. Why can't you just be normal. * Cleanup after syntax check Co-authored-by: Marcelo Castagna --- .babelrc | 12 - .gitignore | 11 +- .jenkins/config.json | 10 + .version | 1 + Dockerfile | 39 - Dockerfile.arm64 | 38 - Dockerfile.armv6l | 38 - Dockerfile.armv7l | 38 - Jenkinsfile | 515 +- README.md | 6 +- backend/.eslintrc.json | 73 + backend/.gitignore | 6 + backend/.prettierrc | 11 + backend/app.js | 90 + {config => backend/config}/README.md | 0 {config => backend/config}/default.json | 0 backend/db.js | 25 + backend/doc/api.swagger.json | 1254 +++ backend/index.js | 47 + backend/internal/access-list.js | 482 ++ backend/internal/audit-log.js | 78 + backend/internal/certificate.js | 926 +++ backend/internal/dead-host.js | 461 ++ backend/internal/host.js | 235 + backend/internal/ip_ranges.js | 147 + backend/internal/nginx.js | 402 + backend/internal/proxy-host.js | 462 ++ backend/internal/redirection-host.js | 461 ++ backend/internal/report.js | 38 + backend/internal/setting.js | 133 + backend/internal/stream.js | 348 + backend/internal/token.js | 162 + backend/internal/user.js | 518 ++ backend/knexfile.js | 19 + backend/lib/access.js | 314 + backend/lib/access/access_lists-create.json | 23 + backend/lib/access/access_lists-delete.json | 23 + backend/lib/access/access_lists-get.json | 23 + backend/lib/access/access_lists-list.json | 23 + backend/lib/access/access_lists-update.json | 23 + backend/lib/access/auditlog-list.json | 7 + backend/lib/access/certificates-create.json | 23 + backend/lib/access/certificates-delete.json | 23 + backend/lib/access/certificates-get.json | 23 + backend/lib/access/certificates-list.json | 23 + backend/lib/access/certificates-update.json | 23 + backend/lib/access/dead_hosts-create.json | 23 + backend/lib/access/dead_hosts-delete.json | 23 + backend/lib/access/dead_hosts-get.json | 23 + backend/lib/access/dead_hosts-list.json | 23 + backend/lib/access/dead_hosts-update.json | 23 + backend/lib/access/permissions.json | 14 + backend/lib/access/proxy_hosts-create.json | 23 + backend/lib/access/proxy_hosts-delete.json | 23 + backend/lib/access/proxy_hosts-get.json | 23 + backend/lib/access/proxy_hosts-list.json | 23 + backend/lib/access/proxy_hosts-update.json | 23 + .../lib/access/redirection_hosts-create.json | 23 + .../lib/access/redirection_hosts-delete.json | 23 + backend/lib/access/redirection_hosts-get.json | 23 + .../lib/access/redirection_hosts-list.json | 23 + .../lib/access/redirection_hosts-update.json | 23 + backend/lib/access/reports-hosts.json | 7 + backend/lib/access/roles.json | 39 + backend/lib/access/settings-get.json | 7 + backend/lib/access/settings-list.json | 7 + backend/lib/access/settings-update.json | 7 + backend/lib/access/streams-create.json | 23 + backend/lib/access/streams-delete.json | 23 + backend/lib/access/streams-get.json | 23 + backend/lib/access/streams-list.json | 23 + backend/lib/access/streams-update.json | 23 + backend/lib/access/users-create.json | 7 + backend/lib/access/users-delete.json | 7 + backend/lib/access/users-get.json | 23 + backend/lib/access/users-list.json | 7 + backend/lib/access/users-loginas.json | 7 + backend/lib/access/users-password.json | 23 + backend/lib/access/users-permissions.json | 7 + backend/lib/access/users-update.json | 23 + backend/lib/error.js | 90 + backend/lib/express/cors.js | 30 + backend/lib/express/jwt-decode.js | 15 + backend/lib/express/jwt.js | 13 + backend/lib/express/pagination.js | 55 + backend/lib/express/user-id-from-me.js | 9 + backend/lib/helpers.js | 32 + backend/lib/migrate_template.js | 55 + backend/lib/utils.js | 20 + backend/lib/validator/api.js | 45 + backend/lib/validator/index.js | 49 + backend/logger.js | 13 + backend/migrate.js | 15 + backend/migrations/20180618015850_initial.js | 205 + .../migrations/20180929054513_websockets.js | 35 + .../migrations/20181019052346_forward_host.js | 18 +- .../20181113041458_http2_support.js | 49 + .../20181213013211_forward_scheme.js | 18 +- backend/migrations/20190104035154_disabled.js | 55 + .../20190215115310_customlocations.js | 18 +- backend/migrations/20190218060101_hsts.js | 51 + backend/migrations/20190227065017_settings.js | 54 + backend/models/access_list.js | 81 + backend/models/access_list_auth.js | 54 + backend/models/audit-log.js | 54 + backend/models/auth.js | 85 + backend/models/certificate.js | 72 + backend/models/dead_host.js | 80 + backend/models/proxy_host.js | 93 + backend/models/redirection_host.js | 80 + backend/models/setting.js | 30 + backend/models/stream.js | 55 + backend/models/token.js | 136 + backend/models/user.js | 55 + backend/models/user_permission.js | 28 + nodemon.json => backend/nodemon.json | 4 +- backend/package.json | 48 + backend/routes/api/audit-log.js | 52 + {src/backend => backend}/routes/api/main.js | 31 +- backend/routes/api/nginx/access_lists.js | 148 + backend/routes/api/nginx/certificates.js | 243 + backend/routes/api/nginx/dead_hosts.js | 196 + backend/routes/api/nginx/proxy_hosts.js | 196 + backend/routes/api/nginx/redirection_hosts.js | 196 + backend/routes/api/nginx/streams.js | 196 + backend/routes/api/reports.js | 29 + backend/routes/api/schema.js | 36 + backend/routes/api/settings.js | 96 + backend/routes/api/tokens.js | 54 + backend/routes/api/users.js | 239 + .../schema/definitions.json | 0 .../schema/endpoints/access-lists.json | 0 .../schema/endpoints/certificates.json | 0 .../schema/endpoints/dead-hosts.json | 0 .../schema/endpoints/proxy-hosts.json | 0 .../schema/endpoints/redirection-hosts.json | 0 .../schema/endpoints/settings.json | 0 .../schema/endpoints/streams.json | 0 .../schema/endpoints/tokens.json | 0 .../schema/endpoints/users.json | 0 {src/backend => backend}/schema/examples.json | 0 {src/backend => backend}/schema/index.json | 0 backend/setup.js | 115 + .../templates/_assets.conf | 0 .../templates/_certificates.conf | 0 .../templates/_exploits.conf | 0 .../templates/_forced_ssl.conf | 0 .../templates/_header_comment.conf | 0 {src/backend => backend}/templates/_hsts.conf | 0 .../templates/_listen.conf | 0 .../templates/_location.conf | 0 .../templates/dead_host.conf | 0 .../templates/default.conf | 0 .../templates/ip_ranges.conf | 0 .../templates/letsencrypt-request.conf | 0 .../templates/proxy_host.conf | 0 .../templates/redirection_host.conf | 0 .../backend => backend}/templates/stream.conf | 0 backend/yarn.lock | 3655 +++++++++ bin/build | 4 - bin/build-dev | 4 - bin/migrate_create | 26 - bin/npm | 4 - bin/yarn | 4 - config/my.cnf | 7 - doc/ADVANCED_NGINX.md | 2 +- doc/DOCKERHUB.md | 52 - doc/IMPORTING.md | 57 - doc/INSTALL.md | 11 +- docker-compose.yml | 33 - docker/Dockerfile | 46 + docker/dev/Dockerfile | 32 + docker/docker-compose.ci.yml | 44 + docker/docker-compose.dev.yml | 49 + docker/rootfs/bin/check-health | 11 + .../rootfs}/etc/cont-finish.d/.gitignore | 0 .../rootfs}/etc/cont-init.d/.gitignore | 0 .../rootfs}/etc/fix-attrs.d/.gitignore | 0 .../rootfs/etc/letsencrypt.ini | 0 docker/rootfs/etc/nginx/conf.d/default.conf | 39 + docker/rootfs/etc/nginx/conf.d/dev.conf | 26 + .../etc/nginx/conf.d/include/.gitignore | 1 + .../etc/nginx/conf.d/include/assets.conf | 31 + .../nginx/conf.d/include/block-exploits.conf | 60 +- .../etc/nginx/conf.d/include/force-ssl.conf | 3 + .../etc/nginx/conf.d/include/ip_ranges.conf | 196 + .../include/letsencrypt-acme-challenge.conf | 29 + .../etc/nginx/conf.d/include/proxy.conf | 0 .../etc/nginx/conf.d/include/ssl-ciphers.conf | 0 .../rootfs/etc/nginx/conf.d/production.conf | 30 + .../rootfs}/etc/nginx/mime.types | 0 docker/rootfs/etc/nginx/nginx.conf | 84 + docker/rootfs/etc/services.d/frontend/finish | 6 + docker/rootfs/etc/services.d/frontend/run | 11 + .../rootfs}/etc/services.d/manager/finish | 0 docker/rootfs/etc/services.d/manager/run | 18 + .../rootfs}/etc/services.d/nginx/finish | 0 docker/rootfs/etc/services.d/nginx/run | 45 + docker/rootfs/root/.bashrc | 20 + .../rootfs}/var/www/html/index.html | 0 frontend/.babelrc | 17 + frontend/.gitignore | 4 + .../app-images/default-avatar.jpg | Bin .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../app-images/favicons/apple-touch-icon.png | Bin .../app-images/favicons/browserconfig.xml | 0 .../app-images/favicons/favicon-16x16.png | Bin .../app-images/favicons/favicon-32x32.png | Bin .../app-images/favicons/favicon.ico | Bin .../app-images/favicons/manifest.json | 0 .../app-images/favicons/mstile-150x150.png | Bin .../app-images/favicons/safari-pinned-tab.svg | 0 frontend/fonts | 1 + .../backend/views => frontend/html}/index.ejs | 2 +- .../backend/views => frontend/html}/login.ejs | 2 +- frontend/html/partials/footer.ejs | 2 + frontend/html/partials/header.ejs | 36 + frontend/images | 1 + {src/frontend => frontend}/js/app/api.js | 0 .../js/app/audit-log/list/item.ejs | 0 .../js/app/audit-log/list/item.js | 0 .../js/app/audit-log/list/main.ejs | 0 .../js/app/audit-log}/list/main.js | 2 +- .../js/app/audit-log/main.ejs | 0 .../js/app/audit-log/main.js | 0 .../js/app/audit-log/meta.ejs | 0 .../js/app/audit-log/meta.js | 0 {src/frontend => frontend}/js/app/cache.js | 0 .../js/app/controller.js | 0 .../js/app/dashboard/main.ejs | 0 .../js/app/dashboard/main.js | 0 .../js/app/empty/main.ejs | 0 .../js/app/empty/main.js | 0 .../js/app/error/main.ejs | 0 .../js/app/error/main.js | 0 .../js/app/help/main.ejs | 0 .../frontend => frontend}/js/app/help/main.js | 0 {src/frontend => frontend}/js/app/i18n.js | 0 {src/frontend => frontend}/js/app/main.js | 0 .../js/app/nginx/access/delete.ejs | 0 .../js/app/nginx/access/delete.js | 0 .../js/app/nginx/access/form.ejs | 0 .../js/app/nginx/access/form.js | 0 .../js/app/nginx/access/form/item.ejs | 0 .../js/app/nginx/access/form/item.js | 0 .../js/app/nginx/access/list/item.ejs | 0 .../js/app/nginx/access/list/item.js | 0 .../js/app/nginx/access/list/main.ejs | 0 .../js/app/nginx/access/list/main.js | 2 +- .../js/app/nginx/access/main.ejs | 0 .../js/app/nginx/access/main.js | 0 .../js/app/nginx/certificates-list-item.ejs | 0 .../js/app/nginx/certificates/delete.ejs | 0 .../js/app/nginx/certificates/delete.js | 0 .../js/app/nginx/certificates/form.ejs | 0 .../js/app/nginx/certificates/form.js | 0 .../js/app/nginx/certificates/list/item.ejs | 0 .../js/app/nginx/certificates/list/item.js | 0 .../js/app/nginx/certificates/list/main.ejs | 0 .../js/app/nginx/certificates/list/main.js | 2 +- .../js/app/nginx/certificates/main.ejs | 0 .../js/app/nginx/certificates/main.js | 0 .../js/app/nginx/certificates/renew.ejs | 0 .../js/app/nginx/certificates/renew.js | 0 .../js/app/nginx/dead/delete.ejs | 0 .../js/app/nginx/dead/delete.js | 0 .../js/app/nginx/dead/form.ejs | 0 .../js/app/nginx/dead/form.js | 0 .../js/app/nginx/dead/list/item.ejs | 0 .../js/app/nginx/dead/list/item.js | 0 .../js/app/nginx/dead/list/main.ejs | 0 .../js/app/nginx/dead/list/main.js | 2 +- .../js/app/nginx/dead/main.ejs | 0 .../js/app/nginx/dead/main.js | 0 .../js/app/nginx/proxy/access-list-item.ejs | 0 .../js/app/nginx/proxy/delete.ejs | 0 .../js/app/nginx/proxy/delete.js | 0 .../js/app/nginx/proxy/form.ejs | 0 .../js/app/nginx/proxy/form.js | 0 .../js/app/nginx/proxy/list/item.ejs | 2 +- .../js/app/nginx/proxy/list/item.js | 0 .../js/app/nginx/proxy/list/main.ejs | 0 .../js/app/nginx/proxy/list/main.js | 2 +- .../js/app/nginx/proxy/location-item.ejs | 0 .../js/app/nginx/proxy/location.js | 0 .../js/app/nginx/proxy/main.ejs | 0 .../js/app/nginx/proxy/main.js | 0 .../js/app/nginx/redirection/delete.ejs | 0 .../js/app/nginx/redirection/delete.js | 0 .../js/app/nginx/redirection/form.ejs | 0 .../js/app/nginx/redirection/form.js | 0 .../js/app/nginx/redirection/list/item.ejs | 0 .../js/app/nginx/redirection/list/item.js | 0 .../js/app/nginx/redirection/list/main.ejs | 0 .../js/app/nginx/redirection/list/main.js | 2 +- .../js/app/nginx/redirection/main.ejs | 0 .../js/app/nginx/redirection/main.js | 0 .../js/app/nginx/stream/delete.ejs | 0 .../js/app/nginx/stream/delete.js | 0 .../js/app/nginx/stream/form.ejs | 0 .../js/app/nginx/stream/form.js | 0 .../js/app/nginx/stream/list/item.ejs | 0 .../js/app/nginx/stream/list/item.js | 0 .../js/app/nginx/stream/list/main.ejs | 0 .../js/app/nginx/stream/list/main.js | 2 +- .../js/app/nginx/stream/main.ejs | 0 .../js/app/nginx/stream/main.js | 0 {src/frontend => frontend}/js/app/router.js | 0 .../js/app/settings/default-site/main.ejs | 0 .../js/app/settings/default-site/main.js | 0 .../js/app/settings/list/item.ejs | 0 .../js/app/settings/list/item.js | 0 .../js/app/settings/list/main.ejs | 0 .../js/app/settings}/list/main.js | 2 +- .../js/app/settings/main.ejs | 0 .../js/app/settings/main.js | 0 {src/frontend => frontend}/js/app/tokens.js | 0 .../js/app/ui/footer/main.ejs | 0 .../js/app/ui/footer/main.js | 0 .../js/app/ui/header/main.ejs | 0 .../js/app/ui/header/main.js | 0 {src/frontend => frontend}/js/app/ui/main.ejs | 0 {src/frontend => frontend}/js/app/ui/main.js | 0 .../js/app/ui/menu/main.ejs | 0 .../js/app/ui/menu/main.js | 0 .../js/app/user/delete.ejs | 0 .../js/app/user/delete.js | 0 .../js/app/user/form.ejs | 0 .../frontend => frontend}/js/app/user/form.js | 0 .../js/app/user/password.ejs | 0 .../js/app/user/password.js | 0 .../js/app/user/permissions.ejs | 0 .../js/app/user/permissions.js | 0 .../js/app/users/list/item.ejs | 0 .../js/app/users/list/item.js | 0 .../js/app/users/list/main.ejs | 0 .../js/app/users}/list/main.js | 2 +- .../js/app/users/main.ejs | 0 .../js/app/users/main.js | 0 .../js/i18n/messages.json | 0 {src/frontend => frontend}/js/index.js | 0 {src/frontend => frontend}/js/lib/helpers.js | 0 .../js/lib/marionette.js | 0 {src/frontend => frontend}/js/login.js | 0 {src/frontend => frontend}/js/login/main.js | 1 - .../js/login/ui/login.ejs | 0 .../js/login/ui/login.js | 0 .../js/models/access-list.js | 0 .../js/models/audit-log.js | 0 .../js/models/certificate.js | 0 .../js/models/dead-host.js | 0 .../js/models/proxy-host-location.js | 0 .../js/models/proxy-host.js | 0 .../js/models/redirection-host.js | 0 .../js/models/setting.js | 0 .../frontend => frontend}/js/models/stream.js | 0 {src/frontend => frontend}/js/models/user.js | 0 frontend/package.json | 48 + {src/frontend => frontend}/scss/custom.scss | 0 .../frontend => frontend}/scss/selectize.scss | 0 {src/frontend => frontend}/scss/styles.scss | 0 .../scss/tabler-extra.scss | 0 frontend/webpack.config.js | 132 + frontend/yarn.lock | 6950 +++++++++++++++++ knexfile.js | 19 - package.json | 77 - rootfs/etc/nginx/conf.d/default.conf | 53 - rootfs/etc/nginx/conf.d/include/assets.conf | 31 - .../etc/nginx/conf.d/include/force-ssl.conf | 3 - .../etc/nginx/conf.d/include/ip_ranges.conf | 2 - .../include/letsencrypt-acme-challenge.conf | 29 - .../etc/nginx/conf.d/include/resolvers.conf | 1 - rootfs/etc/nginx/nginx.conf | 90 - rootfs/etc/services.d/manager/run | 11 - rootfs/etc/services.d/nginx/run | 44 - rootfs/root/.bashrc | 13 - scripts/buildx | 39 + scripts/destroy-dev | 22 + scripts/docs-build | 19 + scripts/frontend-build | 21 + scripts/start-dev | 37 + scripts/stop-dev | 22 + scripts/test-dev | 21 + scripts/wait-healthy | 38 + src/backend/app.js | 105 - src/backend/db.js | 25 - src/backend/importer.js | 543 -- src/backend/index.js | 49 - src/backend/internal/access-list.js | 482 -- src/backend/internal/audit-log.js | 78 - src/backend/internal/certificate.js | 911 --- src/backend/internal/dead-host.js | 461 -- src/backend/internal/host.js | 235 - src/backend/internal/ip_ranges.js | 147 - src/backend/internal/nginx.js | 401 - src/backend/internal/proxy-host.js | 462 -- src/backend/internal/redirection-host.js | 461 -- src/backend/internal/report.js | 38 - src/backend/internal/setting.js | 133 - src/backend/internal/stream.js | 348 - src/backend/internal/token.js | 164 - src/backend/internal/user.js | 518 -- src/backend/lib/access.js | 313 - .../lib/access/access_lists-create.json | 23 - .../lib/access/access_lists-delete.json | 23 - src/backend/lib/access/access_lists-get.json | 23 - src/backend/lib/access/access_lists-list.json | 23 - .../lib/access/access_lists-update.json | 23 - src/backend/lib/access/auditlog-list.json | 7 - .../lib/access/certificates-create.json | 23 - .../lib/access/certificates-delete.json | 23 - src/backend/lib/access/certificates-get.json | 23 - src/backend/lib/access/certificates-list.json | 23 - .../lib/access/certificates-update.json | 23 - src/backend/lib/access/dead_hosts-create.json | 23 - src/backend/lib/access/dead_hosts-delete.json | 23 - src/backend/lib/access/dead_hosts-get.json | 23 - src/backend/lib/access/dead_hosts-list.json | 23 - src/backend/lib/access/dead_hosts-update.json | 23 - src/backend/lib/access/permissions.json | 15 - .../lib/access/proxy_hosts-create.json | 23 - .../lib/access/proxy_hosts-delete.json | 23 - src/backend/lib/access/proxy_hosts-get.json | 23 - src/backend/lib/access/proxy_hosts-list.json | 23 - .../lib/access/proxy_hosts-update.json | 23 - .../lib/access/redirection_hosts-create.json | 23 - .../lib/access/redirection_hosts-delete.json | 23 - .../lib/access/redirection_hosts-get.json | 23 - .../lib/access/redirection_hosts-list.json | 23 - .../lib/access/redirection_hosts-update.json | 23 - src/backend/lib/access/reports-hosts.json | 7 - src/backend/lib/access/roles.json | 45 - src/backend/lib/access/settings-get.json | 7 - src/backend/lib/access/settings-list.json | 7 - src/backend/lib/access/settings-update.json | 7 - src/backend/lib/access/streams-create.json | 23 - src/backend/lib/access/streams-delete.json | 23 - src/backend/lib/access/streams-get.json | 23 - src/backend/lib/access/streams-list.json | 23 - src/backend/lib/access/streams-update.json | 23 - src/backend/lib/access/users-create.json | 7 - src/backend/lib/access/users-delete.json | 7 - src/backend/lib/access/users-get.json | 23 - src/backend/lib/access/users-list.json | 7 - src/backend/lib/access/users-loginas.json | 7 - src/backend/lib/access/users-password.json | 23 - src/backend/lib/access/users-permissions.json | 7 - src/backend/lib/access/users-update.json | 26 - src/backend/lib/error.js | 90 - src/backend/lib/express/cors.js | 30 - src/backend/lib/express/jwt-decode.js | 15 - src/backend/lib/express/jwt.js | 13 - src/backend/lib/express/pagination.js | 55 - src/backend/lib/express/user-id-from-me.js | 9 - src/backend/lib/helpers.js | 32 - src/backend/lib/migrate_template.js | 55 - src/backend/lib/utils.js | 20 - src/backend/lib/validator/api.js | 45 - src/backend/lib/validator/index.js | 49 - src/backend/logger.js | 13 - src/backend/migrate.js | 15 - .../migrations/20180618015850_initial.js | 205 - .../migrations/20180929054513_websockets.js | 35 - .../20181113041458_http2_support.js | 49 - .../migrations/20190104035154_disabled.js | 55 - src/backend/migrations/20190218060101_hsts.js | 51 - .../migrations/20190227065017_settings.js | 54 - src/backend/models/access_list.js | 81 - src/backend/models/access_list_auth.js | 54 - src/backend/models/audit-log.js | 54 - src/backend/models/auth.js | 85 - src/backend/models/certificate.js | 72 - src/backend/models/dead_host.js | 80 - src/backend/models/proxy_host.js | 93 - src/backend/models/redirection_host.js | 80 - src/backend/models/setting.js | 30 - src/backend/models/stream.js | 55 - src/backend/models/token.js | 146 - src/backend/models/user.js | 55 - src/backend/models/user_permission.js | 28 - src/backend/routes/api/audit-log.js | 52 - src/backend/routes/api/nginx/access_lists.js | 148 - src/backend/routes/api/nginx/certificates.js | 243 - src/backend/routes/api/nginx/dead_hosts.js | 196 - src/backend/routes/api/nginx/proxy_hosts.js | 196 - .../routes/api/nginx/redirection_hosts.js | 196 - src/backend/routes/api/nginx/streams.js | 196 - src/backend/routes/api/reports.js | 29 - src/backend/routes/api/settings.js | 96 - src/backend/routes/api/tokens.js | 54 - src/backend/routes/api/users.js | 239 - src/backend/routes/main.js | 50 - src/backend/setup.js | 115 - src/backend/views/partials/footer.ejs | 2 - src/backend/views/partials/header.ejs | 36 - src/frontend/fonts | 1 - src/frontend/images | 1 - test/.eslintrc.json | 76 + test/.gitignore | 3 + test/.prettierrc | 11 + test/README.md | 46 + test/cypress/Dockerfile | 8 + test/cypress/config/ci.json | 17 + test/cypress/config/dev.json | 13 + test/cypress/fixtures/example.json | 5 + test/cypress/integration/Health.spec.js | 22 + test/cypress/plugins/backendApi/client.js | 142 + test/cypress/plugins/backendApi/logger.js | 8 + test/cypress/plugins/backendApi/task.js | 64 + test/cypress/plugins/index.js | 20 + test/cypress/support/commands.js | 94 + test/cypress/support/index.js | 9 + test/jsconfig.json | 6 + test/package.json | 25 + test/yarn.lock | 2426 ++++++ webpack.config.js | 114 - 517 files changed, 26258 insertions(+), 11726 deletions(-) delete mode 100644 .babelrc create mode 100644 .jenkins/config.json create mode 100644 .version delete mode 100644 Dockerfile delete mode 100644 Dockerfile.arm64 delete mode 100644 Dockerfile.armv6l delete mode 100644 Dockerfile.armv7l create mode 100644 backend/.eslintrc.json create mode 100644 backend/.gitignore create mode 100644 backend/.prettierrc create mode 100644 backend/app.js rename {config => backend/config}/README.md (100%) rename {config => backend/config}/default.json (100%) create mode 100644 backend/db.js create mode 100644 backend/doc/api.swagger.json create mode 100644 backend/index.js create mode 100644 backend/internal/access-list.js create mode 100644 backend/internal/audit-log.js create mode 100644 backend/internal/certificate.js create mode 100644 backend/internal/dead-host.js create mode 100644 backend/internal/host.js create mode 100644 backend/internal/ip_ranges.js create mode 100644 backend/internal/nginx.js create mode 100644 backend/internal/proxy-host.js create mode 100644 backend/internal/redirection-host.js create mode 100644 backend/internal/report.js create mode 100644 backend/internal/setting.js create mode 100644 backend/internal/stream.js create mode 100644 backend/internal/token.js create mode 100644 backend/internal/user.js create mode 100644 backend/knexfile.js create mode 100644 backend/lib/access.js create mode 100644 backend/lib/access/access_lists-create.json create mode 100644 backend/lib/access/access_lists-delete.json create mode 100644 backend/lib/access/access_lists-get.json create mode 100644 backend/lib/access/access_lists-list.json create mode 100644 backend/lib/access/access_lists-update.json create mode 100644 backend/lib/access/auditlog-list.json create mode 100644 backend/lib/access/certificates-create.json create mode 100644 backend/lib/access/certificates-delete.json create mode 100644 backend/lib/access/certificates-get.json create mode 100644 backend/lib/access/certificates-list.json create mode 100644 backend/lib/access/certificates-update.json create mode 100644 backend/lib/access/dead_hosts-create.json create mode 100644 backend/lib/access/dead_hosts-delete.json create mode 100644 backend/lib/access/dead_hosts-get.json create mode 100644 backend/lib/access/dead_hosts-list.json create mode 100644 backend/lib/access/dead_hosts-update.json create mode 100644 backend/lib/access/permissions.json create mode 100644 backend/lib/access/proxy_hosts-create.json create mode 100644 backend/lib/access/proxy_hosts-delete.json create mode 100644 backend/lib/access/proxy_hosts-get.json create mode 100644 backend/lib/access/proxy_hosts-list.json create mode 100644 backend/lib/access/proxy_hosts-update.json create mode 100644 backend/lib/access/redirection_hosts-create.json create mode 100644 backend/lib/access/redirection_hosts-delete.json create mode 100644 backend/lib/access/redirection_hosts-get.json create mode 100644 backend/lib/access/redirection_hosts-list.json create mode 100644 backend/lib/access/redirection_hosts-update.json create mode 100644 backend/lib/access/reports-hosts.json create mode 100644 backend/lib/access/roles.json create mode 100644 backend/lib/access/settings-get.json create mode 100644 backend/lib/access/settings-list.json create mode 100644 backend/lib/access/settings-update.json create mode 100644 backend/lib/access/streams-create.json create mode 100644 backend/lib/access/streams-delete.json create mode 100644 backend/lib/access/streams-get.json create mode 100644 backend/lib/access/streams-list.json create mode 100644 backend/lib/access/streams-update.json create mode 100644 backend/lib/access/users-create.json create mode 100644 backend/lib/access/users-delete.json create mode 100644 backend/lib/access/users-get.json create mode 100644 backend/lib/access/users-list.json create mode 100644 backend/lib/access/users-loginas.json create mode 100644 backend/lib/access/users-password.json create mode 100644 backend/lib/access/users-permissions.json create mode 100644 backend/lib/access/users-update.json create mode 100644 backend/lib/error.js create mode 100644 backend/lib/express/cors.js create mode 100644 backend/lib/express/jwt-decode.js create mode 100644 backend/lib/express/jwt.js create mode 100644 backend/lib/express/pagination.js create mode 100644 backend/lib/express/user-id-from-me.js create mode 100644 backend/lib/helpers.js create mode 100644 backend/lib/migrate_template.js create mode 100644 backend/lib/utils.js create mode 100644 backend/lib/validator/api.js create mode 100644 backend/lib/validator/index.js create mode 100644 backend/logger.js create mode 100644 backend/migrate.js create mode 100644 backend/migrations/20180618015850_initial.js create mode 100644 backend/migrations/20180929054513_websockets.js rename {src/backend => backend}/migrations/20181019052346_forward_host.js (50%) create mode 100644 backend/migrations/20181113041458_http2_support.js rename {src/backend => backend}/migrations/20181213013211_forward_scheme.js (50%) create mode 100644 backend/migrations/20190104035154_disabled.js rename {src/backend => backend}/migrations/20190215115310_customlocations.js (55%) create mode 100644 backend/migrations/20190218060101_hsts.js create mode 100644 backend/migrations/20190227065017_settings.js create mode 100644 backend/models/access_list.js create mode 100644 backend/models/access_list_auth.js create mode 100644 backend/models/audit-log.js create mode 100644 backend/models/auth.js create mode 100644 backend/models/certificate.js create mode 100644 backend/models/dead_host.js create mode 100644 backend/models/proxy_host.js create mode 100644 backend/models/redirection_host.js create mode 100644 backend/models/setting.js create mode 100644 backend/models/stream.js create mode 100644 backend/models/token.js create mode 100644 backend/models/user.js create mode 100644 backend/models/user_permission.js rename nodemon.json => backend/nodemon.json (60%) create mode 100644 backend/package.json create mode 100644 backend/routes/api/audit-log.js rename {src/backend => backend}/routes/api/main.js (64%) create mode 100644 backend/routes/api/nginx/access_lists.js create mode 100644 backend/routes/api/nginx/certificates.js create mode 100644 backend/routes/api/nginx/dead_hosts.js create mode 100644 backend/routes/api/nginx/proxy_hosts.js create mode 100644 backend/routes/api/nginx/redirection_hosts.js create mode 100644 backend/routes/api/nginx/streams.js create mode 100644 backend/routes/api/reports.js create mode 100644 backend/routes/api/schema.js create mode 100644 backend/routes/api/settings.js create mode 100644 backend/routes/api/tokens.js create mode 100644 backend/routes/api/users.js rename {src/backend => backend}/schema/definitions.json (100%) rename {src/backend => backend}/schema/endpoints/access-lists.json (100%) rename {src/backend => backend}/schema/endpoints/certificates.json (100%) rename {src/backend => backend}/schema/endpoints/dead-hosts.json (100%) rename {src/backend => backend}/schema/endpoints/proxy-hosts.json (100%) rename {src/backend => backend}/schema/endpoints/redirection-hosts.json (100%) rename {src/backend => backend}/schema/endpoints/settings.json (100%) rename {src/backend => backend}/schema/endpoints/streams.json (100%) rename {src/backend => backend}/schema/endpoints/tokens.json (100%) rename {src/backend => backend}/schema/endpoints/users.json (100%) rename {src/backend => backend}/schema/examples.json (100%) rename {src/backend => backend}/schema/index.json (100%) create mode 100644 backend/setup.js rename {src/backend => backend}/templates/_assets.conf (100%) rename {src/backend => backend}/templates/_certificates.conf (100%) rename {src/backend => backend}/templates/_exploits.conf (100%) rename {src/backend => backend}/templates/_forced_ssl.conf (100%) rename {src/backend => backend}/templates/_header_comment.conf (100%) rename {src/backend => backend}/templates/_hsts.conf (100%) rename {src/backend => backend}/templates/_listen.conf (100%) rename {src/backend => backend}/templates/_location.conf (100%) rename {src/backend => backend}/templates/dead_host.conf (100%) rename {src/backend => backend}/templates/default.conf (100%) rename {src/backend => backend}/templates/ip_ranges.conf (100%) rename {src/backend => backend}/templates/letsencrypt-request.conf (100%) rename {src/backend => backend}/templates/proxy_host.conf (100%) rename {src/backend => backend}/templates/redirection_host.conf (100%) rename {src/backend => backend}/templates/stream.conf (100%) create mode 100644 backend/yarn.lock delete mode 100755 bin/build delete mode 100755 bin/build-dev delete mode 100755 bin/migrate_create delete mode 100755 bin/npm delete mode 100755 bin/yarn delete mode 100644 config/my.cnf delete mode 100644 doc/DOCKERHUB.md delete mode 100644 doc/IMPORTING.md delete mode 100644 docker-compose.yml create mode 100644 docker/Dockerfile create mode 100644 docker/dev/Dockerfile create mode 100644 docker/docker-compose.ci.yml create mode 100644 docker/docker-compose.dev.yml create mode 100755 docker/rootfs/bin/check-health rename {rootfs => docker/rootfs}/etc/cont-finish.d/.gitignore (100%) rename {rootfs => docker/rootfs}/etc/cont-init.d/.gitignore (100%) rename {rootfs => docker/rootfs}/etc/fix-attrs.d/.gitignore (100%) rename rootfs/root/.config/letsencrypt/cli.ini => docker/rootfs/etc/letsencrypt.ini (100%) create mode 100644 docker/rootfs/etc/nginx/conf.d/default.conf create mode 100644 docker/rootfs/etc/nginx/conf.d/dev.conf create mode 100644 docker/rootfs/etc/nginx/conf.d/include/.gitignore create mode 100644 docker/rootfs/etc/nginx/conf.d/include/assets.conf rename {rootfs => docker/rootfs}/etc/nginx/conf.d/include/block-exploits.conf (68%) create mode 100644 docker/rootfs/etc/nginx/conf.d/include/force-ssl.conf create mode 100644 docker/rootfs/etc/nginx/conf.d/include/ip_ranges.conf create mode 100644 docker/rootfs/etc/nginx/conf.d/include/letsencrypt-acme-challenge.conf rename {rootfs => docker/rootfs}/etc/nginx/conf.d/include/proxy.conf (100%) rename {rootfs => docker/rootfs}/etc/nginx/conf.d/include/ssl-ciphers.conf (100%) create mode 100644 docker/rootfs/etc/nginx/conf.d/production.conf rename {rootfs => docker/rootfs}/etc/nginx/mime.types (100%) create mode 100644 docker/rootfs/etc/nginx/nginx.conf create mode 100755 docker/rootfs/etc/services.d/frontend/finish create mode 100755 docker/rootfs/etc/services.d/frontend/run rename {rootfs => docker/rootfs}/etc/services.d/manager/finish (100%) create mode 100755 docker/rootfs/etc/services.d/manager/run rename {rootfs => docker/rootfs}/etc/services.d/nginx/finish (100%) create mode 100755 docker/rootfs/etc/services.d/nginx/run create mode 100644 docker/rootfs/root/.bashrc rename {rootfs => docker/rootfs}/var/www/html/index.html (100%) create mode 100644 frontend/.babelrc create mode 100644 frontend/.gitignore rename {src/frontend => frontend}/app-images/default-avatar.jpg (100%) rename {src/frontend => frontend}/app-images/favicons/android-chrome-192x192.png (100%) rename {src/frontend => frontend}/app-images/favicons/android-chrome-512x512.png (100%) rename {src/frontend => frontend}/app-images/favicons/apple-touch-icon.png (100%) rename {src/frontend => frontend}/app-images/favicons/browserconfig.xml (100%) rename {src/frontend => frontend}/app-images/favicons/favicon-16x16.png (100%) rename {src/frontend => frontend}/app-images/favicons/favicon-32x32.png (100%) rename {src/frontend => frontend}/app-images/favicons/favicon.ico (100%) rename {src/frontend => frontend}/app-images/favicons/manifest.json (100%) rename {src/frontend => frontend}/app-images/favicons/mstile-150x150.png (100%) rename {src/frontend => frontend}/app-images/favicons/safari-pinned-tab.svg (100%) create mode 120000 frontend/fonts rename {src/backend/views => frontend/html}/index.ejs (87%) rename {src/backend/views => frontend/html}/login.ejs (89%) create mode 100644 frontend/html/partials/footer.ejs create mode 100644 frontend/html/partials/header.ejs create mode 120000 frontend/images rename {src/frontend => frontend}/js/app/api.js (100%) rename {src/frontend => frontend}/js/app/audit-log/list/item.ejs (100%) rename {src/frontend => frontend}/js/app/audit-log/list/item.js (100%) rename {src/frontend => frontend}/js/app/audit-log/list/main.ejs (100%) rename {src/frontend/js/app/users => frontend/js/app/audit-log}/list/main.js (86%) rename {src/frontend => frontend}/js/app/audit-log/main.ejs (100%) rename {src/frontend => frontend}/js/app/audit-log/main.js (100%) rename {src/frontend => frontend}/js/app/audit-log/meta.ejs (100%) rename {src/frontend => frontend}/js/app/audit-log/meta.js (100%) rename {src/frontend => frontend}/js/app/cache.js (100%) rename {src/frontend => frontend}/js/app/controller.js (100%) rename {src/frontend => frontend}/js/app/dashboard/main.ejs (100%) rename {src/frontend => frontend}/js/app/dashboard/main.js (100%) rename {src/frontend => frontend}/js/app/empty/main.ejs (100%) rename {src/frontend => frontend}/js/app/empty/main.js (100%) rename {src/frontend => frontend}/js/app/error/main.ejs (100%) rename {src/frontend => frontend}/js/app/error/main.js (100%) rename {src/frontend => frontend}/js/app/help/main.ejs (100%) rename {src/frontend => frontend}/js/app/help/main.js (100%) rename {src/frontend => frontend}/js/app/i18n.js (100%) rename {src/frontend => frontend}/js/app/main.js (100%) rename {src/frontend => frontend}/js/app/nginx/access/delete.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/access/delete.js (100%) rename {src/frontend => frontend}/js/app/nginx/access/form.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/access/form.js (100%) rename {src/frontend => frontend}/js/app/nginx/access/form/item.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/access/form/item.js (100%) rename {src/frontend => frontend}/js/app/nginx/access/list/item.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/access/list/item.js (100%) rename {src/frontend => frontend}/js/app/nginx/access/list/main.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/access/list/main.js (88%) rename {src/frontend => frontend}/js/app/nginx/access/main.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/access/main.js (100%) rename {src/frontend => frontend}/js/app/nginx/certificates-list-item.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/certificates/delete.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/certificates/delete.js (100%) rename {src/frontend => frontend}/js/app/nginx/certificates/form.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/certificates/form.js (100%) rename {src/frontend => frontend}/js/app/nginx/certificates/list/item.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/certificates/list/item.js (100%) rename {src/frontend => frontend}/js/app/nginx/certificates/list/main.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/certificates/list/main.js (88%) rename {src/frontend => frontend}/js/app/nginx/certificates/main.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/certificates/main.js (100%) rename {src/frontend => frontend}/js/app/nginx/certificates/renew.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/certificates/renew.js (100%) rename {src/frontend => frontend}/js/app/nginx/dead/delete.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/dead/delete.js (100%) rename {src/frontend => frontend}/js/app/nginx/dead/form.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/dead/form.js (100%) rename {src/frontend => frontend}/js/app/nginx/dead/list/item.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/dead/list/item.js (100%) rename {src/frontend => frontend}/js/app/nginx/dead/list/main.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/dead/list/main.js (88%) rename {src/frontend => frontend}/js/app/nginx/dead/main.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/dead/main.js (100%) rename {src/frontend => frontend}/js/app/nginx/proxy/access-list-item.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/proxy/delete.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/proxy/delete.js (100%) rename {src/frontend => frontend}/js/app/nginx/proxy/form.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/proxy/form.js (100%) rename {src/frontend => frontend}/js/app/nginx/proxy/list/item.ejs (99%) rename {src/frontend => frontend}/js/app/nginx/proxy/list/item.js (100%) rename {src/frontend => frontend}/js/app/nginx/proxy/list/main.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/proxy/list/main.js (88%) rename {src/frontend => frontend}/js/app/nginx/proxy/location-item.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/proxy/location.js (100%) rename {src/frontend => frontend}/js/app/nginx/proxy/main.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/proxy/main.js (100%) rename {src/frontend => frontend}/js/app/nginx/redirection/delete.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/redirection/delete.js (100%) rename {src/frontend => frontend}/js/app/nginx/redirection/form.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/redirection/form.js (100%) rename {src/frontend => frontend}/js/app/nginx/redirection/list/item.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/redirection/list/item.js (100%) rename {src/frontend => frontend}/js/app/nginx/redirection/list/main.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/redirection/list/main.js (89%) rename {src/frontend => frontend}/js/app/nginx/redirection/main.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/redirection/main.js (100%) rename {src/frontend => frontend}/js/app/nginx/stream/delete.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/stream/delete.js (100%) rename {src/frontend => frontend}/js/app/nginx/stream/form.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/stream/form.js (100%) rename {src/frontend => frontend}/js/app/nginx/stream/list/item.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/stream/list/item.js (100%) rename {src/frontend => frontend}/js/app/nginx/stream/list/main.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/stream/list/main.js (88%) rename {src/frontend => frontend}/js/app/nginx/stream/main.ejs (100%) rename {src/frontend => frontend}/js/app/nginx/stream/main.js (100%) rename {src/frontend => frontend}/js/app/router.js (100%) rename {src/frontend => frontend}/js/app/settings/default-site/main.ejs (100%) rename {src/frontend => frontend}/js/app/settings/default-site/main.js (100%) rename {src/frontend => frontend}/js/app/settings/list/item.ejs (100%) rename {src/frontend => frontend}/js/app/settings/list/item.js (100%) rename {src/frontend => frontend}/js/app/settings/list/main.ejs (100%) rename {src/frontend/js/app/audit-log => frontend/js/app/settings}/list/main.js (86%) rename {src/frontend => frontend}/js/app/settings/main.ejs (100%) rename {src/frontend => frontend}/js/app/settings/main.js (100%) rename {src/frontend => frontend}/js/app/tokens.js (100%) rename {src/frontend => frontend}/js/app/ui/footer/main.ejs (100%) rename {src/frontend => frontend}/js/app/ui/footer/main.js (100%) rename {src/frontend => frontend}/js/app/ui/header/main.ejs (100%) rename {src/frontend => frontend}/js/app/ui/header/main.js (100%) rename {src/frontend => frontend}/js/app/ui/main.ejs (100%) rename {src/frontend => frontend}/js/app/ui/main.js (100%) rename {src/frontend => frontend}/js/app/ui/menu/main.ejs (100%) rename {src/frontend => frontend}/js/app/ui/menu/main.js (100%) rename {src/frontend => frontend}/js/app/user/delete.ejs (100%) rename {src/frontend => frontend}/js/app/user/delete.js (100%) rename {src/frontend => frontend}/js/app/user/form.ejs (100%) rename {src/frontend => frontend}/js/app/user/form.js (100%) rename {src/frontend => frontend}/js/app/user/password.ejs (100%) rename {src/frontend => frontend}/js/app/user/password.js (100%) rename {src/frontend => frontend}/js/app/user/permissions.ejs (100%) rename {src/frontend => frontend}/js/app/user/permissions.js (100%) rename {src/frontend => frontend}/js/app/users/list/item.ejs (100%) rename {src/frontend => frontend}/js/app/users/list/item.js (100%) rename {src/frontend => frontend}/js/app/users/list/main.ejs (100%) rename {src/frontend/js/app/settings => frontend/js/app/users}/list/main.js (86%) rename {src/frontend => frontend}/js/app/users/main.ejs (100%) rename {src/frontend => frontend}/js/app/users/main.js (100%) rename {src/frontend => frontend}/js/i18n/messages.json (100%) rename {src/frontend => frontend}/js/index.js (100%) rename {src/frontend => frontend}/js/lib/helpers.js (100%) rename {src/frontend => frontend}/js/lib/marionette.js (100%) rename {src/frontend => frontend}/js/login.js (100%) rename {src/frontend => frontend}/js/login/main.js (99%) rename {src/frontend => frontend}/js/login/ui/login.ejs (100%) rename {src/frontend => frontend}/js/login/ui/login.js (100%) rename {src/frontend => frontend}/js/models/access-list.js (100%) rename {src/frontend => frontend}/js/models/audit-log.js (100%) rename {src/frontend => frontend}/js/models/certificate.js (100%) rename {src/frontend => frontend}/js/models/dead-host.js (100%) rename {src/frontend => frontend}/js/models/proxy-host-location.js (100%) rename {src/frontend => frontend}/js/models/proxy-host.js (100%) rename {src/frontend => frontend}/js/models/redirection-host.js (100%) rename {src/frontend => frontend}/js/models/setting.js (100%) rename {src/frontend => frontend}/js/models/stream.js (100%) rename {src/frontend => frontend}/js/models/user.js (100%) create mode 100644 frontend/package.json rename {src/frontend => frontend}/scss/custom.scss (100%) rename {src/frontend => frontend}/scss/selectize.scss (100%) rename {src/frontend => frontend}/scss/styles.scss (100%) rename {src/frontend => frontend}/scss/tabler-extra.scss (100%) create mode 100644 frontend/webpack.config.js create mode 100644 frontend/yarn.lock delete mode 100644 knexfile.js delete mode 100644 package.json delete mode 100644 rootfs/etc/nginx/conf.d/default.conf delete mode 100644 rootfs/etc/nginx/conf.d/include/assets.conf delete mode 100644 rootfs/etc/nginx/conf.d/include/force-ssl.conf delete mode 100644 rootfs/etc/nginx/conf.d/include/ip_ranges.conf delete mode 100644 rootfs/etc/nginx/conf.d/include/letsencrypt-acme-challenge.conf delete mode 100644 rootfs/etc/nginx/conf.d/include/resolvers.conf delete mode 100644 rootfs/etc/nginx/nginx.conf delete mode 100755 rootfs/etc/services.d/manager/run delete mode 100755 rootfs/etc/services.d/nginx/run delete mode 100644 rootfs/root/.bashrc create mode 100755 scripts/buildx create mode 100755 scripts/destroy-dev create mode 100755 scripts/docs-build create mode 100755 scripts/frontend-build create mode 100755 scripts/start-dev create mode 100755 scripts/stop-dev create mode 100755 scripts/test-dev create mode 100755 scripts/wait-healthy delete mode 100644 src/backend/app.js delete mode 100644 src/backend/db.js delete mode 100644 src/backend/importer.js delete mode 100644 src/backend/index.js delete mode 100644 src/backend/internal/access-list.js delete mode 100644 src/backend/internal/audit-log.js delete mode 100644 src/backend/internal/certificate.js delete mode 100644 src/backend/internal/dead-host.js delete mode 100644 src/backend/internal/host.js delete mode 100644 src/backend/internal/ip_ranges.js delete mode 100644 src/backend/internal/nginx.js delete mode 100644 src/backend/internal/proxy-host.js delete mode 100644 src/backend/internal/redirection-host.js delete mode 100644 src/backend/internal/report.js delete mode 100644 src/backend/internal/setting.js delete mode 100644 src/backend/internal/stream.js delete mode 100644 src/backend/internal/token.js delete mode 100644 src/backend/internal/user.js delete mode 100644 src/backend/lib/access.js delete mode 100644 src/backend/lib/access/access_lists-create.json delete mode 100644 src/backend/lib/access/access_lists-delete.json delete mode 100644 src/backend/lib/access/access_lists-get.json delete mode 100644 src/backend/lib/access/access_lists-list.json delete mode 100644 src/backend/lib/access/access_lists-update.json delete mode 100644 src/backend/lib/access/auditlog-list.json delete mode 100644 src/backend/lib/access/certificates-create.json delete mode 100644 src/backend/lib/access/certificates-delete.json delete mode 100644 src/backend/lib/access/certificates-get.json delete mode 100644 src/backend/lib/access/certificates-list.json delete mode 100644 src/backend/lib/access/certificates-update.json delete mode 100644 src/backend/lib/access/dead_hosts-create.json delete mode 100644 src/backend/lib/access/dead_hosts-delete.json delete mode 100644 src/backend/lib/access/dead_hosts-get.json delete mode 100644 src/backend/lib/access/dead_hosts-list.json delete mode 100644 src/backend/lib/access/dead_hosts-update.json delete mode 100644 src/backend/lib/access/permissions.json delete mode 100644 src/backend/lib/access/proxy_hosts-create.json delete mode 100644 src/backend/lib/access/proxy_hosts-delete.json delete mode 100644 src/backend/lib/access/proxy_hosts-get.json delete mode 100644 src/backend/lib/access/proxy_hosts-list.json delete mode 100644 src/backend/lib/access/proxy_hosts-update.json delete mode 100644 src/backend/lib/access/redirection_hosts-create.json delete mode 100644 src/backend/lib/access/redirection_hosts-delete.json delete mode 100644 src/backend/lib/access/redirection_hosts-get.json delete mode 100644 src/backend/lib/access/redirection_hosts-list.json delete mode 100644 src/backend/lib/access/redirection_hosts-update.json delete mode 100644 src/backend/lib/access/reports-hosts.json delete mode 100644 src/backend/lib/access/roles.json delete mode 100644 src/backend/lib/access/settings-get.json delete mode 100644 src/backend/lib/access/settings-list.json delete mode 100644 src/backend/lib/access/settings-update.json delete mode 100644 src/backend/lib/access/streams-create.json delete mode 100644 src/backend/lib/access/streams-delete.json delete mode 100644 src/backend/lib/access/streams-get.json delete mode 100644 src/backend/lib/access/streams-list.json delete mode 100644 src/backend/lib/access/streams-update.json delete mode 100644 src/backend/lib/access/users-create.json delete mode 100644 src/backend/lib/access/users-delete.json delete mode 100644 src/backend/lib/access/users-get.json delete mode 100644 src/backend/lib/access/users-list.json delete mode 100644 src/backend/lib/access/users-loginas.json delete mode 100644 src/backend/lib/access/users-password.json delete mode 100644 src/backend/lib/access/users-permissions.json delete mode 100644 src/backend/lib/access/users-update.json delete mode 100644 src/backend/lib/error.js delete mode 100644 src/backend/lib/express/cors.js delete mode 100644 src/backend/lib/express/jwt-decode.js delete mode 100644 src/backend/lib/express/jwt.js delete mode 100644 src/backend/lib/express/pagination.js delete mode 100644 src/backend/lib/express/user-id-from-me.js delete mode 100644 src/backend/lib/helpers.js delete mode 100644 src/backend/lib/migrate_template.js delete mode 100644 src/backend/lib/utils.js delete mode 100644 src/backend/lib/validator/api.js delete mode 100644 src/backend/lib/validator/index.js delete mode 100644 src/backend/logger.js delete mode 100644 src/backend/migrate.js delete mode 100644 src/backend/migrations/20180618015850_initial.js delete mode 100644 src/backend/migrations/20180929054513_websockets.js delete mode 100644 src/backend/migrations/20181113041458_http2_support.js delete mode 100644 src/backend/migrations/20190104035154_disabled.js delete mode 100644 src/backend/migrations/20190218060101_hsts.js delete mode 100644 src/backend/migrations/20190227065017_settings.js delete mode 100644 src/backend/models/access_list.js delete mode 100644 src/backend/models/access_list_auth.js delete mode 100644 src/backend/models/audit-log.js delete mode 100644 src/backend/models/auth.js delete mode 100644 src/backend/models/certificate.js delete mode 100644 src/backend/models/dead_host.js delete mode 100644 src/backend/models/proxy_host.js delete mode 100644 src/backend/models/redirection_host.js delete mode 100644 src/backend/models/setting.js delete mode 100644 src/backend/models/stream.js delete mode 100644 src/backend/models/token.js delete mode 100644 src/backend/models/user.js delete mode 100644 src/backend/models/user_permission.js delete mode 100644 src/backend/routes/api/audit-log.js delete mode 100644 src/backend/routes/api/nginx/access_lists.js delete mode 100644 src/backend/routes/api/nginx/certificates.js delete mode 100644 src/backend/routes/api/nginx/dead_hosts.js delete mode 100644 src/backend/routes/api/nginx/proxy_hosts.js delete mode 100644 src/backend/routes/api/nginx/redirection_hosts.js delete mode 100644 src/backend/routes/api/nginx/streams.js delete mode 100644 src/backend/routes/api/reports.js delete mode 100644 src/backend/routes/api/settings.js delete mode 100644 src/backend/routes/api/tokens.js delete mode 100644 src/backend/routes/api/users.js delete mode 100644 src/backend/routes/main.js delete mode 100644 src/backend/setup.js delete mode 100644 src/backend/views/partials/footer.ejs delete mode 100644 src/backend/views/partials/header.ejs delete mode 120000 src/frontend/fonts delete mode 120000 src/frontend/images create mode 100644 test/.eslintrc.json create mode 100644 test/.gitignore create mode 100644 test/.prettierrc create mode 100644 test/README.md create mode 100644 test/cypress/Dockerfile create mode 100644 test/cypress/config/ci.json create mode 100644 test/cypress/config/dev.json create mode 100644 test/cypress/fixtures/example.json create mode 100644 test/cypress/integration/Health.spec.js create mode 100644 test/cypress/plugins/backendApi/client.js create mode 100644 test/cypress/plugins/backendApi/logger.js create mode 100644 test/cypress/plugins/backendApi/task.js create mode 100644 test/cypress/plugins/index.js create mode 100644 test/cypress/support/commands.js create mode 100644 test/cypress/support/index.js create mode 100644 test/jsconfig.json create mode 100644 test/package.json create mode 100644 test/yarn.lock delete mode 100644 webpack.config.js diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 313497cf9..000000000 --- a/.babelrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "presets": [ - ["env", { - "targets": { - "browsers": ["Chrome >= 65"] - }, - "debug": false, - "modules": false, - "useBuiltIns": "usage" - }] - ] -} diff --git a/.gitignore b/.gitignore index 184fbc3ca..deb3fb55c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,5 @@ .DS_Store .idea ._* -node_modules -core* -config/development.json -dist -webpack_stats.html -data/* -yarn-error.log -yarn.lock -tmp -certbot.log +.vscode diff --git a/.jenkins/config.json b/.jenkins/config.json new file mode 100644 index 000000000..19ad2237f --- /dev/null +++ b/.jenkins/config.json @@ -0,0 +1,10 @@ +{ + "database": { + "engine": "mysql", + "host": "db", + "name": "npm", + "user": "npm", + "password": "npm", + "port": 3306 + } +} \ No newline at end of file diff --git a/.version b/.version new file mode 100644 index 000000000..50aea0e7a --- /dev/null +++ b/.version @@ -0,0 +1 @@ +2.1.0 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index a3f45064e..000000000 --- a/Dockerfile +++ /dev/null @@ -1,39 +0,0 @@ -FROM jc21/nginx-proxy-manager-base:latest - -MAINTAINER Jamie Curnow -LABEL maintainer="Jamie Curnow " - -ENV SUPPRESS_NO_CONFIG_WARNING=1 -ENV S6_FIX_ATTRS_HIDDEN=1 -RUN echo "fs.file-max = 65535" > /etc/sysctl.conf - -# Nginx, Node and required packages should already be installed from the base image - -# root filesystem -COPY rootfs / - -# s6 overlay -RUN curl -L -o /tmp/s6-overlay-amd64.tar.gz "https://github.com/just-containers/s6-overlay/releases/download/v1.21.4.0/s6-overlay-amd64.tar.gz" \ - && tar xzf /tmp/s6-overlay-amd64.tar.gz -C / - -# App -ENV NODE_ENV=production - -ADD dist /app/dist -ADD node_modules /app/node_modules -ADD src/backend /app/src/backend -ADD package.json /app/package.json -ADD knexfile.js /app/knexfile.js - -# Volumes -VOLUME [ "/data", "/etc/letsencrypt" ] -CMD [ "/init" ] - -# Ports -EXPOSE 80 -EXPOSE 81 -EXPOSE 443 -EXPOSE 9876 - -HEALTHCHECK --interval=15s --timeout=3s CMD curl -f http://localhost:9876/health || exit 1 - diff --git a/Dockerfile.arm64 b/Dockerfile.arm64 deleted file mode 100644 index 897a5fa82..000000000 --- a/Dockerfile.arm64 +++ /dev/null @@ -1,38 +0,0 @@ -FROM jc21/nginx-proxy-manager-base:arm64 - -MAINTAINER Jamie Curnow -LABEL maintainer="Jamie Curnow " - -ENV SUPPRESS_NO_CONFIG_WARNING=1 -ENV S6_FIX_ATTRS_HIDDEN=1 -RUN echo "fs.file-max = 65535" > /etc/sysctl.conf - -# Nginx, Node and required packages should already be installed from the base image - -# root filesystem -COPY rootfs / - -# s6 overlay -RUN curl -L -o /tmp/s6-overlay-aarch64.tar.gz "https://github.com/just-containers/s6-overlay/releases/download/v1.21.8.0/s6-overlay-aarch64.tar.gz" \ - && tar xzf /tmp/s6-overlay-aarch64.tar.gz -C / - -# App -ENV NODE_ENV=production - -ADD dist /app/dist -ADD node_modules /app/node_modules -ADD src/backend /app/src/backend -ADD package.json /app/package.json -ADD knexfile.js /app/knexfile.js - -# Volumes -VOLUME [ "/data", "/etc/letsencrypt" ] -CMD [ "/init" ] - -# Ports -EXPOSE 80 -EXPOSE 81 -EXPOSE 443 -EXPOSE 9876 - -HEALTHCHECK --interval=15s --timeout=3s CMD curl -f http://localhost:9876/health || exit 1 diff --git a/Dockerfile.armv6l b/Dockerfile.armv6l deleted file mode 100644 index c08d09b4a..000000000 --- a/Dockerfile.armv6l +++ /dev/null @@ -1,38 +0,0 @@ -FROM jc21/nginx-proxy-manager-base:armv6 - -MAINTAINER Jamie Curnow -LABEL maintainer="Jamie Curnow " - -ENV SUPPRESS_NO_CONFIG_WARNING=1 -ENV S6_FIX_ATTRS_HIDDEN=1 -RUN echo "fs.file-max = 65535" > /etc/sysctl.conf - -# Nginx, Node and required packages should already be installed from the base image - -# root filesystem -COPY rootfs / - -# s6 overlay -RUN curl -L -o /tmp/s6-overlay-arm.tar.gz "https://github.com/just-containers/s6-overlay/releases/download/v1.21.8.0/s6-overlay-arm.tar.gz" \ - && tar xzf /tmp/s6-overlay-arm.tar.gz -C / - -# App -ENV NODE_ENV=production - -ADD dist /app/dist -ADD node_modules /app/node_modules -ADD src/backend /app/src/backend -ADD package.json /app/package.json -ADD knexfile.js /app/knexfile.js - -# Volumes -VOLUME [ "/data", "/etc/letsencrypt" ] -CMD [ "/init" ] - -# Ports -EXPOSE 80 -EXPOSE 81 -EXPOSE 443 -EXPOSE 9876 - -HEALTHCHECK --interval=15s --timeout=3s CMD curl -f http://localhost:9876/health || exit 1 diff --git a/Dockerfile.armv7l b/Dockerfile.armv7l deleted file mode 100644 index af6b82a1b..000000000 --- a/Dockerfile.armv7l +++ /dev/null @@ -1,38 +0,0 @@ -FROM jc21/nginx-proxy-manager-base:armhf - -MAINTAINER Jamie Curnow -LABEL maintainer="Jamie Curnow " - -ENV SUPPRESS_NO_CONFIG_WARNING=1 -ENV S6_FIX_ATTRS_HIDDEN=1 -RUN echo "fs.file-max = 65535" > /etc/sysctl.conf - -# Nginx, Node and required packages should already be installed from the base image - -# root filesystem -COPY rootfs / - -# s6 overlay -RUN curl -L -o /tmp/s6-overlay-armhf.tar.gz "https://github.com/just-containers/s6-overlay/releases/download/v1.21.4.0/s6-overlay-armhf.tar.gz" \ - && tar xzf /tmp/s6-overlay-armhf.tar.gz -C / - -# App -ENV NODE_ENV=production - -ADD dist /app/dist -ADD node_modules /app/node_modules -ADD src/backend /app/src/backend -ADD package.json /app/package.json -ADD knexfile.js /app/knexfile.js - -# Volumes -VOLUME [ "/data", "/etc/letsencrypt" ] -CMD [ "/init" ] - -# Ports -EXPOSE 80 -EXPOSE 81 -EXPOSE 443 -EXPOSE 9876 - -HEALTHCHECK --interval=15s --timeout=3s CMD curl -f http://localhost:9876/health || exit 1 diff --git a/Jenkinsfile b/Jenkinsfile index 530be9a1d..04089ed14 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,364 +1,161 @@ pipeline { - options { - buildDiscarder(logRotator(numToKeepStr: '10')) - disableConcurrentBuilds() - } - agent any - environment { - IMAGE = "nginx-proxy-manager" - BASE_IMAGE = "jc21/${IMAGE}-base" - TEMP_IMAGE = "${IMAGE}-build_${BUILD_NUMBER}" - TAG_VERSION = getPackageVersion() - MAJOR_VERSION = "2" - BRANCH_LOWER = "${BRANCH_NAME.toLowerCase()}" - // Architectures: - AMD64_TAG = "amd64" - ARMV6_TAG = "armv6l" - ARMV7_TAG = "armv7l" - ARM64_TAG = "arm64" - } - stages { - stage('Build PR') { - when { - changeRequest() - } - steps { - ansiColor('xterm') { - // Codebase - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install' - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} npm run-script build' - sh 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} rm -rf node_modules' - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install --prod' - sh 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} node-prune' - - // Docker Build - sh 'docker build --pull --no-cache --squash --compress -t ${TEMP_IMAGE}-${AMD64_TAG} .' - - // Dockerhub - sh 'docker tag ${TEMP_IMAGE}-${AMD64_TAG} docker.io/jc21/${IMAGE}:github-${BRANCH_LOWER}-${AMD64_TAG}' - withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { - sh "docker login -u '${duser}' -p '${dpass}'" - sh 'docker push docker.io/jc21/${IMAGE}:github-${BRANCH_LOWER}-${AMD64_TAG}' - } - - sh 'docker rmi ${TEMP_IMAGE}-${AMD64_TAG}' - - script { - def comment = pullRequest.comment("Docker Image for build ${BUILD_NUMBER} is available on [DockerHub](https://cloud.docker.com/repository/docker/jc21/${IMAGE}) as `jc21/${IMAGE}:github-${BRANCH_LOWER}-${AMD64_TAG}`") - } - } - } - } - stage('Build Develop') { - when { - branch 'develop' - } - steps { - ansiColor('xterm') { - // Codebase - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install' - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} npm run-script build' - sh 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} rm -rf node_modules' - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install --prod' - sh 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} node-prune' - - // Docker Build - sh 'docker build --pull --no-cache --squash --compress -t ${TEMP_IMAGE}-${AMD64_TAG} .' - - // Dockerhub - sh 'docker tag ${TEMP_IMAGE}-${AMD64_TAG} docker.io/jc21/${IMAGE}:develop-${AMD64_TAG}' - withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { - sh "docker login -u '${duser}' -p '${dpass}'" - sh 'docker push docker.io/jc21/${IMAGE}:develop-${AMD64_TAG}' - } - - sh 'docker rmi ${TEMP_IMAGE}-${AMD64_TAG}' - } - } - } - stage('Build Master') { - when { - branch 'master' - } - parallel { - // ======================== - // amd64 - // ======================== - stage('amd64') { - agent { - label 'amd64' - } - steps { - ansiColor('xterm') { - // Codebase - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install' - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} npm run-script build' - sh 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} rm -rf node_modules' - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install --prod' - sh 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} node-prune' - - // Docker Build - sh 'docker build --pull --no-cache --squash --compress -t ${TEMP_IMAGE}-${AMD64_TAG} .' - - // Dockerhub - sh 'docker tag ${TEMP_IMAGE}-${AMD64_TAG} docker.io/jc21/${IMAGE}:${TAG_VERSION}-${AMD64_TAG}' - sh 'docker tag ${TEMP_IMAGE}-${AMD64_TAG} docker.io/jc21/${IMAGE}:${MAJOR_VERSION}-${AMD64_TAG}' - sh 'docker tag ${TEMP_IMAGE}-${AMD64_TAG} docker.io/jc21/${IMAGE}:latest-${AMD64_TAG}' - - withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { - sh "docker login -u '${duser}' -p '${dpass}'" - sh 'docker push docker.io/jc21/${IMAGE}:${TAG_VERSION}-${AMD64_TAG}' - sh 'docker push docker.io/jc21/${IMAGE}:${MAJOR_VERSION}-${AMD64_TAG}' - sh 'docker push docker.io/jc21/${IMAGE}:latest-${AMD64_TAG}' - } - - sh 'docker rmi ${TEMP_IMAGE}-${AMD64_TAG}' - } - } - } - // ======================== - // arm64 - // ======================== - stage('arm64') { - agent { - label 'arm64' - } - steps { - ansiColor('xterm') { - // Codebase - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install' - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} npm run-script build' - sh 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} rm -rf node_modules' - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install --prod' - - // Docker Build - sh 'docker build --pull --no-cache --squash --compress -t ${TEMP_IMAGE}-${ARM64_TAG} -f Dockerfile.${ARM64_TAG} .' - - // Dockerhub - sh 'docker tag ${TEMP_IMAGE}-${ARM64_TAG} docker.io/jc21/${IMAGE}:${TAG_VERSION}-${ARM64_TAG}' - sh 'docker tag ${TEMP_IMAGE}-${ARM64_TAG} docker.io/jc21/${IMAGE}:${MAJOR_VERSION}-${ARM64_TAG}' - sh 'docker tag ${TEMP_IMAGE}-${ARM64_TAG} docker.io/jc21/${IMAGE}:latest-${ARM64_TAG}' - - withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { - sh "docker login -u '${duser}' -p '${dpass}'" - sh 'docker push docker.io/jc21/${IMAGE}:${TAG_VERSION}-${ARM64_TAG}' - sh 'docker push docker.io/jc21/${IMAGE}:${MAJOR_VERSION}-${ARM64_TAG}' - sh 'docker push docker.io/jc21/${IMAGE}:latest-${ARM64_TAG}' - } - - sh 'docker rmi ${TEMP_IMAGE}-${ARM64_TAG}' - } - } - } - // ======================== - // armv7l - // ======================== - stage('armv7l') { - agent { - label 'armv7l' - } - steps { - ansiColor('xterm') { - // Codebase - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install' - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} npm run-script build' - sh 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} rm -rf node_modules' - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install --prod' - - // Docker Build - sh 'docker build --pull --no-cache --squash --compress -t ${TEMP_IMAGE}-${ARMV7_TAG} -f Dockerfile.${ARMV7_TAG} .' - - // Dockerhub - sh 'docker tag ${TEMP_IMAGE}-${ARMV7_TAG} docker.io/jc21/${IMAGE}:${TAG_VERSION}-${ARMV7_TAG}' - sh 'docker tag ${TEMP_IMAGE}-${ARMV7_TAG} docker.io/jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV7_TAG}' - sh 'docker tag ${TEMP_IMAGE}-${ARMV7_TAG} docker.io/jc21/${IMAGE}:latest-${ARMV7_TAG}' - - withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { - sh "docker login -u '${duser}' -p '${dpass}'" - sh 'docker push docker.io/jc21/${IMAGE}:${TAG_VERSION}-${ARMV7_TAG}' - sh 'docker push docker.io/jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV7_TAG}' - sh 'docker push docker.io/jc21/${IMAGE}:latest-${ARMV7_TAG}' - } - - sh 'docker rmi ${TEMP_IMAGE}-${ARMV7_TAG}' - } - } - } - // ======================== - // armv6l - Disabled for the time being - // ======================== - /* - stage('armv6l') { - agent { - label 'armv6l' - } - steps { - ansiColor('xterm') { - // Codebase - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install' - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} npm run-script build' - sh 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} rm -rf node_modules' - sh 'docker run --rm -v $(pwd):/app -w /app ${BASE_IMAGE} yarn install --prod' - - // Docker Build - sh 'docker build --pull --no-cache --squash --compress -t ${TEMP_IMAGE}-${ARMV6_TAG} -f Dockerfile.${ARMV6_TAG} .' - - // Dockerhub - sh 'docker tag ${TEMP_IMAGE}-${ARMV6_TAG} docker.io/jc21/${IMAGE}:${TAG_VERSION}-${ARMV6_TAG}' - sh 'docker tag ${TEMP_IMAGE}-${ARMV6_TAG} docker.io/jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV6_TAG}' - sh 'docker tag ${TEMP_IMAGE}-${ARMV6_TAG} docker.io/jc21/${IMAGE}:latest-${ARMV6_TAG}' - - withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { - sh "docker login -u '${duser}' -p '${dpass}'" - sh 'docker push docker.io/jc21/${IMAGE}:${TAG_VERSION}-${ARMV6_TAG}' - sh 'docker push docker.io/jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV6_TAG}' - sh 'docker push docker.io/jc21/${IMAGE}:latest-${ARMV6_TAG}' - } - - sh 'docker rmi ${TEMP_IMAGE}-${ARMV6_TAG}' - } - } - } - */ - } - } - // ======================== - // latest manifest - // ======================== - stage('Latest Manifest') { - when { - branch 'master' - } - steps { - ansiColor('xterm') { - // ======================= - // latest - // ======================= - sh 'docker pull jc21/${IMAGE}:latest-${AMD64_TAG}' - sh 'docker pull jc21/${IMAGE}:latest-${ARM64_TAG}' - sh 'docker pull jc21/${IMAGE}:latest-${ARMV7_TAG}' - //sh 'docker pull jc21/${IMAGE}:latest-${ARMV6_TAG}' - - sh 'docker manifest push --purge jc21/${IMAGE}:latest || echo ""' - sh 'docker manifest create jc21/${IMAGE}:latest jc21/${IMAGE}:latest-${AMD64_TAG} jc21/${IMAGE}:latest-${ARM64_TAG} jc21/${IMAGE}:latest-${ARMV7_TAG}' - - sh 'docker manifest annotate jc21/${IMAGE}:latest jc21/${IMAGE}:latest-${AMD64_TAG} --arch ${AMD64_TAG}' - sh 'docker manifest annotate jc21/${IMAGE}:latest jc21/${IMAGE}:latest-${ARM64_TAG} --os linux --arch ${ARM64_TAG}' - sh 'docker manifest annotate jc21/${IMAGE}:latest jc21/${IMAGE}:latest-${ARMV7_TAG} --os linux --arch arm --variant ${ARMV7_TAG}' - //sh 'docker manifest annotate jc21/${IMAGE}:latest jc21/${IMAGE}:latest-${ARMV6_TAG} --os linux --arch arm --variant ${ARMV6_TAG}' - sh 'docker manifest push --purge jc21/${IMAGE}:latest' - - // ======================= - // major version - // ======================= - sh 'docker pull jc21/${IMAGE}:${MAJOR_VERSION}-${AMD64_TAG}' - sh 'docker pull jc21/${IMAGE}:${MAJOR_VERSION}-${ARM64_TAG}' - sh 'docker pull jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV7_TAG}' - //sh 'docker pull jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV6_TAG}' - - sh 'docker manifest push --purge jc21/${IMAGE}:${MAJOR_VERSION} || echo ""' - sh 'docker manifest create jc21/${IMAGE}:${MAJOR_VERSION} jc21/${IMAGE}:${MAJOR_VERSION}-${AMD64_TAG} jc21/${IMAGE}:${MAJOR_VERSION}-${ARM64_TAG} jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV7_TAG}' - - sh 'docker manifest annotate jc21/${IMAGE}:${MAJOR_VERSION} jc21/${IMAGE}:${MAJOR_VERSION}-${AMD64_TAG} --arch ${AMD64_TAG}' - sh 'docker manifest annotate jc21/${IMAGE}:${MAJOR_VERSION} jc21/${IMAGE}:${MAJOR_VERSION}-${ARM64_TAG} --os linux --arch ${ARM64_TAG}' - sh 'docker manifest annotate jc21/${IMAGE}:${MAJOR_VERSION} jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV7_TAG} --os linux --arch arm --variant ${ARMV7_TAG}' - //sh 'docker manifest annotate jc21/${IMAGE}:${MAJOR_VERSION} jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV6_TAG} --os linux --arch arm --variant ${ARMV6_TAG}' - - // ======================= - // version - // ======================= - sh 'docker pull jc21/${IMAGE}:${TAG_VERSION}-${AMD64_TAG}' - sh 'docker pull jc21/${IMAGE}:${TAG_VERSION}-${ARM64_TAG}' - sh 'docker pull jc21/${IMAGE}:${TAG_VERSION}-${ARMV7_TAG}' - //sh 'docker pull jc21/${IMAGE}:${TAG_VERSION}-${ARMV6_TAG}' - - sh 'docker manifest push --purge jc21/${IMAGE}:${TAG_VERSION} || echo ""' - sh 'docker manifest create jc21/${IMAGE}:${TAG_VERSION} jc21/${IMAGE}:${TAG_VERSION}-${AMD64_TAG} jc21/${IMAGE}:${TAG_VERSION}-${ARM64_TAG} jc21/${IMAGE}:${TAG_VERSION}-${ARMV7_TAG}' - - sh 'docker manifest annotate jc21/${IMAGE}:${TAG_VERSION} jc21/${IMAGE}:${TAG_VERSION}-${AMD64_TAG} --arch ${AMD64_TAG}' - sh 'docker manifest annotate jc21/${IMAGE}:${TAG_VERSION} jc21/${IMAGE}:${TAG_VERSION}-${ARM64_TAG} --os linux --arch ${ARM64_TAG}' - sh 'docker manifest annotate jc21/${IMAGE}:${TAG_VERSION} jc21/${IMAGE}:${TAG_VERSION}-${ARMV7_TAG} --os linux --arch arm --variant ${ARMV7_TAG}' - //sh 'docker manifest annotate jc21/${IMAGE}:${TAG_VERSION} jc21/${IMAGE}:${TAG_VERSION}-${ARMV6_TAG} --os linux --arch arm --variant ${ARMV6_TAG}' - } - } - } - // ======================== - // develop - // ======================== - stage('Develop Manifest') { - when { - branch 'develop' - } - steps { - ansiColor('xterm') { - sh 'docker pull jc21/${IMAGE}:develop-${AMD64_TAG}' - //sh 'docker pull jc21/${IMAGE}:develop-${ARM64_TAG}' - //sh 'docker pull jc21/${IMAGE}:develop-${ARMV7_TAG}' - //sh 'docker pull jc21/${IMAGE}:${TAG_VERSION}-${ARMV6_TAG}' - - sh 'docker manifest push --purge jc21/${IMAGE}:develop || :' - sh 'docker manifest create jc21/${IMAGE}:develop jc21/${IMAGE}:develop-${AMD64_TAG}' + agent { + label 'docker-multiarch' + } + options { + buildDiscarder(logRotator(numToKeepStr: '5')) + disableConcurrentBuilds() + } + environment { + IMAGE = "nginx-proxy-manager" + BUILD_VERSION = getVersion() + MAJOR_VERSION = "2" + COMPOSE_PROJECT_NAME = "npm_${GIT_BRANCH}_${BUILD_NUMBER}" + COMPOSE_FILE = 'docker/docker-compose.ci.yml' + COMPOSE_INTERACTIVE_NO_CLI = 1 + BUILDX_NAME = "${COMPOSE_PROJECT_NAME}" + BRANCH_LOWER = "${BRANCH_NAME.toLowerCase()}" + + // Defaults to the Branch name, which is applies to all branches AND pr's + BUILDX_PUSH_TAGS = "-t docker.io/jc21/${IMAGE}:github-${BRANCH_LOWER}" + } + stages { + stage('Environment') { + parallel { + stage('Master') { + when { + branch 'master' + } + steps { + script { + env.BUILDX_PUSH_TAGS = "-t docker.io/jc21/${IMAGE}:${BUILD_VERSION} -t docker.io/jc21/${IMAGE}:${MAJOR_VERSION}" + } + } + } + } + } + stage('Frontend') { + steps { + ansiColor('xterm') { + sh './scripts/frontend-build' + } + } + } + stage('Backend') { + steps { + ansiColor('xterm') { + echo 'Checking Syntax ...' + // See: https://github.com/yarnpkg/yarn/issues/3254 + sh '''docker run --rm \\ + -v "$(pwd)/backend:/app" \\ + -w /app \\ + node:latest \\ + sh -c "yarn install && yarn eslint . && rm -rf node_modules" + ''' + + echo 'Docker Build ...' + sh '''docker build --pull --no-cache --squash --compress \\ + -t "${IMAGE}:ci-${BUILD_NUMBER}" \\ + -f docker/Dockerfile \\ + --build-arg TARGETPLATFORM=linux/amd64 \\ + --build-arg BUILDPLATFORM=linux/amd64 \\ + --build-arg BUILD_VERSION="${BUILD_VERSION}" \\ + --build-arg BUILD_COMMIT="${BUILD_COMMIT}" \\ + --build-arg BUILD_DATE="$(date '+%Y-%m-%d %T %Z')" \\ + . + ''' + } + } + } + stage('Test') { + steps { + ansiColor('xterm') { + // Bring up a stack + sh 'docker-compose up -d fullstack' + sh './scripts/wait-healthy $(docker-compose ps -q fullstack) 120' + + // Run tests + sh 'rm -rf test/results' + sh 'docker-compose up cypress' + // Get results + sh 'docker cp -L "$(docker-compose ps -q cypress):/results" test/' + } + } + post { + always { + junit 'test/results/junit/*' + // Cypress videos and screenshot artifacts + dir(path: 'test/results') { + archiveArtifacts allowEmptyArchive: true, artifacts: '**/*', excludes: '**/*.xml' + } + // Dumps to analyze later + sh 'mkdir -p debug' + sh 'docker-compose logs fullstack | gzip > debug/docker_fullstack.log.gz' + } + } + } + stage('MultiArch Build') { + when { + not { + equals expected: 'UNSTABLE', actual: currentBuild.result + } + } + steps { + ansiColor('xterm') { + withCredentials([usernamePassword(credentialsId: 'jc21-dockerhub', passwordVariable: 'dpass', usernameVariable: 'duser')]) { + sh "docker login -u '${duser}' -p '${dpass}'" + // Buildx with push + sh "./scripts/buildx --push ${BUILDX_PUSH_TAGS}" + } + } + } + } + stage('PR Comment') { + when { + allOf { + changeRequest() + not { + equals expected: 'UNSTABLE', actual: currentBuild.result + } + } + } + steps { + ansiColor('xterm') { + script { + def comment = pullRequest.comment("Docker Image for build ${BUILD_NUMBER} is available on [DockerHub](https://cloud.docker.com/repository/docker/jc21/${IMAGE}) as `jc21/${IMAGE}:github-${BRANCH_LOWER}`") + } + } + } + } + } + post { + always { + sh 'docker-compose down --rmi all --remove-orphans --volumes -t 30' + sh 'echo Reverting ownership' + sh 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} chown -R $(id -u):$(id -g) /data' + } + success { + juxtapose event: 'success' + sh 'figlet "SUCCESS"' + } + failure { + juxtapose event: 'failure' + sh 'figlet "FAILURE"' + } + unstable { + archiveArtifacts(artifacts: 'debug/**.*', allowEmptyArchive: true) + juxtapose event: 'unstable' + sh 'figlet "UNSTABLE"' + } + } +} - sh 'docker manifest annotate jc21/${IMAGE}:develop jc21/${IMAGE}:develop-${AMD64_TAG} --arch ${AMD64_TAG}' - //sh 'docker manifest annotate jc21/${IMAGE}:develop jc21/${IMAGE}:develop-${ARM64_TAG} --os linux --arch ${ARM64_TAG}' - //sh 'docker manifest annotate jc21/${IMAGE}:develop jc21/${IMAGE}:develop-${ARMV7_TAG} --os linux --arch arm --variant ${ARMV7_TAG}' - //sh 'docker manifest annotate jc21/${IMAGE}:develop jc21/${IMAGE}:develop-${ARMV6_TAG} --os linux --arch arm --variant ${ARMV6_TAG}' - } - } - } - // ======================== - // cleanup - // ======================== - stage('Latest Cleanup') { - when { - branch 'master' - } - steps { - ansiColor('xterm') { - sh 'docker rmi jc21/${IMAGE}:latest jc21/${IMAGE}:latest-${AMD64_TAG} jc21/${IMAGE}:latest-${ARM64_TAG} jc21/${IMAGE}:latest-${ARMV7_TAG} || echo ""' - sh 'docker rmi jc21/${IMAGE}:${MAJOR_VERSION}-${AMD64_TAG} jc21/${IMAGE}:${MAJOR_VERSION}-${ARM64_TAG} jc21/${IMAGE}:${MAJOR_VERSION}-${ARMV7_TAG} || echo ""' - sh 'docker rmi jc21/${IMAGE}:${TAG_VERSION}-${AMD64_TAG} jc21/${IMAGE}:${TAG_VERSION}-${ARM64_TAG} jc21/${IMAGE}:${TAG_VERSION}-${ARMV7_TAG} || echo ""' - } - } - } - stage('Develop Cleanup') { - when { - branch 'develop' - } - steps { - ansiColor('xterm') { - sh 'docker rmi jc21/${IMAGE}:develop jc21/${IMAGE}:develop-${AMD64_TAG} || echo ""' - } - } - } - stage('PR Cleanup') { - when { - changeRequest() - } - steps { - ansiColor('xterm') { - sh 'docker rmi jc21/${IMAGE}:github-${BRANCH_LOWER}-${AMD64_TAG} || echo ""' - } - } - } - } - post { - success { - juxtapose event: 'success' - sh 'figlet "SUCCESS"' - } - failure { - juxtapose event: 'failure' - sh 'figlet "FAILURE"' - } - always { - sh 'echo Reverting ownership' - sh 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} chown -R $(id -u):$(id -g) /data' - } - } +def getVersion() { + ver = sh(script: 'cat .version', returnStdout: true) + return ver.trim() } -def getPackageVersion() { - ver = sh(script: 'docker run --rm -v $(pwd):/data ${DOCKER_CI_TOOLS} bash -c "cat /data/package.json|jq -r \'.version\'"', returnStdout: true) - return ver.trim() +def getCommit() { + ver = sh(script: 'git log -n 1 --format=%h', returnStdout: true) + return ver.trim() } diff --git a/README.md b/README.md index a0270ba30..179295085 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ ![Stars](https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge) ![Pulls](https://img.shields.io/docker/pulls/jc21/nginx-proxy-manager.svg?style=for-the-badge) +[![Build Status](https://ci.nginxproxymanager.jc21.com/buildStatus/icon?job=nginx-proxy-manager%2Fmaster&style=flat-square)](https://ci.nginxproxymanager.jc21.com/job/nginx-proxy-manager/job/master/) + This project comes as a pre-built docker image that enables you to easily forward to your websites running at home or otherwise, including free SSL, without having to know too much about Nginx or Letsencrypt. @@ -84,8 +86,8 @@ I won't go in to too much detail here but here are the basics for someone new to 1. Your home router will have a Port Forwarding section somewhere. Log in and find it 2. Add port forwarding for port 80 and 443 to the server hosting this project -3. Configure your domain name details to point to your home, either with a static ip or a service like DuckDNS -4. Use the Nginx Proxy Manager here as your gateway to forward to your other web based services +3. Configure your domain name details to point to your home, either with a static ip or a service like DuckDNS or [Amazon Route53](https://github.com/jc21/route53-ddns) +4. Use the Nginx Proxy Manager as your gateway to forward to your other web based services ## Nginx Proxy Manager in the wild diff --git a/backend/.eslintrc.json b/backend/.eslintrc.json new file mode 100644 index 000000000..6d6172a48 --- /dev/null +++ b/backend/.eslintrc.json @@ -0,0 +1,73 @@ +{ + "env": { + "node": true, + "es6": true + }, + "extends": [ + "eslint:recommended" + ], + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module" + }, + "plugins": [ + "align-assignments" + ], + "rules": { + "arrow-parens": [ + "error", + "always" + ], + "indent": [ + "error", + "tab" + ], + "linebreak-style": [ + "error", + "unix" + ], + "quotes": [ + "error", + "single" + ], + "semi": [ + "error", + "always" + ], + "key-spacing": [ + "error", + { + "align": "value" + } + ], + "comma-spacing": [ + "error", + { + "before": false, + "after": true + } + ], + "func-call-spacing": [ + "error", + "never" + ], + "keyword-spacing": [ + "error", + { + "before": true + } + ], + "no-irregular-whitespace": "error", + "no-unused-expressions": 0, + "align-assignments/align-assignments": [ + 2, + { + "requiresOnly": false + } + ] + } +} \ No newline at end of file diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 000000000..963bfd80b --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,6 @@ +config/development.json +data/* +yarn-error.log +tmp +certbot.log +node_modules diff --git a/backend/.prettierrc b/backend/.prettierrc new file mode 100644 index 000000000..fefbcfa6d --- /dev/null +++ b/backend/.prettierrc @@ -0,0 +1,11 @@ +{ + "printWidth": 320, + "tabWidth": 4, + "useTabs": true, + "semi": true, + "singleQuote": true, + "bracketSpacing": true, + "jsxBracketSameLine": true, + "trailingComma": "all", + "proseWrap": "always" +} diff --git a/backend/app.js b/backend/app.js new file mode 100644 index 000000000..fc39e105c --- /dev/null +++ b/backend/app.js @@ -0,0 +1,90 @@ +const express = require('express'); +const bodyParser = require('body-parser'); +const fileUpload = require('express-fileupload'); +const compression = require('compression'); +const log = require('./logger').express; + +/** + * App + */ +const app = express(); +app.use(fileUpload()); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({extended: true})); + +// Gzip +app.use(compression()); + +/** + * General Logging, BEFORE routes + */ + +app.disable('x-powered-by'); +app.enable('trust proxy', ['loopback', 'linklocal', 'uniquelocal']); +app.enable('strict routing'); + +// pretty print JSON when not live +if (process.env.NODE_ENV !== 'production') { + app.set('json spaces', 2); +} + +// CORS for everything +app.use(require('./lib/express/cors')); + +// General security/cache related headers + server header +app.use(function (req, res, next) { + let x_frame_options = 'DENY'; + + if (typeof process.env.X_FRAME_OPTIONS !== 'undefined' && process.env.X_FRAME_OPTIONS) { + x_frame_options = process.env.X_FRAME_OPTIONS; + } + + res.set({ + 'Strict-Transport-Security': 'includeSubDomains; max-age=631138519; preload', + 'X-XSS-Protection': '1; mode=block', + 'X-Content-Type-Options': 'nosniff', + 'X-Frame-Options': x_frame_options, + 'Cache-Control': 'no-cache, no-store, max-age=0, must-revalidate', + Pragma: 'no-cache', + Expires: 0 + }); + next(); +}); + +app.use(require('./lib/express/jwt')()); +app.use('/', require('./routes/api/main')); + +// production error handler +// no stacktraces leaked to user +// eslint-disable-next-line +app.use(function (err, req, res, next) { + + let payload = { + error: { + code: err.status, + message: err.public ? err.message : 'Internal Error' + } + }; + + if (process.env.NODE_ENV === 'development') { + payload.debug = { + stack: typeof err.stack !== 'undefined' && err.stack ? err.stack.split('\n') : null, + previous: err.previous + }; + } + + // Not every error is worth logging - but this is good for now until it gets annoying. + if (typeof err.stack !== 'undefined' && err.stack) { + if (process.env.NODE_ENV === 'development') { + log.debug(err.stack); + } else if (typeof err.public == 'undefined' || !err.public) { + log.warn(err.message); + } + } + + res + .status(err.status || 500) + .send(payload); +}); + +module.exports = app; diff --git a/config/README.md b/backend/config/README.md similarity index 100% rename from config/README.md rename to backend/config/README.md diff --git a/config/default.json b/backend/config/default.json similarity index 100% rename from config/default.json rename to backend/config/default.json diff --git a/backend/db.js b/backend/db.js new file mode 100644 index 000000000..1f4d5b021 --- /dev/null +++ b/backend/db.js @@ -0,0 +1,25 @@ +const config = require('config'); + +if (!config.has('database')) { + throw new Error('Database config does not exist! Please read the instructions: https://github.com/jc21/nginx-proxy-manager/blob/master/doc/INSTALL.md'); +} + +let data = { + client: config.database.engine, + connection: { + host: config.database.host, + user: config.database.user, + password: config.database.password, + database: config.database.name, + port: config.database.port + }, + migrations: { + tableName: 'migrations' + } +}; + +if (typeof config.database.version !== 'undefined') { + data.version = config.database.version; +} + +module.exports = require('knex')(data); diff --git a/backend/doc/api.swagger.json b/backend/doc/api.swagger.json new file mode 100644 index 000000000..06c025648 --- /dev/null +++ b/backend/doc/api.swagger.json @@ -0,0 +1,1254 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Nginx Proxy Manager API", + "version": "2.x.x" + }, + "servers": [ + { + "url": "http://127.0.0.1:81/api" + } + ], + "paths": { + "/": { + "get": { + "operationId": "health", + "summary": "Returns the API health status", + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "status": "OK", + "version": { + "major": 2, + "minor": 1, + "revision": 0 + } + } + } + }, + "schema": { + "$ref": "#/components/schemas/HealthObject" + } + } + } + } + } + } + }, + "/schema": { + "get": { + "operationId": "schema", + "responses": { + "200": { + "description": "200 response" + } + }, + "summary": "Returns this swagger API schema" + } + }, + "/tokens": { + "get": { + "operationId": "refreshToken", + "summary": "Refresh your access token", + "tags": [ + "Tokens" + ], + "security": [ + { + "BearerAuth": [ + "tokens" + ] + } + ], + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "expires": 1566540510, + "token": "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.ey...xaHKYr3Kk6MvkUjcC4" + } + } + }, + "schema": { + "$ref": "#/components/schemas/TokenObject" + } + } + } + } + } + }, + "post": { + "operationId": "requestToken", + "parameters": [ + { + "description": "Credentials Payload", + "in": "body", + "name": "credentials", + "required": true, + "schema": { + "additionalProperties": false, + "properties": { + "identity": { + "minLength": 1, + "type": "string" + }, + "scope": { + "minLength": 1, + "type": "string", + "enum": [ + "user" + ] + }, + "secret": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "identity", + "secret" + ], + "type": "object" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "result": { + "expires": 1566540510, + "token": "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.ey...xaHKYr3Kk6MvkUjcC4" + } + } + } + }, + "schema": { + "$ref": "#/components/schemas/TokenObject" + } + } + }, + "description": "200 response" + } + }, + "summary": "Request a new access token from credentials", + "tags": [ + "Tokens" + ] + } + }, + "/settings": { + "get": { + "operationId": "getSettings", + "summary": "Get all settings", + "tags": [ + "Settings" + ], + "security": [ + { + "BearerAuth": [ + "settings" + ] + } + ], + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "examples": { + "default": { + "value": [ + { + "id": "default-site", + "name": "Default Site", + "description": "What to show when Nginx is hit with an unknown Host", + "value": "congratulations", + "meta": {} + } + ] + } + }, + "schema": { + "$ref": "#/components/schemas/SettingsList" + } + } + } + } + } + } + }, + "/settings/{settingID}": { + "get": { + "operationId": "getSetting", + "summary": "Get a setting", + "tags": [ + "Settings" + ], + "security": [ + { + "BearerAuth": [ + "settings" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "settingID", + "schema": { + "type": "string", + "minLength": 1 + }, + "required": true, + "description": "Setting ID", + "example": "default-site" + } + ], + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "id": "default-site", + "name": "Default Site", + "description": "What to show when Nginx is hit with an unknown Host", + "value": "congratulations", + "meta": {} + } + } + }, + "schema": { + "$ref": "#/components/schemas/SettingObject" + } + } + } + } + } + }, + "put": { + "operationId": "updateSetting", + "summary": "Update a setting", + "tags": [ + "Settings" + ], + "security": [ + { + "BearerAuth": [ + "settings" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "settingID", + "schema": { + "type": "string", + "minLength": 1 + }, + "required": true, + "description": "Setting ID", + "example": "default-site" + }, + { + "in": "body", + "name": "setting", + "description": "Setting Payload", + "required": true, + "schema": { + "$ref": "#/components/schemas/SettingObject" + } + } + ], + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "id": "default-site", + "name": "Default Site", + "description": "What to show when Nginx is hit with an unknown Host", + "value": "congratulations", + "meta": {} + } + } + }, + "schema": { + "$ref": "#/components/schemas/SettingObject" + } + } + } + } + } + } + }, + "/users": { + "get": { + "operationId": "getUsers", + "summary": "Get all users", + "tags": [ + "Users" + ], + "security": [ + { + "BearerAuth": [ + "users" + ] + } + ], + "parameters": [ + { + "in": "query", + "name": "expand", + "description": "Expansions", + "schema": { + "type": "string", + "enum": [ + "permissions" + ] + } + } + ], + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "examples": { + "default": { + "value": [ + { + "id": 1, + "created_on": "2020-01-30T09:36:08.000Z", + "modified_on": "2020-01-30T09:41:04.000Z", + "is_disabled": 0, + "email": "jc@jc21.com", + "name": "Jamie Curnow", + "nickname": "James", + "avatar": "//www.gravatar.com/avatar/6193176330f8d38747f038c170ddb193?default=mm", + "roles": [ + "admin" + ] + } + ] + }, + "withPermissions": { + "value": [ + { + "id": 1, + "created_on": "2020-01-30T09:36:08.000Z", + "modified_on": "2020-01-30T09:41:04.000Z", + "is_disabled": 0, + "email": "jc@jc21.com", + "name": "Jamie Curnow", + "nickname": "James", + "avatar": "//www.gravatar.com/avatar/6193176330f8d38747f038c170ddb193?default=mm", + "roles": [ + "admin" + ], + "permissions": { + "visibility": "all", + "proxy_hosts": "manage", + "redirection_hosts": "manage", + "dead_hosts": "manage", + "streams": "manage", + "access_lists": "manage", + "certificates": "manage" + } + } + ] + } + }, + "schema": { + "$ref": "#/components/schemas/UsersList" + } + } + } + } + } + }, + "post": { + "operationId": "createUser", + "summary": "Create a User", + "tags": [ + "Users" + ], + "security": [ + { + "BearerAuth": [ + "users" + ] + } + ], + "parameters": [ + { + "in": "body", + "name": "user", + "description": "User Payload", + "required": true, + "schema": { + "$ref": "#/components/schemas/UserObject" + } + } + ], + "responses": { + "201": { + "description": "201 response", + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "id": 2, + "created_on": "2020-01-30T09:36:08.000Z", + "modified_on": "2020-01-30T09:41:04.000Z", + "is_disabled": 0, + "email": "jc@jc21.com", + "name": "Jamie Curnow", + "nickname": "James", + "avatar": "//www.gravatar.com/avatar/6193176330f8d38747f038c170ddb193?default=mm", + "roles": [ + "admin" + ], + "permissions": { + "visibility": "all", + "proxy_hosts": "manage", + "redirection_hosts": "manage", + "dead_hosts": "manage", + "streams": "manage", + "access_lists": "manage", + "certificates": "manage" + } + } + } + }, + "schema": { + "$ref": "#/components/schemas/UserObject" + } + } + } + } + } + } + }, + "/users/{userID}": { + "get": { + "operationId": "getUser", + "summary": "Get a user", + "tags": [ + "Users" + ], + "security": [ + { + "BearerAuth": [ + "users" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "userID", + "schema": { + "oneOf": [ + { + "type": "string", + "pattern": "^me$" + }, + { + "type": "integer", + "minimum": 1 + } + ] + }, + "required": true, + "description": "User ID or 'me' for yourself", + "example": 1 + } + ], + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "id": 1, + "created_on": "2020-01-30T09:36:08.000Z", + "modified_on": "2020-01-30T09:41:04.000Z", + "is_disabled": 0, + "email": "jc@jc21.com", + "name": "Jamie Curnow", + "nickname": "James", + "avatar": "//www.gravatar.com/avatar/6193176330f8d38747f038c170ddb193?default=mm", + "roles": [ + "admin" + ] + } + } + }, + "schema": { + "$ref": "#/components/schemas/UserObject" + } + } + } + } + } + }, + "put": { + "operationId": "updateUser", + "summary": "Update a User", + "tags": [ + "Users" + ], + "security": [ + { + "BearerAuth": [ + "users" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "userID", + "schema": { + "oneOf": [ + { + "type": "string", + "pattern": "^me$" + }, + { + "type": "integer", + "minimum": 1 + } + ] + }, + "required": true, + "description": "User ID or 'me' for yourself", + "example": 2 + }, + { + "in": "body", + "name": "user", + "description": "User Payload", + "required": true, + "schema": { + "$ref": "#/components/schemas/UserObject" + } + } + ], + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "id": 2, + "created_on": "2020-01-30T09:36:08.000Z", + "modified_on": "2020-01-30T09:41:04.000Z", + "is_disabled": 0, + "email": "jc@jc21.com", + "name": "Jamie Curnow", + "nickname": "James", + "avatar": "//www.gravatar.com/avatar/6193176330f8d38747f038c170ddb193?default=mm", + "roles": [ + "admin" + ] + } + } + }, + "schema": { + "$ref": "#/components/schemas/UserObject" + } + } + } + } + } + }, + "delete": { + "operationId": "deleteUser", + "summary": "Delete a User", + "tags": [ + "Users" + ], + "security": [ + { + "BearerAuth": [ + "users" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "userID", + "schema": { + "type": "integer", + "minimum": 1 + }, + "required": true, + "description": "User ID", + "example": 2 + } + ], + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "examples": { + "default": { + "value": true + } + }, + "schema": { + "type": "boolean" + } + } + } + } + } + } + }, + "/users/{userID}/auth": { + "put": { + "operationId": "updateUserAuth", + "summary": "Update a User's Authentication", + "tags": [ + "Users" + ], + "security": [ + { + "BearerAuth": [ + "users" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "userID", + "schema": { + "oneOf": [ + { + "type": "string", + "pattern": "^me$" + }, + { + "type": "integer", + "minimum": 1 + } + ] + }, + "required": true, + "description": "User ID or 'me' for yourself", + "example": 2 + }, + { + "in": "body", + "name": "user", + "description": "User Payload", + "required": true, + "schema": { + "$ref": "#/components/schemas/AuthObject" + } + } + ], + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "examples": { + "default": { + "value": true + } + }, + "schema": { + "type": "boolean" + } + } + } + } + } + } + }, + "/users/{userID}/permissions": { + "put": { + "operationId": "updateUserPermissions", + "summary": "Update a User's Permissions", + "tags": [ + "Users" + ], + "security": [ + { + "BearerAuth": [ + "users" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "userID", + "schema": { + "type": "integer", + "minimum": 1 + }, + "required": true, + "description": "User ID", + "example": 2 + }, + { + "in": "body", + "name": "user", + "description": "Permissions Payload", + "required": true, + "schema": { + "$ref": "#/components/schemas/PermissionsObject" + } + } + ], + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "examples": { + "default": { + "value": true + } + }, + "schema": { + "type": "boolean" + } + } + } + } + } + } + }, + "/users/{userID}/login": { + "put": { + "operationId": "loginAsUser", + "summary": "Login as this user", + "tags": [ + "Users" + ], + "security": [ + { + "BearerAuth": [ + "users" + ] + } + ], + "parameters": [ + { + "in": "path", + "name": "userID", + "schema": { + "type": "integer", + "minimum": 1 + }, + "required": true, + "description": "User ID", + "example": 2 + } + ], + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "token": "eyJhbGciOiJSUzI1NiIsInR...16OjT8B3NLyXg", + "expires": "2020-01-31T10:56:23.239Z", + "user": { + "id": 1, + "created_on": "2020-01-30T10:43:44.000Z", + "modified_on": "2020-01-30T10:43:44.000Z", + "is_disabled": 0, + "email": "jc@jc21.com", + "name": "Jamie Curnow", + "nickname": "James", + "avatar": "//www.gravatar.com/avatar/3c8d73f45fd8763f827b964c76e6032a?default=mm", + "roles": [ + "admin" + ] + } + } + } + }, + "schema": { + "type": "object", + "description": "Login object", + "required": [ + "expires", + "token", + "user" + ], + "additionalProperties": false, + "properties": { + "expires": { + "description": "Token Expiry Unix Time", + "example": 1566540249, + "minimum": 1, + "type": "number" + }, + "token": { + "description": "JWT Token", + "example": "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.ey...xaHKYr3Kk6MvkUjcC4", + "type": "string" + }, + "user": { + "$ref": "#/components/schemas/UserObject" + } + } + } + } + } + } + } + } + }, + "/reports/hosts": { + "get": { + "operationId": "reportsHosts", + "summary": "Report on Host Statistics", + "tags": [ + "Reports" + ], + "security": [ + { + "BearerAuth": [ + "reports" + ] + } + ], + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "proxy": 20, + "redirection": 1, + "stream": 0, + "dead": 1 + } + } + }, + "schema": { + "$ref": "#/components/schemas/HostReportObject" + } + } + } + } + } + } + }, + "/audit-log": { + "get": { + "operationId": "getAuditLog", + "summary": "Get Audit Log", + "tags": [ + "Audit Log" + ], + "security": [ + { + "BearerAuth": [ + "audit-log" + ] + } + ], + "responses": { + "200": { + "description": "200 response", + "content": { + "application/json": { + "examples": { + "default": { + "value": { + "proxy": 20, + "redirection": 1, + "stream": 0, + "dead": 1 + } + } + }, + "schema": { + "$ref": "#/components/schemas/HostReportObject" + } + } + } + } + } + } + } + }, + "components": { + "securitySchemes": { + "BearerAuth": { + "type": "http", + "scheme": "bearer" + } + }, + "schemas": { + "HealthObject": { + "type": "object", + "description": "Health object", + "additionalProperties": false, + "required": [ + "status", + "version" + ], + "properties": { + "status": { + "type": "string", + "description": "Healthy", + "example": "OK" + }, + "version": { + "type": "object", + "description": "The version object", + "example": { + "major": 2, + "minor": 0, + "revision": 0 + }, + "additionalProperties": false, + "required": [ + "major", + "minor", + "revision" + ], + "properties": { + "major": { + "type": "integer", + "minimum": 0 + }, + "minor": { + "type": "integer", + "minimum": 0 + }, + "revision": { + "type": "integer", + "minimum": 0 + } + } + } + } + }, + "TokenObject": { + "type": "object", + "description": "Token object", + "required": [ + "expires", + "token" + ], + "additionalProperties": false, + "properties": { + "expires": { + "description": "Token Expiry Unix Time", + "example": 1566540249, + "minimum": 1, + "type": "number" + }, + "token": { + "description": "JWT Token", + "example": "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.ey...xaHKYr3Kk6MvkUjcC4", + "type": "string" + } + } + }, + "SettingObject": { + "type": "object", + "description": "Setting object", + "required": [ + "id", + "name", + "description", + "value", + "meta" + ], + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "Setting ID", + "minLength": 1, + "example": "default-site" + }, + "name": { + "type": "string", + "description": "Setting Display Name", + "minLength": 1, + "example": "Default Site" + }, + "description": { + "type": "string", + "description": "Meaningful description", + "minLength": 1, + "example": "What to show when Nginx is hit with an unknown Host" + }, + "value": { + "description": "Value in almost any form", + "example": "congratulations", + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "integer" + }, + { + "type": "object" + }, + { + "type": "number" + }, + { + "type": "array" + } + ] + }, + "meta": { + "description": "Extra metadata", + "example": {}, + "type": "object" + } + } + }, + "SettingsList": { + "type": "array", + "description": "Setting list", + "items": { + "$ref": "#/components/schemas/SettingObject" + } + }, + "UserObject": { + "type": "object", + "description": "User object", + "required": [ + "id", + "created_on", + "modified_on", + "is_disabled", + "email", + "name", + "nickname", + "avatar", + "roles" + ], + "additionalProperties": false, + "properties": { + "id": { + "type": "integer", + "description": "User ID", + "minimum": 1, + "example": 1 + }, + "created_on": { + "type": "string", + "description": "Created Date", + "example": "2020-01-30T09:36:08.000Z" + }, + "modified_on": { + "type": "string", + "description": "Modified Date", + "example": "2020-01-30T09:41:04.000Z" + }, + "is_disabled": { + "type": "integer", + "minimum": 0, + "maximum": 1, + "description": "Is user Disabled (0 = false, 1 = true)", + "example": 0 + }, + "email": { + "type": "string", + "description": "Email", + "minLength": 3, + "example": "jc@jc21.com" + }, + "name": { + "type": "string", + "description": "Name", + "minLength": 1, + "example": "Jamie Curnow" + }, + "nickname": { + "type": "string", + "description": "Nickname", + "example": "James" + }, + "avatar": { + "type": "string", + "description": "Gravatar URL based on email, without scheme", + "example": "//www.gravatar.com/avatar/6193176330f8d38747f038c170ddb193?default=mm" + }, + "roles": { + "description": "Roles applied", + "example": [ + "admin" + ], + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "UsersList": { + "type": "array", + "description": "User list", + "items": { + "$ref": "#/components/schemas/UserObject" + } + }, + "AuthObject": { + "type": "object", + "description": "Authentication Object", + "required": [ + "type", + "secret" + ], + "properties": { + "type": { + "type": "string", + "pattern": "^password$", + "example": "password" + }, + "current": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "example": "changeme" + }, + "secret": { + "type": "string", + "minLength": 8, + "maxLength": 64, + "example": "mySuperN3wP@ssword!" + } + } + }, + "PermissionsObject": { + "type": "object", + "properties": { + "visibility": { + "type": "string", + "description": "Visibility Type", + "enum": [ + "all", + "user" + ] + }, + "access_lists": { + "type": "string", + "description": "Access Lists Permissions", + "enum": [ + "hidden", + "view", + "manage" + ] + }, + "dead_hosts": { + "type": "string", + "description": "404 Hosts Permissions", + "enum": [ + "hidden", + "view", + "manage" + ] + }, + "proxy_hosts": { + "type": "string", + "description": "Proxy Hosts Permissions", + "enum": [ + "hidden", + "view", + "manage" + ] + }, + "redirection_hosts": { + "type": "string", + "description": "Redirection Permissions", + "enum": [ + "hidden", + "view", + "manage" + ] + }, + "streams": { + "type": "string", + "description": "Streams Permissions", + "enum": [ + "hidden", + "view", + "manage" + ] + }, + "certificates": { + "type": "string", + "description": "Certificates Permissions", + "enum": [ + "hidden", + "view", + "manage" + ] + } + } + }, + "HostReportObject": { + "type": "object", + "properties": { + "proxy": { + "type": "integer", + "description": "Proxy Hosts Count" + }, + "redirection": { + "type": "integer", + "description": "Redirection Hosts Count" + }, + "stream": { + "type": "integer", + "description": "Streams Count" + }, + "dead": { + "type": "integer", + "description": "404 Hosts Count" + } + } + } + } + } +} \ No newline at end of file diff --git a/backend/index.js b/backend/index.js new file mode 100644 index 000000000..0c08af328 --- /dev/null +++ b/backend/index.js @@ -0,0 +1,47 @@ +#!/usr/bin/env node + +const logger = require('./logger').global; + +function appStart () { + const migrate = require('./migrate'); + const setup = require('./setup'); + const app = require('./app'); + const apiValidator = require('./lib/validator/api'); + const internalCertificate = require('./internal/certificate'); + const internalIpRanges = require('./internal/ip_ranges'); + + return migrate.latest() + .then(setup) + .then(() => { + return apiValidator.loadSchemas; + }) + .then(internalIpRanges.fetch) + .then(() => { + + internalCertificate.initTimer(); + internalIpRanges.initTimer(); + + const server = app.listen(3000, () => { + logger.info('Backend PID ' + process.pid + ' listening on port 3000 ...'); + + process.on('SIGTERM', () => { + logger.info('PID ' + process.pid + ' received SIGTERM'); + server.close(() => { + logger.info('Stopping.'); + process.exit(0); + }); + }); + }); + }) + .catch((err) => { + logger.error(err.message); + setTimeout(appStart, 1000); + }); +} + +try { + appStart(); +} catch (err) { + logger.error(err.message, err); + process.exit(1); +} diff --git a/backend/internal/access-list.js b/backend/internal/access-list.js new file mode 100644 index 000000000..bfecf613d --- /dev/null +++ b/backend/internal/access-list.js @@ -0,0 +1,482 @@ +const _ = require('lodash'); +const fs = require('fs'); +const batchflow = require('batchflow'); +const logger = require('../logger').access; +const error = require('../lib/error'); +const accessListModel = require('../models/access_list'); +const accessListAuthModel = require('../models/access_list_auth'); +const proxyHostModel = require('../models/proxy_host'); +const internalAuditLog = require('./audit-log'); +const internalNginx = require('./nginx'); +const utils = require('../lib/utils'); + +function omissions () { + return ['is_deleted']; +} + +const internalAccessList = { + + /** + * @param {Access} access + * @param {Object} data + * @returns {Promise} + */ + create: (access, data) => { + return access.can('access_lists:create', data) + .then((/*access_data*/) => { + return accessListModel + .query() + .omit(omissions()) + .insertAndFetch({ + name: data.name, + owner_user_id: access.token.getUserId(1) + }); + }) + .then((row) => { + data.id = row.id; + + // Now add the items + let promises = []; + data.items.map((item) => { + promises.push(accessListAuthModel + .query() + .insert({ + access_list_id: row.id, + username: item.username, + password: item.password + }) + ); + }); + + return Promise.all(promises); + }) + .then(() => { + // re-fetch with expansions + return internalAccessList.get(access, { + id: data.id, + expand: ['owner', 'items'] + }, true /* <- skip masking */); + }) + .then((row) => { + // Audit log + data.meta = _.assign({}, data.meta || {}, row.meta); + + return internalAccessList.build(row) + .then(() => { + if (row.proxy_host_count) { + return internalNginx.reload(); + } + }) + .then(() => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'created', + object_type: 'access-list', + object_id: row.id, + meta: internalAccessList.maskItems(data) + }); + }) + .then(() => { + return internalAccessList.maskItems(row); + }); + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Integer} data.id + * @param {String} [data.name] + * @param {String} [data.items] + * @return {Promise} + */ + update: (access, data) => { + return access.can('access_lists:update', data.id) + .then((/*access_data*/) => { + return internalAccessList.get(access, {id: data.id}); + }) + .then((row) => { + if (row.id !== data.id) { + // Sanity check that something crazy hasn't happened + throw new error.InternalValidationError('Access List could not be updated, IDs do not match: ' + row.id + ' !== ' + data.id); + } + + }) + .then(() => { + // patch name if specified + if (typeof data.name !== 'undefined' && data.name) { + return accessListModel + .query() + .where({id: data.id}) + .patch({ + name: data.name + }); + } + }) + .then(() => { + // Check for items and add/update/remove them + if (typeof data.items !== 'undefined' && data.items) { + let promises = []; + let items_to_keep = []; + + data.items.map(function (item) { + if (item.password) { + promises.push(accessListAuthModel + .query() + .insert({ + access_list_id: data.id, + username: item.username, + password: item.password + }) + ); + } else { + // This was supplied with an empty password, which means keep it but don't change the password + items_to_keep.push(item.username); + } + }); + + let query = accessListAuthModel + .query() + .delete() + .where('access_list_id', data.id); + + if (items_to_keep.length) { + query.andWhere('username', 'NOT IN', items_to_keep); + } + + return query + .then(() => { + // Add new items + if (promises.length) { + return Promise.all(promises); + } + }); + } + }) + .then(() => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'updated', + object_type: 'access-list', + object_id: data.id, + meta: internalAccessList.maskItems(data) + }); + }) + .then(() => { + // re-fetch with expansions + return internalAccessList.get(access, { + id: data.id, + expand: ['owner', 'items'] + }, true /* <- skip masking */); + }) + .then((row) => { + return internalAccessList.build(row) + .then(() => { + if (row.proxy_host_count) { + return internalNginx.reload(); + } + }) + .then(() => { + return internalAccessList.maskItems(row); + }); + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Integer} data.id + * @param {Array} [data.expand] + * @param {Array} [data.omit] + * @param {Boolean} [skip_masking] + * @return {Promise} + */ + get: (access, data, skip_masking) => { + if (typeof data === 'undefined') { + data = {}; + } + + return access.can('access_lists:get', data.id) + .then((access_data) => { + let query = accessListModel + .query() + .select('access_list.*', accessListModel.raw('COUNT(proxy_host.id) as proxy_host_count')) + .joinRaw('LEFT JOIN `proxy_host` ON `proxy_host`.`access_list_id` = `access_list`.`id` AND `proxy_host`.`is_deleted` = 0') + .where('access_list.is_deleted', 0) + .andWhere('access_list.id', data.id) + .allowEager('[owner,items,proxy_hosts]') + .omit(['access_list.is_deleted']) + .first(); + + if (access_data.permission_visibility !== 'all') { + query.andWhere('access_list.owner_user_id', access.token.getUserId(1)); + } + + // Custom omissions + if (typeof data.omit !== 'undefined' && data.omit !== null) { + query.omit(data.omit); + } + + if (typeof data.expand !== 'undefined' && data.expand !== null) { + query.eager('[' + data.expand.join(', ') + ']'); + } + + return query; + }) + .then((row) => { + if (row) { + if (!skip_masking && typeof row.items !== 'undefined' && row.items) { + row = internalAccessList.maskItems(row); + } + + return _.omit(row, omissions()); + } else { + throw new error.ItemNotFoundError(data.id); + } + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Integer} data.id + * @param {String} [data.reason] + * @returns {Promise} + */ + delete: (access, data) => { + return access.can('access_lists:delete', data.id) + .then(() => { + return internalAccessList.get(access, {id: data.id, expand: ['proxy_hosts', 'items']}); + }) + .then((row) => { + if (!row) { + throw new error.ItemNotFoundError(data.id); + } + + // 1. update row to be deleted + // 2. update any proxy hosts that were using it (ignoring permissions) + // 3. reconfigure those hosts + // 4. audit log + + // 1. update row to be deleted + return accessListModel + .query() + .where('id', row.id) + .patch({ + is_deleted: 1 + }) + .then(() => { + // 2. update any proxy hosts that were using it (ignoring permissions) + if (row.proxy_hosts) { + return proxyHostModel + .query() + .where('access_list_id', '=', row.id) + .patch({access_list_id: 0}) + .then(() => { + // 3. reconfigure those hosts, then reload nginx + + // set the access_list_id to zero for these items + row.proxy_hosts.map(function (val, idx) { + row.proxy_hosts[idx].access_list_id = 0; + }); + + return internalNginx.bulkGenerateConfigs('proxy_host', row.proxy_hosts); + }) + .then(() => { + return internalNginx.reload(); + }); + } + }) + .then(() => { + // delete the htpasswd file + let htpasswd_file = internalAccessList.getFilename(row); + + try { + fs.unlinkSync(htpasswd_file); + } catch (err) { + // do nothing + } + }) + .then(() => { + // 4. audit log + return internalAuditLog.add(access, { + action: 'deleted', + object_type: 'access-list', + object_id: row.id, + meta: _.omit(internalAccessList.maskItems(row), ['is_deleted', 'proxy_hosts']) + }); + }); + }) + .then(() => { + return true; + }); + }, + + /** + * All Lists + * + * @param {Access} access + * @param {Array} [expand] + * @param {String} [search_query] + * @returns {Promise} + */ + getAll: (access, expand, search_query) => { + return access.can('access_lists:list') + .then((access_data) => { + let query = accessListModel + .query() + .select('access_list.*', accessListModel.raw('COUNT(proxy_host.id) as proxy_host_count')) + .joinRaw('LEFT JOIN `proxy_host` ON `proxy_host`.`access_list_id` = `access_list`.`id` AND `proxy_host`.`is_deleted` = 0') + .where('access_list.is_deleted', 0) + .groupBy('access_list.id') + .omit(['access_list.is_deleted']) + .allowEager('[owner,items]') + .orderBy('access_list.name', 'ASC'); + + if (access_data.permission_visibility !== 'all') { + query.andWhere('owner_user_id', access.token.getUserId(1)); + } + + // Query is used for searching + if (typeof search_query === 'string') { + query.where(function () { + this.where('name', 'like', '%' + search_query + '%'); + }); + } + + if (typeof expand !== 'undefined' && expand !== null) { + query.eager('[' + expand.join(', ') + ']'); + } + + return query; + }) + .then((rows) => { + if (rows) { + rows.map(function (row, idx) { + if (typeof row.items !== 'undefined' && row.items) { + rows[idx] = internalAccessList.maskItems(row); + } + }); + } + + return rows; + }); + }, + + /** + * Report use + * + * @param {Integer} user_id + * @param {String} visibility + * @returns {Promise} + */ + getCount: (user_id, visibility) => { + let query = accessListModel + .query() + .count('id as count') + .where('is_deleted', 0); + + if (visibility !== 'all') { + query.andWhere('owner_user_id', user_id); + } + + return query.first() + .then((row) => { + return parseInt(row.count, 10); + }); + }, + + /** + * @param {Object} list + * @returns {Object} + */ + maskItems: (list) => { + if (list && typeof list.items !== 'undefined') { + list.items.map(function (val, idx) { + let repeat_for = 8; + let first_char = '*'; + + if (typeof val.password !== 'undefined' && val.password) { + repeat_for = val.password.length - 1; + first_char = val.password.charAt(0); + } + + list.items[idx].hint = first_char + ('*').repeat(repeat_for); + list.items[idx].password = ''; + }); + } + + return list; + }, + + /** + * @param {Object} list + * @param {Integer} list.id + * @returns {String} + */ + getFilename: (list) => { + return '/data/access/' + list.id; + }, + + /** + * @param {Object} list + * @param {Integer} list.id + * @param {String} list.name + * @param {Array} list.items + * @returns {Promise} + */ + build: (list) => { + logger.info('Building Access file #' + list.id + ' for: ' + list.name); + + return new Promise((resolve, reject) => { + let htpasswd_file = internalAccessList.getFilename(list); + + // 1. remove any existing access file + try { + fs.unlinkSync(htpasswd_file); + } catch (err) { + // do nothing + } + + // 2. create empty access file + try { + fs.writeFileSync(htpasswd_file, '', {encoding: 'utf8'}); + resolve(htpasswd_file); + } catch (err) { + reject(err); + } + }) + .then((htpasswd_file) => { + // 3. generate password for each user + if (list.items.length) { + return new Promise((resolve, reject) => { + batchflow(list.items).sequential() + .each((i, item, next) => { + if (typeof item.password !== 'undefined' && item.password.length) { + logger.info('Adding: ' + item.username); + + utils.exec('/usr/bin/htpasswd -b "' + htpasswd_file + '" "' + item.username + '" "' + item.password + '"') + .then((/*result*/) => { + next(); + }) + .catch((err) => { + logger.error(err); + next(err); + }); + } + }) + .error((err) => { + logger.error(err); + reject(err); + }) + .end((results) => { + logger.success('Built Access file #' + list.id + ' for: ' + list.name); + resolve(results); + }); + }); + } + }); + } +}; + +module.exports = internalAccessList; diff --git a/backend/internal/audit-log.js b/backend/internal/audit-log.js new file mode 100644 index 000000000..422b4f467 --- /dev/null +++ b/backend/internal/audit-log.js @@ -0,0 +1,78 @@ +const error = require('../lib/error'); +const auditLogModel = require('../models/audit-log'); + +const internalAuditLog = { + + /** + * All logs + * + * @param {Access} access + * @param {Array} [expand] + * @param {String} [search_query] + * @returns {Promise} + */ + getAll: (access, expand, search_query) => { + return access.can('auditlog:list') + .then(() => { + let query = auditLogModel + .query() + .orderBy('created_on', 'DESC') + .orderBy('id', 'DESC') + .limit(100) + .allowEager('[user]'); + + // Query is used for searching + if (typeof search_query === 'string') { + query.where(function () { + this.where('meta', 'like', '%' + search_query + '%'); + }); + } + + if (typeof expand !== 'undefined' && expand !== null) { + query.eager('[' + expand.join(', ') + ']'); + } + + return query; + }); + }, + + /** + * This method should not be publicly used, it doesn't check certain things. It will be assumed + * that permission to add to audit log is already considered, however the access token is used for + * default user id determination. + * + * @param {Access} access + * @param {Object} data + * @param {String} data.action + * @param {Number} [data.user_id] + * @param {Number} [data.object_id] + * @param {Number} [data.object_type] + * @param {Object} [data.meta] + * @returns {Promise} + */ + add: (access, data) => { + return new Promise((resolve, reject) => { + // Default the user id + if (typeof data.user_id === 'undefined' || !data.user_id) { + data.user_id = access.token.getUserId(1); + } + + if (typeof data.action === 'undefined' || !data.action) { + reject(new error.InternalValidationError('Audit log entry must contain an Action')); + } else { + // Make sure at least 1 of the IDs are set and action + resolve(auditLogModel + .query() + .insert({ + user_id: data.user_id, + action: data.action, + object_type: data.object_type || '', + object_id: data.object_id || 0, + meta: data.meta || {} + })); + } + }); + } +}; + +module.exports = internalAuditLog; diff --git a/backend/internal/certificate.js b/backend/internal/certificate.js new file mode 100644 index 000000000..4f0caf3d6 --- /dev/null +++ b/backend/internal/certificate.js @@ -0,0 +1,926 @@ +const fs = require('fs'); +const _ = require('lodash'); +const logger = require('../logger').ssl; +const error = require('../lib/error'); +const certificateModel = require('../models/certificate'); +const internalAuditLog = require('./audit-log'); +const tempWrite = require('temp-write'); +const utils = require('../lib/utils'); +const moment = require('moment'); +const debug_mode = process.env.NODE_ENV !== 'production' || !!process.env.DEBUG; +const le_staging = process.env.NODE_ENV !== 'production'; +const internalNginx = require('./nginx'); +const internalHost = require('./host'); +const certbot_command = '/usr/bin/certbot'; +const le_config = '/etc/letsencrypt.ini'; + +function omissions() { + return ['is_deleted']; +} + +const internalCertificate = { + + allowed_ssl_files: ['certificate', 'certificate_key', 'intermediate_certificate'], + interval_timeout: 1000 * 60 * 60, // 1 hour + interval: null, + interval_processing: false, + + initTimer: () => { + logger.info('Let\'s Encrypt Renewal Timer initialized'); + internalCertificate.interval = setInterval(internalCertificate.processExpiringHosts, internalCertificate.interval_timeout); + // And do this now as well + internalCertificate.processExpiringHosts(); + }, + + /** + * Triggered by a timer, this will check for expiring hosts and renew their ssl certs if required + */ + processExpiringHosts: () => { + if (!internalCertificate.interval_processing) { + internalCertificate.interval_processing = true; + logger.info('Renewing SSL certs close to expiry...'); + + let cmd = certbot_command + ' renew --non-interactive --quiet ' + + '--config "' + le_config + '" ' + + '--preferred-challenges "dns,http" ' + + '--disable-hook-validation ' + + (le_staging ? '--staging' : ''); + + return utils.exec(cmd) + .then((result) => { + if (result) { + logger.info('Renew Result: ' + result); + } + + return internalNginx.reload() + .then(() => { + logger.info('Renew Complete'); + return result; + }); + }) + .then(() => { + // Now go and fetch all the letsencrypt certs from the db and query the files and update expiry times + return certificateModel + .query() + .where('is_deleted', 0) + .andWhere('provider', 'letsencrypt') + .then((certificates) => { + if (certificates && certificates.length) { + let promises = []; + + certificates.map(function (certificate) { + promises.push( + internalCertificate.getCertificateInfoFromFile('/etc/letsencrypt/live/npm-' + certificate.id + '/fullchain.pem') + .then((cert_info) => { + return certificateModel + .query() + .where('id', certificate.id) + .andWhere('provider', 'letsencrypt') + .patch({ + expires_on: certificateModel.raw('FROM_UNIXTIME(' + cert_info.dates.to + ')') + }); + }) + .catch((err) => { + // Don't want to stop the train here, just log the error + logger.error(err.message); + }) + ); + }); + + return Promise.all(promises); + } + }); + }) + .then(() => { + internalCertificate.interval_processing = false; + }) + .catch((err) => { + logger.error(err); + internalCertificate.interval_processing = false; + }); + } + }, + + /** + * @param {Access} access + * @param {Object} data + * @returns {Promise} + */ + create: (access, data) => { + return access.can('certificates:create', data) + .then(() => { + data.owner_user_id = access.token.getUserId(1); + + if (data.provider === 'letsencrypt') { + data.nice_name = data.domain_names.sort().join(', '); + } + + return certificateModel + .query() + .omit(omissions()) + .insertAndFetch(data); + }) + .then((certificate) => { + if (certificate.provider === 'letsencrypt') { + // Request a new Cert from LE. Let the fun begin. + + // 1. Find out any hosts that are using any of the hostnames in this cert + // 2. Disable them in nginx temporarily + // 3. Generate the LE config + // 4. Request cert + // 5. Remove LE config + // 6. Re-instate previously disabled hosts + + // 1. Find out any hosts that are using any of the hostnames in this cert + return internalHost.getHostsWithDomains(certificate.domain_names) + .then((in_use_result) => { + // 2. Disable them in nginx temporarily + return internalCertificate.disableInUseHosts(in_use_result) + .then(() => { + return in_use_result; + }); + }) + .then((in_use_result) => { + // 3. Generate the LE config + return internalNginx.generateLetsEncryptRequestConfig(certificate) + .then(internalNginx.reload) + .then(() => { + // 4. Request cert + return internalCertificate.requestLetsEncryptSsl(certificate); + }) + .then(() => { + // 5. Remove LE config + return internalNginx.deleteLetsEncryptRequestConfig(certificate); + }) + .then(internalNginx.reload) + .then(() => { + // 6. Re-instate previously disabled hosts + return internalCertificate.enableInUseHosts(in_use_result); + }) + .then(() => { + return certificate; + }) + .catch((err) => { + // In the event of failure, revert things and throw err back + return internalNginx.deleteLetsEncryptRequestConfig(certificate) + .then(() => { + return internalCertificate.enableInUseHosts(in_use_result); + }) + .then(internalNginx.reload) + .then(() => { + throw err; + }); + }); + }) + .then(() => { + // At this point, the letsencrypt cert should exist on disk. + // Lets get the expiry date from the file and update the row silently + return internalCertificate.getCertificateInfoFromFile('/etc/letsencrypt/live/npm-' + certificate.id + '/fullchain.pem') + .then((cert_info) => { + return certificateModel + .query() + .patchAndFetchById(certificate.id, { + expires_on: certificateModel.raw('FROM_UNIXTIME(' + cert_info.dates.to + ')') + }) + .then((saved_row) => { + // Add cert data for audit log + saved_row.meta = _.assign({}, saved_row.meta, { + letsencrypt_certificate: cert_info + }); + + return saved_row; + }); + }); + }); + } else { + return certificate; + } + }).then((certificate) => { + + data.meta = _.assign({}, data.meta || {}, certificate.meta); + + // Add to audit log + return internalAuditLog.add(access, { + action: 'created', + object_type: 'certificate', + object_id: certificate.id, + meta: data + }) + .then(() => { + return certificate; + }); + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {String} [data.email] + * @param {String} [data.name] + * @return {Promise} + */ + update: (access, data) => { + return access.can('certificates:update', data.id) + .then((/*access_data*/) => { + return internalCertificate.get(access, {id: data.id}); + }) + .then((row) => { + if (row.id !== data.id) { + // Sanity check that something crazy hasn't happened + throw new error.InternalValidationError('Certificate could not be updated, IDs do not match: ' + row.id + ' !== ' + data.id); + } + + return certificateModel + .query() + .omit(omissions()) + .patchAndFetchById(row.id, data) + .then((saved_row) => { + saved_row.meta = internalCertificate.cleanMeta(saved_row.meta); + data.meta = internalCertificate.cleanMeta(data.meta); + + // Add row.nice_name for custom certs + if (saved_row.provider === 'other') { + data.nice_name = saved_row.nice_name; + } + + // Add to audit log + return internalAuditLog.add(access, { + action: 'updated', + object_type: 'certificate', + object_id: row.id, + meta: _.omit(data, ['expires_on']) // this prevents json circular reference because expires_on might be raw + }) + .then(() => { + return _.omit(saved_row, omissions()); + }); + }); + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {Array} [data.expand] + * @param {Array} [data.omit] + * @return {Promise} + */ + get: (access, data) => { + if (typeof data === 'undefined') { + data = {}; + } + + return access.can('certificates:get', data.id) + .then((access_data) => { + let query = certificateModel + .query() + .where('is_deleted', 0) + .andWhere('id', data.id) + .allowEager('[owner]') + .first(); + + if (access_data.permission_visibility !== 'all') { + query.andWhere('owner_user_id', access.token.getUserId(1)); + } + + // Custom omissions + if (typeof data.omit !== 'undefined' && data.omit !== null) { + query.omit(data.omit); + } + + if (typeof data.expand !== 'undefined' && data.expand !== null) { + query.eager('[' + data.expand.join(', ') + ']'); + } + + return query; + }) + .then((row) => { + if (row) { + return _.omit(row, omissions()); + } else { + throw new error.ItemNotFoundError(data.id); + } + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {String} [data.reason] + * @returns {Promise} + */ + delete: (access, data) => { + return access.can('certificates:delete', data.id) + .then(() => { + return internalCertificate.get(access, {id: data.id}); + }) + .then((row) => { + if (!row) { + throw new error.ItemNotFoundError(data.id); + } + + return certificateModel + .query() + .where('id', row.id) + .patch({ + is_deleted: 1 + }) + .then(() => { + // Add to audit log + row.meta = internalCertificate.cleanMeta(row.meta); + + return internalAuditLog.add(access, { + action: 'deleted', + object_type: 'certificate', + object_id: row.id, + meta: _.omit(row, omissions()) + }); + }) + .then(() => { + if (row.provider === 'letsencrypt') { + // Revoke the cert + return internalCertificate.revokeLetsEncryptSsl(row); + } + }); + }) + .then(() => { + return true; + }); + }, + + /** + * All Certs + * + * @param {Access} access + * @param {Array} [expand] + * @param {String} [search_query] + * @returns {Promise} + */ + getAll: (access, expand, search_query) => { + return access.can('certificates:list') + .then((access_data) => { + let query = certificateModel + .query() + .where('is_deleted', 0) + .groupBy('id') + .omit(['is_deleted']) + .allowEager('[owner]') + .orderBy('nice_name', 'ASC'); + + if (access_data.permission_visibility !== 'all') { + query.andWhere('owner_user_id', access.token.getUserId(1)); + } + + // Query is used for searching + if (typeof search_query === 'string') { + query.where(function () { + this.where('name', 'like', '%' + search_query + '%'); + }); + } + + if (typeof expand !== 'undefined' && expand !== null) { + query.eager('[' + expand.join(', ') + ']'); + } + + return query; + }); + }, + + /** + * Report use + * + * @param {Number} user_id + * @param {String} visibility + * @returns {Promise} + */ + getCount: (user_id, visibility) => { + let query = certificateModel + .query() + .count('id as count') + .where('is_deleted', 0); + + if (visibility !== 'all') { + query.andWhere('owner_user_id', user_id); + } + + return query.first() + .then((row) => { + return parseInt(row.count, 10); + }); + }, + + /** + * @param {Object} certificate + * @returns {Promise} + */ + writeCustomCert: (certificate) => { + if (debug_mode) { + logger.info('Writing Custom Certificate:', certificate); + } + + let dir = '/data/custom_ssl/npm-' + certificate.id; + + return new Promise((resolve, reject) => { + if (certificate.provider === 'letsencrypt') { + reject(new Error('Refusing to write letsencrypt certs here')); + return; + } + + let cert_data = certificate.meta.certificate; + if (typeof certificate.meta.intermediate_certificate !== 'undefined') { + cert_data = cert_data + '\n' + certificate.meta.intermediate_certificate; + } + + try { + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir); + } + } catch (err) { + reject(err); + return; + } + + fs.writeFile(dir + '/fullchain.pem', cert_data, function (err) { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }) + .then(() => { + return new Promise((resolve, reject) => { + fs.writeFile(dir + '/privkey.pem', certificate.meta.certificate_key, function (err) { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Array} data.domain_names + * @param {String} data.meta.letsencrypt_email + * @param {Boolean} data.meta.letsencrypt_agree + * @returns {Promise} + */ + createQuickCertificate: (access, data) => { + return internalCertificate.create(access, { + provider: 'letsencrypt', + domain_names: data.domain_names, + meta: data.meta + }); + }, + + /** + * Validates that the certs provided are good. + * No access required here, nothing is changed or stored. + * + * @param {Object} data + * @param {Object} data.files + * @returns {Promise} + */ + validate: (data) => { + return new Promise((resolve) => { + // Put file contents into an object + let files = {}; + _.map(data.files, (file, name) => { + if (internalCertificate.allowed_ssl_files.indexOf(name) !== -1) { + files[name] = file.data.toString(); + } + }); + + resolve(files); + }) + .then((files) => { + // For each file, create a temp file and write the contents to it + // Then test it depending on the file type + let promises = []; + _.map(files, (content, type) => { + promises.push(new Promise((resolve) => { + if (type === 'certificate_key') { + resolve(internalCertificate.checkPrivateKey(content)); + } else { + // this should handle `certificate` and intermediate certificate + resolve(internalCertificate.getCertificateInfo(content, true)); + } + }).then((res) => { + return {[type]: res}; + })); + }); + + return Promise.all(promises) + .then((files) => { + let data = {}; + + _.each(files, (file) => { + data = _.assign({}, data, file); + }); + + return data; + }); + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {Object} data.files + * @returns {Promise} + */ + upload: (access, data) => { + return internalCertificate.get(access, {id: data.id}) + .then((row) => { + if (row.provider !== 'other') { + throw new error.ValidationError('Cannot upload certificates for this type of provider'); + } + + return internalCertificate.validate(data) + .then((validations) => { + if (typeof validations.certificate === 'undefined') { + throw new error.ValidationError('Certificate file was not provided'); + } + + _.map(data.files, (file, name) => { + if (internalCertificate.allowed_ssl_files.indexOf(name) !== -1) { + row.meta[name] = file.data.toString(); + } + }); + + // TODO: This uses a mysql only raw function that won't translate to postgres + return internalCertificate.update(access, { + id: data.id, + expires_on: certificateModel.raw('FROM_UNIXTIME(' + validations.certificate.dates.to + ')'), + domain_names: [validations.certificate.cn], + meta: _.clone(row.meta) // Prevent the update method from changing this value that we'll use later + }) + .then((certificate) => { + console.log('ROWMETA:', row.meta); + certificate.meta = row.meta; + return internalCertificate.writeCustomCert(certificate); + }); + }) + .then(() => { + return _.pick(row.meta, internalCertificate.allowed_ssl_files); + }); + }); + }, + + /** + * Uses the openssl command to validate the private key. + * It will save the file to disk first, then run commands on it, then delete the file. + * + * @param {String} private_key This is the entire key contents as a string + */ + checkPrivateKey: (private_key) => { + return tempWrite(private_key, '/tmp') + .then((filepath) => { + return utils.exec('openssl rsa -in ' + filepath + ' -check -noout') + .then((result) => { + if (!result.toLowerCase().includes('key ok')) { + throw new error.ValidationError(result); + } + + fs.unlinkSync(filepath); + return true; + }).catch((err) => { + fs.unlinkSync(filepath); + throw new error.ValidationError('Certificate Key is not valid (' + err.message + ')', err); + }); + }); + }, + + /** + * Uses the openssl command to both validate and get info out of the certificate. + * It will save the file to disk first, then run commands on it, then delete the file. + * + * @param {String} certificate This is the entire cert contents as a string + * @param {Boolean} [throw_expired] Throw when the certificate is out of date + */ + getCertificateInfo: (certificate, throw_expired) => { + return tempWrite(certificate, '/tmp') + .then((filepath) => { + return internalCertificate.getCertificateInfoFromFile(filepath, throw_expired) + .then((cert_data) => { + fs.unlinkSync(filepath); + return cert_data; + }).catch((err) => { + fs.unlinkSync(filepath); + throw err; + }); + }); + }, + + /** + * Uses the openssl command to both validate and get info out of the certificate. + * It will save the file to disk first, then run commands on it, then delete the file. + * + * @param {String} certificate_file The file location on disk + * @param {Boolean} [throw_expired] Throw when the certificate is out of date + */ + getCertificateInfoFromFile: (certificate_file, throw_expired) => { + let cert_data = {}; + + return utils.exec('openssl x509 -in ' + certificate_file + ' -subject -noout') + .then((result) => { + // subject=CN = something.example.com + let regex = /(?:subject=)?[^=]+=\s+(\S+)/gim; + let match = regex.exec(result); + + if (typeof match[1] === 'undefined') { + throw new error.ValidationError('Could not determine subject from certificate: ' + result); + } + + cert_data['cn'] = match[1]; + }) + .then(() => { + return utils.exec('openssl x509 -in ' + certificate_file + ' -issuer -noout'); + }) + .then((result) => { + // issuer=C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3 + let regex = /^(?:issuer=)?(.*)$/gim; + let match = regex.exec(result); + + if (typeof match[1] === 'undefined') { + throw new error.ValidationError('Could not determine issuer from certificate: ' + result); + } + + cert_data['issuer'] = match[1]; + }) + .then(() => { + return utils.exec('openssl x509 -in ' + certificate_file + ' -dates -noout'); + }) + .then((result) => { + // notBefore=Jul 14 04:04:29 2018 GMT + // notAfter=Oct 12 04:04:29 2018 GMT + let valid_from = null; + let valid_to = null; + + let lines = result.split('\n'); + lines.map(function (str) { + let regex = /^(\S+)=(.*)$/gim; + let match = regex.exec(str.trim()); + + if (match && typeof match[2] !== 'undefined') { + let date = parseInt(moment(match[2], 'MMM DD HH:mm:ss YYYY z').format('X'), 10); + + if (match[1].toLowerCase() === 'notbefore') { + valid_from = date; + } else if (match[1].toLowerCase() === 'notafter') { + valid_to = date; + } + } + }); + + if (!valid_from || !valid_to) { + throw new error.ValidationError('Could not determine dates from certificate: ' + result); + } + + if (throw_expired && valid_to < parseInt(moment().format('X'), 10)) { + throw new error.ValidationError('Certificate has expired'); + } + + cert_data['dates'] = { + from: valid_from, + to: valid_to + }; + + return cert_data; + }).catch((err) => { + throw new error.ValidationError('Certificate is not valid (' + err.message + ')', err); + }); + }, + + /** + * Cleans the ssl keys from the meta object and sets them to "true" + * + * @param {Object} meta + * @param {Boolean} [remove] + * @returns {Object} + */ + cleanMeta: function (meta, remove) { + internalCertificate.allowed_ssl_files.map((key) => { + if (typeof meta[key] !== 'undefined' && meta[key]) { + if (remove) { + delete meta[key]; + } else { + meta[key] = true; + } + } + }); + + return meta; + }, + + /** + * @param {Object} certificate the certificate row + * @returns {Promise} + */ + requestLetsEncryptSsl: (certificate) => { + logger.info('Requesting Let\'sEncrypt certificates for Cert #' + certificate.id + ': ' + certificate.domain_names.join(', ')); + + let cmd = certbot_command + ' certonly --non-interactive ' + + '--config "' + le_config + '" ' + + '--cert-name "npm-' + certificate.id + '" ' + + '--agree-tos ' + + '--email "' + certificate.meta.letsencrypt_email + '" ' + + '--preferred-challenges "dns,http" ' + + '--webroot ' + + '--domains "' + certificate.domain_names.join(',') + '" ' + + (le_staging ? '--staging' : ''); + + if (debug_mode) { + logger.info('Command:', cmd); + } + + return utils.exec(cmd) + .then((result) => { + logger.success(result); + return result; + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @returns {Promise} + */ + renew: (access, data) => { + return access.can('certificates:update', data) + .then(() => { + return internalCertificate.get(access, data); + }) + .then((certificate) => { + if (certificate.provider === 'letsencrypt') { + return internalCertificate.renewLetsEncryptSsl(certificate) + .then(() => { + return internalCertificate.getCertificateInfoFromFile('/etc/letsencrypt/live/npm-' + certificate.id + '/fullchain.pem'); + }) + .then((cert_info) => { + return certificateModel + .query() + .patchAndFetchById(certificate.id, { + expires_on: certificateModel.raw('FROM_UNIXTIME(' + cert_info.dates.to + ')') + }); + }) + .then((updated_certificate) => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'renewed', + object_type: 'certificate', + object_id: updated_certificate.id, + meta: updated_certificate + }) + .then(() => { + return updated_certificate; + }); + }); + } else { + throw new error.ValidationError('Only Let\'sEncrypt certificates can be renewed'); + } + }); + }, + + /** + * @param {Object} certificate the certificate row + * @returns {Promise} + */ + renewLetsEncryptSsl: (certificate) => { + logger.info('Renewing Let\'sEncrypt certificates for Cert #' + certificate.id + ': ' + certificate.domain_names.join(', ')); + + let cmd = certbot_command + ' renew --non-interactive ' + + '--config "' + le_config + '" ' + + '--cert-name "npm-' + certificate.id + '" ' + + '--preferred-challenges "dns,http" ' + + '--disable-hook-validation ' + + (le_staging ? '--staging' : ''); + + if (debug_mode) { + logger.info('Command:', cmd); + } + + return utils.exec(cmd) + .then((result) => { + logger.info(result); + return result; + }); + }, + + /** + * @param {Object} certificate the certificate row + * @param {Boolean} [throw_errors] + * @returns {Promise} + */ + revokeLetsEncryptSsl: (certificate, throw_errors) => { + logger.info('Revoking Let\'sEncrypt certificates for Cert #' + certificate.id + ': ' + certificate.domain_names.join(', ')); + + let cmd = certbot_command + ' revoke --non-interactive ' + + '--config "' + le_config + '" ' + + '--cert-path "/etc/letsencrypt/live/npm-' + certificate.id + '/fullchain.pem" ' + + '--delete-after-revoke ' + + (le_staging ? '--staging' : ''); + + if (debug_mode) { + logger.info('Command:', cmd); + } + + return utils.exec(cmd) + .then((result) => { + if (debug_mode) { + logger.info('Command:', cmd); + } + logger.info(result); + return result; + }) + .catch((err) => { + if (debug_mode) { + logger.error(err.message); + } + + if (throw_errors) { + throw err; + } + }); + }, + + /** + * @param {Object} certificate + * @returns {Boolean} + */ + hasLetsEncryptSslCerts: (certificate) => { + let le_path = '/etc/letsencrypt/live/npm-' + certificate.id; + + return fs.existsSync(le_path + '/fullchain.pem') && fs.existsSync(le_path + '/privkey.pem'); + }, + + /** + * @param {Object} in_use_result + * @param {Number} in_use_result.total_count + * @param {Array} in_use_result.proxy_hosts + * @param {Array} in_use_result.redirection_hosts + * @param {Array} in_use_result.dead_hosts + */ + disableInUseHosts: (in_use_result) => { + if (in_use_result.total_count) { + let promises = []; + + if (in_use_result.proxy_hosts.length) { + promises.push(internalNginx.bulkDeleteConfigs('proxy_host', in_use_result.proxy_hosts)); + } + + if (in_use_result.redirection_hosts.length) { + promises.push(internalNginx.bulkDeleteConfigs('redirection_host', in_use_result.redirection_hosts)); + } + + if (in_use_result.dead_hosts.length) { + promises.push(internalNginx.bulkDeleteConfigs('dead_host', in_use_result.dead_hosts)); + } + + return Promise.all(promises); + + } else { + return Promise.resolve(); + } + }, + + /** + * @param {Object} in_use_result + * @param {Number} in_use_result.total_count + * @param {Array} in_use_result.proxy_hosts + * @param {Array} in_use_result.redirection_hosts + * @param {Array} in_use_result.dead_hosts + */ + enableInUseHosts: (in_use_result) => { + if (in_use_result.total_count) { + let promises = []; + + if (in_use_result.proxy_hosts.length) { + promises.push(internalNginx.bulkGenerateConfigs('proxy_host', in_use_result.proxy_hosts)); + } + + if (in_use_result.redirection_hosts.length) { + promises.push(internalNginx.bulkGenerateConfigs('redirection_host', in_use_result.redirection_hosts)); + } + + if (in_use_result.dead_hosts.length) { + promises.push(internalNginx.bulkGenerateConfigs('dead_host', in_use_result.dead_hosts)); + } + + return Promise.all(promises); + + } else { + return Promise.resolve(); + } + } +}; + +module.exports = internalCertificate; diff --git a/backend/internal/dead-host.js b/backend/internal/dead-host.js new file mode 100644 index 000000000..d35fec257 --- /dev/null +++ b/backend/internal/dead-host.js @@ -0,0 +1,461 @@ +const _ = require('lodash'); +const error = require('../lib/error'); +const deadHostModel = require('../models/dead_host'); +const internalHost = require('./host'); +const internalNginx = require('./nginx'); +const internalAuditLog = require('./audit-log'); +const internalCertificate = require('./certificate'); + +function omissions () { + return ['is_deleted']; +} + +const internalDeadHost = { + + /** + * @param {Access} access + * @param {Object} data + * @returns {Promise} + */ + create: (access, data) => { + let create_certificate = data.certificate_id === 'new'; + + if (create_certificate) { + delete data.certificate_id; + } + + return access.can('dead_hosts:create', data) + .then((/*access_data*/) => { + // Get a list of the domain names and check each of them against existing records + let domain_name_check_promises = []; + + data.domain_names.map(function (domain_name) { + domain_name_check_promises.push(internalHost.isHostnameTaken(domain_name)); + }); + + return Promise.all(domain_name_check_promises) + .then((check_results) => { + check_results.map(function (result) { + if (result.is_taken) { + throw new error.ValidationError(result.hostname + ' is already in use'); + } + }); + }); + }) + .then(() => { + // At this point the domains should have been checked + data.owner_user_id = access.token.getUserId(1); + data = internalHost.cleanSslHstsData(data); + + return deadHostModel + .query() + .omit(omissions()) + .insertAndFetch(data); + }) + .then((row) => { + if (create_certificate) { + return internalCertificate.createQuickCertificate(access, data) + .then((cert) => { + // update host with cert id + return internalDeadHost.update(access, { + id: row.id, + certificate_id: cert.id + }); + }) + .then(() => { + return row; + }); + } else { + return row; + } + }) + .then((row) => { + // re-fetch with cert + return internalDeadHost.get(access, { + id: row.id, + expand: ['certificate', 'owner'] + }); + }) + .then((row) => { + // Configure nginx + return internalNginx.configure(deadHostModel, 'dead_host', row) + .then(() => { + return row; + }); + }) + .then((row) => { + data.meta = _.assign({}, data.meta || {}, row.meta); + + // Add to audit log + return internalAuditLog.add(access, { + action: 'created', + object_type: 'dead-host', + object_id: row.id, + meta: data + }) + .then(() => { + return row; + }); + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @return {Promise} + */ + update: (access, data) => { + let create_certificate = data.certificate_id === 'new'; + + if (create_certificate) { + delete data.certificate_id; + } + + return access.can('dead_hosts:update', data.id) + .then((/*access_data*/) => { + // Get a list of the domain names and check each of them against existing records + let domain_name_check_promises = []; + + if (typeof data.domain_names !== 'undefined') { + data.domain_names.map(function (domain_name) { + domain_name_check_promises.push(internalHost.isHostnameTaken(domain_name, 'dead', data.id)); + }); + + return Promise.all(domain_name_check_promises) + .then((check_results) => { + check_results.map(function (result) { + if (result.is_taken) { + throw new error.ValidationError(result.hostname + ' is already in use'); + } + }); + }); + } + }) + .then(() => { + return internalDeadHost.get(access, {id: data.id}); + }) + .then((row) => { + if (row.id !== data.id) { + // Sanity check that something crazy hasn't happened + throw new error.InternalValidationError('404 Host could not be updated, IDs do not match: ' + row.id + ' !== ' + data.id); + } + + if (create_certificate) { + return internalCertificate.createQuickCertificate(access, { + domain_names: data.domain_names || row.domain_names, + meta: _.assign({}, row.meta, data.meta) + }) + .then((cert) => { + // update host with cert id + data.certificate_id = cert.id; + }) + .then(() => { + return row; + }); + } else { + return row; + } + }) + .then((row) => { + // Add domain_names to the data in case it isn't there, so that the audit log renders correctly. The order is important here. + data = _.assign({}, { + domain_names: row.domain_names + }, data); + + data = internalHost.cleanSslHstsData(data, row); + + return deadHostModel + .query() + .where({id: data.id}) + .patch(data) + .then((saved_row) => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'updated', + object_type: 'dead-host', + object_id: row.id, + meta: data + }) + .then(() => { + return _.omit(saved_row, omissions()); + }); + }); + }) + .then(() => { + return internalDeadHost.get(access, { + id: data.id, + expand: ['owner', 'certificate'] + }) + .then((row) => { + // Configure nginx + return internalNginx.configure(deadHostModel, 'dead_host', row) + .then((new_meta) => { + row.meta = new_meta; + row = internalHost.cleanRowCertificateMeta(row); + return _.omit(row, omissions()); + }); + }); + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {Array} [data.expand] + * @param {Array} [data.omit] + * @return {Promise} + */ + get: (access, data) => { + if (typeof data === 'undefined') { + data = {}; + } + + return access.can('dead_hosts:get', data.id) + .then((access_data) => { + let query = deadHostModel + .query() + .where('is_deleted', 0) + .andWhere('id', data.id) + .allowEager('[owner,certificate]') + .first(); + + if (access_data.permission_visibility !== 'all') { + query.andWhere('owner_user_id', access.token.getUserId(1)); + } + + // Custom omissions + if (typeof data.omit !== 'undefined' && data.omit !== null) { + query.omit(data.omit); + } + + if (typeof data.expand !== 'undefined' && data.expand !== null) { + query.eager('[' + data.expand.join(', ') + ']'); + } + + return query; + }) + .then((row) => { + if (row) { + row = internalHost.cleanRowCertificateMeta(row); + return _.omit(row, omissions()); + } else { + throw new error.ItemNotFoundError(data.id); + } + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {String} [data.reason] + * @returns {Promise} + */ + delete: (access, data) => { + return access.can('dead_hosts:delete', data.id) + .then(() => { + return internalDeadHost.get(access, {id: data.id}); + }) + .then((row) => { + if (!row) { + throw new error.ItemNotFoundError(data.id); + } + + return deadHostModel + .query() + .where('id', row.id) + .patch({ + is_deleted: 1 + }) + .then(() => { + // Delete Nginx Config + return internalNginx.deleteConfig('dead_host', row) + .then(() => { + return internalNginx.reload(); + }); + }) + .then(() => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'deleted', + object_type: 'dead-host', + object_id: row.id, + meta: _.omit(row, omissions()) + }); + }); + }) + .then(() => { + return true; + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {String} [data.reason] + * @returns {Promise} + */ + enable: (access, data) => { + return access.can('dead_hosts:update', data.id) + .then(() => { + return internalDeadHost.get(access, { + id: data.id, + expand: ['certificate', 'owner'] + }); + }) + .then((row) => { + if (!row) { + throw new error.ItemNotFoundError(data.id); + } else if (row.enabled) { + throw new error.ValidationError('Host is already enabled'); + } + + row.enabled = 1; + + return deadHostModel + .query() + .where('id', row.id) + .patch({ + enabled: 1 + }) + .then(() => { + // Configure nginx + return internalNginx.configure(deadHostModel, 'dead_host', row); + }) + .then(() => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'enabled', + object_type: 'dead-host', + object_id: row.id, + meta: _.omit(row, omissions()) + }); + }); + }) + .then(() => { + return true; + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {String} [data.reason] + * @returns {Promise} + */ + disable: (access, data) => { + return access.can('dead_hosts:update', data.id) + .then(() => { + return internalDeadHost.get(access, {id: data.id}); + }) + .then((row) => { + if (!row) { + throw new error.ItemNotFoundError(data.id); + } else if (!row.enabled) { + throw new error.ValidationError('Host is already disabled'); + } + + row.enabled = 0; + + return deadHostModel + .query() + .where('id', row.id) + .patch({ + enabled: 0 + }) + .then(() => { + // Delete Nginx Config + return internalNginx.deleteConfig('dead_host', row) + .then(() => { + return internalNginx.reload(); + }); + }) + .then(() => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'disabled', + object_type: 'dead-host', + object_id: row.id, + meta: _.omit(row, omissions()) + }); + }); + }) + .then(() => { + return true; + }); + }, + + /** + * All Hosts + * + * @param {Access} access + * @param {Array} [expand] + * @param {String} [search_query] + * @returns {Promise} + */ + getAll: (access, expand, search_query) => { + return access.can('dead_hosts:list') + .then((access_data) => { + let query = deadHostModel + .query() + .where('is_deleted', 0) + .groupBy('id') + .omit(['is_deleted']) + .allowEager('[owner,certificate]') + .orderBy('domain_names', 'ASC'); + + if (access_data.permission_visibility !== 'all') { + query.andWhere('owner_user_id', access.token.getUserId(1)); + } + + // Query is used for searching + if (typeof search_query === 'string') { + query.where(function () { + this.where('domain_names', 'like', '%' + search_query + '%'); + }); + } + + if (typeof expand !== 'undefined' && expand !== null) { + query.eager('[' + expand.join(', ') + ']'); + } + + return query; + }) + .then((rows) => { + if (typeof expand !== 'undefined' && expand !== null && expand.indexOf('certificate') !== -1) { + return internalHost.cleanAllRowsCertificateMeta(rows); + } + + return rows; + }); + }, + + /** + * Report use + * + * @param {Number} user_id + * @param {String} visibility + * @returns {Promise} + */ + getCount: (user_id, visibility) => { + let query = deadHostModel + .query() + .count('id as count') + .where('is_deleted', 0); + + if (visibility !== 'all') { + query.andWhere('owner_user_id', user_id); + } + + return query.first() + .then((row) => { + return parseInt(row.count, 10); + }); + } +}; + +module.exports = internalDeadHost; diff --git a/backend/internal/host.js b/backend/internal/host.js new file mode 100644 index 000000000..a8abf3239 --- /dev/null +++ b/backend/internal/host.js @@ -0,0 +1,235 @@ +const _ = require('lodash'); +const proxyHostModel = require('../models/proxy_host'); +const redirectionHostModel = require('../models/redirection_host'); +const deadHostModel = require('../models/dead_host'); + +const internalHost = { + + /** + * Makes sure that the ssl_* and hsts_* fields play nicely together. + * ie: if there is no cert, then force_ssl is off. + * if force_ssl is off, then hsts_enabled is definitely off. + * + * @param {object} data + * @param {object} [existing_data] + * @returns {object} + */ + cleanSslHstsData: function (data, existing_data) { + existing_data = existing_data === undefined ? {} : existing_data; + + let combined_data = _.assign({}, existing_data, data); + + if (!combined_data.certificate_id) { + combined_data.ssl_forced = false; + combined_data.http2_support = false; + } + + if (!combined_data.ssl_forced) { + combined_data.hsts_enabled = false; + } + + if (!combined_data.hsts_enabled) { + combined_data.hsts_subdomains = false; + } + + return combined_data; + }, + + /** + * used by the getAll functions of hosts, this removes the certificate meta if present + * + * @param {Array} rows + * @returns {Array} + */ + cleanAllRowsCertificateMeta: function (rows) { + rows.map(function (row, idx) { + if (typeof rows[idx].certificate !== 'undefined' && rows[idx].certificate) { + rows[idx].certificate.meta = {}; + } + }); + + return rows; + }, + + /** + * used by the get/update functions of hosts, this removes the certificate meta if present + * + * @param {Object} row + * @returns {Object} + */ + cleanRowCertificateMeta: function (row) { + if (typeof row.certificate !== 'undefined' && row.certificate) { + row.certificate.meta = {}; + } + + return row; + }, + + /** + * This returns all the host types with any domain listed in the provided domain_names array. + * This is used by the certificates to temporarily disable any host that is using the domain + * + * @param {Array} domain_names + * @returns {Promise} + */ + getHostsWithDomains: function (domain_names) { + let promises = [ + proxyHostModel + .query() + .where('is_deleted', 0), + redirectionHostModel + .query() + .where('is_deleted', 0), + deadHostModel + .query() + .where('is_deleted', 0) + ]; + + return Promise.all(promises) + .then((promises_results) => { + let response_object = { + total_count: 0, + dead_hosts: [], + proxy_hosts: [], + redirection_hosts: [] + }; + + if (promises_results[0]) { + // Proxy Hosts + response_object.proxy_hosts = internalHost._getHostsWithDomains(promises_results[0], domain_names); + response_object.total_count += response_object.proxy_hosts.length; + } + + if (promises_results[1]) { + // Redirection Hosts + response_object.redirection_hosts = internalHost._getHostsWithDomains(promises_results[1], domain_names); + response_object.total_count += response_object.redirection_hosts.length; + } + + if (promises_results[1]) { + // Dead Hosts + response_object.dead_hosts = internalHost._getHostsWithDomains(promises_results[2], domain_names); + response_object.total_count += response_object.dead_hosts.length; + } + + return response_object; + }); + }, + + /** + * Internal use only, checks to see if the domain is already taken by any other record + * + * @param {String} hostname + * @param {String} [ignore_type] 'proxy', 'redirection', 'dead' + * @param {Integer} [ignore_id] Must be supplied if type was also supplied + * @returns {Promise} + */ + isHostnameTaken: function (hostname, ignore_type, ignore_id) { + let promises = [ + proxyHostModel + .query() + .where('is_deleted', 0) + .andWhere('domain_names', 'like', '%' + hostname + '%'), + redirectionHostModel + .query() + .where('is_deleted', 0) + .andWhere('domain_names', 'like', '%' + hostname + '%'), + deadHostModel + .query() + .where('is_deleted', 0) + .andWhere('domain_names', 'like', '%' + hostname + '%') + ]; + + return Promise.all(promises) + .then((promises_results) => { + let is_taken = false; + + if (promises_results[0]) { + // Proxy Hosts + if (internalHost._checkHostnameRecordsTaken(hostname, promises_results[0], ignore_type === 'proxy' && ignore_id ? ignore_id : 0)) { + is_taken = true; + } + } + + if (promises_results[1]) { + // Redirection Hosts + if (internalHost._checkHostnameRecordsTaken(hostname, promises_results[1], ignore_type === 'redirection' && ignore_id ? ignore_id : 0)) { + is_taken = true; + } + } + + if (promises_results[1]) { + // Dead Hosts + if (internalHost._checkHostnameRecordsTaken(hostname, promises_results[2], ignore_type === 'dead' && ignore_id ? ignore_id : 0)) { + is_taken = true; + } + } + + return { + hostname: hostname, + is_taken: is_taken + }; + }); + }, + + /** + * Private call only + * + * @param {String} hostname + * @param {Array} existing_rows + * @param {Integer} [ignore_id] + * @returns {Boolean} + */ + _checkHostnameRecordsTaken: function (hostname, existing_rows, ignore_id) { + let is_taken = false; + + if (existing_rows && existing_rows.length) { + existing_rows.map(function (existing_row) { + existing_row.domain_names.map(function (existing_hostname) { + // Does this domain match? + if (existing_hostname.toLowerCase() === hostname.toLowerCase()) { + if (!ignore_id || ignore_id !== existing_row.id) { + is_taken = true; + } + } + }); + }); + } + + return is_taken; + }, + + /** + * Private call only + * + * @param {Array} hosts + * @param {Array} domain_names + * @returns {Array} + */ + _getHostsWithDomains: function (hosts, domain_names) { + let response = []; + + if (hosts && hosts.length) { + hosts.map(function (host) { + let host_matches = false; + + domain_names.map(function (domain_name) { + host.domain_names.map(function (host_domain_name) { + if (domain_name.toLowerCase() === host_domain_name.toLowerCase()) { + host_matches = true; + } + }); + }); + + if (host_matches) { + response.push(host); + } + }); + } + + return response; + } + +}; + +module.exports = internalHost; diff --git a/backend/internal/ip_ranges.js b/backend/internal/ip_ranges.js new file mode 100644 index 000000000..3f07cb39e --- /dev/null +++ b/backend/internal/ip_ranges.js @@ -0,0 +1,147 @@ +const https = require('https'); +const fs = require('fs'); +const logger = require('../logger').ip_ranges; +const error = require('../lib/error'); +const internalNginx = require('./nginx'); +const Liquid = require('liquidjs'); + +const CLOUDFRONT_URL = 'https://ip-ranges.amazonaws.com/ip-ranges.json'; +const CLOUDFARE_V4_URL = 'https://www.cloudflare.com/ips-v4'; +const CLOUDFARE_V6_URL = 'https://www.cloudflare.com/ips-v6'; + +const internalIpRanges = { + + interval_timeout: 1000 * 60 * 60 * 6, // 6 hours + interval: null, + interval_processing: false, + iteration_count: 0, + + initTimer: () => { + logger.info('IP Ranges Renewal Timer initialized'); + internalIpRanges.interval = setInterval(internalIpRanges.fetch, internalIpRanges.interval_timeout); + }, + + fetchUrl: (url) => { + return new Promise((resolve, reject) => { + logger.info('Fetching ' + url); + return https.get(url, (res) => { + res.setEncoding('utf8'); + let raw_data = ''; + res.on('data', (chunk) => { + raw_data += chunk; + }); + + res.on('end', () => { + resolve(raw_data); + }); + }).on('error', (err) => { + reject(err); + }); + }); + }, + + /** + * Triggered at startup and then later by a timer, this will fetch the ip ranges from services and apply them to nginx. + */ + fetch: () => { + if (!internalIpRanges.interval_processing) { + internalIpRanges.interval_processing = true; + logger.info('Fetching IP Ranges from online services...'); + + let ip_ranges = []; + + return internalIpRanges.fetchUrl(CLOUDFRONT_URL) + .then((cloudfront_data) => { + let data = JSON.parse(cloudfront_data); + + if (data && typeof data.prefixes !== 'undefined') { + data.prefixes.map((item) => { + if (item.service === 'CLOUDFRONT') { + ip_ranges.push(item.ip_prefix); + } + }); + } + + if (data && typeof data.ipv6_prefixes !== 'undefined') { + data.ipv6_prefixes.map((item) => { + if (item.service === 'CLOUDFRONT') { + ip_ranges.push(item.ipv6_prefix); + } + }); + } + }) + .then(() => { + return internalIpRanges.fetchUrl(CLOUDFARE_V4_URL); + }) + .then((cloudfare_data) => { + let items = cloudfare_data.split('\n'); + ip_ranges = [... ip_ranges, ... items]; + }) + .then(() => { + return internalIpRanges.fetchUrl(CLOUDFARE_V6_URL); + }) + .then((cloudfare_data) => { + let items = cloudfare_data.split('\n'); + ip_ranges = [... ip_ranges, ... items]; + }) + .then(() => { + let clean_ip_ranges = []; + ip_ranges.map((range) => { + if (range) { + clean_ip_ranges.push(range); + } + }); + + return internalIpRanges.generateConfig(clean_ip_ranges) + .then(() => { + if (internalIpRanges.iteration_count) { + // Reload nginx + return internalNginx.reload(); + } + }); + }) + .then(() => { + internalIpRanges.interval_processing = false; + internalIpRanges.iteration_count++; + }) + .catch((err) => { + logger.error(err.message); + internalIpRanges.interval_processing = false; + }); + } + }, + + /** + * @param {Array} ip_ranges + * @returns {Promise} + */ + generateConfig: (ip_ranges) => { + let renderEngine = Liquid({ + root: __dirname + '/../templates/' + }); + + return new Promise((resolve, reject) => { + let template = null; + let filename = '/etc/nginx/conf.d/include/ip_ranges.conf'; + try { + template = fs.readFileSync(__dirname + '/../templates/ip_ranges.conf', {encoding: 'utf8'}); + } catch (err) { + reject(new error.ConfigurationError(err.message)); + return; + } + + renderEngine + .parseAndRender(template, {ip_ranges: ip_ranges}) + .then((config_text) => { + fs.writeFileSync(filename, config_text, {encoding: 'utf8'}); + resolve(true); + }) + .catch((err) => { + logger.warn('Could not write ' + filename + ':', err.message); + reject(new error.ConfigurationError(err.message)); + }); + }); + } +}; + +module.exports = internalIpRanges; diff --git a/backend/internal/nginx.js b/backend/internal/nginx.js new file mode 100644 index 000000000..6d4aa5fc7 --- /dev/null +++ b/backend/internal/nginx.js @@ -0,0 +1,402 @@ +const _ = require('lodash'); +const fs = require('fs'); +const Liquid = require('liquidjs'); +const logger = require('../logger').nginx; +const utils = require('../lib/utils'); +const error = require('../lib/error'); +const debug_mode = process.env.NODE_ENV !== 'production' || !!process.env.DEBUG; + +const internalNginx = { + + /** + * This will: + * - test the nginx config first to make sure it's OK + * - create / recreate the config for the host + * - test again + * - IF OK: update the meta with online status + * - IF BAD: update the meta with offline status and remove the config entirely + * - then reload nginx + * + * @param {Object|String} model + * @param {String} host_type + * @param {Object} host + * @returns {Promise} + */ + configure: (model, host_type, host) => { + let combined_meta = {}; + + return internalNginx.test() + .then(() => { + // Nginx is OK + // We're deleting this config regardless. + return internalNginx.deleteConfig(host_type, host); // Don't throw errors, as the file may not exist at all + }) + .then(() => { + return internalNginx.generateConfig(host_type, host); + }) + .then(() => { + // Test nginx again and update meta with result + return internalNginx.test() + .then(() => { + // nginx is ok + combined_meta = _.assign({}, host.meta, { + nginx_online: true, + nginx_err: null + }); + + return model + .query() + .where('id', host.id) + .patch({ + meta: combined_meta + }); + }) + .catch((err) => { + // Remove the error_log line because it's a docker-ism false positive that doesn't need to be reported. + // It will always look like this: + // nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (6: No such device or address) + + let valid_lines = []; + let err_lines = err.message.split('\n'); + err_lines.map(function (line) { + if (line.indexOf('/var/log/nginx/error.log') === -1) { + valid_lines.push(line); + } + }); + + if (debug_mode) { + logger.error('Nginx test failed:', valid_lines.join('\n')); + } + + // config is bad, update meta and delete config + combined_meta = _.assign({}, host.meta, { + nginx_online: false, + nginx_err: valid_lines.join('\n') + }); + + return model + .query() + .where('id', host.id) + .patch({ + meta: combined_meta + }) + .then(() => { + return internalNginx.deleteConfig(host_type, host, true); + }); + }); + }) + .then(() => { + return internalNginx.reload(); + }) + .then(() => { + return combined_meta; + }); + }, + + /** + * @returns {Promise} + */ + test: () => { + if (debug_mode) { + logger.info('Testing Nginx configuration'); + } + + return utils.exec('/usr/sbin/nginx -t -g "error_log off;"'); + }, + + /** + * @returns {Promise} + */ + reload: () => { + return internalNginx.test() + .then(() => { + logger.info('Reloading Nginx'); + return utils.exec('/usr/sbin/nginx -s reload'); + }); + }, + + /** + * @param {String} host_type + * @param {Integer} host_id + * @returns {String} + */ + getConfigName: (host_type, host_id) => { + host_type = host_type.replace(new RegExp('-', 'g'), '_'); + + if (host_type === 'default') { + return '/data/nginx/default_host/site.conf'; + } + + return '/data/nginx/' + host_type + '/' + host_id + '.conf'; + }, + + /** + * Generates custom locations + * @param {Object} host + * @returns {Promise} + */ + renderLocations: (host) => { + return new Promise((resolve, reject) => { + let template; + + try { + template = fs.readFileSync(__dirname + '/../templates/_location.conf', {encoding: 'utf8'}); + } catch (err) { + reject(new error.ConfigurationError(err.message)); + return; + } + + let renderer = new Liquid(); + let renderedLocations = ''; + + const locationRendering = async () => { + for (let i = 0; i < host.locations.length; i++) { + let locationCopy = Object.assign({}, host.locations[i]); + + if (locationCopy.forward_host.indexOf('/') > -1) { + const splitted = locationCopy.forward_host.split('/'); + + locationCopy.forward_host = splitted.shift(); + locationCopy.forward_path = `/${splitted.join('/')}`; + } + + // eslint-disable-next-line + renderedLocations += await renderer.parseAndRender(template, locationCopy); + } + }; + + locationRendering().then(() => resolve(renderedLocations)); + }); + }, + + /** + * @param {String} host_type + * @param {Object} host + * @returns {Promise} + */ + generateConfig: (host_type, host) => { + host_type = host_type.replace(new RegExp('-', 'g'), '_'); + + if (debug_mode) { + logger.info('Generating ' + host_type + ' Config:', host); + } + + let renderEngine = Liquid({ + root: __dirname + '/../templates/' + }); + + return new Promise((resolve, reject) => { + let template = null; + let filename = internalNginx.getConfigName(host_type, host.id); + + try { + template = fs.readFileSync(__dirname + '/../templates/' + host_type + '.conf', {encoding: 'utf8'}); + } catch (err) { + reject(new error.ConfigurationError(err.message)); + return; + } + + let locationsPromise; + let origLocations; + + // Manipulate the data a bit before sending it to the template + if (host_type !== 'default') { + host.use_default_location = true; + if (typeof host.advanced_config !== 'undefined' && host.advanced_config) { + host.use_default_location = !internalNginx.advancedConfigHasDefaultLocation(host.advanced_config); + } + } + + if (host.locations) { + origLocations = [].concat(host.locations); + locationsPromise = internalNginx.renderLocations(host).then((renderedLocations) => { + host.locations = renderedLocations; + }); + + // Allow someone who is using / custom location path to use it, and skip the default / location + _.map(host.locations, (location) => { + if (location.path === '/') { + host.use_default_location = false; + } + }); + + } else { + locationsPromise = Promise.resolve(); + } + + locationsPromise.then(() => { + renderEngine + .parseAndRender(template, host) + .then((config_text) => { + fs.writeFileSync(filename, config_text, {encoding: 'utf8'}); + + if (debug_mode) { + logger.success('Wrote config:', filename, config_text); + } + + // Restore locations array + host.locations = origLocations; + + resolve(true); + }) + .catch((err) => { + if (debug_mode) { + logger.warn('Could not write ' + filename + ':', err.message); + } + + reject(new error.ConfigurationError(err.message)); + }); + }); + }); + }, + + /** + * This generates a temporary nginx config listening on port 80 for the domain names listed + * in the certificate setup. It allows the letsencrypt acme challenge to be requested by letsencrypt + * when requesting a certificate without having a hostname set up already. + * + * @param {Object} certificate + * @returns {Promise} + */ + generateLetsEncryptRequestConfig: (certificate) => { + if (debug_mode) { + logger.info('Generating LetsEncrypt Request Config:', certificate); + } + + let renderEngine = Liquid({ + root: __dirname + '/../templates/' + }); + + return new Promise((resolve, reject) => { + let template = null; + let filename = '/data/nginx/temp/letsencrypt_' + certificate.id + '.conf'; + try { + template = fs.readFileSync(__dirname + '/../templates/letsencrypt-request.conf', {encoding: 'utf8'}); + } catch (err) { + reject(new error.ConfigurationError(err.message)); + return; + } + + renderEngine + .parseAndRender(template, certificate) + .then((config_text) => { + fs.writeFileSync(filename, config_text, {encoding: 'utf8'}); + + if (debug_mode) { + logger.success('Wrote config:', filename, config_text); + } + + resolve(true); + }) + .catch((err) => { + if (debug_mode) { + logger.warn('Could not write ' + filename + ':', err.message); + } + + reject(new error.ConfigurationError(err.message)); + }); + }); + }, + + /** + * This removes the temporary nginx config file generated by `generateLetsEncryptRequestConfig` + * + * @param {Object} certificate + * @param {Boolean} [throw_errors] + * @returns {Promise} + */ + deleteLetsEncryptRequestConfig: (certificate, throw_errors) => { + return new Promise((resolve, reject) => { + try { + let config_file = '/data/nginx/temp/letsencrypt_' + certificate.id + '.conf'; + + if (debug_mode) { + logger.warn('Deleting nginx config: ' + config_file); + } + + fs.unlinkSync(config_file); + } catch (err) { + if (debug_mode) { + logger.warn('Could not delete config:', err.message); + } + + if (throw_errors) { + reject(err); + } + } + + resolve(); + }); + }, + + /** + * @param {String} host_type + * @param {Object} [host] + * @param {Boolean} [throw_errors] + * @returns {Promise} + */ + deleteConfig: (host_type, host, throw_errors) => { + host_type = host_type.replace(new RegExp('-', 'g'), '_'); + + return new Promise((resolve, reject) => { + try { + let config_file = internalNginx.getConfigName(host_type, typeof host === 'undefined' ? 0 : host.id); + + if (debug_mode) { + logger.warn('Deleting nginx config: ' + config_file); + } + + fs.unlinkSync(config_file); + } catch (err) { + if (debug_mode) { + logger.warn('Could not delete config:', err.message); + } + + if (throw_errors) { + reject(err); + } + } + + resolve(); + }); + }, + + /** + * @param {String} host_type + * @param {Array} hosts + * @returns {Promise} + */ + bulkGenerateConfigs: (host_type, hosts) => { + let promises = []; + hosts.map(function (host) { + promises.push(internalNginx.generateConfig(host_type, host)); + }); + + return Promise.all(promises); + }, + + /** + * @param {String} host_type + * @param {Array} hosts + * @param {Boolean} [throw_errors] + * @returns {Promise} + */ + bulkDeleteConfigs: (host_type, hosts, throw_errors) => { + let promises = []; + hosts.map(function (host) { + promises.push(internalNginx.deleteConfig(host_type, host, throw_errors)); + }); + + return Promise.all(promises); + }, + + /** + * @param {string} config + * @returns {boolean} + */ + advancedConfigHasDefaultLocation: function (config) { + return !!config.match(/^(?:.*;)?\s*?location\s*?\/\s*?{/im); + } +}; + +module.exports = internalNginx; diff --git a/backend/internal/proxy-host.js b/backend/internal/proxy-host.js new file mode 100644 index 000000000..0e9ced9a4 --- /dev/null +++ b/backend/internal/proxy-host.js @@ -0,0 +1,462 @@ +const _ = require('lodash'); +const error = require('../lib/error'); +const proxyHostModel = require('../models/proxy_host'); +const internalHost = require('./host'); +const internalNginx = require('./nginx'); +const internalAuditLog = require('./audit-log'); +const internalCertificate = require('./certificate'); + +function omissions () { + return ['is_deleted']; +} + +const internalProxyHost = { + + /** + * @param {Access} access + * @param {Object} data + * @returns {Promise} + */ + create: (access, data) => { + let create_certificate = data.certificate_id === 'new'; + + if (create_certificate) { + delete data.certificate_id; + } + + return access.can('proxy_hosts:create', data) + .then(() => { + // Get a list of the domain names and check each of them against existing records + let domain_name_check_promises = []; + + data.domain_names.map(function (domain_name) { + domain_name_check_promises.push(internalHost.isHostnameTaken(domain_name)); + }); + + return Promise.all(domain_name_check_promises) + .then((check_results) => { + check_results.map(function (result) { + if (result.is_taken) { + throw new error.ValidationError(result.hostname + ' is already in use'); + } + }); + }); + }) + .then(() => { + // At this point the domains should have been checked + data.owner_user_id = access.token.getUserId(1); + data = internalHost.cleanSslHstsData(data); + + return proxyHostModel + .query() + .omit(omissions()) + .insertAndFetch(data); + }) + .then((row) => { + if (create_certificate) { + return internalCertificate.createQuickCertificate(access, data) + .then((cert) => { + // update host with cert id + return internalProxyHost.update(access, { + id: row.id, + certificate_id: cert.id + }); + }) + .then(() => { + return row; + }); + } else { + return row; + } + }) + .then((row) => { + // re-fetch with cert + return internalProxyHost.get(access, { + id: row.id, + expand: ['certificate', 'owner', 'access_list'] + }); + }) + .then((row) => { + // Configure nginx + return internalNginx.configure(proxyHostModel, 'proxy_host', row) + .then(() => { + return row; + }); + }) + .then((row) => { + // Audit log + data.meta = _.assign({}, data.meta || {}, row.meta); + + // Add to audit log + return internalAuditLog.add(access, { + action: 'created', + object_type: 'proxy-host', + object_id: row.id, + meta: data + }) + .then(() => { + return row; + }); + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @return {Promise} + */ + update: (access, data) => { + let create_certificate = data.certificate_id === 'new'; + + if (create_certificate) { + delete data.certificate_id; + } + + return access.can('proxy_hosts:update', data.id) + .then((/*access_data*/) => { + // Get a list of the domain names and check each of them against existing records + let domain_name_check_promises = []; + + if (typeof data.domain_names !== 'undefined') { + data.domain_names.map(function (domain_name) { + domain_name_check_promises.push(internalHost.isHostnameTaken(domain_name, 'proxy', data.id)); + }); + + return Promise.all(domain_name_check_promises) + .then((check_results) => { + check_results.map(function (result) { + if (result.is_taken) { + throw new error.ValidationError(result.hostname + ' is already in use'); + } + }); + }); + } + }) + .then(() => { + return internalProxyHost.get(access, {id: data.id}); + }) + .then((row) => { + if (row.id !== data.id) { + // Sanity check that something crazy hasn't happened + throw new error.InternalValidationError('Proxy Host could not be updated, IDs do not match: ' + row.id + ' !== ' + data.id); + } + + if (create_certificate) { + return internalCertificate.createQuickCertificate(access, { + domain_names: data.domain_names || row.domain_names, + meta: _.assign({}, row.meta, data.meta) + }) + .then((cert) => { + // update host with cert id + data.certificate_id = cert.id; + }) + .then(() => { + return row; + }); + } else { + return row; + } + }) + .then((row) => { + // Add domain_names to the data in case it isn't there, so that the audit log renders correctly. The order is important here. + data = _.assign({}, { + domain_names: row.domain_names + }, data); + + data = internalHost.cleanSslHstsData(data, row); + + return proxyHostModel + .query() + .where({id: data.id}) + .patch(data) + .then((saved_row) => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'updated', + object_type: 'proxy-host', + object_id: row.id, + meta: data + }) + .then(() => { + return _.omit(saved_row, omissions()); + }); + }); + }) + .then(() => { + return internalProxyHost.get(access, { + id: data.id, + expand: ['owner', 'certificate', 'access_list'] + }) + .then((row) => { + // Configure nginx + return internalNginx.configure(proxyHostModel, 'proxy_host', row) + .then((new_meta) => { + row.meta = new_meta; + row = internalHost.cleanRowCertificateMeta(row); + return _.omit(row, omissions()); + }); + }); + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {Array} [data.expand] + * @param {Array} [data.omit] + * @return {Promise} + */ + get: (access, data) => { + if (typeof data === 'undefined') { + data = {}; + } + + return access.can('proxy_hosts:get', data.id) + .then((access_data) => { + let query = proxyHostModel + .query() + .where('is_deleted', 0) + .andWhere('id', data.id) + .allowEager('[owner,access_list,certificate]') + .first(); + + if (access_data.permission_visibility !== 'all') { + query.andWhere('owner_user_id', access.token.getUserId(1)); + } + + // Custom omissions + if (typeof data.omit !== 'undefined' && data.omit !== null) { + query.omit(data.omit); + } + + if (typeof data.expand !== 'undefined' && data.expand !== null) { + query.eager('[' + data.expand.join(', ') + ']'); + } + + return query; + }) + .then((row) => { + if (row) { + row = internalHost.cleanRowCertificateMeta(row); + return _.omit(row, omissions()); + } else { + throw new error.ItemNotFoundError(data.id); + } + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {String} [data.reason] + * @returns {Promise} + */ + delete: (access, data) => { + return access.can('proxy_hosts:delete', data.id) + .then(() => { + return internalProxyHost.get(access, {id: data.id}); + }) + .then((row) => { + if (!row) { + throw new error.ItemNotFoundError(data.id); + } + + return proxyHostModel + .query() + .where('id', row.id) + .patch({ + is_deleted: 1 + }) + .then(() => { + // Delete Nginx Config + return internalNginx.deleteConfig('proxy_host', row) + .then(() => { + return internalNginx.reload(); + }); + }) + .then(() => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'deleted', + object_type: 'proxy-host', + object_id: row.id, + meta: _.omit(row, omissions()) + }); + }); + }) + .then(() => { + return true; + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {String} [data.reason] + * @returns {Promise} + */ + enable: (access, data) => { + return access.can('proxy_hosts:update', data.id) + .then(() => { + return internalProxyHost.get(access, { + id: data.id, + expand: ['certificate', 'owner', 'access_list'] + }); + }) + .then((row) => { + if (!row) { + throw new error.ItemNotFoundError(data.id); + } else if (row.enabled) { + throw new error.ValidationError('Host is already enabled'); + } + + row.enabled = 1; + + return proxyHostModel + .query() + .where('id', row.id) + .patch({ + enabled: 1 + }) + .then(() => { + // Configure nginx + return internalNginx.configure(proxyHostModel, 'proxy_host', row); + }) + .then(() => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'enabled', + object_type: 'proxy-host', + object_id: row.id, + meta: _.omit(row, omissions()) + }); + }); + }) + .then(() => { + return true; + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {String} [data.reason] + * @returns {Promise} + */ + disable: (access, data) => { + return access.can('proxy_hosts:update', data.id) + .then(() => { + return internalProxyHost.get(access, {id: data.id}); + }) + .then((row) => { + if (!row) { + throw new error.ItemNotFoundError(data.id); + } else if (!row.enabled) { + throw new error.ValidationError('Host is already disabled'); + } + + row.enabled = 0; + + return proxyHostModel + .query() + .where('id', row.id) + .patch({ + enabled: 0 + }) + .then(() => { + // Delete Nginx Config + return internalNginx.deleteConfig('proxy_host', row) + .then(() => { + return internalNginx.reload(); + }); + }) + .then(() => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'disabled', + object_type: 'proxy-host', + object_id: row.id, + meta: _.omit(row, omissions()) + }); + }); + }) + .then(() => { + return true; + }); + }, + + /** + * All Hosts + * + * @param {Access} access + * @param {Array} [expand] + * @param {String} [search_query] + * @returns {Promise} + */ + getAll: (access, expand, search_query) => { + return access.can('proxy_hosts:list') + .then((access_data) => { + let query = proxyHostModel + .query() + .where('is_deleted', 0) + .groupBy('id') + .omit(['is_deleted']) + .allowEager('[owner,access_list,certificate]') + .orderBy('domain_names', 'ASC'); + + if (access_data.permission_visibility !== 'all') { + query.andWhere('owner_user_id', access.token.getUserId(1)); + } + + // Query is used for searching + if (typeof search_query === 'string') { + query.where(function () { + this.where('domain_names', 'like', '%' + search_query + '%'); + }); + } + + if (typeof expand !== 'undefined' && expand !== null) { + query.eager('[' + expand.join(', ') + ']'); + } + + return query; + }) + .then((rows) => { + if (typeof expand !== 'undefined' && expand !== null && expand.indexOf('certificate') !== -1) { + return internalHost.cleanAllRowsCertificateMeta(rows); + } + + return rows; + }); + }, + + /** + * Report use + * + * @param {Number} user_id + * @param {String} visibility + * @returns {Promise} + */ + getCount: (user_id, visibility) => { + let query = proxyHostModel + .query() + .count('id as count') + .where('is_deleted', 0); + + if (visibility !== 'all') { + query.andWhere('owner_user_id', user_id); + } + + return query.first() + .then((row) => { + return parseInt(row.count, 10); + }); + } +}; + +module.exports = internalProxyHost; diff --git a/backend/internal/redirection-host.js b/backend/internal/redirection-host.js new file mode 100644 index 000000000..f22c36688 --- /dev/null +++ b/backend/internal/redirection-host.js @@ -0,0 +1,461 @@ +const _ = require('lodash'); +const error = require('../lib/error'); +const redirectionHostModel = require('../models/redirection_host'); +const internalHost = require('./host'); +const internalNginx = require('./nginx'); +const internalAuditLog = require('./audit-log'); +const internalCertificate = require('./certificate'); + +function omissions () { + return ['is_deleted']; +} + +const internalRedirectionHost = { + + /** + * @param {Access} access + * @param {Object} data + * @returns {Promise} + */ + create: (access, data) => { + let create_certificate = data.certificate_id === 'new'; + + if (create_certificate) { + delete data.certificate_id; + } + + return access.can('redirection_hosts:create', data) + .then((/*access_data*/) => { + // Get a list of the domain names and check each of them against existing records + let domain_name_check_promises = []; + + data.domain_names.map(function (domain_name) { + domain_name_check_promises.push(internalHost.isHostnameTaken(domain_name)); + }); + + return Promise.all(domain_name_check_promises) + .then((check_results) => { + check_results.map(function (result) { + if (result.is_taken) { + throw new error.ValidationError(result.hostname + ' is already in use'); + } + }); + }); + }) + .then(() => { + // At this point the domains should have been checked + data.owner_user_id = access.token.getUserId(1); + data = internalHost.cleanSslHstsData(data); + + return redirectionHostModel + .query() + .omit(omissions()) + .insertAndFetch(data); + }) + .then((row) => { + if (create_certificate) { + return internalCertificate.createQuickCertificate(access, data) + .then((cert) => { + // update host with cert id + return internalRedirectionHost.update(access, { + id: row.id, + certificate_id: cert.id + }); + }) + .then(() => { + return row; + }); + } else { + return row; + } + }) + .then((row) => { + // re-fetch with cert + return internalRedirectionHost.get(access, { + id: row.id, + expand: ['certificate', 'owner'] + }); + }) + .then((row) => { + // Configure nginx + return internalNginx.configure(redirectionHostModel, 'redirection_host', row) + .then(() => { + return row; + }); + }) + .then((row) => { + data.meta = _.assign({}, data.meta || {}, row.meta); + + // Add to audit log + return internalAuditLog.add(access, { + action: 'created', + object_type: 'redirection-host', + object_id: row.id, + meta: data + }) + .then(() => { + return row; + }); + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @return {Promise} + */ + update: (access, data) => { + let create_certificate = data.certificate_id === 'new'; + + if (create_certificate) { + delete data.certificate_id; + } + + return access.can('redirection_hosts:update', data.id) + .then((/*access_data*/) => { + // Get a list of the domain names and check each of them against existing records + let domain_name_check_promises = []; + + if (typeof data.domain_names !== 'undefined') { + data.domain_names.map(function (domain_name) { + domain_name_check_promises.push(internalHost.isHostnameTaken(domain_name, 'redirection', data.id)); + }); + + return Promise.all(domain_name_check_promises) + .then((check_results) => { + check_results.map(function (result) { + if (result.is_taken) { + throw new error.ValidationError(result.hostname + ' is already in use'); + } + }); + }); + } + }) + .then(() => { + return internalRedirectionHost.get(access, {id: data.id}); + }) + .then((row) => { + if (row.id !== data.id) { + // Sanity check that something crazy hasn't happened + throw new error.InternalValidationError('Redirection Host could not be updated, IDs do not match: ' + row.id + ' !== ' + data.id); + } + + if (create_certificate) { + return internalCertificate.createQuickCertificate(access, { + domain_names: data.domain_names || row.domain_names, + meta: _.assign({}, row.meta, data.meta) + }) + .then((cert) => { + // update host with cert id + data.certificate_id = cert.id; + }) + .then(() => { + return row; + }); + } else { + return row; + } + }) + .then((row) => { + // Add domain_names to the data in case it isn't there, so that the audit log renders correctly. The order is important here. + data = _.assign({}, { + domain_names: row.domain_names + }, data); + + data = internalHost.cleanSslHstsData(data, row); + + return redirectionHostModel + .query() + .where({id: data.id}) + .patch(data) + .then((saved_row) => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'updated', + object_type: 'redirection-host', + object_id: row.id, + meta: data + }) + .then(() => { + return _.omit(saved_row, omissions()); + }); + }); + }) + .then(() => { + return internalRedirectionHost.get(access, { + id: data.id, + expand: ['owner', 'certificate'] + }) + .then((row) => { + // Configure nginx + return internalNginx.configure(redirectionHostModel, 'redirection_host', row) + .then((new_meta) => { + row.meta = new_meta; + row = internalHost.cleanRowCertificateMeta(row); + return _.omit(row, omissions()); + }); + }); + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {Array} [data.expand] + * @param {Array} [data.omit] + * @return {Promise} + */ + get: (access, data) => { + if (typeof data === 'undefined') { + data = {}; + } + + return access.can('redirection_hosts:get', data.id) + .then((access_data) => { + let query = redirectionHostModel + .query() + .where('is_deleted', 0) + .andWhere('id', data.id) + .allowEager('[owner,certificate]') + .first(); + + if (access_data.permission_visibility !== 'all') { + query.andWhere('owner_user_id', access.token.getUserId(1)); + } + + // Custom omissions + if (typeof data.omit !== 'undefined' && data.omit !== null) { + query.omit(data.omit); + } + + if (typeof data.expand !== 'undefined' && data.expand !== null) { + query.eager('[' + data.expand.join(', ') + ']'); + } + + return query; + }) + .then((row) => { + if (row) { + row = internalHost.cleanRowCertificateMeta(row); + return _.omit(row, omissions()); + } else { + throw new error.ItemNotFoundError(data.id); + } + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {String} [data.reason] + * @returns {Promise} + */ + delete: (access, data) => { + return access.can('redirection_hosts:delete', data.id) + .then(() => { + return internalRedirectionHost.get(access, {id: data.id}); + }) + .then((row) => { + if (!row) { + throw new error.ItemNotFoundError(data.id); + } + + return redirectionHostModel + .query() + .where('id', row.id) + .patch({ + is_deleted: 1 + }) + .then(() => { + // Delete Nginx Config + return internalNginx.deleteConfig('redirection_host', row) + .then(() => { + return internalNginx.reload(); + }); + }) + .then(() => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'deleted', + object_type: 'redirection-host', + object_id: row.id, + meta: _.omit(row, omissions()) + }); + }); + }) + .then(() => { + return true; + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {String} [data.reason] + * @returns {Promise} + */ + enable: (access, data) => { + return access.can('redirection_hosts:update', data.id) + .then(() => { + return internalRedirectionHost.get(access, { + id: data.id, + expand: ['certificate', 'owner'] + }); + }) + .then((row) => { + if (!row) { + throw new error.ItemNotFoundError(data.id); + } else if (row.enabled) { + throw new error.ValidationError('Host is already enabled'); + } + + row.enabled = 1; + + return redirectionHostModel + .query() + .where('id', row.id) + .patch({ + enabled: 1 + }) + .then(() => { + // Configure nginx + return internalNginx.configure(redirectionHostModel, 'redirection_host', row); + }) + .then(() => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'enabled', + object_type: 'redirection-host', + object_id: row.id, + meta: _.omit(row, omissions()) + }); + }); + }) + .then(() => { + return true; + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {String} [data.reason] + * @returns {Promise} + */ + disable: (access, data) => { + return access.can('redirection_hosts:update', data.id) + .then(() => { + return internalRedirectionHost.get(access, {id: data.id}); + }) + .then((row) => { + if (!row) { + throw new error.ItemNotFoundError(data.id); + } else if (!row.enabled) { + throw new error.ValidationError('Host is already disabled'); + } + + row.enabled = 0; + + return redirectionHostModel + .query() + .where('id', row.id) + .patch({ + enabled: 0 + }) + .then(() => { + // Delete Nginx Config + return internalNginx.deleteConfig('redirection_host', row) + .then(() => { + return internalNginx.reload(); + }); + }) + .then(() => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'disabled', + object_type: 'redirection-host', + object_id: row.id, + meta: _.omit(row, omissions()) + }); + }); + }) + .then(() => { + return true; + }); + }, + + /** + * All Hosts + * + * @param {Access} access + * @param {Array} [expand] + * @param {String} [search_query] + * @returns {Promise} + */ + getAll: (access, expand, search_query) => { + return access.can('redirection_hosts:list') + .then((access_data) => { + let query = redirectionHostModel + .query() + .where('is_deleted', 0) + .groupBy('id') + .omit(['is_deleted']) + .allowEager('[owner,certificate]') + .orderBy('domain_names', 'ASC'); + + if (access_data.permission_visibility !== 'all') { + query.andWhere('owner_user_id', access.token.getUserId(1)); + } + + // Query is used for searching + if (typeof search_query === 'string') { + query.where(function () { + this.where('domain_names', 'like', '%' + search_query + '%'); + }); + } + + if (typeof expand !== 'undefined' && expand !== null) { + query.eager('[' + expand.join(', ') + ']'); + } + + return query; + }) + .then((rows) => { + if (typeof expand !== 'undefined' && expand !== null && expand.indexOf('certificate') !== -1) { + return internalHost.cleanAllRowsCertificateMeta(rows); + } + + return rows; + }); + }, + + /** + * Report use + * + * @param {Number} user_id + * @param {String} visibility + * @returns {Promise} + */ + getCount: (user_id, visibility) => { + let query = redirectionHostModel + .query() + .count('id as count') + .where('is_deleted', 0); + + if (visibility !== 'all') { + query.andWhere('owner_user_id', user_id); + } + + return query.first() + .then((row) => { + return parseInt(row.count, 10); + }); + } +}; + +module.exports = internalRedirectionHost; diff --git a/backend/internal/report.js b/backend/internal/report.js new file mode 100644 index 000000000..4dde659bd --- /dev/null +++ b/backend/internal/report.js @@ -0,0 +1,38 @@ +const internalProxyHost = require('./proxy-host'); +const internalRedirectionHost = require('./redirection-host'); +const internalDeadHost = require('./dead-host'); +const internalStream = require('./stream'); + +const internalReport = { + + /** + * @param {Access} access + * @return {Promise} + */ + getHostsReport: (access) => { + return access.can('reports:hosts', 1) + .then((access_data) => { + let user_id = access.token.getUserId(1); + + let promises = [ + internalProxyHost.getCount(user_id, access_data.visibility), + internalRedirectionHost.getCount(user_id, access_data.visibility), + internalStream.getCount(user_id, access_data.visibility), + internalDeadHost.getCount(user_id, access_data.visibility) + ]; + + return Promise.all(promises); + }) + .then((counts) => { + return { + proxy: counts.shift(), + redirection: counts.shift(), + stream: counts.shift(), + dead: counts.shift() + }; + }); + + } +}; + +module.exports = internalReport; diff --git a/backend/internal/setting.js b/backend/internal/setting.js new file mode 100644 index 000000000..d4ac67d8a --- /dev/null +++ b/backend/internal/setting.js @@ -0,0 +1,133 @@ +const fs = require('fs'); +const error = require('../lib/error'); +const settingModel = require('../models/setting'); +const internalNginx = require('./nginx'); + +const internalSetting = { + + /** + * @param {Access} access + * @param {Object} data + * @param {String} data.id + * @return {Promise} + */ + update: (access, data) => { + return access.can('settings:update', data.id) + .then((/*access_data*/) => { + return internalSetting.get(access, {id: data.id}); + }) + .then((row) => { + if (row.id !== data.id) { + // Sanity check that something crazy hasn't happened + throw new error.InternalValidationError('Setting could not be updated, IDs do not match: ' + row.id + ' !== ' + data.id); + } + + return settingModel + .query() + .where({id: data.id}) + .patch(data); + }) + .then(() => { + return internalSetting.get(access, { + id: data.id + }); + }) + .then((row) => { + if (row.id === 'default-site') { + // write the html if we need to + if (row.value === 'html') { + fs.writeFileSync('/data/nginx/default_www/index.html', row.meta.html, {encoding: 'utf8'}); + } + + // Configure nginx + return internalNginx.deleteConfig('default') + .then(() => { + return internalNginx.generateConfig('default', row); + }) + .then(() => { + return internalNginx.test(); + }) + .then(() => { + return internalNginx.reload(); + }) + .then(() => { + return row; + }) + .catch((/*err*/) => { + internalNginx.deleteConfig('default') + .then(() => { + return internalNginx.test(); + }) + .then(() => { + return internalNginx.reload(); + }) + .then(() => { + // I'm being slack here I know.. + throw new error.ValidationError('Could not reconfigure Nginx. Please check logs.'); + }); + }); + } else { + return row; + } + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {String} data.id + * @return {Promise} + */ + get: (access, data) => { + return access.can('settings:get', data.id) + .then(() => { + return settingModel + .query() + .where('id', data.id) + .first(); + }) + .then((row) => { + if (row) { + return row; + } else { + throw new error.ItemNotFoundError(data.id); + } + }); + }, + + /** + * This will only count the settings + * + * @param {Access} access + * @returns {*} + */ + getCount: (access) => { + return access.can('settings:list') + .then(() => { + return settingModel + .query() + .count('id as count') + .first(); + }) + .then((row) => { + return parseInt(row.count, 10); + }); + }, + + /** + * All settings + * + * @param {Access} access + * @returns {Promise} + */ + getAll: (access) => { + return access.can('settings:list') + .then(() => { + return settingModel + .query() + .orderBy('description', 'ASC'); + }); + } +}; + +module.exports = internalSetting; diff --git a/backend/internal/stream.js b/backend/internal/stream.js new file mode 100644 index 000000000..9c458a10b --- /dev/null +++ b/backend/internal/stream.js @@ -0,0 +1,348 @@ +const _ = require('lodash'); +const error = require('../lib/error'); +const streamModel = require('../models/stream'); +const internalNginx = require('./nginx'); +const internalAuditLog = require('./audit-log'); + +function omissions () { + return ['is_deleted']; +} + +const internalStream = { + + /** + * @param {Access} access + * @param {Object} data + * @returns {Promise} + */ + create: (access, data) => { + return access.can('streams:create', data) + .then((/*access_data*/) => { + // TODO: At this point the existing ports should have been checked + data.owner_user_id = access.token.getUserId(1); + + if (typeof data.meta === 'undefined') { + data.meta = {}; + } + + return streamModel + .query() + .omit(omissions()) + .insertAndFetch(data); + }) + .then((row) => { + // Configure nginx + return internalNginx.configure(streamModel, 'stream', row) + .then(() => { + return internalStream.get(access, {id: row.id, expand: ['owner']}); + }); + }) + .then((row) => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'created', + object_type: 'stream', + object_id: row.id, + meta: data + }) + .then(() => { + return row; + }); + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @return {Promise} + */ + update: (access, data) => { + return access.can('streams:update', data.id) + .then((/*access_data*/) => { + // TODO: at this point the existing streams should have been checked + return internalStream.get(access, {id: data.id}); + }) + .then((row) => { + if (row.id !== data.id) { + // Sanity check that something crazy hasn't happened + throw new error.InternalValidationError('Stream could not be updated, IDs do not match: ' + row.id + ' !== ' + data.id); + } + + return streamModel + .query() + .omit(omissions()) + .patchAndFetchById(row.id, data) + .then((saved_row) => { + return internalNginx.configure(streamModel, 'stream', saved_row) + .then(() => { + return internalStream.get(access, {id: row.id, expand: ['owner']}); + }); + }) + .then((saved_row) => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'updated', + object_type: 'stream', + object_id: row.id, + meta: data + }) + .then(() => { + return _.omit(saved_row, omissions()); + }); + }); + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {Array} [data.expand] + * @param {Array} [data.omit] + * @return {Promise} + */ + get: (access, data) => { + if (typeof data === 'undefined') { + data = {}; + } + + return access.can('streams:get', data.id) + .then((access_data) => { + let query = streamModel + .query() + .where('is_deleted', 0) + .andWhere('id', data.id) + .allowEager('[owner]') + .first(); + + if (access_data.permission_visibility !== 'all') { + query.andWhere('owner_user_id', access.token.getUserId(1)); + } + + // Custom omissions + if (typeof data.omit !== 'undefined' && data.omit !== null) { + query.omit(data.omit); + } + + if (typeof data.expand !== 'undefined' && data.expand !== null) { + query.eager('[' + data.expand.join(', ') + ']'); + } + + return query; + }) + .then((row) => { + if (row) { + return _.omit(row, omissions()); + } else { + throw new error.ItemNotFoundError(data.id); + } + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {String} [data.reason] + * @returns {Promise} + */ + delete: (access, data) => { + return access.can('streams:delete', data.id) + .then(() => { + return internalStream.get(access, {id: data.id}); + }) + .then((row) => { + if (!row) { + throw new error.ItemNotFoundError(data.id); + } + + return streamModel + .query() + .where('id', row.id) + .patch({ + is_deleted: 1 + }) + .then(() => { + // Delete Nginx Config + return internalNginx.deleteConfig('stream', row) + .then(() => { + return internalNginx.reload(); + }); + }) + .then(() => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'deleted', + object_type: 'stream', + object_id: row.id, + meta: _.omit(row, omissions()) + }); + }); + }) + .then(() => { + return true; + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {String} [data.reason] + * @returns {Promise} + */ + enable: (access, data) => { + return access.can('streams:update', data.id) + .then(() => { + return internalStream.get(access, { + id: data.id, + expand: ['owner'] + }); + }) + .then((row) => { + if (!row) { + throw new error.ItemNotFoundError(data.id); + } else if (row.enabled) { + throw new error.ValidationError('Host is already enabled'); + } + + row.enabled = 1; + + return streamModel + .query() + .where('id', row.id) + .patch({ + enabled: 1 + }) + .then(() => { + // Configure nginx + return internalNginx.configure(streamModel, 'stream', row); + }) + .then(() => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'enabled', + object_type: 'stream', + object_id: row.id, + meta: _.omit(row, omissions()) + }); + }); + }) + .then(() => { + return true; + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @param {String} [data.reason] + * @returns {Promise} + */ + disable: (access, data) => { + return access.can('streams:update', data.id) + .then(() => { + return internalStream.get(access, {id: data.id}); + }) + .then((row) => { + if (!row) { + throw new error.ItemNotFoundError(data.id); + } else if (!row.enabled) { + throw new error.ValidationError('Host is already disabled'); + } + + row.enabled = 0; + + return streamModel + .query() + .where('id', row.id) + .patch({ + enabled: 0 + }) + .then(() => { + // Delete Nginx Config + return internalNginx.deleteConfig('stream', row) + .then(() => { + return internalNginx.reload(); + }); + }) + .then(() => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'disabled', + object_type: 'stream-host', + object_id: row.id, + meta: _.omit(row, omissions()) + }); + }); + }) + .then(() => { + return true; + }); + }, + + /** + * All Streams + * + * @param {Access} access + * @param {Array} [expand] + * @param {String} [search_query] + * @returns {Promise} + */ + getAll: (access, expand, search_query) => { + return access.can('streams:list') + .then((access_data) => { + let query = streamModel + .query() + .where('is_deleted', 0) + .groupBy('id') + .omit(['is_deleted']) + .allowEager('[owner]') + .orderBy('incoming_port', 'ASC'); + + if (access_data.permission_visibility !== 'all') { + query.andWhere('owner_user_id', access.token.getUserId(1)); + } + + // Query is used for searching + if (typeof search_query === 'string') { + query.where(function () { + this.where('incoming_port', 'like', '%' + search_query + '%'); + }); + } + + if (typeof expand !== 'undefined' && expand !== null) { + query.eager('[' + expand.join(', ') + ']'); + } + + return query; + }); + }, + + /** + * Report use + * + * @param {Number} user_id + * @param {String} visibility + * @returns {Promise} + */ + getCount: (user_id, visibility) => { + let query = streamModel + .query() + .count('id as count') + .where('is_deleted', 0); + + if (visibility !== 'all') { + query.andWhere('owner_user_id', user_id); + } + + return query.first() + .then((row) => { + return parseInt(row.count, 10); + }); + } +}; + +module.exports = internalStream; diff --git a/backend/internal/token.js b/backend/internal/token.js new file mode 100644 index 000000000..a64b90105 --- /dev/null +++ b/backend/internal/token.js @@ -0,0 +1,162 @@ +const _ = require('lodash'); +const error = require('../lib/error'); +const userModel = require('../models/user'); +const authModel = require('../models/auth'); +const helpers = require('../lib/helpers'); +const TokenModel = require('../models/token'); + +module.exports = { + + /** + * @param {Object} data + * @param {String} data.identity + * @param {String} data.secret + * @param {String} [data.scope] + * @param {String} [data.expiry] + * @param {String} [issuer] + * @returns {Promise} + */ + getTokenFromEmail: (data, issuer) => { + let Token = new TokenModel(); + + data.scope = data.scope || 'user'; + data.expiry = data.expiry || '1d'; + + return userModel + .query() + .where('email', data.identity) + .andWhere('is_deleted', 0) + .andWhere('is_disabled', 0) + .first() + .then((user) => { + if (user) { + // Get auth + return authModel + .query() + .where('user_id', '=', user.id) + .where('type', '=', 'password') + .first() + .then((auth) => { + if (auth) { + return auth.verifyPassword(data.secret) + .then((valid) => { + if (valid) { + + if (data.scope !== 'user' && _.indexOf(user.roles, data.scope) === -1) { + // The scope requested doesn't exist as a role against the user, + // you shall not pass. + throw new error.AuthError('Invalid scope: ' + data.scope); + } + + // Create a moment of the expiry expression + let expiry = helpers.parseDatePeriod(data.expiry); + if (expiry === null) { + throw new error.AuthError('Invalid expiry time: ' + data.expiry); + } + + return Token.create({ + iss: issuer || 'api', + attrs: { + id: user.id + }, + scope: [data.scope], + expiresIn: data.expiry + }) + .then((signed) => { + return { + token: signed.token, + expires: expiry.toISOString() + }; + }); + } else { + throw new error.AuthError('Invalid password'); + } + }); + } else { + throw new error.AuthError('No password auth for user'); + } + }); + } else { + throw new error.AuthError('No relevant user found'); + } + }); + }, + + /** + * @param {Access} access + * @param {Object} [data] + * @param {String} [data.expiry] + * @param {String} [data.scope] Only considered if existing token scope is admin + * @returns {Promise} + */ + getFreshToken: (access, data) => { + let Token = new TokenModel(); + + data = data || {}; + data.expiry = data.expiry || '1d'; + + if (access && access.token.getUserId(0)) { + + // Create a moment of the expiry expression + let expiry = helpers.parseDatePeriod(data.expiry); + if (expiry === null) { + throw new error.AuthError('Invalid expiry time: ' + data.expiry); + } + + let token_attrs = { + id: access.token.getUserId(0) + }; + + // Only admins can request otherwise scoped tokens + let scope = access.token.get('scope'); + if (data.scope && access.token.hasScope('admin')) { + scope = [data.scope]; + + if (data.scope === 'job-board' || data.scope === 'worker') { + token_attrs.id = 0; + } + } + + return Token.create({ + iss: 'api', + scope: scope, + attrs: token_attrs, + expiresIn: data.expiry + }) + .then((signed) => { + return { + token: signed.token, + expires: expiry.toISOString() + }; + }); + } else { + throw new error.AssertionFailedError('Existing token contained invalid user data'); + } + }, + + /** + * @param {Object} user + * @returns {Promise} + */ + getTokenFromUser: (user) => { + const expire = '1d'; + const Token = new TokenModel(); + const expiry = helpers.parseDatePeriod(expire); + + return Token.create({ + iss: 'api', + attrs: { + id: user.id + }, + scope: ['user'], + expiresIn: expire + }) + .then((signed) => { + return { + token: signed.token, + expires: expiry.toISOString(), + user: user + }; + }); + } +}; diff --git a/backend/internal/user.js b/backend/internal/user.js new file mode 100644 index 000000000..2e2d8abf6 --- /dev/null +++ b/backend/internal/user.js @@ -0,0 +1,518 @@ +const _ = require('lodash'); +const error = require('../lib/error'); +const userModel = require('../models/user'); +const userPermissionModel = require('../models/user_permission'); +const authModel = require('../models/auth'); +const gravatar = require('gravatar'); +const internalToken = require('./token'); +const internalAuditLog = require('./audit-log'); + +function omissions () { + return ['is_deleted']; +} + +const internalUser = { + + /** + * @param {Access} access + * @param {Object} data + * @returns {Promise} + */ + create: (access, data) => { + let auth = data.auth || null; + delete data.auth; + + data.avatar = data.avatar || ''; + data.roles = data.roles || []; + + if (typeof data.is_disabled !== 'undefined') { + data.is_disabled = data.is_disabled ? 1 : 0; + } + + return access.can('users:create', data) + .then(() => { + data.avatar = gravatar.url(data.email, {default: 'mm'}); + + return userModel + .query() + .omit(omissions()) + .insertAndFetch(data); + }) + .then((user) => { + if (auth) { + return authModel + .query() + .insert({ + user_id: user.id, + type: auth.type, + secret: auth.secret, + meta: {} + }) + .then(() => { + return user; + }); + } else { + return user; + } + }) + .then((user) => { + // Create permissions row as well + let is_admin = data.roles.indexOf('admin') !== -1; + + return userPermissionModel + .query() + .insert({ + user_id: user.id, + visibility: is_admin ? 'all' : 'user', + proxy_hosts: 'manage', + redirection_hosts: 'manage', + dead_hosts: 'manage', + streams: 'manage', + access_lists: 'manage', + certificates: 'manage' + }) + .then(() => { + return internalUser.get(access, {id: user.id, expand: ['permissions']}); + }); + }) + .then((user) => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'created', + object_type: 'user', + object_id: user.id, + meta: user + }) + .then(() => { + return user; + }); + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Integer} data.id + * @param {String} [data.email] + * @param {String} [data.name] + * @return {Promise} + */ + update: (access, data) => { + if (typeof data.is_disabled !== 'undefined') { + data.is_disabled = data.is_disabled ? 1 : 0; + } + + return access.can('users:update', data.id) + .then(() => { + + // Make sure that the user being updated doesn't change their email to another user that is already using it + // 1. get user we want to update + return internalUser.get(access, {id: data.id}) + .then((user) => { + + // 2. if email is to be changed, find other users with that email + if (typeof data.email !== 'undefined') { + data.email = data.email.toLowerCase().trim(); + + if (user.email !== data.email) { + return internalUser.isEmailAvailable(data.email, data.id) + .then((available) => { + if (!available) { + throw new error.ValidationError('Email address already in use - ' + data.email); + } + + return user; + }); + } + } + + // No change to email: + return user; + }); + }) + .then((user) => { + if (user.id !== data.id) { + // Sanity check that something crazy hasn't happened + throw new error.InternalValidationError('User could not be updated, IDs do not match: ' + user.id + ' !== ' + data.id); + } + + data.avatar = gravatar.url(data.email || user.email, {default: 'mm'}); + + return userModel + .query() + .omit(omissions()) + .patchAndFetchById(user.id, data) + .then((saved_user) => { + return _.omit(saved_user, omissions()); + }); + }) + .then(() => { + return internalUser.get(access, {id: data.id}); + }) + .then((user) => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'updated', + object_type: 'user', + object_id: user.id, + meta: data + }) + .then(() => { + return user; + }); + }); + }, + + /** + * @param {Access} access + * @param {Object} [data] + * @param {Integer} [data.id] Defaults to the token user + * @param {Array} [data.expand] + * @param {Array} [data.omit] + * @return {Promise} + */ + get: (access, data) => { + if (typeof data === 'undefined') { + data = {}; + } + + if (typeof data.id === 'undefined' || !data.id) { + data.id = access.token.getUserId(0); + } + + return access.can('users:get', data.id) + .then(() => { + let query = userModel + .query() + .where('is_deleted', 0) + .andWhere('id', data.id) + .allowEager('[permissions]') + .first(); + + // Custom omissions + if (typeof data.omit !== 'undefined' && data.omit !== null) { + query.omit(data.omit); + } + + if (typeof data.expand !== 'undefined' && data.expand !== null) { + query.eager('[' + data.expand.join(', ') + ']'); + } + + return query; + }) + .then((row) => { + if (row) { + return _.omit(row, omissions()); + } else { + throw new error.ItemNotFoundError(data.id); + } + }); + }, + + /** + * Checks if an email address is available, but if a user_id is supplied, it will ignore checking + * against that user. + * + * @param email + * @param user_id + */ + isEmailAvailable: (email, user_id) => { + let query = userModel + .query() + .where('email', '=', email.toLowerCase().trim()) + .where('is_deleted', 0) + .first(); + + if (typeof user_id !== 'undefined') { + query.where('id', '!=', user_id); + } + + return query + .then((user) => { + return !user; + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Integer} data.id + * @param {String} [data.reason] + * @returns {Promise} + */ + delete: (access, data) => { + return access.can('users:delete', data.id) + .then(() => { + return internalUser.get(access, {id: data.id}); + }) + .then((user) => { + if (!user) { + throw new error.ItemNotFoundError(data.id); + } + + // Make sure user can't delete themselves + if (user.id === access.token.getUserId(0)) { + throw new error.PermissionError('You cannot delete yourself.'); + } + + return userModel + .query() + .where('id', user.id) + .patch({ + is_deleted: 1 + }) + .then(() => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'deleted', + object_type: 'user', + object_id: user.id, + meta: _.omit(user, omissions()) + }); + }); + }) + .then(() => { + return true; + }); + }, + + /** + * This will only count the users + * + * @param {Access} access + * @param {String} [search_query] + * @returns {*} + */ + getCount: (access, search_query) => { + return access.can('users:list') + .then(() => { + let query = userModel + .query() + .count('id as count') + .where('is_deleted', 0) + .first(); + + // Query is used for searching + if (typeof search_query === 'string') { + query.where(function () { + this.where('user.name', 'like', '%' + search_query + '%') + .orWhere('user.email', 'like', '%' + search_query + '%'); + }); + } + + return query; + }) + .then((row) => { + return parseInt(row.count, 10); + }); + }, + + /** + * All users + * + * @param {Access} access + * @param {Array} [expand] + * @param {String} [search_query] + * @returns {Promise} + */ + getAll: (access, expand, search_query) => { + return access.can('users:list') + .then(() => { + let query = userModel + .query() + .where('is_deleted', 0) + .groupBy('id') + .omit(['is_deleted']) + .allowEager('[permissions]') + .orderBy('name', 'ASC'); + + // Query is used for searching + if (typeof search_query === 'string') { + query.where(function () { + this.where('name', 'like', '%' + search_query + '%') + .orWhere('email', 'like', '%' + search_query + '%'); + }); + } + + if (typeof expand !== 'undefined' && expand !== null) { + query.eager('[' + expand.join(', ') + ']'); + } + + return query; + }); + }, + + /** + * @param {Access} access + * @param {Integer} [id_requested] + * @returns {[String]} + */ + getUserOmisionsByAccess: (access, id_requested) => { + let response = []; // Admin response + + if (!access.token.hasScope('admin') && access.token.getUserId(0) !== id_requested) { + response = ['roles', 'is_deleted']; // Restricted response + } + + return response; + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Integer} data.id + * @param {String} data.type + * @param {String} data.secret + * @return {Promise} + */ + setPassword: (access, data) => { + return access.can('users:password', data.id) + .then(() => { + return internalUser.get(access, {id: data.id}); + }) + .then((user) => { + if (user.id !== data.id) { + // Sanity check that something crazy hasn't happened + throw new error.InternalValidationError('User could not be updated, IDs do not match: ' + user.id + ' !== ' + data.id); + } + + if (user.id === access.token.getUserId(0)) { + // they're setting their own password. Make sure their current password is correct + if (typeof data.current === 'undefined' || !data.current) { + throw new error.ValidationError('Current password was not supplied'); + } + + return internalToken.getTokenFromEmail({ + identity: user.email, + secret: data.current + }) + .then(() => { + return user; + }); + } + + return user; + }) + .then((user) => { + // Get auth, patch if it exists + return authModel + .query() + .where('user_id', user.id) + .andWhere('type', data.type) + .first() + .then((existing_auth) => { + if (existing_auth) { + // patch + return authModel + .query() + .where('user_id', user.id) + .andWhere('type', data.type) + .patch({ + type: data.type, // This is required for the model to encrypt on save + secret: data.secret + }); + } else { + // insert + return authModel + .query() + .insert({ + user_id: user.id, + type: data.type, + secret: data.secret, + meta: {} + }); + } + }) + .then(() => { + // Add to Audit Log + return internalAuditLog.add(access, { + action: 'updated', + object_type: 'user', + object_id: user.id, + meta: { + name: user.name, + password_changed: true, + auth_type: data.type + } + }); + }); + }) + .then(() => { + return true; + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @return {Promise} + */ + setPermissions: (access, data) => { + return access.can('users:permissions', data.id) + .then(() => { + return internalUser.get(access, {id: data.id}); + }) + .then((user) => { + if (user.id !== data.id) { + // Sanity check that something crazy hasn't happened + throw new error.InternalValidationError('User could not be updated, IDs do not match: ' + user.id + ' !== ' + data.id); + } + + return user; + }) + .then((user) => { + // Get perms row, patch if it exists + return userPermissionModel + .query() + .where('user_id', user.id) + .first() + .then((existing_auth) => { + if (existing_auth) { + // patch + return userPermissionModel + .query() + .where('user_id', user.id) + .patchAndFetchById(existing_auth.id, _.assign({user_id: user.id}, data)); + } else { + // insert + return userPermissionModel + .query() + .insertAndFetch(_.assign({user_id: user.id}, data)); + } + }) + .then((permissions) => { + // Add to Audit Log + return internalAuditLog.add(access, { + action: 'updated', + object_type: 'user', + object_id: user.id, + meta: { + name: user.name, + permissions: permissions + } + }); + + }); + }) + .then(() => { + return true; + }); + }, + + /** + * @param {Access} access + * @param {Object} data + * @param {Integer} data.id + */ + loginAs: (access, data) => { + return access.can('users:loginas', data.id) + .then(() => { + return internalUser.get(access, data); + }) + .then((user) => { + return internalToken.getTokenFromUser(user); + }); + } +}; + +module.exports = internalUser; diff --git a/backend/knexfile.js b/backend/knexfile.js new file mode 100644 index 000000000..391ca0050 --- /dev/null +++ b/backend/knexfile.js @@ -0,0 +1,19 @@ +module.exports = { + development: { + client: 'mysql', + migrations: { + tableName: 'migrations', + stub: 'lib/migrate_template.js', + directory: 'migrations' + } + }, + + production: { + client: 'mysql', + migrations: { + tableName: 'migrations', + stub: 'lib/migrate_template.js', + directory: 'migrations' + } + } +}; diff --git a/backend/lib/access.js b/backend/lib/access.js new file mode 100644 index 000000000..9d7329d94 --- /dev/null +++ b/backend/lib/access.js @@ -0,0 +1,314 @@ +/** + * Some Notes: This is a friggin complicated piece of code. + * + * "scope" in this file means "where did this token come from and what is using it", so 99% of the time + * the "scope" is going to be "user" because it would be a user token. This is not to be confused with + * the "role" which could be "user" or "admin". The scope in fact, could be "worker" or anything else. + * + * + */ + +const _ = require('lodash'); +const logger = require('../logger').access; +const validator = require('ajv'); +const error = require('./error'); +const userModel = require('../models/user'); +const proxyHostModel = require('../models/proxy_host'); +const TokenModel = require('../models/token'); +const roleSchema = require('./access/roles.json'); +const permsSchema = require('./access/permissions.json'); + +module.exports = function (token_string) { + let Token = new TokenModel(); + let token_data = null; + let initialised = false; + let object_cache = {}; + let allow_internal_access = false; + let user_roles = []; + let permissions = {}; + + /** + * Loads the Token object from the token string + * + * @returns {Promise} + */ + this.init = () => { + return new Promise((resolve, reject) => { + if (initialised) { + resolve(); + } else if (!token_string) { + reject(new error.PermissionError('Permission Denied')); + } else { + resolve(Token.load(token_string) + .then((data) => { + token_data = data; + + // At this point we need to load the user from the DB and make sure they: + // - exist (and not soft deleted) + // - still have the appropriate scopes for this token + // This is only required when the User ID is supplied or if the token scope has `user` + + if (token_data.attrs.id || (typeof token_data.scope !== 'undefined' && _.indexOf(token_data.scope, 'user') !== -1)) { + // Has token user id or token user scope + return userModel + .query() + .where('id', token_data.attrs.id) + .andWhere('is_deleted', 0) + .andWhere('is_disabled', 0) + .allowEager('[permissions]') + .eager('[permissions]') + .first() + .then((user) => { + if (user) { + // make sure user has all scopes of the token + // The `user` role is not added against the user row, so we have to just add it here to get past this check. + user.roles.push('user'); + + let is_ok = true; + _.forEach(token_data.scope, (scope_item) => { + if (_.indexOf(user.roles, scope_item) === -1) { + is_ok = false; + } + }); + + if (!is_ok) { + throw new error.AuthError('Invalid token scope for User'); + } else { + initialised = true; + user_roles = user.roles; + permissions = user.permissions; + } + + } else { + throw new error.AuthError('User cannot be loaded for Token'); + } + }); + } else { + initialised = true; + } + })); + } + }); + }; + + /** + * Fetches the object ids from the database, only once per object type, for this token. + * This only applies to USER token scopes, as all other tokens are not really bound + * by object scopes + * + * @param {String} object_type + * @returns {Promise} + */ + this.loadObjects = (object_type) => { + return new Promise((resolve, reject) => { + if (Token.hasScope('user')) { + if (typeof token_data.attrs.id === 'undefined' || !token_data.attrs.id) { + reject(new error.AuthError('User Token supplied without a User ID')); + } else { + let token_user_id = token_data.attrs.id ? token_data.attrs.id : 0; + let query; + + if (typeof object_cache[object_type] === 'undefined') { + switch (object_type) { + + // USERS - should only return yourself + case 'users': + resolve(token_user_id ? [token_user_id] : []); + break; + + // Proxy Hosts + case 'proxy_hosts': + query = proxyHostModel + .query() + .select('id') + .andWhere('is_deleted', 0); + + if (permissions.visibility === 'user') { + query.andWhere('owner_user_id', token_user_id); + } + + resolve(query + .then((rows) => { + let result = []; + _.forEach(rows, (rule_row) => { + result.push(rule_row.id); + }); + + // enum should not have less than 1 item + if (!result.length) { + result.push(0); + } + + return result; + }) + ); + break; + + // DEFAULT: null + default: + resolve(null); + break; + } + } else { + resolve(object_cache[object_type]); + } + } + } else { + resolve(null); + } + }) + .then((objects) => { + object_cache[object_type] = objects; + return objects; + }); + }; + + /** + * Creates a schema object on the fly with the IDs and other values required to be checked against the permissionSchema + * + * @param {String} permission_label + * @returns {Object} + */ + this.getObjectSchema = (permission_label) => { + let base_object_type = permission_label.split(':').shift(); + + let schema = { + $id: 'objects', + $schema: 'http://json-schema.org/draft-07/schema#', + description: 'Actor Properties', + type: 'object', + additionalProperties: false, + properties: { + user_id: { + anyOf: [ + { + type: 'number', + enum: [Token.get('attrs').id] + } + ] + }, + scope: { + type: 'string', + pattern: '^' + Token.get('scope') + '$' + } + } + }; + + return this.loadObjects(base_object_type) + .then((object_result) => { + if (typeof object_result === 'object' && object_result !== null) { + schema.properties[base_object_type] = { + type: 'number', + enum: object_result, + minimum: 1 + }; + } else { + schema.properties[base_object_type] = { + type: 'number', + minimum: 1 + }; + } + + return schema; + }); + }; + + return { + + token: Token, + + /** + * + * @param {Boolean} [allow_internal] + * @returns {Promise} + */ + load: (allow_internal) => { + return new Promise(function (resolve/*, reject*/) { + if (token_string) { + resolve(Token.load(token_string)); + } else { + allow_internal_access = allow_internal; + resolve(allow_internal_access || null); + } + }); + }, + + reloadObjects: this.loadObjects, + + /** + * + * @param {String} permission + * @param {*} [data] + * @returns {Promise} + */ + can: (permission, data) => { + if (allow_internal_access === true) { + return Promise.resolve(true); + //return true; + } else { + return this.init() + .then(() => { + // Initialised, token decoded ok + return this.getObjectSchema(permission) + .then((objectSchema) => { + let data_schema = { + [permission]: { + data: data, + scope: Token.get('scope'), + roles: user_roles, + permission_visibility: permissions.visibility, + permission_proxy_hosts: permissions.proxy_hosts, + permission_redirection_hosts: permissions.redirection_hosts, + permission_dead_hosts: permissions.dead_hosts, + permission_streams: permissions.streams, + permission_access_lists: permissions.access_lists, + permission_certificates: permissions.certificates + } + }; + + let permissionSchema = { + $schema: 'http://json-schema.org/draft-07/schema#', + $async: true, + $id: 'permissions', + additionalProperties: false, + properties: {} + }; + + permissionSchema.properties[permission] = require('./access/' + permission.replace(/:/gim, '-') + '.json'); + + // logger.info('objectSchema', JSON.stringify(objectSchema, null, 2)); + // logger.info('permissionSchema', JSON.stringify(permissionSchema, null, 2)); + // logger.info('data_schema', JSON.stringify(data_schema, null, 2)); + + let ajv = validator({ + verbose: true, + allErrors: true, + format: 'full', + missingRefs: 'fail', + breakOnError: true, + coerceTypes: true, + schemas: [ + roleSchema, + permsSchema, + objectSchema, + permissionSchema + ] + }); + + return ajv.validate('permissions', data_schema) + .then(() => { + return data_schema[permission]; + }); + }); + }) + .catch((err) => { + err.permission = permission; + err.permission_data = data; + logger.error(permission, data, err.message); + + throw new error.PermissionError('Permission Denied', err); + }); + } + } + }; +}; diff --git a/backend/lib/access/access_lists-create.json b/backend/lib/access/access_lists-create.json new file mode 100644 index 000000000..5a16a8642 --- /dev/null +++ b/backend/lib/access/access_lists-create.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_access_lists", "roles"], + "properties": { + "permission_access_lists": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/access_lists-delete.json b/backend/lib/access/access_lists-delete.json new file mode 100644 index 000000000..5a16a8642 --- /dev/null +++ b/backend/lib/access/access_lists-delete.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_access_lists", "roles"], + "properties": { + "permission_access_lists": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/access_lists-get.json b/backend/lib/access/access_lists-get.json new file mode 100644 index 000000000..8f6dd8cc6 --- /dev/null +++ b/backend/lib/access/access_lists-get.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_access_lists", "roles"], + "properties": { + "permission_access_lists": { + "$ref": "perms#/definitions/view" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/access_lists-list.json b/backend/lib/access/access_lists-list.json new file mode 100644 index 000000000..8f6dd8cc6 --- /dev/null +++ b/backend/lib/access/access_lists-list.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_access_lists", "roles"], + "properties": { + "permission_access_lists": { + "$ref": "perms#/definitions/view" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/access_lists-update.json b/backend/lib/access/access_lists-update.json new file mode 100644 index 000000000..5a16a8642 --- /dev/null +++ b/backend/lib/access/access_lists-update.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_access_lists", "roles"], + "properties": { + "permission_access_lists": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/auditlog-list.json b/backend/lib/access/auditlog-list.json new file mode 100644 index 000000000..aeadc94ba --- /dev/null +++ b/backend/lib/access/auditlog-list.json @@ -0,0 +1,7 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + } + ] +} diff --git a/backend/lib/access/certificates-create.json b/backend/lib/access/certificates-create.json new file mode 100644 index 000000000..bcdf66742 --- /dev/null +++ b/backend/lib/access/certificates-create.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_certificates", "roles"], + "properties": { + "permission_certificates": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/certificates-delete.json b/backend/lib/access/certificates-delete.json new file mode 100644 index 000000000..bcdf66742 --- /dev/null +++ b/backend/lib/access/certificates-delete.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_certificates", "roles"], + "properties": { + "permission_certificates": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/certificates-get.json b/backend/lib/access/certificates-get.json new file mode 100644 index 000000000..9ccfa4f15 --- /dev/null +++ b/backend/lib/access/certificates-get.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_certificates", "roles"], + "properties": { + "permission_certificates": { + "$ref": "perms#/definitions/view" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/certificates-list.json b/backend/lib/access/certificates-list.json new file mode 100644 index 000000000..9ccfa4f15 --- /dev/null +++ b/backend/lib/access/certificates-list.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_certificates", "roles"], + "properties": { + "permission_certificates": { + "$ref": "perms#/definitions/view" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/certificates-update.json b/backend/lib/access/certificates-update.json new file mode 100644 index 000000000..bcdf66742 --- /dev/null +++ b/backend/lib/access/certificates-update.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_certificates", "roles"], + "properties": { + "permission_certificates": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/dead_hosts-create.json b/backend/lib/access/dead_hosts-create.json new file mode 100644 index 000000000..a276c681d --- /dev/null +++ b/backend/lib/access/dead_hosts-create.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_dead_hosts", "roles"], + "properties": { + "permission_dead_hosts": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/dead_hosts-delete.json b/backend/lib/access/dead_hosts-delete.json new file mode 100644 index 000000000..a276c681d --- /dev/null +++ b/backend/lib/access/dead_hosts-delete.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_dead_hosts", "roles"], + "properties": { + "permission_dead_hosts": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/dead_hosts-get.json b/backend/lib/access/dead_hosts-get.json new file mode 100644 index 000000000..87aa12e7d --- /dev/null +++ b/backend/lib/access/dead_hosts-get.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_dead_hosts", "roles"], + "properties": { + "permission_dead_hosts": { + "$ref": "perms#/definitions/view" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/dead_hosts-list.json b/backend/lib/access/dead_hosts-list.json new file mode 100644 index 000000000..87aa12e7d --- /dev/null +++ b/backend/lib/access/dead_hosts-list.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_dead_hosts", "roles"], + "properties": { + "permission_dead_hosts": { + "$ref": "perms#/definitions/view" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/dead_hosts-update.json b/backend/lib/access/dead_hosts-update.json new file mode 100644 index 000000000..a276c681d --- /dev/null +++ b/backend/lib/access/dead_hosts-update.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_dead_hosts", "roles"], + "properties": { + "permission_dead_hosts": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/permissions.json b/backend/lib/access/permissions.json new file mode 100644 index 000000000..8480f9a1c --- /dev/null +++ b/backend/lib/access/permissions.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "perms", + "definitions": { + "view": { + "type": "string", + "pattern": "^(view|manage)$" + }, + "manage": { + "type": "string", + "pattern": "^(manage)$" + } + } +} diff --git a/backend/lib/access/proxy_hosts-create.json b/backend/lib/access/proxy_hosts-create.json new file mode 100644 index 000000000..166527a39 --- /dev/null +++ b/backend/lib/access/proxy_hosts-create.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_proxy_hosts", "roles"], + "properties": { + "permission_proxy_hosts": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/proxy_hosts-delete.json b/backend/lib/access/proxy_hosts-delete.json new file mode 100644 index 000000000..166527a39 --- /dev/null +++ b/backend/lib/access/proxy_hosts-delete.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_proxy_hosts", "roles"], + "properties": { + "permission_proxy_hosts": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/proxy_hosts-get.json b/backend/lib/access/proxy_hosts-get.json new file mode 100644 index 000000000..d88e4cfff --- /dev/null +++ b/backend/lib/access/proxy_hosts-get.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_proxy_hosts", "roles"], + "properties": { + "permission_proxy_hosts": { + "$ref": "perms#/definitions/view" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/proxy_hosts-list.json b/backend/lib/access/proxy_hosts-list.json new file mode 100644 index 000000000..d88e4cfff --- /dev/null +++ b/backend/lib/access/proxy_hosts-list.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_proxy_hosts", "roles"], + "properties": { + "permission_proxy_hosts": { + "$ref": "perms#/definitions/view" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/proxy_hosts-update.json b/backend/lib/access/proxy_hosts-update.json new file mode 100644 index 000000000..166527a39 --- /dev/null +++ b/backend/lib/access/proxy_hosts-update.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_proxy_hosts", "roles"], + "properties": { + "permission_proxy_hosts": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/redirection_hosts-create.json b/backend/lib/access/redirection_hosts-create.json new file mode 100644 index 000000000..342babc88 --- /dev/null +++ b/backend/lib/access/redirection_hosts-create.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_redirection_hosts", "roles"], + "properties": { + "permission_redirection_hosts": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/redirection_hosts-delete.json b/backend/lib/access/redirection_hosts-delete.json new file mode 100644 index 000000000..342babc88 --- /dev/null +++ b/backend/lib/access/redirection_hosts-delete.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_redirection_hosts", "roles"], + "properties": { + "permission_redirection_hosts": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/redirection_hosts-get.json b/backend/lib/access/redirection_hosts-get.json new file mode 100644 index 000000000..ba2292064 --- /dev/null +++ b/backend/lib/access/redirection_hosts-get.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_redirection_hosts", "roles"], + "properties": { + "permission_redirection_hosts": { + "$ref": "perms#/definitions/view" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/redirection_hosts-list.json b/backend/lib/access/redirection_hosts-list.json new file mode 100644 index 000000000..ba2292064 --- /dev/null +++ b/backend/lib/access/redirection_hosts-list.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_redirection_hosts", "roles"], + "properties": { + "permission_redirection_hosts": { + "$ref": "perms#/definitions/view" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/redirection_hosts-update.json b/backend/lib/access/redirection_hosts-update.json new file mode 100644 index 000000000..342babc88 --- /dev/null +++ b/backend/lib/access/redirection_hosts-update.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_redirection_hosts", "roles"], + "properties": { + "permission_redirection_hosts": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/reports-hosts.json b/backend/lib/access/reports-hosts.json new file mode 100644 index 000000000..dbc9e0c0f --- /dev/null +++ b/backend/lib/access/reports-hosts.json @@ -0,0 +1,7 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/user" + } + ] +} diff --git a/backend/lib/access/roles.json b/backend/lib/access/roles.json new file mode 100644 index 000000000..16b33b55b --- /dev/null +++ b/backend/lib/access/roles.json @@ -0,0 +1,39 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "roles", + "definitions": { + "admin": { + "type": "object", + "required": ["scope", "roles"], + "properties": { + "scope": { + "type": "array", + "contains": { + "type": "string", + "pattern": "^user$" + } + }, + "roles": { + "type": "array", + "contains": { + "type": "string", + "pattern": "^admin$" + } + } + } + }, + "user": { + "type": "object", + "required": ["scope"], + "properties": { + "scope": { + "type": "array", + "contains": { + "type": "string", + "pattern": "^user$" + } + } + } + } + } +} diff --git a/backend/lib/access/settings-get.json b/backend/lib/access/settings-get.json new file mode 100644 index 000000000..aeadc94ba --- /dev/null +++ b/backend/lib/access/settings-get.json @@ -0,0 +1,7 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + } + ] +} diff --git a/backend/lib/access/settings-list.json b/backend/lib/access/settings-list.json new file mode 100644 index 000000000..aeadc94ba --- /dev/null +++ b/backend/lib/access/settings-list.json @@ -0,0 +1,7 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + } + ] +} diff --git a/backend/lib/access/settings-update.json b/backend/lib/access/settings-update.json new file mode 100644 index 000000000..aeadc94ba --- /dev/null +++ b/backend/lib/access/settings-update.json @@ -0,0 +1,7 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + } + ] +} diff --git a/backend/lib/access/streams-create.json b/backend/lib/access/streams-create.json new file mode 100644 index 000000000..fbeb1cc91 --- /dev/null +++ b/backend/lib/access/streams-create.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_streams", "roles"], + "properties": { + "permission_streams": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/streams-delete.json b/backend/lib/access/streams-delete.json new file mode 100644 index 000000000..fbeb1cc91 --- /dev/null +++ b/backend/lib/access/streams-delete.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_streams", "roles"], + "properties": { + "permission_streams": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/streams-get.json b/backend/lib/access/streams-get.json new file mode 100644 index 000000000..7e9962874 --- /dev/null +++ b/backend/lib/access/streams-get.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_streams", "roles"], + "properties": { + "permission_streams": { + "$ref": "perms#/definitions/view" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/streams-list.json b/backend/lib/access/streams-list.json new file mode 100644 index 000000000..7e9962874 --- /dev/null +++ b/backend/lib/access/streams-list.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_streams", "roles"], + "properties": { + "permission_streams": { + "$ref": "perms#/definitions/view" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/streams-update.json b/backend/lib/access/streams-update.json new file mode 100644 index 000000000..fbeb1cc91 --- /dev/null +++ b/backend/lib/access/streams-update.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["permission_streams", "roles"], + "properties": { + "permission_streams": { + "$ref": "perms#/definitions/manage" + }, + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": ["user"] + } + } + } + } + ] +} diff --git a/backend/lib/access/users-create.json b/backend/lib/access/users-create.json new file mode 100644 index 000000000..aeadc94ba --- /dev/null +++ b/backend/lib/access/users-create.json @@ -0,0 +1,7 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + } + ] +} diff --git a/backend/lib/access/users-delete.json b/backend/lib/access/users-delete.json new file mode 100644 index 000000000..aeadc94ba --- /dev/null +++ b/backend/lib/access/users-delete.json @@ -0,0 +1,7 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + } + ] +} diff --git a/backend/lib/access/users-get.json b/backend/lib/access/users-get.json new file mode 100644 index 000000000..2a2f0423a --- /dev/null +++ b/backend/lib/access/users-get.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["data", "scope"], + "properties": { + "data": { + "$ref": "objects#/properties/users" + }, + "scope": { + "type": "array", + "contains": { + "type": "string", + "pattern": "^user$" + } + } + } + } + ] +} diff --git a/backend/lib/access/users-list.json b/backend/lib/access/users-list.json new file mode 100644 index 000000000..aeadc94ba --- /dev/null +++ b/backend/lib/access/users-list.json @@ -0,0 +1,7 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + } + ] +} diff --git a/backend/lib/access/users-loginas.json b/backend/lib/access/users-loginas.json new file mode 100644 index 000000000..aeadc94ba --- /dev/null +++ b/backend/lib/access/users-loginas.json @@ -0,0 +1,7 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + } + ] +} diff --git a/backend/lib/access/users-password.json b/backend/lib/access/users-password.json new file mode 100644 index 000000000..2a2f0423a --- /dev/null +++ b/backend/lib/access/users-password.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["data", "scope"], + "properties": { + "data": { + "$ref": "objects#/properties/users" + }, + "scope": { + "type": "array", + "contains": { + "type": "string", + "pattern": "^user$" + } + } + } + } + ] +} diff --git a/backend/lib/access/users-permissions.json b/backend/lib/access/users-permissions.json new file mode 100644 index 000000000..aeadc94ba --- /dev/null +++ b/backend/lib/access/users-permissions.json @@ -0,0 +1,7 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + } + ] +} diff --git a/backend/lib/access/users-update.json b/backend/lib/access/users-update.json new file mode 100644 index 000000000..2a2f0423a --- /dev/null +++ b/backend/lib/access/users-update.json @@ -0,0 +1,23 @@ +{ + "anyOf": [ + { + "$ref": "roles#/definitions/admin" + }, + { + "type": "object", + "required": ["data", "scope"], + "properties": { + "data": { + "$ref": "objects#/properties/users" + }, + "scope": { + "type": "array", + "contains": { + "type": "string", + "pattern": "^user$" + } + } + } + } + ] +} diff --git a/backend/lib/error.js b/backend/lib/error.js new file mode 100644 index 000000000..9e456f051 --- /dev/null +++ b/backend/lib/error.js @@ -0,0 +1,90 @@ +const _ = require('lodash'); +const util = require('util'); + +module.exports = { + + PermissionError: function (message, previous) { + Error.captureStackTrace(this, this.constructor); + this.name = this.constructor.name; + this.previous = previous; + this.message = 'Permission Denied'; + this.public = true; + this.status = 403; + }, + + ItemNotFoundError: function (id, previous) { + Error.captureStackTrace(this, this.constructor); + this.name = this.constructor.name; + this.previous = previous; + this.message = 'Item Not Found - ' + id; + this.public = true; + this.status = 404; + }, + + AuthError: function (message, previous) { + Error.captureStackTrace(this, this.constructor); + this.name = this.constructor.name; + this.previous = previous; + this.message = message; + this.public = true; + this.status = 401; + }, + + InternalError: function (message, previous) { + Error.captureStackTrace(this, this.constructor); + this.name = this.constructor.name; + this.previous = previous; + this.message = message; + this.status = 500; + this.public = false; + }, + + InternalValidationError: function (message, previous) { + Error.captureStackTrace(this, this.constructor); + this.name = this.constructor.name; + this.previous = previous; + this.message = message; + this.status = 400; + this.public = false; + }, + + ConfigurationError: function (message, previous) { + Error.captureStackTrace(this, this.constructor); + this.name = this.constructor.name; + this.previous = previous; + this.message = message; + this.status = 400; + this.public = true; + }, + + CacheError: function (message, previous) { + Error.captureStackTrace(this, this.constructor); + this.name = this.constructor.name; + this.message = message; + this.previous = previous; + this.status = 500; + this.public = false; + }, + + ValidationError: function (message, previous) { + Error.captureStackTrace(this, this.constructor); + this.name = this.constructor.name; + this.previous = previous; + this.message = message; + this.public = true; + this.status = 400; + }, + + AssertionFailedError: function (message, previous) { + Error.captureStackTrace(this, this.constructor); + this.name = this.constructor.name; + this.previous = previous; + this.message = message; + this.public = false; + this.status = 400; + } +}; + +_.forEach(module.exports, function (error) { + util.inherits(error, Error); +}); diff --git a/backend/lib/express/cors.js b/backend/lib/express/cors.js new file mode 100644 index 000000000..bb4ca8966 --- /dev/null +++ b/backend/lib/express/cors.js @@ -0,0 +1,30 @@ +const validator = require('../validator'); + +module.exports = function (req, res, next) { + + if (req.headers.origin) { + + // very relaxed validation.... + validator({ + type: 'string', + pattern: '^[a-z\\-]+:\\/\\/(?:[\\w\\-\\.]+(:[0-9]+)?/?)?$' + }, req.headers.origin) + .then(function () { + res.set({ + 'Access-Control-Allow-Origin': req.headers.origin, + 'Access-Control-Allow-Credentials': true, + 'Access-Control-Allow-Methods': 'OPTIONS, GET, POST', + 'Access-Control-Allow-Headers': 'Content-Type, Cache-Control, Pragma, Expires, Authorization, X-Dataset-Total, X-Dataset-Offset, X-Dataset-Limit', + 'Access-Control-Max-Age': 5 * 60, + 'Access-Control-Expose-Headers': 'X-Dataset-Total, X-Dataset-Offset, X-Dataset-Limit' + }); + next(); + }) + .catch(next); + + } else { + // No origin + next(); + } + +}; diff --git a/backend/lib/express/jwt-decode.js b/backend/lib/express/jwt-decode.js new file mode 100644 index 000000000..17edccec0 --- /dev/null +++ b/backend/lib/express/jwt-decode.js @@ -0,0 +1,15 @@ +const Access = require('../access'); + +module.exports = () => { + return function (req, res, next) { + res.locals.access = null; + let access = new Access(res.locals.token || null); + access.load() + .then(() => { + res.locals.access = access; + next(); + }) + .catch(next); + }; +}; + diff --git a/backend/lib/express/jwt.js b/backend/lib/express/jwt.js new file mode 100644 index 000000000..44aa36934 --- /dev/null +++ b/backend/lib/express/jwt.js @@ -0,0 +1,13 @@ +module.exports = function () { + return function (req, res, next) { + if (req.headers.authorization) { + let parts = req.headers.authorization.split(' '); + + if (parts && parts[0] === 'Bearer' && parts[1]) { + res.locals.token = parts[1]; + } + } + + next(); + }; +}; diff --git a/backend/lib/express/pagination.js b/backend/lib/express/pagination.js new file mode 100644 index 000000000..24ffa58d0 --- /dev/null +++ b/backend/lib/express/pagination.js @@ -0,0 +1,55 @@ +let _ = require('lodash'); + +module.exports = function (default_sort, default_offset, default_limit, max_limit) { + + /** + * This will setup the req query params with filtered data and defaults + * + * sort will be an array of fields and their direction + * offset will be an int, defaulting to zero if no other default supplied + * limit will be an int, defaulting to 50 if no other default supplied, and limited to the max if that was supplied + * + */ + + return function (req, res, next) { + + req.query.offset = typeof req.query.limit === 'undefined' ? default_offset || 0 : parseInt(req.query.offset, 10); + req.query.limit = typeof req.query.limit === 'undefined' ? default_limit || 50 : parseInt(req.query.limit, 10); + + if (max_limit && req.query.limit > max_limit) { + req.query.limit = max_limit; + } + + // Sorting + let sort = typeof req.query.sort === 'undefined' ? default_sort : req.query.sort; + let myRegexp = /.*\.(asc|desc)$/ig; + let sort_array = []; + + sort = sort.split(','); + _.map(sort, function (val) { + let matches = myRegexp.exec(val); + + if (matches !== null) { + let dir = matches[1]; + sort_array.push({ + field: val.substr(0, val.length - (dir.length + 1)), + dir: dir.toLowerCase() + }); + } else { + sort_array.push({ + field: val, + dir: 'asc' + }); + } + }); + + // Sort will now be in this format: + // [ + // { field: 'field1', dir: 'asc' }, + // { field: 'field2', dir: 'desc' } + // ] + + req.query.sort = sort_array; + next(); + }; +}; diff --git a/backend/lib/express/user-id-from-me.js b/backend/lib/express/user-id-from-me.js new file mode 100644 index 000000000..4a37a4069 --- /dev/null +++ b/backend/lib/express/user-id-from-me.js @@ -0,0 +1,9 @@ +module.exports = (req, res, next) => { + if (req.params.user_id === 'me' && res.locals.access) { + req.params.user_id = res.locals.access.token.get('attrs').id; + } else { + req.params.user_id = parseInt(req.params.user_id, 10); + } + + next(); +}; diff --git a/backend/lib/helpers.js b/backend/lib/helpers.js new file mode 100644 index 000000000..e38be991e --- /dev/null +++ b/backend/lib/helpers.js @@ -0,0 +1,32 @@ +const moment = require('moment'); + +module.exports = { + + /** + * Takes an expression such as 30d and returns a moment object of that date in future + * + * Key Shorthand + * ================== + * years y + * quarters Q + * months M + * weeks w + * days d + * hours h + * minutes m + * seconds s + * milliseconds ms + * + * @param {String} expression + * @returns {Object} + */ + parseDatePeriod: function (expression) { + let matches = expression.match(/^([0-9]+)(y|Q|M|w|d|h|m|s|ms)$/m); + if (matches) { + return moment().add(matches[1], matches[2]); + } + + return null; + } + +}; diff --git a/backend/lib/migrate_template.js b/backend/lib/migrate_template.js new file mode 100644 index 000000000..f75f77ef4 --- /dev/null +++ b/backend/lib/migrate_template.js @@ -0,0 +1,55 @@ +const migrate_name = 'identifier_for_migrate'; +const logger = require('../logger').migrate; + +/** + * Migrate + * + * @see http://knexjs.org/#Schema + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.up = function (knex, Promise) { + + logger.info('[' + migrate_name + '] Migrating Up...'); + + // Create Table example: + + /*return knex.schema.createTable('notification', (table) => { + table.increments().primary(); + table.string('name').notNull(); + table.string('type').notNull(); + table.integer('created_on').notNull(); + table.integer('modified_on').notNull(); + }) + .then(function () { + logger.info('[' + migrate_name + '] Notification Table created'); + });*/ + + logger.info('[' + migrate_name + '] Migrating Up Complete'); + + return Promise.resolve(true); +}; + +/** + * Undo Migrate + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.down = function (knex, Promise) { + logger.info('[' + migrate_name + '] Migrating Down...'); + + // Drop table example: + + /*return knex.schema.dropTable('notification') + .then(() => { + logger.info('[' + migrate_name + '] Notification Table dropped'); + });*/ + + logger.info('[' + migrate_name + '] Migrating Down Complete'); + + return Promise.resolve(true); +}; diff --git a/backend/lib/utils.js b/backend/lib/utils.js new file mode 100644 index 000000000..4c8b62a84 --- /dev/null +++ b/backend/lib/utils.js @@ -0,0 +1,20 @@ +const exec = require('child_process').exec; + +module.exports = { + + /** + * @param {String} cmd + * @returns {Promise} + */ + exec: function (cmd) { + return new Promise((resolve, reject) => { + exec(cmd, function (err, stdout, /*stderr*/) { + if (err && typeof err === 'object') { + reject(err); + } else { + resolve(stdout.trim()); + } + }); + }); + } +}; diff --git a/backend/lib/validator/api.js b/backend/lib/validator/api.js new file mode 100644 index 000000000..3f51b5969 --- /dev/null +++ b/backend/lib/validator/api.js @@ -0,0 +1,45 @@ +const error = require('../error'); +const path = require('path'); +const parser = require('json-schema-ref-parser'); + +const ajv = require('ajv')({ + verbose: true, + validateSchema: true, + allErrors: false, + format: 'full', + coerceTypes: true +}); + +/** + * @param {Object} schema + * @param {Object} payload + * @returns {Promise} + */ +function apiValidator (schema, payload/*, description*/) { + return new Promise(function Promise_apiValidator (resolve, reject) { + if (typeof payload === 'undefined') { + reject(new error.ValidationError('Payload is undefined')); + } + + let validate = ajv.compile(schema); + let valid = validate(payload); + + if (valid && !validate.errors) { + resolve(payload); + } else { + let message = ajv.errorsText(validate.errors); + let err = new error.ValidationError(message); + err.debug = [validate.errors, payload]; + reject(err); + } + }); +} + +apiValidator.loadSchemas = parser + .dereference(path.resolve('schema/index.json')) + .then((schema) => { + ajv.addSchema(schema); + return schema; + }); + +module.exports = apiValidator; diff --git a/backend/lib/validator/index.js b/backend/lib/validator/index.js new file mode 100644 index 000000000..fca6f4bf2 --- /dev/null +++ b/backend/lib/validator/index.js @@ -0,0 +1,49 @@ +const _ = require('lodash'); +const error = require('../error'); +const definitions = require('../../schema/definitions.json'); + +RegExp.prototype.toJSON = RegExp.prototype.toString; + +const ajv = require('ajv')({ + verbose: true, //process.env.NODE_ENV === 'development', + allErrors: true, + format: 'full', // strict regexes for format checks + coerceTypes: true, + schemas: [ + definitions + ] +}); + +/** + * + * @param {Object} schema + * @param {Object} payload + * @returns {Promise} + */ +function validator (schema, payload) { + return new Promise(function (resolve, reject) { + if (!payload) { + reject(new error.InternalValidationError('Payload is falsy')); + } else { + try { + let validate = ajv.compile(schema); + + let valid = validate(payload); + if (valid && !validate.errors) { + resolve(_.cloneDeep(payload)); + } else { + let message = ajv.errorsText(validate.errors); + reject(new error.InternalValidationError(message)); + } + + } catch (err) { + reject(err); + } + + } + + }); + +} + +module.exports = validator; diff --git a/backend/logger.js b/backend/logger.js new file mode 100644 index 000000000..680af6d51 --- /dev/null +++ b/backend/logger.js @@ -0,0 +1,13 @@ +const {Signale} = require('signale'); + +module.exports = { + global: new Signale({scope: 'Global '}), + migrate: new Signale({scope: 'Migrate '}), + express: new Signale({scope: 'Express '}), + access: new Signale({scope: 'Access '}), + nginx: new Signale({scope: 'Nginx '}), + ssl: new Signale({scope: 'SSL '}), + import: new Signale({scope: 'Importer '}), + setup: new Signale({scope: 'Setup '}), + ip_ranges: new Signale({scope: 'IP Ranges'}) +}; diff --git a/backend/migrate.js b/backend/migrate.js new file mode 100644 index 000000000..263c87020 --- /dev/null +++ b/backend/migrate.js @@ -0,0 +1,15 @@ +const db = require('./db'); +const logger = require('./logger').migrate; + +module.exports = { + latest: function () { + return db.migrate.currentVersion() + .then((version) => { + logger.info('Current database version:', version); + return db.migrate.latest({ + tableName: 'migrations', + directory: 'migrations' + }); + }); + } +}; diff --git a/backend/migrations/20180618015850_initial.js b/backend/migrations/20180618015850_initial.js new file mode 100644 index 000000000..a112e8261 --- /dev/null +++ b/backend/migrations/20180618015850_initial.js @@ -0,0 +1,205 @@ +const migrate_name = 'initial-schema'; +const logger = require('../logger').migrate; + +/** + * Migrate + * + * @see http://knexjs.org/#Schema + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.up = function (knex/*, Promise*/) { + logger.info('[' + migrate_name + '] Migrating Up...'); + + return knex.schema.createTable('auth', (table) => { + table.increments().primary(); + table.dateTime('created_on').notNull(); + table.dateTime('modified_on').notNull(); + table.integer('user_id').notNull().unsigned(); + table.string('type', 30).notNull(); + table.string('secret').notNull(); + table.json('meta').notNull(); + table.integer('is_deleted').notNull().unsigned().defaultTo(0); + }) + .then(() => { + logger.info('[' + migrate_name + '] auth Table created'); + + return knex.schema.createTable('user', (table) => { + table.increments().primary(); + table.dateTime('created_on').notNull(); + table.dateTime('modified_on').notNull(); + table.integer('is_deleted').notNull().unsigned().defaultTo(0); + table.integer('is_disabled').notNull().unsigned().defaultTo(0); + table.string('email').notNull(); + table.string('name').notNull(); + table.string('nickname').notNull(); + table.string('avatar').notNull(); + table.json('roles').notNull(); + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] user Table created'); + + return knex.schema.createTable('user_permission', (table) => { + table.increments().primary(); + table.dateTime('created_on').notNull(); + table.dateTime('modified_on').notNull(); + table.integer('user_id').notNull().unsigned(); + table.string('visibility').notNull(); + table.string('proxy_hosts').notNull(); + table.string('redirection_hosts').notNull(); + table.string('dead_hosts').notNull(); + table.string('streams').notNull(); + table.string('access_lists').notNull(); + table.string('certificates').notNull(); + table.unique('user_id'); + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] user_permission Table created'); + + return knex.schema.createTable('proxy_host', (table) => { + table.increments().primary(); + table.dateTime('created_on').notNull(); + table.dateTime('modified_on').notNull(); + table.integer('owner_user_id').notNull().unsigned(); + table.integer('is_deleted').notNull().unsigned().defaultTo(0); + table.json('domain_names').notNull(); + table.string('forward_ip').notNull(); + table.integer('forward_port').notNull().unsigned(); + table.integer('access_list_id').notNull().unsigned().defaultTo(0); + table.integer('certificate_id').notNull().unsigned().defaultTo(0); + table.integer('ssl_forced').notNull().unsigned().defaultTo(0); + table.integer('caching_enabled').notNull().unsigned().defaultTo(0); + table.integer('block_exploits').notNull().unsigned().defaultTo(0); + table.text('advanced_config').notNull().defaultTo(''); + table.json('meta').notNull(); + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] proxy_host Table created'); + + return knex.schema.createTable('redirection_host', (table) => { + table.increments().primary(); + table.dateTime('created_on').notNull(); + table.dateTime('modified_on').notNull(); + table.integer('owner_user_id').notNull().unsigned(); + table.integer('is_deleted').notNull().unsigned().defaultTo(0); + table.json('domain_names').notNull(); + table.string('forward_domain_name').notNull(); + table.integer('preserve_path').notNull().unsigned().defaultTo(0); + table.integer('certificate_id').notNull().unsigned().defaultTo(0); + table.integer('ssl_forced').notNull().unsigned().defaultTo(0); + table.integer('block_exploits').notNull().unsigned().defaultTo(0); + table.text('advanced_config').notNull().defaultTo(''); + table.json('meta').notNull(); + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] redirection_host Table created'); + + return knex.schema.createTable('dead_host', (table) => { + table.increments().primary(); + table.dateTime('created_on').notNull(); + table.dateTime('modified_on').notNull(); + table.integer('owner_user_id').notNull().unsigned(); + table.integer('is_deleted').notNull().unsigned().defaultTo(0); + table.json('domain_names').notNull(); + table.integer('certificate_id').notNull().unsigned().defaultTo(0); + table.integer('ssl_forced').notNull().unsigned().defaultTo(0); + table.text('advanced_config').notNull().defaultTo(''); + table.json('meta').notNull(); + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] dead_host Table created'); + + return knex.schema.createTable('stream', (table) => { + table.increments().primary(); + table.dateTime('created_on').notNull(); + table.dateTime('modified_on').notNull(); + table.integer('owner_user_id').notNull().unsigned(); + table.integer('is_deleted').notNull().unsigned().defaultTo(0); + table.integer('incoming_port').notNull().unsigned(); + table.string('forward_ip').notNull(); + table.integer('forwarding_port').notNull().unsigned(); + table.integer('tcp_forwarding').notNull().unsigned().defaultTo(0); + table.integer('udp_forwarding').notNull().unsigned().defaultTo(0); + table.json('meta').notNull(); + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] stream Table created'); + + return knex.schema.createTable('access_list', (table) => { + table.increments().primary(); + table.dateTime('created_on').notNull(); + table.dateTime('modified_on').notNull(); + table.integer('owner_user_id').notNull().unsigned(); + table.integer('is_deleted').notNull().unsigned().defaultTo(0); + table.string('name').notNull(); + table.json('meta').notNull(); + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] access_list Table created'); + + return knex.schema.createTable('certificate', (table) => { + table.increments().primary(); + table.dateTime('created_on').notNull(); + table.dateTime('modified_on').notNull(); + table.integer('owner_user_id').notNull().unsigned(); + table.integer('is_deleted').notNull().unsigned().defaultTo(0); + table.string('provider').notNull(); + table.string('nice_name').notNull().defaultTo(''); + table.json('domain_names').notNull(); + table.dateTime('expires_on').notNull(); + table.json('meta').notNull(); + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] certificate Table created'); + + return knex.schema.createTable('access_list_auth', (table) => { + table.increments().primary(); + table.dateTime('created_on').notNull(); + table.dateTime('modified_on').notNull(); + table.integer('access_list_id').notNull().unsigned(); + table.string('username').notNull(); + table.string('password').notNull(); + table.json('meta').notNull(); + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] access_list_auth Table created'); + + return knex.schema.createTable('audit_log', (table) => { + table.increments().primary(); + table.dateTime('created_on').notNull(); + table.dateTime('modified_on').notNull(); + table.integer('user_id').notNull().unsigned(); + table.string('object_type').notNull().defaultTo(''); + table.integer('object_id').notNull().unsigned().defaultTo(0); + table.string('action').notNull(); + table.json('meta').notNull(); + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] audit_log Table created'); + }); + +}; + +/** + * Undo Migrate + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.down = function (knex, Promise) { + logger.warn('[' + migrate_name + '] You can\'t migrate down the initial data.'); + return Promise.resolve(true); +}; diff --git a/backend/migrations/20180929054513_websockets.js b/backend/migrations/20180929054513_websockets.js new file mode 100644 index 000000000..060548502 --- /dev/null +++ b/backend/migrations/20180929054513_websockets.js @@ -0,0 +1,35 @@ +const migrate_name = 'websockets'; +const logger = require('../logger').migrate; + +/** + * Migrate + * + * @see http://knexjs.org/#Schema + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.up = function (knex/*, Promise*/) { + logger.info('[' + migrate_name + '] Migrating Up...'); + + return knex.schema.table('proxy_host', function (proxy_host) { + proxy_host.integer('allow_websocket_upgrade').notNull().unsigned().defaultTo(0); + }) + .then(() => { + logger.info('[' + migrate_name + '] proxy_host Table altered'); + }); + +}; + +/** + * Undo Migrate + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.down = function (knex, Promise) { + logger.warn('[' + migrate_name + '] You can\'t migrate down this one.'); + return Promise.resolve(true); +}; \ No newline at end of file diff --git a/src/backend/migrations/20181019052346_forward_host.js b/backend/migrations/20181019052346_forward_host.js similarity index 50% rename from src/backend/migrations/20181019052346_forward_host.js rename to backend/migrations/20181019052346_forward_host.js index 0a8a4311c..05c277396 100644 --- a/src/backend/migrations/20181019052346_forward_host.js +++ b/backend/migrations/20181019052346_forward_host.js @@ -11,14 +11,14 @@ const logger = require('../logger').migrate; * @returns {Promise} */ exports.up = function (knex/*, Promise*/) { - logger.info('[' + migrate_name + '] Migrating Up...'); + logger.info('[' + migrate_name + '] Migrating Up...'); - return knex.schema.table('proxy_host', function (proxy_host) { - proxy_host.renameColumn('forward_ip', 'forward_host'); - }) - .then(() => { - logger.info('[' + migrate_name + '] proxy_host Table altered'); - }); + return knex.schema.table('proxy_host', function (proxy_host) { + proxy_host.renameColumn('forward_ip', 'forward_host'); + }) + .then(() => { + logger.info('[' + migrate_name + '] proxy_host Table altered'); + }); }; /** @@ -29,6 +29,6 @@ exports.up = function (knex/*, Promise*/) { * @returns {Promise} */ exports.down = function (knex, Promise) { - logger.warn('[' + migrate_name + '] You can\'t migrate down this one.'); - return Promise.resolve(true); + logger.warn('[' + migrate_name + '] You can\'t migrate down this one.'); + return Promise.resolve(true); }; \ No newline at end of file diff --git a/backend/migrations/20181113041458_http2_support.js b/backend/migrations/20181113041458_http2_support.js new file mode 100644 index 000000000..9f6b43367 --- /dev/null +++ b/backend/migrations/20181113041458_http2_support.js @@ -0,0 +1,49 @@ +const migrate_name = 'http2_support'; +const logger = require('../logger').migrate; + +/** + * Migrate + * + * @see http://knexjs.org/#Schema + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.up = function (knex/*, Promise*/) { + logger.info('[' + migrate_name + '] Migrating Up...'); + + return knex.schema.table('proxy_host', function (proxy_host) { + proxy_host.integer('http2_support').notNull().unsigned().defaultTo(0); + }) + .then(() => { + logger.info('[' + migrate_name + '] proxy_host Table altered'); + + return knex.schema.table('redirection_host', function (redirection_host) { + redirection_host.integer('http2_support').notNull().unsigned().defaultTo(0); + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] redirection_host Table altered'); + + return knex.schema.table('dead_host', function (dead_host) { + dead_host.integer('http2_support').notNull().unsigned().defaultTo(0); + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] dead_host Table altered'); + }); +}; + +/** + * Undo Migrate + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.down = function (knex, Promise) { + logger.warn('[' + migrate_name + '] You can\'t migrate down this one.'); + return Promise.resolve(true); +}; + diff --git a/src/backend/migrations/20181213013211_forward_scheme.js b/backend/migrations/20181213013211_forward_scheme.js similarity index 50% rename from src/backend/migrations/20181213013211_forward_scheme.js rename to backend/migrations/20181213013211_forward_scheme.js index 4c02273de..22ae619ed 100644 --- a/src/backend/migrations/20181213013211_forward_scheme.js +++ b/backend/migrations/20181213013211_forward_scheme.js @@ -11,14 +11,14 @@ const logger = require('../logger').migrate; * @returns {Promise} */ exports.up = function (knex/*, Promise*/) { - logger.info('[' + migrate_name + '] Migrating Up...'); + logger.info('[' + migrate_name + '] Migrating Up...'); - return knex.schema.table('proxy_host', function (proxy_host) { - proxy_host.string('forward_scheme').notNull().defaultTo('http'); - }) - .then(() => { - logger.info('[' + migrate_name + '] proxy_host Table altered'); - }); + return knex.schema.table('proxy_host', function (proxy_host) { + proxy_host.string('forward_scheme').notNull().defaultTo('http'); + }) + .then(() => { + logger.info('[' + migrate_name + '] proxy_host Table altered'); + }); }; /** @@ -29,6 +29,6 @@ exports.up = function (knex/*, Promise*/) { * @returns {Promise} */ exports.down = function (knex, Promise) { - logger.warn('[' + migrate_name + '] You can\'t migrate down this one.'); - return Promise.resolve(true); + logger.warn('[' + migrate_name + '] You can\'t migrate down this one.'); + return Promise.resolve(true); }; diff --git a/backend/migrations/20190104035154_disabled.js b/backend/migrations/20190104035154_disabled.js new file mode 100644 index 000000000..2780c4df2 --- /dev/null +++ b/backend/migrations/20190104035154_disabled.js @@ -0,0 +1,55 @@ +const migrate_name = 'disabled'; +const logger = require('../logger').migrate; + +/** + * Migrate + * + * @see http://knexjs.org/#Schema + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.up = function (knex/*, Promise*/) { + logger.info('[' + migrate_name + '] Migrating Up...'); + + return knex.schema.table('proxy_host', function (proxy_host) { + proxy_host.integer('enabled').notNull().unsigned().defaultTo(1); + }) + .then(() => { + logger.info('[' + migrate_name + '] proxy_host Table altered'); + + return knex.schema.table('redirection_host', function (redirection_host) { + redirection_host.integer('enabled').notNull().unsigned().defaultTo(1); + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] redirection_host Table altered'); + + return knex.schema.table('dead_host', function (dead_host) { + dead_host.integer('enabled').notNull().unsigned().defaultTo(1); + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] dead_host Table altered'); + + return knex.schema.table('stream', function (stream) { + stream.integer('enabled').notNull().unsigned().defaultTo(1); + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] stream Table altered'); + }); +}; + +/** + * Undo Migrate + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.down = function (knex, Promise) { + logger.warn('[' + migrate_name + '] You can\'t migrate down this one.'); + return Promise.resolve(true); +}; diff --git a/src/backend/migrations/20190215115310_customlocations.js b/backend/migrations/20190215115310_customlocations.js similarity index 55% rename from src/backend/migrations/20190215115310_customlocations.js rename to backend/migrations/20190215115310_customlocations.js index b1766ac15..4bcfd51ad 100644 --- a/src/backend/migrations/20190215115310_customlocations.js +++ b/backend/migrations/20190215115310_customlocations.js @@ -12,14 +12,14 @@ const logger = require('../logger').migrate; * @returns {Promise} */ exports.up = function (knex/*, Promise*/) { - logger.info('[' + migrate_name + '] Migrating Up...'); + logger.info('[' + migrate_name + '] Migrating Up...'); - return knex.schema.table('proxy_host', function (proxy_host) { - proxy_host.json('locations'); - }) - .then(() => { - logger.info('[' + migrate_name + '] proxy_host Table altered'); - }) + return knex.schema.table('proxy_host', function (proxy_host) { + proxy_host.json('locations'); + }) + .then(() => { + logger.info('[' + migrate_name + '] proxy_host Table altered'); + }); }; /** @@ -30,6 +30,6 @@ exports.up = function (knex/*, Promise*/) { * @returns {Promise} */ exports.down = function (knex, Promise) { - logger.warn('[' + migrate_name + '] You can\'t migrate down this one.'); - return Promise.resolve(true); + logger.warn('[' + migrate_name + '] You can\'t migrate down this one.'); + return Promise.resolve(true); }; diff --git a/backend/migrations/20190218060101_hsts.js b/backend/migrations/20190218060101_hsts.js new file mode 100644 index 000000000..648b162a0 --- /dev/null +++ b/backend/migrations/20190218060101_hsts.js @@ -0,0 +1,51 @@ +const migrate_name = 'hsts'; +const logger = require('../logger').migrate; + +/** + * Migrate + * + * @see http://knexjs.org/#Schema + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.up = function (knex/*, Promise*/) { + logger.info('[' + migrate_name + '] Migrating Up...'); + + return knex.schema.table('proxy_host', function (proxy_host) { + proxy_host.integer('hsts_enabled').notNull().unsigned().defaultTo(0); + proxy_host.integer('hsts_subdomains').notNull().unsigned().defaultTo(0); + }) + .then(() => { + logger.info('[' + migrate_name + '] proxy_host Table altered'); + + return knex.schema.table('redirection_host', function (redirection_host) { + redirection_host.integer('hsts_enabled').notNull().unsigned().defaultTo(0); + redirection_host.integer('hsts_subdomains').notNull().unsigned().defaultTo(0); + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] redirection_host Table altered'); + + return knex.schema.table('dead_host', function (dead_host) { + dead_host.integer('hsts_enabled').notNull().unsigned().defaultTo(0); + dead_host.integer('hsts_subdomains').notNull().unsigned().defaultTo(0); + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] dead_host Table altered'); + }); +}; + +/** + * Undo Migrate + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.down = function (knex, Promise) { + logger.warn('[' + migrate_name + '] You can\'t migrate down this one.'); + return Promise.resolve(true); +}; diff --git a/backend/migrations/20190227065017_settings.js b/backend/migrations/20190227065017_settings.js new file mode 100644 index 000000000..dc1d68502 --- /dev/null +++ b/backend/migrations/20190227065017_settings.js @@ -0,0 +1,54 @@ +const migrate_name = 'settings'; +const logger = require('../logger').migrate; + +/** + * Migrate + * + * @see http://knexjs.org/#Schema + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.up = function (knex/*, Promise*/) { + logger.info('[' + migrate_name + '] Migrating Up...'); + + return knex.schema.createTable('setting', (table) => { + table.string('id').notNull().primary(); + table.string('name', 100).notNull(); + table.string('description', 255).notNull(); + table.string('value', 255).notNull(); + table.json('meta').notNull(); + }) + .then(() => { + logger.info('[' + migrate_name + '] setting Table created'); + + // TODO: add settings + let settingModel = require('../models/setting'); + + return settingModel + .query() + .insert({ + id: 'default-site', + name: 'Default Site', + description: 'What to show when Nginx is hit with an unknown Host', + value: 'congratulations', + meta: {} + }); + }) + .then(() => { + logger.info('[' + migrate_name + '] Default settings added'); + }); +}; + +/** + * Undo Migrate + * + * @param {Object} knex + * @param {Promise} Promise + * @returns {Promise} + */ +exports.down = function (knex, Promise) { + logger.warn('[' + migrate_name + '] You can\'t migrate down the initial data.'); + return Promise.resolve(true); +}; diff --git a/backend/models/access_list.js b/backend/models/access_list.js new file mode 100644 index 000000000..7704893f0 --- /dev/null +++ b/backend/models/access_list.js @@ -0,0 +1,81 @@ +// Objection Docs: +// http://vincit.github.io/objection.js/ + +const db = require('../db'); +const Model = require('objection').Model; +const User = require('./user'); +const AccessListAuth = require('./access_list_auth'); + +Model.knex(db); + +class AccessList extends Model { + $beforeInsert () { + this.created_on = Model.raw('NOW()'); + this.modified_on = Model.raw('NOW()'); + + // Default for meta + if (typeof this.meta === 'undefined') { + this.meta = {}; + } + } + + $beforeUpdate () { + this.modified_on = Model.raw('NOW()'); + } + + static get name () { + return 'AccessList'; + } + + static get tableName () { + return 'access_list'; + } + + static get jsonAttributes () { + return ['meta']; + } + + static get relationMappings () { + const ProxyHost = require('./proxy_host'); + + return { + owner: { + relation: Model.HasOneRelation, + modelClass: User, + join: { + from: 'access_list.owner_user_id', + to: 'user.id' + }, + modify: function (qb) { + qb.where('user.is_deleted', 0); + qb.omit(['id', 'created_on', 'modified_on', 'is_deleted', 'email', 'roles']); + } + }, + items: { + relation: Model.HasManyRelation, + modelClass: AccessListAuth, + join: { + from: 'access_list.id', + to: 'access_list_auth.access_list_id' + }, + modify: function (qb) { + qb.omit(['id', 'created_on', 'modified_on', 'access_list_id', 'meta']); + } + }, + proxy_hosts: { + relation: Model.HasManyRelation, + modelClass: ProxyHost, + join: { + from: 'access_list.id', + to: 'proxy_host.access_list_id' + }, + modify: function (qb) { + qb.where('proxy_host.is_deleted', 0); + qb.omit(['is_deleted', 'meta']); + } + } + }; + } +} + +module.exports = AccessList; diff --git a/backend/models/access_list_auth.js b/backend/models/access_list_auth.js new file mode 100644 index 000000000..20436ccd8 --- /dev/null +++ b/backend/models/access_list_auth.js @@ -0,0 +1,54 @@ +// Objection Docs: +// http://vincit.github.io/objection.js/ + +const db = require('../db'); +const Model = require('objection').Model; + +Model.knex(db); + +class AccessListAuth extends Model { + $beforeInsert () { + this.created_on = Model.raw('NOW()'); + this.modified_on = Model.raw('NOW()'); + + // Default for meta + if (typeof this.meta === 'undefined') { + this.meta = {}; + } + } + + $beforeUpdate () { + this.modified_on = Model.raw('NOW()'); + } + + static get name () { + return 'AccessListAuth'; + } + + static get tableName () { + return 'access_list_auth'; + } + + static get jsonAttributes () { + return ['meta']; + } + + static get relationMappings () { + return { + access_list: { + relation: Model.HasOneRelation, + modelClass: require('./access_list'), + join: { + from: 'access_list_auth.access_list_id', + to: 'access_list.id' + }, + modify: function (qb) { + qb.where('access_list.is_deleted', 0); + qb.omit(['created_on', 'modified_on', 'is_deleted', 'access_list_id']); + } + } + }; + } +} + +module.exports = AccessListAuth; diff --git a/backend/models/audit-log.js b/backend/models/audit-log.js new file mode 100644 index 000000000..3d473fc10 --- /dev/null +++ b/backend/models/audit-log.js @@ -0,0 +1,54 @@ +// Objection Docs: +// http://vincit.github.io/objection.js/ + +const db = require('../db'); +const Model = require('objection').Model; +const User = require('./user'); + +Model.knex(db); + +class AuditLog extends Model { + $beforeInsert () { + this.created_on = Model.raw('NOW()'); + this.modified_on = Model.raw('NOW()'); + + // Default for meta + if (typeof this.meta === 'undefined') { + this.meta = {}; + } + } + + $beforeUpdate () { + this.modified_on = Model.raw('NOW()'); + } + + static get name () { + return 'AuditLog'; + } + + static get tableName () { + return 'audit_log'; + } + + static get jsonAttributes () { + return ['meta']; + } + + static get relationMappings () { + return { + user: { + relation: Model.HasOneRelation, + modelClass: User, + join: { + from: 'audit_log.user_id', + to: 'user.id' + }, + modify: function (qb) { + qb.omit(['id', 'created_on', 'modified_on', 'roles']); + } + } + }; + } +} + +module.exports = AuditLog; diff --git a/backend/models/auth.js b/backend/models/auth.js new file mode 100644 index 000000000..9db62f5f4 --- /dev/null +++ b/backend/models/auth.js @@ -0,0 +1,85 @@ +// Objection Docs: +// http://vincit.github.io/objection.js/ + +const bcrypt = require('bcrypt'); +const db = require('../db'); +const Model = require('objection').Model; +const User = require('./user'); + +Model.knex(db); + +function encryptPassword () { + /* jshint -W040 */ + let _this = this; + + if (_this.type === 'password' && _this.secret) { + return bcrypt.hash(_this.secret, 13) + .then(function (hash) { + _this.secret = hash; + }); + } + + return null; +} + +class Auth extends Model { + $beforeInsert (queryContext) { + this.created_on = Model.raw('NOW()'); + this.modified_on = Model.raw('NOW()'); + + // Default for meta + if (typeof this.meta === 'undefined') { + this.meta = {}; + } + + return encryptPassword.apply(this, queryContext); + } + + $beforeUpdate (queryContext) { + this.modified_on = Model.raw('NOW()'); + return encryptPassword.apply(this, queryContext); + } + + /** + * Verify a plain password against the encrypted password + * + * @param {String} password + * @returns {Promise} + */ + verifyPassword (password) { + return bcrypt.compare(password, this.secret); + } + + static get name () { + return 'Auth'; + } + + static get tableName () { + return 'auth'; + } + + static get jsonAttributes () { + return ['meta']; + } + + static get relationMappings () { + return { + user: { + relation: Model.HasOneRelation, + modelClass: User, + join: { + from: 'auth.user_id', + to: 'user.id' + }, + filter: { + is_deleted: 0 + }, + modify: function (qb) { + qb.omit(['is_deleted']); + } + } + }; + } +} + +module.exports = Auth; diff --git a/backend/models/certificate.js b/backend/models/certificate.js new file mode 100644 index 000000000..2dcb75055 --- /dev/null +++ b/backend/models/certificate.js @@ -0,0 +1,72 @@ +// Objection Docs: +// http://vincit.github.io/objection.js/ + +const db = require('../db'); +const Model = require('objection').Model; +const User = require('./user'); + +Model.knex(db); + +class Certificate extends Model { + $beforeInsert () { + this.created_on = Model.raw('NOW()'); + this.modified_on = Model.raw('NOW()'); + + // Default for expires_on + if (typeof this.expires_on === 'undefined') { + this.expires_on = Model.raw('NOW()'); + } + + // Default for domain_names + if (typeof this.domain_names === 'undefined') { + this.domain_names = []; + } + + // Default for meta + if (typeof this.meta === 'undefined') { + this.meta = {}; + } + + this.domain_names.sort(); + } + + $beforeUpdate () { + this.modified_on = Model.raw('NOW()'); + + // Sort domain_names + if (typeof this.domain_names !== 'undefined') { + this.domain_names.sort(); + } + } + + static get name () { + return 'Certificate'; + } + + static get tableName () { + return 'certificate'; + } + + static get jsonAttributes () { + return ['domain_names', 'meta']; + } + + static get relationMappings () { + return { + owner: { + relation: Model.HasOneRelation, + modelClass: User, + join: { + from: 'certificate.owner_user_id', + to: 'user.id' + }, + modify: function (qb) { + qb.where('user.is_deleted', 0); + qb.omit(['id', 'created_on', 'modified_on', 'is_deleted', 'email', 'roles']); + } + } + }; + } +} + +module.exports = Certificate; diff --git a/backend/models/dead_host.js b/backend/models/dead_host.js new file mode 100644 index 000000000..dc1109c84 --- /dev/null +++ b/backend/models/dead_host.js @@ -0,0 +1,80 @@ +// Objection Docs: +// http://vincit.github.io/objection.js/ + +const db = require('../db'); +const Model = require('objection').Model; +const User = require('./user'); +const Certificate = require('./certificate'); + +Model.knex(db); + +class DeadHost extends Model { + $beforeInsert () { + this.created_on = Model.raw('NOW()'); + this.modified_on = Model.raw('NOW()'); + + // Default for domain_names + if (typeof this.domain_names === 'undefined') { + this.domain_names = []; + } + + // Default for meta + if (typeof this.meta === 'undefined') { + this.meta = {}; + } + + this.domain_names.sort(); + } + + $beforeUpdate () { + this.modified_on = Model.raw('NOW()'); + + // Sort domain_names + if (typeof this.domain_names !== 'undefined') { + this.domain_names.sort(); + } + } + + static get name () { + return 'DeadHost'; + } + + static get tableName () { + return 'dead_host'; + } + + static get jsonAttributes () { + return ['domain_names', 'meta']; + } + + static get relationMappings () { + return { + owner: { + relation: Model.HasOneRelation, + modelClass: User, + join: { + from: 'dead_host.owner_user_id', + to: 'user.id' + }, + modify: function (qb) { + qb.where('user.is_deleted', 0); + qb.omit(['id', 'created_on', 'modified_on', 'is_deleted', 'email', 'roles']); + } + }, + certificate: { + relation: Model.HasOneRelation, + modelClass: Certificate, + join: { + from: 'dead_host.certificate_id', + to: 'certificate.id' + }, + modify: function (qb) { + qb.where('certificate.is_deleted', 0); + qb.omit(['id', 'created_on', 'modified_on', 'is_deleted']); + } + } + }; + } +} + +module.exports = DeadHost; diff --git a/backend/models/proxy_host.js b/backend/models/proxy_host.js new file mode 100644 index 000000000..a2c9beee8 --- /dev/null +++ b/backend/models/proxy_host.js @@ -0,0 +1,93 @@ +// Objection Docs: +// http://vincit.github.io/objection.js/ + +const db = require('../db'); +const Model = require('objection').Model; +const User = require('./user'); +const AccessList = require('./access_list'); +const Certificate = require('./certificate'); + +Model.knex(db); + +class ProxyHost extends Model { + $beforeInsert () { + this.created_on = Model.raw('NOW()'); + this.modified_on = Model.raw('NOW()'); + + // Default for domain_names + if (typeof this.domain_names === 'undefined') { + this.domain_names = []; + } + + // Default for meta + if (typeof this.meta === 'undefined') { + this.meta = {}; + } + + this.domain_names.sort(); + } + + $beforeUpdate () { + this.modified_on = Model.raw('NOW()'); + + // Sort domain_names + if (typeof this.domain_names !== 'undefined') { + this.domain_names.sort(); + } + } + + static get name () { + return 'ProxyHost'; + } + + static get tableName () { + return 'proxy_host'; + } + + static get jsonAttributes () { + return ['domain_names', 'meta', 'locations']; + } + + static get relationMappings () { + return { + owner: { + relation: Model.HasOneRelation, + modelClass: User, + join: { + from: 'proxy_host.owner_user_id', + to: 'user.id' + }, + modify: function (qb) { + qb.where('user.is_deleted', 0); + qb.omit(['id', 'created_on', 'modified_on', 'is_deleted', 'email', 'roles']); + } + }, + access_list: { + relation: Model.HasOneRelation, + modelClass: AccessList, + join: { + from: 'proxy_host.access_list_id', + to: 'access_list.id' + }, + modify: function (qb) { + qb.where('access_list.is_deleted', 0); + qb.omit(['id', 'created_on', 'modified_on', 'is_deleted']); + } + }, + certificate: { + relation: Model.HasOneRelation, + modelClass: Certificate, + join: { + from: 'proxy_host.certificate_id', + to: 'certificate.id' + }, + modify: function (qb) { + qb.where('certificate.is_deleted', 0); + qb.omit(['id', 'created_on', 'modified_on', 'is_deleted']); + } + } + }; + } +} + +module.exports = ProxyHost; diff --git a/backend/models/redirection_host.js b/backend/models/redirection_host.js new file mode 100644 index 000000000..029b0c08f --- /dev/null +++ b/backend/models/redirection_host.js @@ -0,0 +1,80 @@ +// Objection Docs: +// http://vincit.github.io/objection.js/ + +const db = require('../db'); +const Model = require('objection').Model; +const User = require('./user'); +const Certificate = require('./certificate'); + +Model.knex(db); + +class RedirectionHost extends Model { + $beforeInsert () { + this.created_on = Model.raw('NOW()'); + this.modified_on = Model.raw('NOW()'); + + // Default for domain_names + if (typeof this.domain_names === 'undefined') { + this.domain_names = []; + } + + // Default for meta + if (typeof this.meta === 'undefined') { + this.meta = {}; + } + + this.domain_names.sort(); + } + + $beforeUpdate () { + this.modified_on = Model.raw('NOW()'); + + // Sort domain_names + if (typeof this.domain_names !== 'undefined') { + this.domain_names.sort(); + } + } + + static get name () { + return 'RedirectionHost'; + } + + static get tableName () { + return 'redirection_host'; + } + + static get jsonAttributes () { + return ['domain_names', 'meta']; + } + + static get relationMappings () { + return { + owner: { + relation: Model.HasOneRelation, + modelClass: User, + join: { + from: 'redirection_host.owner_user_id', + to: 'user.id' + }, + modify: function (qb) { + qb.where('user.is_deleted', 0); + qb.omit(['id', 'created_on', 'modified_on', 'is_deleted', 'email', 'roles']); + } + }, + certificate: { + relation: Model.HasOneRelation, + modelClass: Certificate, + join: { + from: 'redirection_host.certificate_id', + to: 'certificate.id' + }, + modify: function (qb) { + qb.where('certificate.is_deleted', 0); + qb.omit(['id', 'created_on', 'modified_on', 'is_deleted']); + } + } + }; + } +} + +module.exports = RedirectionHost; diff --git a/backend/models/setting.js b/backend/models/setting.js new file mode 100644 index 000000000..75aa90076 --- /dev/null +++ b/backend/models/setting.js @@ -0,0 +1,30 @@ +// Objection Docs: +// http://vincit.github.io/objection.js/ + +const db = require('../db'); +const Model = require('objection').Model; + +Model.knex(db); + +class Setting extends Model { + $beforeInsert () { + // Default for meta + if (typeof this.meta === 'undefined') { + this.meta = {}; + } + } + + static get name () { + return 'Setting'; + } + + static get tableName () { + return 'setting'; + } + + static get jsonAttributes () { + return ['meta']; + } +} + +module.exports = Setting; diff --git a/backend/models/stream.js b/backend/models/stream.js new file mode 100644 index 000000000..7b6c8a4b7 --- /dev/null +++ b/backend/models/stream.js @@ -0,0 +1,55 @@ +// Objection Docs: +// http://vincit.github.io/objection.js/ + +const db = require('../db'); +const Model = require('objection').Model; +const User = require('./user'); + +Model.knex(db); + +class Stream extends Model { + $beforeInsert () { + this.created_on = Model.raw('NOW()'); + this.modified_on = Model.raw('NOW()'); + + // Default for meta + if (typeof this.meta === 'undefined') { + this.meta = {}; + } + } + + $beforeUpdate () { + this.modified_on = Model.raw('NOW()'); + } + + static get name () { + return 'Stream'; + } + + static get tableName () { + return 'stream'; + } + + static get jsonAttributes () { + return ['meta']; + } + + static get relationMappings () { + return { + owner: { + relation: Model.HasOneRelation, + modelClass: User, + join: { + from: 'stream.owner_user_id', + to: 'user.id' + }, + modify: function (qb) { + qb.where('user.is_deleted', 0); + qb.omit(['id', 'created_on', 'modified_on', 'is_deleted', 'email', 'roles']); + } + } + }; + } +} + +module.exports = Stream; diff --git a/backend/models/token.js b/backend/models/token.js new file mode 100644 index 000000000..373f8e5c9 --- /dev/null +++ b/backend/models/token.js @@ -0,0 +1,136 @@ +/** + NOTE: This is not a database table, this is a model of a Token object that can be created/loaded + and then has abilities after that. + */ + +const _ = require('lodash'); +const config = require('config'); +const jwt = require('jsonwebtoken'); +const crypto = require('crypto'); +const error = require('../lib/error'); +const ALGO = 'RS256'; + +module.exports = function () { + const public_key = config.get('jwt.pub'); + const private_key = config.get('jwt.key'); + + let token_data = {}; + + let self = { + /** + * @param {Object} payload + * @returns {Promise} + */ + create: (payload) => { + // sign with RSA SHA256 + let options = { + algorithm: ALGO, + expiresIn: payload.expiresIn || '1d' + }; + + payload.jti = crypto.randomBytes(12) + .toString('base64') + .substr(-8); + + return new Promise((resolve, reject) => { + jwt.sign(payload, private_key, options, (err, token) => { + if (err) { + reject(err); + } else { + token_data = payload; + resolve({ + token: token, + payload: payload + }); + } + }); + }); + }, + + /** + * @param {String} token + * @returns {Promise} + */ + load: function (token) { + return new Promise((resolve, reject) => { + try { + if (!token || token === null || token === 'null') { + reject(new error.AuthError('Empty token')); + } else { + jwt.verify(token, public_key, {ignoreExpiration: false, algorithms: [ALGO]}, (err, result) => { + if (err) { + + if (err.name === 'TokenExpiredError') { + reject(new error.AuthError('Token has expired', err)); + } else { + reject(err); + } + + } else { + token_data = result; + + // Hack: some tokens out in the wild have a scope of 'all' instead of 'user'. + // For 30 days at least, we need to replace 'all' with user. + if ((typeof token_data.scope !== 'undefined' && _.indexOf(token_data.scope, 'all') !== -1)) { + //console.log('Warning! Replacing "all" scope with "user"'); + + token_data.scope = ['user']; + } + + resolve(token_data); + } + }); + } + } catch (err) { + reject(err); + } + }); + + }, + + /** + * Does the token have the specified scope? + * + * @param {String} scope + * @returns {Boolean} + */ + hasScope: function (scope) { + return typeof token_data.scope !== 'undefined' && _.indexOf(token_data.scope, scope) !== -1; + }, + + /** + * @param {String} key + * @return {*} + */ + get: function (key) { + if (typeof token_data[key] !== 'undefined') { + return token_data[key]; + } + + return null; + }, + + /** + * @param {String} key + * @param {*} value + */ + set: function (key, value) { + token_data[key] = value; + }, + + /** + * @param [default_value] + * @returns {Integer} + */ + getUserId: (default_value) => { + let attrs = self.get('attrs'); + if (attrs && typeof attrs.id !== 'undefined' && attrs.id) { + return attrs.id; + } + + return default_value || 0; + } + }; + + return self; +}; diff --git a/backend/models/user.js b/backend/models/user.js new file mode 100644 index 000000000..8d1ef1230 --- /dev/null +++ b/backend/models/user.js @@ -0,0 +1,55 @@ +// Objection Docs: +// http://vincit.github.io/objection.js/ + +const db = require('../db'); +const Model = require('objection').Model; +const UserPermission = require('./user_permission'); + +Model.knex(db); + +class User extends Model { + $beforeInsert () { + this.created_on = Model.raw('NOW()'); + this.modified_on = Model.raw('NOW()'); + + // Default for roles + if (typeof this.roles === 'undefined') { + this.roles = []; + } + } + + $beforeUpdate () { + this.modified_on = Model.raw('NOW()'); + } + + static get name () { + return 'User'; + } + + static get tableName () { + return 'user'; + } + + static get jsonAttributes () { + return ['roles']; + } + + static get relationMappings () { + return { + permissions: { + relation: Model.HasOneRelation, + modelClass: UserPermission, + join: { + from: 'user.id', + to: 'user_permission.user_id' + }, + modify: function (qb) { + qb.omit(['id', 'created_on', 'modified_on', 'user_id']); + } + } + }; + } + +} + +module.exports = User; diff --git a/backend/models/user_permission.js b/backend/models/user_permission.js new file mode 100644 index 000000000..836a23f56 --- /dev/null +++ b/backend/models/user_permission.js @@ -0,0 +1,28 @@ +// Objection Docs: +// http://vincit.github.io/objection.js/ + +const db = require('../db'); +const Model = require('objection').Model; + +Model.knex(db); + +class UserPermission extends Model { + $beforeInsert () { + this.created_on = Model.raw('NOW()'); + this.modified_on = Model.raw('NOW()'); + } + + $beforeUpdate () { + this.modified_on = Model.raw('NOW()'); + } + + static get name () { + return 'UserPermission'; + } + + static get tableName () { + return 'user_permission'; + } +} + +module.exports = UserPermission; diff --git a/nodemon.json b/backend/nodemon.json similarity index 60% rename from nodemon.json rename to backend/nodemon.json index bcbb216c3..3d6d13420 100644 --- a/nodemon.json +++ b/backend/nodemon.json @@ -1,9 +1,7 @@ { "verbose": false, "ignore": [ - "dist", - "data", - "src/frontend" + "data" ], "ext": "js json ejs" } diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 000000000..9a1a12b08 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,48 @@ +{ + "name": "nginx-proxy-manager", + "version": "2.1.0", + "description": "A beautiful interface for creating Nginx endpoints", + "main": "js/index.js", + "dependencies": { + "ajv": "^6.5.1", + "batchflow": "^0.4.0", + "bcrypt": "^3.0.0", + "body-parser": "^1.18.3", + "compression": "^1.7.2", + "config": "^2.0.1", + "diskdb": "^0.1.17", + "express": "^4.16.3", + "express-fileupload": "^0.4.0", + "gravatar": "^1.6.0", + "html-entities": "^1.2.1", + "json-schema-ref-parser": "^5.0.3", + "jsonwebtoken": "^8.3.0", + "knex": "^0.15.2", + "liquidjs": "^5.1.1", + "lodash": "^4.17.10", + "moment": "^2.22.2", + "mysql": "^2.15.0", + "node-rsa": "^1.0.0", + "nodemon": "^2.0.2", + "objection": "^1.1.10", + "path": "^0.12.7", + "restler": "^3.4.0", + "signale": "^1.2.1", + "temp-write": "^3.4.0", + "unix-timestamp": "^0.2.0" + }, + "scripts": { + "build": "webpack --mode production" + }, + "signale": { + "displayDate": true, + "displayTimestamp": true + }, + "author": "Jamie Curnow ", + "license": "MIT", + "devDependencies": { + "eslint": "^6.8.0", + "eslint-plugin-align-assignments": "^1.1.2", + "prettier": "^1.19.1" + } +} diff --git a/backend/routes/api/audit-log.js b/backend/routes/api/audit-log.js new file mode 100644 index 000000000..8a2490c3f --- /dev/null +++ b/backend/routes/api/audit-log.js @@ -0,0 +1,52 @@ +const express = require('express'); +const validator = require('../../lib/validator'); +const jwtdecode = require('../../lib/express/jwt-decode'); +const internalAuditLog = require('../../internal/audit-log'); + +let router = express.Router({ + caseSensitive: true, + strict: true, + mergeParams: true +}); + +/** + * /api/audit-log + */ +router + .route('/') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * GET /api/audit-log + * + * Retrieve all logs + */ + .get((req, res, next) => { + validator({ + additionalProperties: false, + properties: { + expand: { + $ref: 'definitions#/definitions/expand' + }, + query: { + $ref: 'definitions#/definitions/query' + } + } + }, { + expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null), + query: (typeof req.query.query === 'string' ? req.query.query : null) + }) + .then((data) => { + return internalAuditLog.getAll(res.locals.access, data.expand, data.query); + }) + .then((rows) => { + res.status(200) + .send(rows); + }) + .catch(next); + }); + +module.exports = router; diff --git a/src/backend/routes/api/main.js b/backend/routes/api/main.js similarity index 64% rename from src/backend/routes/api/main.js rename to backend/routes/api/main.js index bdbe08fa2..33cbbc21f 100644 --- a/src/backend/routes/api/main.js +++ b/backend/routes/api/main.js @@ -1,11 +1,11 @@ const express = require('express'); -const pjson = require('../../../../package.json'); +const pjson = require('../../package.json'); const error = require('../../lib/error'); let router = express.Router({ - caseSensitive: true, - strict: true, - mergeParams: true + caseSensitive: true, + strict: true, + mergeParams: true }); /** @@ -13,18 +13,19 @@ let router = express.Router({ * GET /api */ router.get('/', (req, res/*, next*/) => { - let version = pjson.version.split('-').shift().split('.'); + let version = pjson.version.split('-').shift().split('.'); - res.status(200).send({ - status: 'OK', - version: { - major: parseInt(version.shift(), 10), - minor: parseInt(version.shift(), 10), - revision: parseInt(version.shift(), 10) - } - }); + res.status(200).send({ + status: 'OK', + version: { + major: parseInt(version.shift(), 10), + minor: parseInt(version.shift(), 10), + revision: parseInt(version.shift(), 10) + } + }); }); +router.use('/schema', require('./schema')); router.use('/tokens', require('./tokens')); router.use('/users', require('./users')); router.use('/audit-log', require('./audit-log')); @@ -43,8 +44,8 @@ router.use('/nginx/certificates', require('./nginx/certificates')); * ALL /api/* */ router.all(/(.+)/, function (req, res, next) { - req.params.page = req.params['0']; - next(new error.ItemNotFoundError(req.params.page)); + req.params.page = req.params['0']; + next(new error.ItemNotFoundError(req.params.page)); }); module.exports = router; diff --git a/backend/routes/api/nginx/access_lists.js b/backend/routes/api/nginx/access_lists.js new file mode 100644 index 000000000..d55c3ae12 --- /dev/null +++ b/backend/routes/api/nginx/access_lists.js @@ -0,0 +1,148 @@ +const express = require('express'); +const validator = require('../../../lib/validator'); +const jwtdecode = require('../../../lib/express/jwt-decode'); +const internalAccessList = require('../../../internal/access-list'); +const apiValidator = require('../../../lib/validator/api'); + +let router = express.Router({ + caseSensitive: true, + strict: true, + mergeParams: true +}); + +/** + * /api/nginx/access-lists + */ +router + .route('/') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * GET /api/nginx/access-lists + * + * Retrieve all access-lists + */ + .get((req, res, next) => { + validator({ + additionalProperties: false, + properties: { + expand: { + $ref: 'definitions#/definitions/expand' + }, + query: { + $ref: 'definitions#/definitions/query' + } + } + }, { + expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null), + query: (typeof req.query.query === 'string' ? req.query.query : null) + }) + .then((data) => { + return internalAccessList.getAll(res.locals.access, data.expand, data.query); + }) + .then((rows) => { + res.status(200) + .send(rows); + }) + .catch(next); + }) + + /** + * POST /api/nginx/access-lists + * + * Create a new access-list + */ + .post((req, res, next) => { + apiValidator({$ref: 'endpoints/access-lists#/links/1/schema'}, req.body) + .then((payload) => { + return internalAccessList.create(res.locals.access, payload); + }) + .then((result) => { + res.status(201) + .send(result); + }) + .catch(next); + }); + +/** + * Specific access-list + * + * /api/nginx/access-lists/123 + */ +router + .route('/:list_id') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * GET /api/nginx/access-lists/123 + * + * Retrieve a specific access-list + */ + .get((req, res, next) => { + validator({ + required: ['list_id'], + additionalProperties: false, + properties: { + list_id: { + $ref: 'definitions#/definitions/id' + }, + expand: { + $ref: 'definitions#/definitions/expand' + } + } + }, { + list_id: req.params.list_id, + expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null) + }) + .then((data) => { + return internalAccessList.get(res.locals.access, { + id: parseInt(data.list_id, 10), + expand: data.expand + }); + }) + .then((row) => { + res.status(200) + .send(row); + }) + .catch(next); + }) + + /** + * PUT /api/nginx/access-lists/123 + * + * Update and existing access-list + */ + .put((req, res, next) => { + apiValidator({$ref: 'endpoints/access-lists#/links/2/schema'}, req.body) + .then((payload) => { + payload.id = parseInt(req.params.list_id, 10); + return internalAccessList.update(res.locals.access, payload); + }) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }) + + /** + * DELETE /api/nginx/access-lists/123 + * + * Delete and existing access-list + */ + .delete((req, res, next) => { + internalAccessList.delete(res.locals.access, {id: parseInt(req.params.list_id, 10)}) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }); + +module.exports = router; diff --git a/backend/routes/api/nginx/certificates.js b/backend/routes/api/nginx/certificates.js new file mode 100644 index 000000000..50d39137a --- /dev/null +++ b/backend/routes/api/nginx/certificates.js @@ -0,0 +1,243 @@ +const express = require('express'); +const validator = require('../../../lib/validator'); +const jwtdecode = require('../../../lib/express/jwt-decode'); +const internalCertificate = require('../../../internal/certificate'); +const apiValidator = require('../../../lib/validator/api'); + +let router = express.Router({ + caseSensitive: true, + strict: true, + mergeParams: true +}); + +/** + * /api/nginx/certificates + */ +router + .route('/') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * GET /api/nginx/certificates + * + * Retrieve all certificates + */ + .get((req, res, next) => { + validator({ + additionalProperties: false, + properties: { + expand: { + $ref: 'definitions#/definitions/expand' + }, + query: { + $ref: 'definitions#/definitions/query' + } + } + }, { + expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null), + query: (typeof req.query.query === 'string' ? req.query.query : null) + }) + .then((data) => { + return internalCertificate.getAll(res.locals.access, data.expand, data.query); + }) + .then((rows) => { + res.status(200) + .send(rows); + }) + .catch(next); + }) + + /** + * POST /api/nginx/certificates + * + * Create a new certificate + */ + .post((req, res, next) => { + apiValidator({$ref: 'endpoints/certificates#/links/1/schema'}, req.body) + .then((payload) => { + return internalCertificate.create(res.locals.access, payload); + }) + .then((result) => { + res.status(201) + .send(result); + }) + .catch(next); + }); + +/** + * Specific certificate + * + * /api/nginx/certificates/123 + */ +router + .route('/:certificate_id') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * GET /api/nginx/certificates/123 + * + * Retrieve a specific certificate + */ + .get((req, res, next) => { + validator({ + required: ['certificate_id'], + additionalProperties: false, + properties: { + certificate_id: { + $ref: 'definitions#/definitions/id' + }, + expand: { + $ref: 'definitions#/definitions/expand' + } + } + }, { + certificate_id: req.params.certificate_id, + expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null) + }) + .then((data) => { + return internalCertificate.get(res.locals.access, { + id: parseInt(data.certificate_id, 10), + expand: data.expand + }); + }) + .then((row) => { + res.status(200) + .send(row); + }) + .catch(next); + }) + + /** + * PUT /api/nginx/certificates/123 + * + * Update and existing certificate + */ + .put((req, res, next) => { + apiValidator({$ref: 'endpoints/certificates#/links/2/schema'}, req.body) + .then((payload) => { + payload.id = parseInt(req.params.certificate_id, 10); + return internalCertificate.update(res.locals.access, payload); + }) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }) + + /** + * DELETE /api/nginx/certificates/123 + * + * Update and existing certificate + */ + .delete((req, res, next) => { + internalCertificate.delete(res.locals.access, {id: parseInt(req.params.certificate_id, 10)}) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }); + +/** + * Upload Certs + * + * /api/nginx/certificates/123/upload + */ +router + .route('/:certificate_id/upload') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * POST /api/nginx/certificates/123/upload + * + * Upload certificates + */ + .post((req, res, next) => { + if (!req.files) { + res.status(400) + .send({error: 'No files were uploaded'}); + } else { + internalCertificate.upload(res.locals.access, { + id: parseInt(req.params.certificate_id, 10), + files: req.files + }) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + } + }); + +/** + * Renew LE Certs + * + * /api/nginx/certificates/123/renew + */ +router + .route('/:certificate_id/renew') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * POST /api/nginx/certificates/123/renew + * + * Renew certificate + */ + .post((req, res, next) => { + internalCertificate.renew(res.locals.access, { + id: parseInt(req.params.certificate_id, 10) + }) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }); + +/** + * Validate Certs before saving + * + * /api/nginx/certificates/validate + */ +router + .route('/validate') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * POST /api/nginx/certificates/validate + * + * Validate certificates + */ + .post((req, res, next) => { + if (!req.files) { + res.status(400) + .send({error: 'No files were uploaded'}); + } else { + internalCertificate.validate({ + files: req.files + }) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + } + }); + +module.exports = router; diff --git a/backend/routes/api/nginx/dead_hosts.js b/backend/routes/api/nginx/dead_hosts.js new file mode 100644 index 000000000..08b58f2de --- /dev/null +++ b/backend/routes/api/nginx/dead_hosts.js @@ -0,0 +1,196 @@ +const express = require('express'); +const validator = require('../../../lib/validator'); +const jwtdecode = require('../../../lib/express/jwt-decode'); +const internalDeadHost = require('../../../internal/dead-host'); +const apiValidator = require('../../../lib/validator/api'); + +let router = express.Router({ + caseSensitive: true, + strict: true, + mergeParams: true +}); + +/** + * /api/nginx/dead-hosts + */ +router + .route('/') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * GET /api/nginx/dead-hosts + * + * Retrieve all dead-hosts + */ + .get((req, res, next) => { + validator({ + additionalProperties: false, + properties: { + expand: { + $ref: 'definitions#/definitions/expand' + }, + query: { + $ref: 'definitions#/definitions/query' + } + } + }, { + expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null), + query: (typeof req.query.query === 'string' ? req.query.query : null) + }) + .then((data) => { + return internalDeadHost.getAll(res.locals.access, data.expand, data.query); + }) + .then((rows) => { + res.status(200) + .send(rows); + }) + .catch(next); + }) + + /** + * POST /api/nginx/dead-hosts + * + * Create a new dead-host + */ + .post((req, res, next) => { + apiValidator({$ref: 'endpoints/dead-hosts#/links/1/schema'}, req.body) + .then((payload) => { + return internalDeadHost.create(res.locals.access, payload); + }) + .then((result) => { + res.status(201) + .send(result); + }) + .catch(next); + }); + +/** + * Specific dead-host + * + * /api/nginx/dead-hosts/123 + */ +router + .route('/:host_id') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * GET /api/nginx/dead-hosts/123 + * + * Retrieve a specific dead-host + */ + .get((req, res, next) => { + validator({ + required: ['host_id'], + additionalProperties: false, + properties: { + host_id: { + $ref: 'definitions#/definitions/id' + }, + expand: { + $ref: 'definitions#/definitions/expand' + } + } + }, { + host_id: req.params.host_id, + expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null) + }) + .then((data) => { + return internalDeadHost.get(res.locals.access, { + id: parseInt(data.host_id, 10), + expand: data.expand + }); + }) + .then((row) => { + res.status(200) + .send(row); + }) + .catch(next); + }) + + /** + * PUT /api/nginx/dead-hosts/123 + * + * Update and existing dead-host + */ + .put((req, res, next) => { + apiValidator({$ref: 'endpoints/dead-hosts#/links/2/schema'}, req.body) + .then((payload) => { + payload.id = parseInt(req.params.host_id, 10); + return internalDeadHost.update(res.locals.access, payload); + }) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }) + + /** + * DELETE /api/nginx/dead-hosts/123 + * + * Update and existing dead-host + */ + .delete((req, res, next) => { + internalDeadHost.delete(res.locals.access, {id: parseInt(req.params.host_id, 10)}) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }); + +/** + * Enable dead-host + * + * /api/nginx/dead-hosts/123/enable + */ +router + .route('/:host_id/enable') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * POST /api/nginx/dead-hosts/123/enable + */ + .post((req, res, next) => { + internalDeadHost.enable(res.locals.access, {id: parseInt(req.params.host_id, 10)}) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }); + +/** + * Disable dead-host + * + * /api/nginx/dead-hosts/123/disable + */ +router + .route('/:host_id/disable') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * POST /api/nginx/dead-hosts/123/disable + */ + .post((req, res, next) => { + internalDeadHost.disable(res.locals.access, {id: parseInt(req.params.host_id, 10)}) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }); + +module.exports = router; diff --git a/backend/routes/api/nginx/proxy_hosts.js b/backend/routes/api/nginx/proxy_hosts.js new file mode 100644 index 000000000..6f933c3d3 --- /dev/null +++ b/backend/routes/api/nginx/proxy_hosts.js @@ -0,0 +1,196 @@ +const express = require('express'); +const validator = require('../../../lib/validator'); +const jwtdecode = require('../../../lib/express/jwt-decode'); +const internalProxyHost = require('../../../internal/proxy-host'); +const apiValidator = require('../../../lib/validator/api'); + +let router = express.Router({ + caseSensitive: true, + strict: true, + mergeParams: true +}); + +/** + * /api/nginx/proxy-hosts + */ +router + .route('/') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * GET /api/nginx/proxy-hosts + * + * Retrieve all proxy-hosts + */ + .get((req, res, next) => { + validator({ + additionalProperties: false, + properties: { + expand: { + $ref: 'definitions#/definitions/expand' + }, + query: { + $ref: 'definitions#/definitions/query' + } + } + }, { + expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null), + query: (typeof req.query.query === 'string' ? req.query.query : null) + }) + .then((data) => { + return internalProxyHost.getAll(res.locals.access, data.expand, data.query); + }) + .then((rows) => { + res.status(200) + .send(rows); + }) + .catch(next); + }) + + /** + * POST /api/nginx/proxy-hosts + * + * Create a new proxy-host + */ + .post((req, res, next) => { + apiValidator({$ref: 'endpoints/proxy-hosts#/links/1/schema'}, req.body) + .then((payload) => { + return internalProxyHost.create(res.locals.access, payload); + }) + .then((result) => { + res.status(201) + .send(result); + }) + .catch(next); + }); + +/** + * Specific proxy-host + * + * /api/nginx/proxy-hosts/123 + */ +router + .route('/:host_id') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * GET /api/nginx/proxy-hosts/123 + * + * Retrieve a specific proxy-host + */ + .get((req, res, next) => { + validator({ + required: ['host_id'], + additionalProperties: false, + properties: { + host_id: { + $ref: 'definitions#/definitions/id' + }, + expand: { + $ref: 'definitions#/definitions/expand' + } + } + }, { + host_id: req.params.host_id, + expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null) + }) + .then((data) => { + return internalProxyHost.get(res.locals.access, { + id: parseInt(data.host_id, 10), + expand: data.expand + }); + }) + .then((row) => { + res.status(200) + .send(row); + }) + .catch(next); + }) + + /** + * PUT /api/nginx/proxy-hosts/123 + * + * Update and existing proxy-host + */ + .put((req, res, next) => { + apiValidator({$ref: 'endpoints/proxy-hosts#/links/2/schema'}, req.body) + .then((payload) => { + payload.id = parseInt(req.params.host_id, 10); + return internalProxyHost.update(res.locals.access, payload); + }) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }) + + /** + * DELETE /api/nginx/proxy-hosts/123 + * + * Update and existing proxy-host + */ + .delete((req, res, next) => { + internalProxyHost.delete(res.locals.access, {id: parseInt(req.params.host_id, 10)}) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }); + +/** + * Enable proxy-host + * + * /api/nginx/proxy-hosts/123/enable + */ +router + .route('/:host_id/enable') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * POST /api/nginx/proxy-hosts/123/enable + */ + .post((req, res, next) => { + internalProxyHost.enable(res.locals.access, {id: parseInt(req.params.host_id, 10)}) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }); + +/** + * Disable proxy-host + * + * /api/nginx/proxy-hosts/123/disable + */ +router + .route('/:host_id/disable') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * POST /api/nginx/proxy-hosts/123/disable + */ + .post((req, res, next) => { + internalProxyHost.disable(res.locals.access, {id: parseInt(req.params.host_id, 10)}) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }); + +module.exports = router; diff --git a/backend/routes/api/nginx/redirection_hosts.js b/backend/routes/api/nginx/redirection_hosts.js new file mode 100644 index 000000000..4d44c1126 --- /dev/null +++ b/backend/routes/api/nginx/redirection_hosts.js @@ -0,0 +1,196 @@ +const express = require('express'); +const validator = require('../../../lib/validator'); +const jwtdecode = require('../../../lib/express/jwt-decode'); +const internalRedirectionHost = require('../../../internal/redirection-host'); +const apiValidator = require('../../../lib/validator/api'); + +let router = express.Router({ + caseSensitive: true, + strict: true, + mergeParams: true +}); + +/** + * /api/nginx/redirection-hosts + */ +router + .route('/') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * GET /api/nginx/redirection-hosts + * + * Retrieve all redirection-hosts + */ + .get((req, res, next) => { + validator({ + additionalProperties: false, + properties: { + expand: { + $ref: 'definitions#/definitions/expand' + }, + query: { + $ref: 'definitions#/definitions/query' + } + } + }, { + expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null), + query: (typeof req.query.query === 'string' ? req.query.query : null) + }) + .then((data) => { + return internalRedirectionHost.getAll(res.locals.access, data.expand, data.query); + }) + .then((rows) => { + res.status(200) + .send(rows); + }) + .catch(next); + }) + + /** + * POST /api/nginx/redirection-hosts + * + * Create a new redirection-host + */ + .post((req, res, next) => { + apiValidator({$ref: 'endpoints/redirection-hosts#/links/1/schema'}, req.body) + .then((payload) => { + return internalRedirectionHost.create(res.locals.access, payload); + }) + .then((result) => { + res.status(201) + .send(result); + }) + .catch(next); + }); + +/** + * Specific redirection-host + * + * /api/nginx/redirection-hosts/123 + */ +router + .route('/:host_id') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * GET /api/nginx/redirection-hosts/123 + * + * Retrieve a specific redirection-host + */ + .get((req, res, next) => { + validator({ + required: ['host_id'], + additionalProperties: false, + properties: { + host_id: { + $ref: 'definitions#/definitions/id' + }, + expand: { + $ref: 'definitions#/definitions/expand' + } + } + }, { + host_id: req.params.host_id, + expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null) + }) + .then((data) => { + return internalRedirectionHost.get(res.locals.access, { + id: parseInt(data.host_id, 10), + expand: data.expand + }); + }) + .then((row) => { + res.status(200) + .send(row); + }) + .catch(next); + }) + + /** + * PUT /api/nginx/redirection-hosts/123 + * + * Update and existing redirection-host + */ + .put((req, res, next) => { + apiValidator({$ref: 'endpoints/redirection-hosts#/links/2/schema'}, req.body) + .then((payload) => { + payload.id = parseInt(req.params.host_id, 10); + return internalRedirectionHost.update(res.locals.access, payload); + }) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }) + + /** + * DELETE /api/nginx/redirection-hosts/123 + * + * Update and existing redirection-host + */ + .delete((req, res, next) => { + internalRedirectionHost.delete(res.locals.access, {id: parseInt(req.params.host_id, 10)}) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }); + +/** + * Enable redirection-host + * + * /api/nginx/redirection-hosts/123/enable + */ +router + .route('/:host_id/enable') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * POST /api/nginx/redirection-hosts/123/enable + */ + .post((req, res, next) => { + internalRedirectionHost.enable(res.locals.access, {id: parseInt(req.params.host_id, 10)}) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }); + +/** + * Disable redirection-host + * + * /api/nginx/redirection-hosts/123/disable + */ +router + .route('/:host_id/disable') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * POST /api/nginx/redirection-hosts/123/disable + */ + .post((req, res, next) => { + internalRedirectionHost.disable(res.locals.access, {id: parseInt(req.params.host_id, 10)}) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }); + +module.exports = router; diff --git a/backend/routes/api/nginx/streams.js b/backend/routes/api/nginx/streams.js new file mode 100644 index 000000000..5e3fc28fe --- /dev/null +++ b/backend/routes/api/nginx/streams.js @@ -0,0 +1,196 @@ +const express = require('express'); +const validator = require('../../../lib/validator'); +const jwtdecode = require('../../../lib/express/jwt-decode'); +const internalStream = require('../../../internal/stream'); +const apiValidator = require('../../../lib/validator/api'); + +let router = express.Router({ + caseSensitive: true, + strict: true, + mergeParams: true +}); + +/** + * /api/nginx/streams + */ +router + .route('/') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes + + /** + * GET /api/nginx/streams + * + * Retrieve all streams + */ + .get((req, res, next) => { + validator({ + additionalProperties: false, + properties: { + expand: { + $ref: 'definitions#/definitions/expand' + }, + query: { + $ref: 'definitions#/definitions/query' + } + } + }, { + expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null), + query: (typeof req.query.query === 'string' ? req.query.query : null) + }) + .then((data) => { + return internalStream.getAll(res.locals.access, data.expand, data.query); + }) + .then((rows) => { + res.status(200) + .send(rows); + }) + .catch(next); + }) + + /** + * POST /api/nginx/streams + * + * Create a new stream + */ + .post((req, res, next) => { + apiValidator({$ref: 'endpoints/streams#/links/1/schema'}, req.body) + .then((payload) => { + return internalStream.create(res.locals.access, payload); + }) + .then((result) => { + res.status(201) + .send(result); + }) + .catch(next); + }); + +/** + * Specific stream + * + * /api/nginx/streams/123 + */ +router + .route('/:stream_id') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes + + /** + * GET /api/nginx/streams/123 + * + * Retrieve a specific stream + */ + .get((req, res, next) => { + validator({ + required: ['stream_id'], + additionalProperties: false, + properties: { + stream_id: { + $ref: 'definitions#/definitions/id' + }, + expand: { + $ref: 'definitions#/definitions/expand' + } + } + }, { + stream_id: req.params.stream_id, + expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null) + }) + .then((data) => { + return internalStream.get(res.locals.access, { + id: parseInt(data.stream_id, 10), + expand: data.expand + }); + }) + .then((row) => { + res.status(200) + .send(row); + }) + .catch(next); + }) + + /** + * PUT /api/nginx/streams/123 + * + * Update and existing stream + */ + .put((req, res, next) => { + apiValidator({$ref: 'endpoints/streams#/links/2/schema'}, req.body) + .then((payload) => { + payload.id = parseInt(req.params.stream_id, 10); + return internalStream.update(res.locals.access, payload); + }) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }) + + /** + * DELETE /api/nginx/streams/123 + * + * Update and existing stream + */ + .delete((req, res, next) => { + internalStream.delete(res.locals.access, {id: parseInt(req.params.stream_id, 10)}) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }); + +/** + * Enable stream + * + * /api/nginx/streams/123/enable + */ +router + .route('/:host_id/enable') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * POST /api/nginx/streams/123/enable + */ + .post((req, res, next) => { + internalStream.enable(res.locals.access, {id: parseInt(req.params.host_id, 10)}) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }); + +/** + * Disable stream + * + * /api/nginx/streams/123/disable + */ +router + .route('/:host_id/disable') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * POST /api/nginx/streams/123/disable + */ + .post((req, res, next) => { + internalStream.disable(res.locals.access, {id: parseInt(req.params.host_id, 10)}) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }); + +module.exports = router; diff --git a/backend/routes/api/reports.js b/backend/routes/api/reports.js new file mode 100644 index 000000000..9e2c98c89 --- /dev/null +++ b/backend/routes/api/reports.js @@ -0,0 +1,29 @@ +const express = require('express'); +const jwtdecode = require('../../lib/express/jwt-decode'); +const internalReport = require('../../internal/report'); + +let router = express.Router({ + caseSensitive: true, + strict: true, + mergeParams: true +}); + +router + .route('/hosts') + .options((req, res) => { + res.sendStatus(204); + }) + + /** + * GET /reports/hosts + */ + .get(jwtdecode(), (req, res, next) => { + internalReport.getHostsReport(res.locals.access) + .then((data) => { + res.status(200) + .send(data); + }) + .catch(next); + }); + +module.exports = router; diff --git a/backend/routes/api/schema.js b/backend/routes/api/schema.js new file mode 100644 index 000000000..fc6bd5bdf --- /dev/null +++ b/backend/routes/api/schema.js @@ -0,0 +1,36 @@ +const express = require('express'); +const swaggerJSON = require('../../doc/api.swagger.json'); +const PACKAGE = require('../../package.json'); + +let router = express.Router({ + caseSensitive: true, + strict: true, + mergeParams: true +}); + +router + .route('/') + .options((req, res) => { + res.sendStatus(204); + }) + + /** + * GET /schema + */ + .get((req, res/*, next*/) => { + let proto = req.protocol; + if (typeof req.headers['x-forwarded-proto'] !== 'undefined' && req.headers['x-forwarded-proto']) { + proto = req.headers['x-forwarded-proto']; + } + + let origin = proto + '://' + req.hostname; + if (typeof req.headers.origin !== 'undefined' && req.headers.origin) { + origin = req.headers.origin; + } + + swaggerJSON.info.version = PACKAGE.version; + swaggerJSON.servers[0].url = origin + '/api'; + res.status(200).send(swaggerJSON); + }); + +module.exports = router; diff --git a/backend/routes/api/settings.js b/backend/routes/api/settings.js new file mode 100644 index 000000000..d08b2bf5c --- /dev/null +++ b/backend/routes/api/settings.js @@ -0,0 +1,96 @@ +const express = require('express'); +const validator = require('../../lib/validator'); +const jwtdecode = require('../../lib/express/jwt-decode'); +const internalSetting = require('../../internal/setting'); +const apiValidator = require('../../lib/validator/api'); + +let router = express.Router({ + caseSensitive: true, + strict: true, + mergeParams: true +}); + +/** + * /api/settings + */ +router + .route('/') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * GET /api/settings + * + * Retrieve all settings + */ + .get((req, res, next) => { + internalSetting.getAll(res.locals.access) + .then((rows) => { + res.status(200) + .send(rows); + }) + .catch(next); + }); + +/** + * Specific setting + * + * /api/settings/something + */ +router + .route('/:setting_id') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * GET /settings/something + * + * Retrieve a specific setting + */ + .get((req, res, next) => { + validator({ + required: ['setting_id'], + additionalProperties: false, + properties: { + setting_id: { + $ref: 'definitions#/definitions/setting_id' + } + } + }, { + setting_id: req.params.setting_id + }) + .then((data) => { + return internalSetting.get(res.locals.access, { + id: data.setting_id + }); + }) + .then((row) => { + res.status(200) + .send(row); + }) + .catch(next); + }) + + /** + * PUT /api/settings/something + * + * Update and existing setting + */ + .put((req, res, next) => { + apiValidator({$ref: 'endpoints/settings#/links/1/schema'}, req.body) + .then((payload) => { + payload.id = req.params.setting_id; + return internalSetting.update(res.locals.access, payload); + }) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }); + +module.exports = router; diff --git a/backend/routes/api/tokens.js b/backend/routes/api/tokens.js new file mode 100644 index 000000000..a21f998ae --- /dev/null +++ b/backend/routes/api/tokens.js @@ -0,0 +1,54 @@ +const express = require('express'); +const jwtdecode = require('../../lib/express/jwt-decode'); +const internalToken = require('../../internal/token'); +const apiValidator = require('../../lib/validator/api'); + +let router = express.Router({ + caseSensitive: true, + strict: true, + mergeParams: true +}); + +router + .route('/') + .options((req, res) => { + res.sendStatus(204); + }) + + /** + * GET /tokens + * + * Get a new Token, given they already have a token they want to refresh + * We also piggy back on to this method, allowing admins to get tokens + * for services like Job board and Worker. + */ + .get(jwtdecode(), (req, res, next) => { + internalToken.getFreshToken(res.locals.access, { + expiry: (typeof req.query.expiry !== 'undefined' ? req.query.expiry : null), + scope: (typeof req.query.scope !== 'undefined' ? req.query.scope : null) + }) + .then((data) => { + res.status(200) + .send(data); + }) + .catch(next); + }) + + /** + * POST /tokens + * + * Create a new Token + */ + .post((req, res, next) => { + apiValidator({$ref: 'endpoints/tokens#/links/0/schema'}, req.body) + .then((payload) => { + return internalToken.getTokenFromEmail(payload); + }) + .then((data) => { + res.status(200) + .send(data); + }) + .catch(next); + }); + +module.exports = router; diff --git a/backend/routes/api/users.js b/backend/routes/api/users.js new file mode 100644 index 000000000..1c6bd0ad2 --- /dev/null +++ b/backend/routes/api/users.js @@ -0,0 +1,239 @@ +const express = require('express'); +const validator = require('../../lib/validator'); +const jwtdecode = require('../../lib/express/jwt-decode'); +const userIdFromMe = require('../../lib/express/user-id-from-me'); +const internalUser = require('../../internal/user'); +const apiValidator = require('../../lib/validator/api'); + +let router = express.Router({ + caseSensitive: true, + strict: true, + mergeParams: true +}); + +/** + * /api/users + */ +router + .route('/') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * GET /api/users + * + * Retrieve all users + */ + .get((req, res, next) => { + validator({ + additionalProperties: false, + properties: { + expand: { + $ref: 'definitions#/definitions/expand' + }, + query: { + $ref: 'definitions#/definitions/query' + } + } + }, { + expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null), + query: (typeof req.query.query === 'string' ? req.query.query : null) + }) + .then((data) => { + return internalUser.getAll(res.locals.access, data.expand, data.query); + }) + .then((users) => { + res.status(200) + .send(users); + }) + .catch(next); + }) + + /** + * POST /api/users + * + * Create a new User + */ + .post((req, res, next) => { + apiValidator({$ref: 'endpoints/users#/links/1/schema'}, req.body) + .then((payload) => { + return internalUser.create(res.locals.access, payload); + }) + .then((result) => { + res.status(201) + .send(result); + }) + .catch(next); + }); + +/** + * Specific user + * + * /api/users/123 + */ +router + .route('/:user_id') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + .all(userIdFromMe) + + /** + * GET /users/123 or /users/me + * + * Retrieve a specific user + */ + .get((req, res, next) => { + validator({ + required: ['user_id'], + additionalProperties: false, + properties: { + user_id: { + $ref: 'definitions#/definitions/id' + }, + expand: { + $ref: 'definitions#/definitions/expand' + } + } + }, { + user_id: req.params.user_id, + expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null) + }) + .then((data) => { + return internalUser.get(res.locals.access, { + id: data.user_id, + expand: data.expand, + omit: internalUser.getUserOmisionsByAccess(res.locals.access, data.user_id) + }); + }) + .then((user) => { + res.status(200) + .send(user); + }) + .catch(next); + }) + + /** + * PUT /api/users/123 + * + * Update and existing user + */ + .put((req, res, next) => { + apiValidator({$ref: 'endpoints/users#/links/2/schema'}, req.body) + .then((payload) => { + payload.id = req.params.user_id; + return internalUser.update(res.locals.access, payload); + }) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }) + + /** + * DELETE /api/users/123 + * + * Update and existing user + */ + .delete((req, res, next) => { + internalUser.delete(res.locals.access, {id: req.params.user_id}) + .then((result) => { + res.status(200) + .send(result); + }) + .catch(next); + }); + +/** + * Specific user auth + * + * /api/users/123/auth + */ +router + .route('/:user_id/auth') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + .all(userIdFromMe) + + /** + * PUT /api/users/123/auth + * + * Update password for a user + */ + .put((req, res, next) => { + apiValidator({$ref: 'endpoints/users#/links/4/schema'}, req.body) + .then((payload) => { + payload.id = req.params.user_id; + return internalUser.setPassword(res.locals.access, payload); + }) + .then((result) => { + res.status(201) + .send(result); + }) + .catch(next); + }); + +/** + * Specific user permissions + * + * /api/users/123/permissions + */ +router + .route('/:user_id/permissions') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + .all(userIdFromMe) + + /** + * PUT /api/users/123/permissions + * + * Set some or all permissions for a user + */ + .put((req, res, next) => { + apiValidator({$ref: 'endpoints/users#/links/5/schema'}, req.body) + .then((payload) => { + payload.id = req.params.user_id; + return internalUser.setPermissions(res.locals.access, payload); + }) + .then((result) => { + res.status(201) + .send(result); + }) + .catch(next); + }); + +/** + * Specific user login as + * + * /api/users/123/login + */ +router + .route('/:user_id/login') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * POST /api/users/123/login + * + * Log in as a user + */ + .post((req, res, next) => { + internalUser.loginAs(res.locals.access, {id: parseInt(req.params.user_id, 10)}) + .then((result) => { + res.status(201) + .send(result); + }) + .catch(next); + }); + +module.exports = router; diff --git a/src/backend/schema/definitions.json b/backend/schema/definitions.json similarity index 100% rename from src/backend/schema/definitions.json rename to backend/schema/definitions.json diff --git a/src/backend/schema/endpoints/access-lists.json b/backend/schema/endpoints/access-lists.json similarity index 100% rename from src/backend/schema/endpoints/access-lists.json rename to backend/schema/endpoints/access-lists.json diff --git a/src/backend/schema/endpoints/certificates.json b/backend/schema/endpoints/certificates.json similarity index 100% rename from src/backend/schema/endpoints/certificates.json rename to backend/schema/endpoints/certificates.json diff --git a/src/backend/schema/endpoints/dead-hosts.json b/backend/schema/endpoints/dead-hosts.json similarity index 100% rename from src/backend/schema/endpoints/dead-hosts.json rename to backend/schema/endpoints/dead-hosts.json diff --git a/src/backend/schema/endpoints/proxy-hosts.json b/backend/schema/endpoints/proxy-hosts.json similarity index 100% rename from src/backend/schema/endpoints/proxy-hosts.json rename to backend/schema/endpoints/proxy-hosts.json diff --git a/src/backend/schema/endpoints/redirection-hosts.json b/backend/schema/endpoints/redirection-hosts.json similarity index 100% rename from src/backend/schema/endpoints/redirection-hosts.json rename to backend/schema/endpoints/redirection-hosts.json diff --git a/src/backend/schema/endpoints/settings.json b/backend/schema/endpoints/settings.json similarity index 100% rename from src/backend/schema/endpoints/settings.json rename to backend/schema/endpoints/settings.json diff --git a/src/backend/schema/endpoints/streams.json b/backend/schema/endpoints/streams.json similarity index 100% rename from src/backend/schema/endpoints/streams.json rename to backend/schema/endpoints/streams.json diff --git a/src/backend/schema/endpoints/tokens.json b/backend/schema/endpoints/tokens.json similarity index 100% rename from src/backend/schema/endpoints/tokens.json rename to backend/schema/endpoints/tokens.json diff --git a/src/backend/schema/endpoints/users.json b/backend/schema/endpoints/users.json similarity index 100% rename from src/backend/schema/endpoints/users.json rename to backend/schema/endpoints/users.json diff --git a/src/backend/schema/examples.json b/backend/schema/examples.json similarity index 100% rename from src/backend/schema/examples.json rename to backend/schema/examples.json diff --git a/src/backend/schema/index.json b/backend/schema/index.json similarity index 100% rename from src/backend/schema/index.json rename to backend/schema/index.json diff --git a/backend/setup.js b/backend/setup.js new file mode 100644 index 000000000..a3a6b1757 --- /dev/null +++ b/backend/setup.js @@ -0,0 +1,115 @@ +const fs = require('fs'); +const NodeRSA = require('node-rsa'); +const config = require('config'); +const logger = require('./logger').setup; +const userModel = require('./models/user'); +const userPermissionModel = require('./models/user_permission'); +const authModel = require('./models/auth'); +const debug_mode = process.env.NODE_ENV !== 'production' || !!process.env.DEBUG; + +module.exports = function () { + return new Promise((resolve, reject) => { + // Now go and check if the jwt gpg keys have been created and if not, create them + if (!config.has('jwt') || !config.has('jwt.key') || !config.has('jwt.pub')) { + logger.info('Creating a new JWT key pair...'); + + // jwt keys are not configured properly + const filename = config.util.getEnv('NODE_CONFIG_DIR') + '/' + (config.util.getEnv('NODE_ENV') || 'default') + '.json'; + let config_data = {}; + + try { + config_data = require(filename); + } catch (err) { + // do nothing + if (debug_mode) { + logger.debug(filename + ' config file could not be required'); + } + } + + // Now create the keys and save them in the config. + let key = new NodeRSA({b: 2048}); + key.generateKeyPair(); + + config_data.jwt = { + key: key.exportKey('private').toString(), + pub: key.exportKey('public').toString() + }; + + // Write config + fs.writeFile(filename, JSON.stringify(config_data, null, 2), (err) => { + if (err) { + logger.error('Could not write JWT key pair to config file: ' + filename); + reject(err); + } else { + logger.info('Wrote JWT key pair to config file: ' + filename); + + logger.warn('Restarting interface to apply new configuration'); + process.exit(0); + } + }); + + } else { + // JWT key pair exists + if (debug_mode) { + logger.debug('JWT Keypair already exists'); + } + + resolve(); + } + }) + .then(() => { + return userModel + .query() + .select(userModel.raw('COUNT(`id`) as `count`')) + .where('is_deleted', 0) + .first(); + }) + .then((row) => { + if (!row.count) { + // Create a new user and set password + logger.info('Creating a new user: admin@example.com with password: changeme'); + + let data = { + is_deleted: 0, + email: 'admin@example.com', + name: 'Administrator', + nickname: 'Admin', + avatar: '', + roles: ['admin'] + }; + + return userModel + .query() + .insertAndFetch(data) + .then((user) => { + return authModel + .query() + .insert({ + user_id: user.id, + type: 'password', + secret: 'changeme', + meta: {} + }) + .then(() => { + return userPermissionModel + .query() + .insert({ + user_id: user.id, + visibility: 'all', + proxy_hosts: 'manage', + redirection_hosts: 'manage', + dead_hosts: 'manage', + streams: 'manage', + access_lists: 'manage', + certificates: 'manage' + }); + }); + }) + .then(() => { + logger.info('Initial setup completed'); + }); + } else if (debug_mode) { + logger.debug('Admin user setup not required'); + } + }); +}; diff --git a/src/backend/templates/_assets.conf b/backend/templates/_assets.conf similarity index 100% rename from src/backend/templates/_assets.conf rename to backend/templates/_assets.conf diff --git a/src/backend/templates/_certificates.conf b/backend/templates/_certificates.conf similarity index 100% rename from src/backend/templates/_certificates.conf rename to backend/templates/_certificates.conf diff --git a/src/backend/templates/_exploits.conf b/backend/templates/_exploits.conf similarity index 100% rename from src/backend/templates/_exploits.conf rename to backend/templates/_exploits.conf diff --git a/src/backend/templates/_forced_ssl.conf b/backend/templates/_forced_ssl.conf similarity index 100% rename from src/backend/templates/_forced_ssl.conf rename to backend/templates/_forced_ssl.conf diff --git a/src/backend/templates/_header_comment.conf b/backend/templates/_header_comment.conf similarity index 100% rename from src/backend/templates/_header_comment.conf rename to backend/templates/_header_comment.conf diff --git a/src/backend/templates/_hsts.conf b/backend/templates/_hsts.conf similarity index 100% rename from src/backend/templates/_hsts.conf rename to backend/templates/_hsts.conf diff --git a/src/backend/templates/_listen.conf b/backend/templates/_listen.conf similarity index 100% rename from src/backend/templates/_listen.conf rename to backend/templates/_listen.conf diff --git a/src/backend/templates/_location.conf b/backend/templates/_location.conf similarity index 100% rename from src/backend/templates/_location.conf rename to backend/templates/_location.conf diff --git a/src/backend/templates/dead_host.conf b/backend/templates/dead_host.conf similarity index 100% rename from src/backend/templates/dead_host.conf rename to backend/templates/dead_host.conf diff --git a/src/backend/templates/default.conf b/backend/templates/default.conf similarity index 100% rename from src/backend/templates/default.conf rename to backend/templates/default.conf diff --git a/src/backend/templates/ip_ranges.conf b/backend/templates/ip_ranges.conf similarity index 100% rename from src/backend/templates/ip_ranges.conf rename to backend/templates/ip_ranges.conf diff --git a/src/backend/templates/letsencrypt-request.conf b/backend/templates/letsencrypt-request.conf similarity index 100% rename from src/backend/templates/letsencrypt-request.conf rename to backend/templates/letsencrypt-request.conf diff --git a/src/backend/templates/proxy_host.conf b/backend/templates/proxy_host.conf similarity index 100% rename from src/backend/templates/proxy_host.conf rename to backend/templates/proxy_host.conf diff --git a/src/backend/templates/redirection_host.conf b/backend/templates/redirection_host.conf similarity index 100% rename from src/backend/templates/redirection_host.conf rename to backend/templates/redirection_host.conf diff --git a/src/backend/templates/stream.conf b/backend/templates/stream.conf similarity index 100% rename from src/backend/templates/stream.conf rename to backend/templates/stream.conf diff --git a/backend/yarn.lock b/backend/yarn.lock new file mode 100644 index 000000000..d37dfa98e --- /dev/null +++ b/backend/yarn.lock @@ -0,0 +1,3655 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + +"@babel/highlight@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" + integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-jsx@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" + integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== + +acorn@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.1: + version "6.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9" + integrity sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + +ansi-escapes@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" + integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + dependencies: + type-fest "^0.8.1" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" + integrity sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg= + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-slice@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" + integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asn1@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batchflow@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/batchflow/-/batchflow-0.4.0.tgz#7d419df79b6b7587b06f9ea34f96ccef6f74e5b5" + integrity sha1-fUGd95trdYewb56jT5bM72905bU= + +bcrypt@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-3.0.7.tgz#1187d29df2e1cde44268152b13e3d4a655a7c7de" + integrity sha512-K5UglF9VQvBMHl/1elNyyFvAfOY9Bj+rpKrCSR9sFwcW8FywAYJSRwTURNej5TaAK2TEJkcJ6r6lh1YPmspx5Q== + dependencies: + nan "2.14.0" + node-pre-gyp "0.13.0" + +bignumber.js@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" + integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== + +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + +bluebird@^3.5.1, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +blueimp-md5@^2.3.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.12.0.tgz#be7367938a889dec3ffbb71138617c117e9c130a" + integrity sha512-zo+HIdIhzojv6F1siQPqPFROyVy7C50KzHv/k/Iz+BtvtVzSHXiMXOpq2wCfNkeBqdCv+V8XOV96tsEt2W/3rQ== + +body-parser@1.19.0, body-parser@^1.18.3: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + 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" + +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + +busboy@^0.2.14: + version "0.2.14" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" + integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM= + dependencies: + dicer "0.2.5" + readable-stream "1.1.x" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + +chalk@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" + integrity sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + integrity sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8= + dependencies: + ansi-styles "~1.0.0" + has-color "~0.1.0" + strip-ansi "~0.1.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +charenc@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= + +chokidar@^3.2.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" + integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.3.0" + optionalDependencies: + fsevents "~2.1.2" + +chownr@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +commander@^2.16.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.2: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +config@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/config/-/config-2.0.2.tgz#b81c8f4e05203e1da7752864c19a11604ca923d7" + integrity sha512-duIbkKb0gls0bOtGwd1vaD4236MwepQlZcrMheOGrn3/9Px7oYFh8G4LB3ylGOlPr5wGoJRm8Grb2RihJZxuHQ== + dependencies: + json5 "^1.0.1" + +configstore@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js@^2.4.0: + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypt@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^3.1.0, debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +dicer@0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" + integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8= + dependencies: + readable-stream "1.1.x" + streamsearch "0.1.2" + +diskdb@^0.1.17: + version "0.1.17" + resolved "https://registry.yarnpkg.com/diskdb/-/diskdb-0.1.17.tgz#8abd095196b33b406791f1494b6b13b4422240c4" + integrity sha1-ir0JUZazO0BnkfFJS2sTtEIiQMQ= + dependencies: + chalk "^0.4.0" + merge "^1.1.3" + node-uuid "^1.4.1" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +email-validator@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/email-validator/-/email-validator-2.0.4.tgz#b8dfaa5d0dae28f1b03c95881d904d4e40bfe7ed" + integrity sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-plugin-align-assignments@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-align-assignments/-/eslint-plugin-align-assignments-1.1.2.tgz#83e1a8a826d4adf29e82b52d0bb39c88b301b576" + integrity sha512-I1ZJgk9EjHfGVU9M2Ex8UkVkkjLL5Y9BS6VNnQHq79eHj2H4/Cgxf36lQSUTLgm2ntB03A2NtF+zg9fyi5vChg== + +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" + integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== + dependencies: + acorn "^7.1.0" + acorn-jsx "^5.1.0" + eslint-visitor-keys "^1.1.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.1.0.tgz#c5c0b66f383e7656404f86b31334d72524eddb48" + integrity sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + 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" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + 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" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +express-fileupload@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/express-fileupload/-/express-fileupload-0.4.0.tgz#de6d1dbe3122732c416f6965aa88bbf70721ad84" + integrity sha512-jPv3aCdTIdQrGAUXQ1e1hU0Vnl+0jE9IbzEsI7VRIevQybrUrIMUgvwNwBThnsetandW8+9ICgflAkhKwLUuLw== + dependencies: + busboy "^0.2.14" + fs-extra "^4.0.1" + md5 "^2.2.1" + streamifier "^0.1.1" + +express@^4.16.3: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + 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" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + 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" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +fined@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" + integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== + dependencies: + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" + +flagged-respawn@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" + integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= + dependencies: + for-in "^1.0.1" + +format-util@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" + integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-extra@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + 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-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-parent@^5.0.0, glob-parent@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + 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" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^12.1.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" + integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== + dependencies: + type-fest "^0.8.1" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +gravatar@^1.6.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/gravatar/-/gravatar-1.8.0.tgz#1dd9ce0f6bb625802377233b96796181b39af8ff" + integrity sha512-00KTHk0tIgOdTGShjE64JS66WHlOAnku7nRyER4OsU5ekFvWZICpV0JYgwyp9NdId2KbJWqK03rn87LXBd1U4g== + dependencies: + blueimp-md5 "^2.3.0" + email-validator "^2.0.3" + querystring "0.2.0" + yargs "^11.0.0" + +has-color@~0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + integrity sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +html-entities@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +iconv-lite@0.2.11: + version "0.2.11" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.2.11.tgz#1ce60a3a57864a292d1321ff4609ca4bb965adc8" + integrity sha1-HOYKOleGSiktEyH/RgnKS7llrcg= + +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= + +ignore-walk@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== + dependencies: + minimatch "^3.0.4" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +import-fresh@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inquirer@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" + integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== + dependencies: + 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.5.3" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +interpret@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ipaddr.js@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5, is-buffer@~1.1.1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + +is-retry-allowed@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.12.0, js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-ref-parser@^5.0.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-5.1.3.tgz#f86c5868f40898e69169e1bbc854725a4fd0e1ad" + integrity sha512-CpDFlBwz/6la78hZxyB9FECVKGYjIIl3Ms3KLqFj99W7IIb7D00/RDgc++IGB4BBALl0QRhh5m4q5WNSopvLtQ== + dependencies: + call-me-maybe "^1.0.1" + debug "^3.1.0" + js-yaml "^3.12.0" + ono "^4.0.6" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonwebtoken@^8.3.0: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + 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@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +knex@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/knex/-/knex-0.15.2.tgz#6059b87489605f4cc87599a6d2a9d265709e9340" + integrity sha1-YFm4dIlgX0zIdZmm0qnSZXCek0A= + dependencies: + babel-runtime "^6.26.0" + bluebird "^3.5.1" + chalk "2.3.2" + commander "^2.16.0" + debug "3.1.0" + inherits "~2.0.3" + interpret "^1.1.0" + liftoff "2.5.0" + lodash "^4.17.10" + minimist "1.2.0" + mkdirp "^0.5.1" + pg-connection-string "2.0.0" + tarn "^1.1.4" + tildify "1.2.0" + uuid "^3.3.2" + v8flags "^3.1.1" + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= + dependencies: + package-json "^4.0.0" + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +liftoff@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" + integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew= + dependencies: + extend "^3.0.0" + findup-sync "^2.0.0" + fined "^1.0.1" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +liquidjs@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/liquidjs/-/liquidjs-5.2.0.tgz#fe219154cfc66dc5da580bd6b2ecd592d1d8c6b2" + integrity sha512-bIDYRWlo8f09dNd8Hz3lHVPOpgw33jtDCebMEDj2D9g54/KhTao7/lVv+3hYtsWTW2PId4hH+1X0iuuYnQHnTg== + dependencies: + resolve-url "^0.2.1" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +make-iterator@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" + integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== + dependencies: + kind-of "^6.0.2" + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.0, map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge@^1.1.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.0.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-types@~2.1.24: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.0.0, mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@1.2.0, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +moment@^2.22.2: + version "2.24.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" + integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +mysql@^2.15.0: + version "2.18.1" + resolved "https://registry.yarnpkg.com/mysql/-/mysql-2.18.1.tgz#2254143855c5a8c73825e4522baf2ea021766717" + integrity sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig== + dependencies: + bignumber.js "9.0.0" + readable-stream "2.3.7" + safe-buffer "5.1.2" + sqlstring "2.3.1" + +nan@2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +needle@^2.2.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-pre-gyp@0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz#df9ab7b68dd6498137717838e4f92a33fc9daa42" + integrity sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ== + dependencies: + 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" + +node-rsa@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/node-rsa/-/node-rsa-1.0.7.tgz#85b7a6d6fa8ee624be6402a6b41be49272d58055" + integrity sha512-idwRXma6scFufZmbaKkHpJoLL93yynRefP6yur13wZ5i9FR35ex451KCoF2OORDeJanyRVahmjjiwmUlCnTqJA== + dependencies: + asn1 "^0.2.4" + +node-uuid@^1.4.1: + version "1.4.8" + resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" + integrity sha1-sEDrCSOWivq/jTL7HxfxFn/auQc= + +nodemon@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.2.tgz#9c7efeaaf9b8259295a97e5d4585ba8f0cbe50b0" + integrity sha512-GWhYPMfde2+M0FsHnggIHXTqPDHXia32HRhh6H0d75Mt9FKUoCBvumNHr7LdrpPBTKxsWmIEOjoN+P4IU6Hcaw== + dependencies: + chokidar "^3.2.2" + debug "^3.2.6" + ignore-by-default "^1.0.1" + minimatch "^3.0.4" + pstree.remy "^1.1.7" + semver "^5.7.1" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.2" + update-notifier "^2.5.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= + dependencies: + abbrev "1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-bundled@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" + integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-packlist@^1.1.6: + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + 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@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + +object.map@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" + integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + +object.pick@^1.2.0, object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +objection@^1.1.10: + version "1.6.11" + resolved "https://registry.yarnpkg.com/objection/-/objection-1.6.11.tgz#6755c15300277eee76c44faf4295704d8e2e02e2" + integrity sha512-/W6iR6+YvFg1U4k5DyX1MrY+xqodDM8AAOU1J0b3HlptsNw8V3uDHjZgTi1cFPPe5+ZeTTMvhIFhNiUP6+nqYQ== + dependencies: + ajv "^6.10.0" + bluebird "^3.5.5" + lodash "^4.17.11" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + +ono@^4.0.6: + version "4.0.11" + resolved "https://registry.yarnpkg.com/ono/-/ono-4.0.11.tgz#c7f4209b3e396e8a44ef43b9cedc7f5d791d221d" + integrity sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g== + dependencies: + format-util "^1.0.3" + +optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-filepath@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path@^0.12.7: + version "0.12.7" + resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" + integrity sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8= + dependencies: + process "^0.11.1" + util "^0.10.3" + +pg-connection-string@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.0.0.tgz#3eefe5997e06d94821e4d502e42b6a1c73f8df82" + integrity sha1-Pu/lmX4G2Ugh5NUC5CtqHHP434I= + +picomatch@^2.0.4, picomatch@^2.0.7: + version "2.2.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" + integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pkg-conf@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" + integrity sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg= + dependencies: + find-up "^2.0.0" + load-json-file "^4.0.0" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +prettier@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.1: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +proxy-addr@~2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" + integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.0" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +pstree.remy@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.7.tgz#c76963a28047ed61542dc361aa26ee55a7fa15f3" + integrity sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-1.2.0.tgz#ed079be28682147e6fd9a34cc2b0c1e0ec6453ee" + integrity sha1-7Qeb4oaCFH5v2aNMwrDB4OxkU+4= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@1.1.x: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@2.3.7, readable-stream@^2.0.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + 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" + +readdirp@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" + integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== + dependencies: + picomatch "^2.0.7" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +registry-auth-token@^3.0.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" + integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.1.6, resolve@^1.1.7: + version "1.15.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5" + integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw== + dependencies: + path-parse "^1.0.6" + +restler@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/restler/-/restler-3.4.0.tgz#741ec0b3d16b949feea2813d0c3c68529e888d9b" + integrity sha1-dB7As9FrlJ/uooE9DDxoUp6IjZs= + dependencies: + iconv-lite "0.2.11" + qs "1.2.0" + xml2js "0.4.0" + yaml "0.2.3" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^2.6.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +rxjs@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" + integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@0.5.x: + version "0.5.8" + resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" + integrity sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE= + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + dependencies: + semver "^5.0.3" + +semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.1.2: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + 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" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +signale@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/signale/-/signale-1.4.0.tgz#c4be58302fb0262ac00fc3d886a7c113759042f1" + integrity sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w== + dependencies: + chalk "^2.3.2" + figures "^2.0.0" + pkg-conf "^2.1.0" + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sqlstring@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40" + integrity sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A= + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +streamifier@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/streamifier/-/streamifier-0.1.1.tgz#97e98d8fa4d105d62a2691d1dc07e820db8dfc4f" + integrity sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8= + +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-ansi@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" + integrity sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE= + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tar@^4: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + 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" + +tarn@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/tarn/-/tarn-1.1.5.tgz#7be88622e951738b9fa3fb77477309242cdddc2d" + integrity sha512-PMtJ3HCLAZeedWjJPgGnCvcphbCOMbtZpjKgLq3qM5Qq9aQud+XHrL0WlrlgnTyS8U+jrjGbEXprFcQrxPy52g== + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + +temp-write@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-3.4.0.tgz#8cff630fb7e9da05f047c74ce4ce4d685457d492" + integrity sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI= + dependencies: + graceful-fs "^4.1.2" + is-stream "^1.1.0" + make-dir "^1.0.0" + pify "^3.0.0" + temp-dir "^1.0.0" + uuid "^3.0.1" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tildify@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo= + dependencies: + os-homedir "^1.0.0" + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= + +undefsafe@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" + integrity sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY= + dependencies: + debug "^2.2.0" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unix-timestamp@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/unix-timestamp/-/unix-timestamp-0.2.0.tgz#e1cdc2808df6327d27e635d9351e72815288733e" + integrity sha1-4c3CgI32Mn0n5jXZNR5ygVKIcz4= + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + +update-notifier@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.0.1, uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + +v8flags@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8" + integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w== + dependencies: + homedir-polyfill "^1.0.1" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.14, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^2.0.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + +xml2js@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.0.tgz#124fc4114b4129c810800ecb2ac86cf25462cb9a" + integrity sha1-Ek/EEUtBKcgQgA7LKshs8lRiy5o= + dependencies: + sax "0.5.x" + xmlbuilder ">=0.4.2" + +xmlbuilder@>=0.4.2: + version "13.0.2" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-13.0.2.tgz#02ae33614b6a047d1c32b5389c1fdacb2bce47a7" + integrity sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ== + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.0, yallist@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yaml@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-0.2.3.tgz#b5450e92e76ef36b5dd24e3660091ebaeef3e5c7" + integrity sha1-tUUOkudu82td0k42YAkeuu7z5cc= + +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= + dependencies: + camelcase "^4.1.0" + +yargs@^11.0.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.1.tgz#5052efe3446a4df5ed669c995886cc0f13702766" + integrity sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw== + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^9.0.2" diff --git a/bin/build b/bin/build deleted file mode 100755 index 43d749a6a..000000000 --- a/bin/build +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -sudo /usr/local/bin/docker-compose run --no-deps --rm app npm run-script build -exit $? diff --git a/bin/build-dev b/bin/build-dev deleted file mode 100755 index 25203eb97..000000000 --- a/bin/build-dev +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -sudo /usr/local/bin/docker-compose run --no-deps --rm app npm run-script dev -exit $? diff --git a/bin/migrate_create b/bin/migrate_create deleted file mode 100755 index dc2b5edf6..000000000 --- a/bin/migrate_create +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -if [ "$1" == "" ]; then - echo "Error: migrate name must be specified as first arg" - exit 1 -else - # Code path - SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - if hash realpath 2>/dev/null; then - export CODEBASE=$(realpath $SCRIPT_DIR/..) - elif hash grealpath 2>/dev/null; then - export CODEBASE=$(grealpath $SCRIPT_DIR/..) - else - export CODEBASE=$(readlink -e $SCRIPT_DIR/..) - fi - - if [ -z "$CODEBASE" ]; then - echo "Unable to determine absolute codebase directory" - exit 1 - fi - - cd "$CODEBASE" - - sudo /usr/local/bin/docker-compose run --rm --no-deps app node node_modules/knex/bin/cli.js migrate:make "$1" - exit $? -fi diff --git a/bin/npm b/bin/npm deleted file mode 100755 index a0863df08..000000000 --- a/bin/npm +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -sudo /usr/local/bin/docker-compose run --no-deps --rm app npm $@ -exit $? diff --git a/bin/yarn b/bin/yarn deleted file mode 100755 index e4fd807d4..000000000 --- a/bin/yarn +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -sudo /usr/local/bin/docker-compose run --no-deps --rm app yarn $@ -exit $? diff --git a/config/my.cnf b/config/my.cnf deleted file mode 100644 index e3860d701..000000000 --- a/config/my.cnf +++ /dev/null @@ -1,7 +0,0 @@ -[mysqld] -skip-innodb -default-storage-engine=Aria -default-tmp-storage-engine=Aria -innodb=OFF -symbolic-links=0 -log-output=file diff --git a/doc/ADVANCED_NGINX.md b/doc/ADVANCED_NGINX.md index eabac84c4..37d941ea7 100644 --- a/doc/ADVANCED_NGINX.md +++ b/doc/ADVANCED_NGINX.md @@ -14,4 +14,4 @@ You can add your custom configuration snippet files at `/data/nginx/custom` as f `/data/nginx/custom/server_stream_tcp.conf`: Included at the end of every TCP stream server block `/data/nginx/custom/server_stream_udp.conf`: Included at the end of every UDP stream server block -Every file is optional. \ No newline at end of file +Every file is optional. diff --git a/doc/DOCKERHUB.md b/doc/DOCKERHUB.md deleted file mode 100644 index 1aa1b439e..000000000 --- a/doc/DOCKERHUB.md +++ /dev/null @@ -1,52 +0,0 @@ -![Nginx Proxy Manager](https://public.jc21.com/nginx-proxy-manager/github.png "Nginx Proxy Manager") - -# [Nginx Proxy Manager](https://nginxproxymanager.jc21.com) - -![Version](https://img.shields.io/badge/version-2.0.14-green.svg?style=for-the-badge) -![Stars](https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge) -![Pulls](https://img.shields.io/docker/pulls/jc21/nginx-proxy-manager.svg?style=for-the-badge) - -[View on Github](https://github.com/jc21/nginx-proxy-manager) - -This project comes as a pre-built docker image that enables you to easily forward to your websites -running at home or otherwise, including free SSL, without having to know too much about Nginx or Letsencrypt. - - -## Tags - -* latest 2, 2.x.x ([Dockerfile](https://github.com/jc21/nginx-proxy-manager/blob/master/Dockerfile)) -* latest-arm64, 2-arm64, 2.x.x-arm64 ([Dockerfile](https://github.com/jc21/nginx-proxy-manager/blob/master/Dockerfile.arm64)) -* latest-arm7l, 2-arm7l, 2.x.x-arm7l ([Dockerfile](https://github.com/jc21/nginx-proxy-manager/blob/master/Dockerfile.arm7l)) - - -## Getting started - -Please consult the [installation instructions](https://github.com/jc21/nginx-proxy-manager/blob/master/doc/INSTALL.md) for a complete guide or -if you just want to get up and running in the quickest time possible, grab all the files in the [doc/example/](https://github.com/jc21/nginx-proxy-manager/tree/master/doc/example) folder and run: - -```bash -docker-compose up -d -``` - - -## Screenshots - -[![Login](https://public.jc21.com/nginx-proxy-manager/v2/small/login.jpg "Login")](https://public.jc21.com/nginx-proxy-manager/v2/large/login.jpg) -[![Dashboard](https://public.jc21.com/nginx-proxy-manager/v2/small/dashboard.jpg "Dashboard")](https://public.jc21.com/nginx-proxy-manager/v2/large/dashboard.jpg) -[![Proxy Hosts](https://public.jc21.com/nginx-proxy-manager/v2/small/proxy-hosts.jpg "Proxy Hosts")](https://public.jc21.com/nginx-proxy-manager/v2/large/proxy-hosts.jpg) -[![Proxy Host Settings](https://public.jc21.com/nginx-proxy-manager/v2/small/proxy-hosts-new1.jpg "Proxy Host Settings")](https://public.jc21.com/nginx-proxy-manager/v2/large/proxy-hosts-new1.jpg) -[![Proxy Host SSL](https://public.jc21.com/nginx-proxy-manager/v2/small/proxy-hosts-new2.jpg "Proxy Host SSL")](https://public.jc21.com/nginx-proxy-manager/v2/large/proxy-hosts-new2.jpg) -[![Redirection Hosts](https://public.jc21.com/nginx-proxy-manager/v2/small/redirection-hosts.jpg "Redirection Hosts")](https://public.jc21.com/nginx-proxy-manager/v2/large/redirection-hosts.jpg) -[![Redirection Host Settings](https://public.jc21.com/nginx-proxy-manager/v2/small/redirection-hosts-new1.jpg "Redirection Host Settings")](https://public.jc21.com/nginx-proxy-manager/v2/large/redirection-hosts-new1.jpg) -[![Streams](https://public.jc21.com/nginx-proxy-manager/v2/small/streams.jpg "Streams")](https://public.jc21.com/nginx-proxy-manager/v2/large/streams.jpg) -[![Stream Settings](https://public.jc21.com/nginx-proxy-manager/v2/small/streams-new1.jpg "Stream Settings")](https://public.jc21.com/nginx-proxy-manager/v2/large/streams-new1.jpg) -[![404 Hosts](https://public.jc21.com/nginx-proxy-manager/v2/small/dead-hosts.jpg "404 Hosts")](https://public.jc21.com/nginx-proxy-manager/v2/large/dead-hosts.jpg) -[![404 Host Settings](https://public.jc21.com/nginx-proxy-manager/v2/small/dead-hosts-new1.jpg "404 Host Settings")](https://public.jc21.com/nginx-proxy-manager/v2/large/dead-hosts-new1.jpg) -[![Certificates](https://public.jc21.com/nginx-proxy-manager/v2/small/certificates.jpg "Certificates")](https://public.jc21.com/nginx-proxy-manager/v2/large/certificates.jpg) -[![Lets Encrypt Certificates](https://public.jc21.com/nginx-proxy-manager/v2/small/certificates-new1.jpg "Lets Encrypt Certificates")](https://public.jc21.com/nginx-proxy-manager/v2/large/certificates-new1.jpg) -[![Custom Certificates](https://public.jc21.com/nginx-proxy-manager/v2/small/certificates-new2.jpg "Custom Certificates")](https://public.jc21.com/nginx-proxy-manager/v2/large/certificates-new2.jpg) -[![Access Lists](https://public.jc21.com/nginx-proxy-manager/v2/small/access-lists.jpg "Access Lists")](https://public.jc21.com/nginx-proxy-manager/v2/large/access-lists.jpg) -[![Access List Users](https://public.jc21.com/nginx-proxy-manager/v2/small/access-lists-new1.jpg "Access List Users")](https://public.jc21.com/nginx-proxy-manager/v2/large/access-lists-new1.jpg) -[![Users](https://public.jc21.com/nginx-proxy-manager/v2/small/users.jpg "Users")](https://public.jc21.com/nginx-proxy-manager/v2/large/users.jpg) -[![User Permissions](https://public.jc21.com/nginx-proxy-manager/v2/small/users-permissions.jpg "User Permissions")](https://public.jc21.com/nginx-proxy-manager/v2/large/users-permissions.jpg) -[![Audit Log](https://public.jc21.com/nginx-proxy-manager/v2/small/audit-log.jpg "Audit Log")](https://public.jc21.com/nginx-proxy-manager/v2/large/audit-log.jpg) diff --git a/doc/IMPORTING.md b/doc/IMPORTING.md deleted file mode 100644 index bfda51649..000000000 --- a/doc/IMPORTING.md +++ /dev/null @@ -1,57 +0,0 @@ -## Importing from Version 1 - -Thanks for using Nginx Proxy Manager version 1. It sucked. - -But it worked. - -This guide will let your import your configuration from version 1 to version 2. - -**IMPORTANT: This will make changes to your `letsencrypt` folder and certificate files!** Make sure you back them up first. - - -### Link your previous folders in your new docker stack - -In version 1, the docker configuration asked for a `config` folder to be linked and a `letsencrypt` folder. However in version 2, the -configuration exists in the database, so the `config` folder is no longer required. However if you have this folder linked in a -version 2 stack, the application will automatically import that configuration the first time it finds it. - -Following the [example configuration](../example): - -```yaml -version: "3" -services: - app: - image: jc21/nginx-proxy-manager:2 - restart: always - ports: - - 80:80 - - 81:81 - - 443:443 - volumes: - - ./config.json:/app/config/production.json - - ./data:/data - - ./letsencrypt:/etc/letsencrypt # this is your previous letsencrypt folder - - ./config:/config # this is your previous config folder - depends_on: - - db - db: - image: mariadb - restart: always - environment: - MYSQL_ROOT_PASSWORD: "password123" - MYSQL_DATABASE: "nginxproxymanager" - MYSQL_USER: "nginxproxymanager" - MYSQL_PASSWORD: "password123" - volumes: - - ./data/mysql:/var/lib/mysql -``` - -After you start the stack, the import will begin just after database initialize. - -Some notes: -- After importing, a file is created in the `config` folder to signify that it has been imported and should not be imported again. -- Because no users previously existed in the version 1 config, the `admin@example.com` user will own all of the imported data. -- If you were crazy like me and used Nginx Proxy Manager version 1 to proxy the Admin interface behind a Access List, you should -really disable the access list for that proxy host in version 1 before importing in to version 2. The app doesn't like being behind basic -authentication and it's own internal authentication. If you forgot to do this before importing, just hit the admin interface directly -on port 81 to get around your basic authentication access list. diff --git a/doc/INSTALL.md b/doc/INSTALL.md index ad74c08d1..f86a17844 100644 --- a/doc/INSTALL.md +++ b/doc/INSTALL.md @@ -57,7 +57,7 @@ Via `docker-compose`: version: "3" services: app: - image: jc21/nginx-proxy-manager:latest + image: jc21/nginx-proxy-manager:2 restart: always ports: # Public HTTP Port: @@ -74,7 +74,7 @@ services: depends_on: - db db: - image: mariadb + image: mariadb:latest restart: always environment: MYSQL_ROOT_PASSWORD: "npm" @@ -94,9 +94,12 @@ docker-compose up -d ### Running on Raspberry PI / ARM devices -There are docker images for all versions of the Rasberry Pi with the exception of the really old `armv6l` versions. +The docker images support the following architectures: +- amd64 +- arm64 +- armv7 -The `latest` docker image is a manifest of all the different architecture docker builds supported, so this means +The docker images are a manifest of all the architecture docker builds supported, so this means you don't have to worry about doing anything special and you can follow the common instructions above. Check out the [dockerhub tags](https://cloud.docker.com/repository/registry-1.docker.io/jc21/nginx-proxy-manager/tags) diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index ab50c910a..000000000 --- a/docker-compose.yml +++ /dev/null @@ -1,33 +0,0 @@ -# WARNING: This is a DEVELOPMENT docker-compose file, it should not be used for production. -version: "2" -services: - app: - image: jc21/nginx-proxy-manager-base:latest - ports: - - 80:80 - - 81:81 - - 43:443 - environment: - - NODE_ENV=development - - FORCE_COLOR=1 - volumes: - - ./data:/data - - ./data/letsencrypt:/etc/letsencrypt - - .:/app - - ./rootfs/etc/nginx:/etc/nginx - working_dir: /app - depends_on: - - db - links: - - db - command: node --max_old_space_size=250 --abort_on_uncaught_exception node_modules/nodemon/bin/nodemon.js - db: - image: jc21/mariadb-aria - environment: - MYSQL_ROOT_PASSWORD: "npm" - MYSQL_DATABASE: "npm" - MYSQL_USER: "npm" - MYSQL_PASSWORD: "npm" - volumes: - - ./config/my.cnf:/etc/mysql/conf.d/npm.cnf - - ./data/mysql:/var/lib/mysql diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 000000000..d3cb40dc2 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,46 @@ +# This is a Dockerfile intended to be built using `docker buildx` +# for multi-arch support. Building with `docker build` may have unexpected results. + +# This file assumes that the frontend has been built using ./scripts/frontend-build + +FROM --platform=${TARGETPLATFORM:-linux/amd64} jc21/alpine-nginx-full:node + +ARG BUILD_VERSION +ARG BUILD_COMMIT +ARG BUILD_DATE + +ENV SUPPRESS_NO_CONFIG_WARNING=1 +ENV S6_FIX_ATTRS_HIDDEN=1 +ENV NODE_ENV=production + +RUN echo "fs.file-max = 65535" > /etc/sysctl.conf \ + && rm -rf /etc/nginx \ + && apk update \ + && apk add python2 certbot jq \ + && rm -rf /var/cache/apk/* + +ENV NPM_BUILD_VERSION="${BUILD_VERSION}" NPM_BUILD_COMMIT="${BUILD_COMMIT}" NPM_BUILD_DATE="${BUILD_DATE}" + +# s6 overlay +RUN curl -L -o /tmp/s6-overlay-amd64.tar.gz "https://github.com/just-containers/s6-overlay/releases/download/v1.22.1.0/s6-overlay-amd64.tar.gz" \ + && tar -xzf /tmp/s6-overlay-amd64.tar.gz -C / + +EXPOSE 80 +EXPOSE 81 +EXPOSE 443 +EXPOSE 9876 + +COPY docker/rootfs / +ADD backend /app +ADD frontend/dist /app/frontend + +WORKDIR /app +RUN yarn install + +# Remove frontend service not required for prod, dev nginx config as well +RUN rm -rf /etc/services.d/frontend RUN rm -f /etc/nginx/conf.d/dev.conf + +VOLUME [ "/data", "/etc/letsencrypt" ] +CMD [ "/init" ] + +HEALTHCHECK --interval=5s --timeout=3s CMD /bin/check-health \ No newline at end of file diff --git a/docker/dev/Dockerfile b/docker/dev/Dockerfile new file mode 100644 index 000000000..f0e2d2620 --- /dev/null +++ b/docker/dev/Dockerfile @@ -0,0 +1,32 @@ +FROM jc21/alpine-nginx-full:node +LABEL maintainer="Jamie Curnow " + +ENV S6_LOGGING=0 +ENV SUPPRESS_NO_CONFIG_WARNING=1 +ENV S6_FIX_ATTRS_HIDDEN=1 + +RUN echo "fs.file-max = 65535" > /etc/sysctl.conf \ + && rm -rf /etc/nginx \ + && apk update \ + && apk add python2 certbot jq \ + && rm -rf /var/cache/apk/* + +# Task +RUN cd /usr \ + && curl -sL https://taskfile.dev/install.sh | sh \ + && cd /root + +COPY rootfs / +RUN rm -f /etc/nginx/conf.d/production.conf + +# s6 overlay +RUN curl -L -o /tmp/s6-overlay-amd64.tar.gz "https://github.com/just-containers/s6-overlay/releases/download/v1.22.1.0/s6-overlay-amd64.tar.gz" \ + && tar -xzf /tmp/s6-overlay-amd64.tar.gz -C / + +EXPOSE 80 +EXPOSE 81 +EXPOSE 443 + +CMD [ "/init" ] + +HEALTHCHECK --interval=5s --timeout=3s CMD /bin/check-health diff --git a/docker/docker-compose.ci.yml b/docker/docker-compose.ci.yml new file mode 100644 index 000000000..dbc122c7f --- /dev/null +++ b/docker/docker-compose.ci.yml @@ -0,0 +1,44 @@ +# WARNING: This is a CI docker-compose file used for building and testing of the entire app, it should not be used for production. +version: "3" +services: + + fullstack: + image: ${IMAGE}:ci-${BUILD_NUMBER} + environment: + - NODE_ENV=development + - FORCE_COLOR=1 + volumes: + - npm_data:/data + - ../.jenkins/config.json:/app/config/production.json + expose: + - 81 + - 80 + - 443 + depends_on: + - db + + db: + image: jc21/mariadb-aria + environment: + MYSQL_ROOT_PASSWORD: "npm" + MYSQL_DATABASE: "npm" + MYSQL_USER: "npm" + MYSQL_PASSWORD: "npm" + volumes: + - db_data:/var/lib/mysql + + cypress: + image: ${IMAGE}-cypress:ci-${BUILD_NUMBER} + build: + context: ../ + dockerfile: test/cypress/Dockerfile + environment: + CYPRESS_baseUrl: "http://fullstack:81" + volumes: + - cypress-logs:/results + command: cypress run --browser chrome --config-file=${CYPRESS_CONFIG:-cypress/config/ci.json} + +volumes: + cypress-logs: + npm_data: + db_data: diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml new file mode 100644 index 000000000..4c0e55f03 --- /dev/null +++ b/docker/docker-compose.dev.yml @@ -0,0 +1,49 @@ +# WARNING: This is a DEVELOPMENT docker-compose file, it should not be used for production. +version: "3" +services: + + npm: + image: nginxproxymanager:dev + build: + context: ./ + dockerfile: ./dev/Dockerfile + ports: + - 3080:80 + - 3081:81 + - 3443:443 + environment: + - NODE_ENV=development + - FORCE_COLOR=1 + - DEVELOPMENT=true + volumes: + - npm_data:/data + - le_data:/etc/letsencrypt + - ..:/app + depends_on: + - db + working_dir: /app + + db: + image: jc21/mariadb-aria + environment: + MYSQL_ROOT_PASSWORD: "npm" + MYSQL_DATABASE: "npm" + MYSQL_USER: "npm" + MYSQL_PASSWORD: "npm" + volumes: + - db_data:/var/lib/mysql + + swagger: + image: 'swaggerapi/swagger-ui:latest' + ports: + - 3001:80 + environment: + URL: "http://127.0.0.1:3081/api/schema" + PORT: '80' + depends_on: + - npm + +volumes: + npm_data: + le_data: + db_data: diff --git a/docker/rootfs/bin/check-health b/docker/rootfs/bin/check-health new file mode 100755 index 000000000..bcf5552b3 --- /dev/null +++ b/docker/rootfs/bin/check-health @@ -0,0 +1,11 @@ +#!/bin/bash + +OK=$(curl --silent http://127.0.0.1:81/api/ | jq --raw-output '.status') + +if [ "$OK" == "OK" ]; then + echo "OK" + exit 0 +else + echo "NOT OK" + exit 1 +fi diff --git a/rootfs/etc/cont-finish.d/.gitignore b/docker/rootfs/etc/cont-finish.d/.gitignore similarity index 100% rename from rootfs/etc/cont-finish.d/.gitignore rename to docker/rootfs/etc/cont-finish.d/.gitignore diff --git a/rootfs/etc/cont-init.d/.gitignore b/docker/rootfs/etc/cont-init.d/.gitignore similarity index 100% rename from rootfs/etc/cont-init.d/.gitignore rename to docker/rootfs/etc/cont-init.d/.gitignore diff --git a/rootfs/etc/fix-attrs.d/.gitignore b/docker/rootfs/etc/fix-attrs.d/.gitignore similarity index 100% rename from rootfs/etc/fix-attrs.d/.gitignore rename to docker/rootfs/etc/fix-attrs.d/.gitignore diff --git a/rootfs/root/.config/letsencrypt/cli.ini b/docker/rootfs/etc/letsencrypt.ini similarity index 100% rename from rootfs/root/.config/letsencrypt/cli.ini rename to docker/rootfs/etc/letsencrypt.ini diff --git a/docker/rootfs/etc/nginx/conf.d/default.conf b/docker/rootfs/etc/nginx/conf.d/default.conf new file mode 100644 index 000000000..d1684ea79 --- /dev/null +++ b/docker/rootfs/etc/nginx/conf.d/default.conf @@ -0,0 +1,39 @@ +# "You are not configured" page, which is the default if another default doesn't exist +server { + listen 80; + listen [::]:80; + + set $forward_scheme "http"; + set $server "127.0.0.1"; + set $port "80"; + + server_name localhost-nginx-proxy-manager; + access_log /data/logs/default.log standard; + error_log /dev/null crit; + include conf.d/include/assets.conf; + include conf.d/include/block-exploits.conf; + + location / { + index index.html; + root /var/www/html; + } +} + +# First 443 Host, which is the default if another default doesn't exist +server { + listen 443 ssl; + listen [::]:443 ssl; + + set $forward_scheme "https"; + set $server "127.0.0.1"; + set $port "443"; + + server_name localhost; + access_log /data/logs/default.log standard; + error_log /dev/null crit; + ssl_certificate /data/nginx/dummycert.pem; + ssl_certificate_key /data/nginx/dummykey.pem; + include conf.d/include/ssl-ciphers.conf; + + return 444; +} diff --git a/docker/rootfs/etc/nginx/conf.d/dev.conf b/docker/rootfs/etc/nginx/conf.d/dev.conf new file mode 100644 index 000000000..b70db17c4 --- /dev/null +++ b/docker/rootfs/etc/nginx/conf.d/dev.conf @@ -0,0 +1,26 @@ +server { + listen 81 default; + listen [::]:81 default; + + server_name nginxproxymanager-dev; + root /app/frontend/dist; + access_log /dev/null; + + location /api { + return 302 /api/; + } + + location /api/ { + add_header X-Served-By $host; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Scheme $scheme; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_pass http://127.0.0.1:3000/; + } + + location / { + index index.html; + try_files $uri $uri.html $uri/ /index.html; + } +} diff --git a/docker/rootfs/etc/nginx/conf.d/include/.gitignore b/docker/rootfs/etc/nginx/conf.d/include/.gitignore new file mode 100644 index 000000000..5291fe15e --- /dev/null +++ b/docker/rootfs/etc/nginx/conf.d/include/.gitignore @@ -0,0 +1 @@ +resolvers.conf diff --git a/docker/rootfs/etc/nginx/conf.d/include/assets.conf b/docker/rootfs/etc/nginx/conf.d/include/assets.conf new file mode 100644 index 000000000..e95c2e8b7 --- /dev/null +++ b/docker/rootfs/etc/nginx/conf.d/include/assets.conf @@ -0,0 +1,31 @@ +location ~* ^.*\.(css|js|jpe?g|gif|png|woff|eot|ttf|svg|ico|css\.map|js\.map)$ { + if_modified_since off; + + # use the public cache + proxy_cache public-cache; + proxy_cache_key $host$request_uri; + + # ignore these headers for media + proxy_ignore_headers Set-Cookie Cache-Control Expires X-Accel-Expires; + + # cache 200s and also 404s (not ideal but there are a few 404 images for some reason) + proxy_cache_valid any 30m; + proxy_cache_valid 404 1m; + + # strip this header to avoid If-Modified-Since requests + proxy_hide_header Last-Modified; + proxy_hide_header Cache-Control; + proxy_hide_header Vary; + + proxy_cache_bypass 0; + proxy_no_cache 0; + + proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504 http_404; + proxy_connect_timeout 5s; + proxy_read_timeout 45s; + + expires @30m; + access_log off; + + include conf.d/include/proxy.conf; +} diff --git a/rootfs/etc/nginx/conf.d/include/block-exploits.conf b/docker/rootfs/etc/nginx/conf.d/include/block-exploits.conf similarity index 68% rename from rootfs/etc/nginx/conf.d/include/block-exploits.conf rename to docker/rootfs/etc/nginx/conf.d/include/block-exploits.conf index 22360fc1a..093bda235 100644 --- a/rootfs/etc/nginx/conf.d/include/block-exploits.conf +++ b/docker/rootfs/etc/nginx/conf.d/include/block-exploits.conf @@ -2,92 +2,92 @@ set $block_sql_injections 0; if ($query_string ~ "union.*select.*\(") { - set $block_sql_injections 1; + set $block_sql_injections 1; } if ($query_string ~ "union.*all.*select.*") { - set $block_sql_injections 1; + set $block_sql_injections 1; } if ($query_string ~ "concat.*\(") { - set $block_sql_injections 1; + set $block_sql_injections 1; } if ($block_sql_injections = 1) { - return 403; + return 403; } ## Block file injections set $block_file_injections 0; if ($query_string ~ "[a-zA-Z0-9_]=http://") { - set $block_file_injections 1; + set $block_file_injections 1; } if ($query_string ~ "[a-zA-Z0-9_]=(\.\.//?)+") { - set $block_file_injections 1; + set $block_file_injections 1; } if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") { - set $block_file_injections 1; + set $block_file_injections 1; } if ($block_file_injections = 1) { - return 403; + return 403; } ## Block common exploits set $block_common_exploits 0; if ($query_string ~ "(<|%3C).*script.*(>|%3E)") { - set $block_common_exploits 1; + set $block_common_exploits 1; } if ($query_string ~ "GLOBALS(=|\[|\%[0-9A-Z]{0,2})") { - set $block_common_exploits 1; + set $block_common_exploits 1; } if ($query_string ~ "_REQUEST(=|\[|\%[0-9A-Z]{0,2})") { - set $block_common_exploits 1; + set $block_common_exploits 1; } if ($query_string ~ "proc/self/environ") { - set $block_common_exploits 1; + set $block_common_exploits 1; } if ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|\%3D)") { - set $block_common_exploits 1; + set $block_common_exploits 1; } if ($query_string ~ "base64_(en|de)code\(.*\)") { - set $block_common_exploits 1; + set $block_common_exploits 1; } if ($block_common_exploits = 1) { - return 403; + return 403; } ## Block spam set $block_spam 0; if ($query_string ~ "\b(ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo)\b") { - set $block_spam 1; + set $block_spam 1; } if ($query_string ~ "\b(erections|hoodia|huronriveracres|impotence|levitra|libido)\b") { - set $block_spam 1; + set $block_spam 1; } if ($query_string ~ "\b(ambien|blue\spill|cialis|cocaine|ejaculation|erectile)\b") { - set $block_spam 1; + set $block_spam 1; } if ($query_string ~ "\b(lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby)\b") { - set $block_spam 1; + set $block_spam 1; } if ($block_spam = 1) { - return 403; + return 403; } ## Block user agents @@ -95,42 +95,42 @@ set $block_user_agents 0; # Disable Akeeba Remote Control 2.5 and earlier if ($http_user_agent ~ "Indy Library") { - set $block_user_agents 1; + set $block_user_agents 1; } # Common bandwidth hoggers and hacking tools. if ($http_user_agent ~ "libwww-perl") { - set $block_user_agents 1; + set $block_user_agents 1; } if ($http_user_agent ~ "GetRight") { - set $block_user_agents 1; + set $block_user_agents 1; } if ($http_user_agent ~ "GetWeb!") { - set $block_user_agents 1; + set $block_user_agents 1; } if ($http_user_agent ~ "Go!Zilla") { - set $block_user_agents 1; + set $block_user_agents 1; } if ($http_user_agent ~ "Download Demon") { - set $block_user_agents 1; + set $block_user_agents 1; } if ($http_user_agent ~ "Go-Ahead-Got-It") { - set $block_user_agents 1; + set $block_user_agents 1; } if ($http_user_agent ~ "TurnitinBot") { - set $block_user_agents 1; + set $block_user_agents 1; } if ($http_user_agent ~ "GrabNet") { - set $block_user_agents 1; + set $block_user_agents 1; } if ($block_user_agents = 1) { - return 403; + return 403; } diff --git a/docker/rootfs/etc/nginx/conf.d/include/force-ssl.conf b/docker/rootfs/etc/nginx/conf.d/include/force-ssl.conf new file mode 100644 index 000000000..15f0d2856 --- /dev/null +++ b/docker/rootfs/etc/nginx/conf.d/include/force-ssl.conf @@ -0,0 +1,3 @@ +if ($scheme = "http") { + return 301 https://$host$request_uri; +} diff --git a/docker/rootfs/etc/nginx/conf.d/include/ip_ranges.conf b/docker/rootfs/etc/nginx/conf.d/include/ip_ranges.conf new file mode 100644 index 000000000..2542b7fe4 --- /dev/null +++ b/docker/rootfs/etc/nginx/conf.d/include/ip_ranges.conf @@ -0,0 +1,196 @@ + +set_real_ip_from 144.220.0.0/16; + +set_real_ip_from 52.124.128.0/17; + +set_real_ip_from 54.230.0.0/16; + +set_real_ip_from 54.239.128.0/18; + +set_real_ip_from 52.82.128.0/19; + +set_real_ip_from 99.84.0.0/16; + +set_real_ip_from 204.246.172.0/24; + +set_real_ip_from 205.251.192.0/19; + +set_real_ip_from 54.239.192.0/19; + +set_real_ip_from 70.132.0.0/18; + +set_real_ip_from 13.32.0.0/15; + +set_real_ip_from 13.224.0.0/14; + +set_real_ip_from 13.35.0.0/16; + +set_real_ip_from 204.246.164.0/22; + +set_real_ip_from 204.246.168.0/22; + +set_real_ip_from 71.152.0.0/17; + +set_real_ip_from 216.137.32.0/19; + +set_real_ip_from 205.251.249.0/24; + +set_real_ip_from 99.86.0.0/16; + +set_real_ip_from 52.46.0.0/18; + +set_real_ip_from 52.84.0.0/15; + +set_real_ip_from 204.246.173.0/24; + +set_real_ip_from 130.176.0.0/16; + +set_real_ip_from 64.252.64.0/18; + +set_real_ip_from 204.246.174.0/23; + +set_real_ip_from 64.252.128.0/18; + +set_real_ip_from 205.251.254.0/24; + +set_real_ip_from 143.204.0.0/16; + +set_real_ip_from 205.251.252.0/23; + +set_real_ip_from 204.246.176.0/20; + +set_real_ip_from 13.249.0.0/16; + +set_real_ip_from 54.240.128.0/18; + +set_real_ip_from 205.251.250.0/23; + +set_real_ip_from 52.222.128.0/17; + +set_real_ip_from 54.182.0.0/16; + +set_real_ip_from 54.192.0.0/16; + +set_real_ip_from 13.124.199.0/24; + +set_real_ip_from 34.226.14.0/24; + +set_real_ip_from 52.15.127.128/26; + +set_real_ip_from 35.158.136.0/24; + +set_real_ip_from 52.57.254.0/24; + +set_real_ip_from 18.216.170.128/25; + +set_real_ip_from 13.52.204.0/23; + +set_real_ip_from 13.54.63.128/26; + +set_real_ip_from 13.59.250.0/26; + +set_real_ip_from 13.210.67.128/26; + +set_real_ip_from 35.167.191.128/26; + +set_real_ip_from 52.47.139.0/24; + +set_real_ip_from 52.199.127.192/26; + +set_real_ip_from 52.212.248.0/26; + +set_real_ip_from 52.66.194.128/26; + +set_real_ip_from 13.113.203.0/24; + +set_real_ip_from 99.79.168.0/23; + +set_real_ip_from 34.195.252.0/24; + +set_real_ip_from 35.162.63.192/26; + +set_real_ip_from 34.223.12.224/27; + +set_real_ip_from 52.56.127.0/25; + +set_real_ip_from 34.223.80.192/26; + +set_real_ip_from 13.228.69.0/24; + +set_real_ip_from 34.216.51.0/25; + +set_real_ip_from 3.231.2.0/25; + +set_real_ip_from 54.233.255.128/26; + +set_real_ip_from 18.200.212.0/23; + +set_real_ip_from 52.52.191.128/26; + +set_real_ip_from 3.234.232.224/27; + +set_real_ip_from 52.78.247.128/26; + +set_real_ip_from 52.220.191.0/26; + +set_real_ip_from 34.232.163.208/29; + +set_real_ip_from 2600:9000:eee::/48; + +set_real_ip_from 2600:9000:4000::/36; + +set_real_ip_from 2600:9000:3000::/36; + +set_real_ip_from 2600:9000:f000::/36; + +set_real_ip_from 2600:9000:fff::/48; + +set_real_ip_from 2600:9000:2000::/36; + +set_real_ip_from 2600:9000:1000::/36; + +set_real_ip_from 2600:9000:ddd::/48; + +set_real_ip_from 2600:9000:5300::/40; + +set_real_ip_from 173.245.48.0/20; + +set_real_ip_from 103.21.244.0/22; + +set_real_ip_from 103.22.200.0/22; + +set_real_ip_from 103.31.4.0/22; + +set_real_ip_from 141.101.64.0/18; + +set_real_ip_from 108.162.192.0/18; + +set_real_ip_from 190.93.240.0/20; + +set_real_ip_from 188.114.96.0/20; + +set_real_ip_from 197.234.240.0/22; + +set_real_ip_from 198.41.128.0/17; + +set_real_ip_from 162.158.0.0/15; + +set_real_ip_from 104.16.0.0/12; + +set_real_ip_from 172.64.0.0/13; + +set_real_ip_from 131.0.72.0/22; + +set_real_ip_from 2400:cb00::/32; + +set_real_ip_from 2606:4700::/32; + +set_real_ip_from 2803:f800::/32; + +set_real_ip_from 2405:b500::/32; + +set_real_ip_from 2405:8100::/32; + +set_real_ip_from 2a06:98c0::/29; + +set_real_ip_from 2c0f:f248::/32; diff --git a/docker/rootfs/etc/nginx/conf.d/include/letsencrypt-acme-challenge.conf b/docker/rootfs/etc/nginx/conf.d/include/letsencrypt-acme-challenge.conf new file mode 100644 index 000000000..d04f70334 --- /dev/null +++ b/docker/rootfs/etc/nginx/conf.d/include/letsencrypt-acme-challenge.conf @@ -0,0 +1,29 @@ +# Rule for legitimate ACME Challenge requests (like /.well-known/acme-challenge/xxxxxxxxx) +# We use ^~ here, so that we don't check other regexes (for speed-up). We actually MUST cancel +# other regex checks, because in our other config files have regex rule that denies access to files with dotted names. +location ^~ /.well-known/acme-challenge/ { + # Since this is for letsencrypt authentication of a domain and they do not give IP ranges of their infrastructure + # we need to open up access by turning off auth and IP ACL for this location. + auth_basic off; + allow all; + + # Set correct content type. According to this: + # https://community.letsencrypt.org/t/using-the-webroot-domain-verification-method/1445/29 + # Current specification requires "text/plain" or no content header at all. + # It seems that "text/plain" is a safe option. + default_type "text/plain"; + + # This directory must be the same as in /etc/letsencrypt/cli.ini + # as "webroot-path" parameter. Also don't forget to set "authenticator" parameter + # there to "webroot". + # Do NOT use alias, use root! Target directory is located here: + # /var/www/common/letsencrypt/.well-known/acme-challenge/ + root /data/letsencrypt-acme-challenge; +} + +# Hide /acme-challenge subdirectory and return 404 on all requests. +# It is somewhat more secure than letting Nginx return 403. +# Ending slash is important! +location = /.well-known/acme-challenge/ { + return 404; +} diff --git a/rootfs/etc/nginx/conf.d/include/proxy.conf b/docker/rootfs/etc/nginx/conf.d/include/proxy.conf similarity index 100% rename from rootfs/etc/nginx/conf.d/include/proxy.conf rename to docker/rootfs/etc/nginx/conf.d/include/proxy.conf diff --git a/rootfs/etc/nginx/conf.d/include/ssl-ciphers.conf b/docker/rootfs/etc/nginx/conf.d/include/ssl-ciphers.conf similarity index 100% rename from rootfs/etc/nginx/conf.d/include/ssl-ciphers.conf rename to docker/rootfs/etc/nginx/conf.d/include/ssl-ciphers.conf diff --git a/docker/rootfs/etc/nginx/conf.d/production.conf b/docker/rootfs/etc/nginx/conf.d/production.conf new file mode 100644 index 000000000..b632bcec4 --- /dev/null +++ b/docker/rootfs/etc/nginx/conf.d/production.conf @@ -0,0 +1,30 @@ +# Admin Interface +server { + listen 81 default; + listen [::]:81 default; + + server_name nginxproxymanager; + root /app/frontend; + access_log /dev/null; + + location /api { + return 302 /api/; + } + + location /api/ { + add_header X-Served-By $host; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Scheme $scheme; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_pass http://127.0.0.1:3000/; + } + + location / { + index index.html; + if ($request_uri ~ ^/(.*)\.html$) { + return 302 /$1; + } + try_files $uri $uri.html $uri/ /index.html; + } +} diff --git a/rootfs/etc/nginx/mime.types b/docker/rootfs/etc/nginx/mime.types similarity index 100% rename from rootfs/etc/nginx/mime.types rename to docker/rootfs/etc/nginx/mime.types diff --git a/docker/rootfs/etc/nginx/nginx.conf b/docker/rootfs/etc/nginx/nginx.conf new file mode 100644 index 000000000..e750e6c17 --- /dev/null +++ b/docker/rootfs/etc/nginx/nginx.conf @@ -0,0 +1,84 @@ +# run nginx in foreground +daemon off; + +user root; + +# Set number of worker processes automatically based on number of CPU cores. +worker_processes auto; + +# Enables the use of JIT for regular expressions to speed-up their processing. +pcre_jit on; + +error_log /data/logs/error.log warn; + +# Includes files with directives to load dynamic modules. +include /etc/nginx/modules/*.conf; + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + sendfile on; + server_tokens off; + tcp_nopush on; + tcp_nodelay on; + client_body_temp_path /tmp/nginx/body 1 2; + keepalive_timeout 65; + ssl_prefer_server_ciphers on; + gzip on; + proxy_ignore_client_abort off; + client_max_body_size 2000m; + server_names_hash_bucket_size 64; + proxy_http_version 1.1; + proxy_set_header X-Forwarded-Scheme $scheme; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Accept-Encoding ""; + proxy_cache off; + proxy_cache_path /var/lib/nginx/cache/public levels=1:2 keys_zone=public-cache:30m max_size=192m; + proxy_cache_path /var/lib/nginx/cache/private levels=1:2 keys_zone=private-cache:5m max_size=1024m; + + log_format proxy '[$time_local] $upstream_cache_status $upstream_status $status - $request_method $scheme $host "$request_uri" [Client $remote_addr] [Length $body_bytes_sent] [Gzip $gzip_ratio] [Sent-to $server] "$http_user_agent" "$http_referer"'; + log_format standard '[$time_local] $status - $request_method $scheme $host "$request_uri" [Client $remote_addr] [Length $body_bytes_sent] [Gzip $gzip_ratio] "$http_user_agent" "$http_referer"'; + + + access_log /data/logs/default.log proxy; + + # Dynamically generated resolvers file + include /etc/nginx/conf.d/include/resolvers.conf; + + # Default upstream scheme + map $host $forward_scheme { + default http; + } + + # Real IP Determination + # Docker subnet: + set_real_ip_from 172.0.0.0/8; + # NPM generated CDN ip ranges: + include conf.d/include/ip_ranges.conf; + # always put the following 2 lines after ip subnets: + real_ip_header X-Forwarded-For; + real_ip_recursive on; + + # Files generated by NPM + include /etc/nginx/conf.d/*.conf; + include /data/nginx/default_host/*.conf; + include /data/nginx/proxy_host/*.conf; + include /data/nginx/redirection_host/*.conf; + include /data/nginx/dead_host/*.conf; + include /data/nginx/temp/*.conf; + + # Custom + include /data/nginx/custom/http[.]conf; +} + +stream { + # Files generated by NPM + include /data/nginx/stream/*.conf; +} + +# Custom +include /data/nginx/custom/root[.]conf; diff --git a/docker/rootfs/etc/services.d/frontend/finish b/docker/rootfs/etc/services.d/frontend/finish new file mode 100755 index 000000000..bca9a35db --- /dev/null +++ b/docker/rootfs/etc/services.d/frontend/finish @@ -0,0 +1,6 @@ +#!/usr/bin/execlineb -S1 +if { s6-test ${1} -ne 0 } +if { s6-test ${1} -ne 256 } + +s6-svscanctl -t /var/run/s6/services + diff --git a/docker/rootfs/etc/services.d/frontend/run b/docker/rootfs/etc/services.d/frontend/run new file mode 100755 index 000000000..32558d98b --- /dev/null +++ b/docker/rootfs/etc/services.d/frontend/run @@ -0,0 +1,11 @@ +#!/usr/bin/with-contenv bash + +# This service is DEVELOPMENT only. + +if [ "$DEVELOPMENT" == "true" ]; then + cd /app/frontend || exit 1 + yarn install + yarn watch +else + exit 0 +fi diff --git a/rootfs/etc/services.d/manager/finish b/docker/rootfs/etc/services.d/manager/finish similarity index 100% rename from rootfs/etc/services.d/manager/finish rename to docker/rootfs/etc/services.d/manager/finish diff --git a/docker/rootfs/etc/services.d/manager/run b/docker/rootfs/etc/services.d/manager/run new file mode 100755 index 000000000..3ea1a17d5 --- /dev/null +++ b/docker/rootfs/etc/services.d/manager/run @@ -0,0 +1,18 @@ +#!/usr/bin/with-contenv bash + +mkdir -p /data/letsencrypt-acme-challenge + +cd /app || echo + +if [ "$DEVELOPMENT" == "true" ]; then + cd /app/backend || exit 1 + yarn install + node --max_old_space_size=250 --abort_on_uncaught_exception node_modules/nodemon/bin/nodemon.js +else + cd /app || exit 1 + while : + do + node --abort_on_uncaught_exception --max_old_space_size=250 index.js + sleep 1 + done +fi diff --git a/rootfs/etc/services.d/nginx/finish b/docker/rootfs/etc/services.d/nginx/finish similarity index 100% rename from rootfs/etc/services.d/nginx/finish rename to docker/rootfs/etc/services.d/nginx/finish diff --git a/docker/rootfs/etc/services.d/nginx/run b/docker/rootfs/etc/services.d/nginx/run new file mode 100755 index 000000000..2e66bcb5b --- /dev/null +++ b/docker/rootfs/etc/services.d/nginx/run @@ -0,0 +1,45 @@ +#!/usr/bin/with-contenv bash + +# Create required folders +mkdir -p /tmp/nginx/body \ + /run/nginx \ + /var/log/nginx \ + /data/nginx \ + /data/custom_ssl \ + /data/logs \ + /data/access \ + /data/nginx/default_host \ + /data/nginx/default_www \ + /data/nginx/proxy_host \ + /data/nginx/redirection_host \ + /data/nginx/stream \ + /data/nginx/dead_host \ + /data/nginx/temp \ + /var/lib/nginx/cache/public \ + /var/lib/nginx/cache/private \ + /var/cache/nginx/proxy_temp + +touch /var/log/nginx/error.log && chmod 777 /var/log/nginx/error.log && chmod -R 777 /var/cache/nginx +chown root /tmp/nginx + +# Dynamically generate resolvers file, if resolver is IPv6, enclose in `[]` +# thanks @tfmm +echo resolver "$(awk 'BEGIN{ORS=" "} $1=="nameserver" {print ($2 ~ ":")? "["$2"]": $2}' /etc/resolv.conf);" > /etc/nginx/conf.d/include/resolvers.conf + +# Generate dummy self-signed certificate. +if [ ! -f /data/nginx/dummycert.pem ] || [ ! -f /data/nginx/dummykey.pem ] +then + echo "Generating dummy SSL certificate..." + openssl req \ + -new \ + -newkey rsa:2048 \ + -days 3650 \ + -nodes \ + -x509 \ + -subj '/O=Nginx Proxy Manager/OU=Dummy Certificate/CN=localhost' \ + -keyout /data/nginx/dummykey.pem \ + -out /data/nginx/dummycert.pem + echo "Complete" +fi + +exec nginx diff --git a/docker/rootfs/root/.bashrc b/docker/rootfs/root/.bashrc new file mode 100644 index 000000000..fe69b7874 --- /dev/null +++ b/docker/rootfs/root/.bashrc @@ -0,0 +1,20 @@ +#!/bin/bash + +if [ -t 1 ]; then + export PS1="\e[1;34m[\e[1;33m\u@\e[1;32mdocker-\h\e[1;37m:\w\[\e[1;34m]\e[1;36m\\$ \e[0m" +fi + +# Aliases +alias l='ls -lAsh --color' +alias ls='ls -C1 --color' +alias cp='cp -ip' +alias rm='rm -i' +alias mv='mv -i' +alias h='cd ~;clear;' + +. /etc/os-release + +echo -e -n '\E[1;34m' +figlet -w 120 "NginxProxyManager" +echo -e "\E[1;36mVersion \E[1;32m${NPM_BUILD_VERSION:-2.0.0-dev}\E[1;36m (${NPM_BUILD_COMMIT:-dev}) ${NPM_BUILD_DATE:-0000-00-00}, Nginx \E[1;32m${NGINX_VERSION:-unknown}\E[1;36m, Alpine \E[1;32m${VERSION_ID:-unknown}\E[1;36m, Kernel \E[1;32m$(uname -r)\E[0m" +echo diff --git a/rootfs/var/www/html/index.html b/docker/rootfs/var/www/html/index.html similarity index 100% rename from rootfs/var/www/html/index.html rename to docker/rootfs/var/www/html/index.html diff --git a/frontend/.babelrc b/frontend/.babelrc new file mode 100644 index 000000000..54071ecd1 --- /dev/null +++ b/frontend/.babelrc @@ -0,0 +1,17 @@ +{ + "presets": [ + [ + "env", + { + "targets": { + "browsers": [ + "Chrome >= 65" + ] + }, + "debug": false, + "modules": false, + "useBuiltIns": "usage" + } + ] + ] +} \ No newline at end of file diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 000000000..c8f4b4f98 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,4 @@ +dist +node_modules +webpack_stats.html +yarn-error.log diff --git a/src/frontend/app-images/default-avatar.jpg b/frontend/app-images/default-avatar.jpg similarity index 100% rename from src/frontend/app-images/default-avatar.jpg rename to frontend/app-images/default-avatar.jpg diff --git a/src/frontend/app-images/favicons/android-chrome-192x192.png b/frontend/app-images/favicons/android-chrome-192x192.png similarity index 100% rename from src/frontend/app-images/favicons/android-chrome-192x192.png rename to frontend/app-images/favicons/android-chrome-192x192.png diff --git a/src/frontend/app-images/favicons/android-chrome-512x512.png b/frontend/app-images/favicons/android-chrome-512x512.png similarity index 100% rename from src/frontend/app-images/favicons/android-chrome-512x512.png rename to frontend/app-images/favicons/android-chrome-512x512.png diff --git a/src/frontend/app-images/favicons/apple-touch-icon.png b/frontend/app-images/favicons/apple-touch-icon.png similarity index 100% rename from src/frontend/app-images/favicons/apple-touch-icon.png rename to frontend/app-images/favicons/apple-touch-icon.png diff --git a/src/frontend/app-images/favicons/browserconfig.xml b/frontend/app-images/favicons/browserconfig.xml similarity index 100% rename from src/frontend/app-images/favicons/browserconfig.xml rename to frontend/app-images/favicons/browserconfig.xml diff --git a/src/frontend/app-images/favicons/favicon-16x16.png b/frontend/app-images/favicons/favicon-16x16.png similarity index 100% rename from src/frontend/app-images/favicons/favicon-16x16.png rename to frontend/app-images/favicons/favicon-16x16.png diff --git a/src/frontend/app-images/favicons/favicon-32x32.png b/frontend/app-images/favicons/favicon-32x32.png similarity index 100% rename from src/frontend/app-images/favicons/favicon-32x32.png rename to frontend/app-images/favicons/favicon-32x32.png diff --git a/src/frontend/app-images/favicons/favicon.ico b/frontend/app-images/favicons/favicon.ico similarity index 100% rename from src/frontend/app-images/favicons/favicon.ico rename to frontend/app-images/favicons/favicon.ico diff --git a/src/frontend/app-images/favicons/manifest.json b/frontend/app-images/favicons/manifest.json similarity index 100% rename from src/frontend/app-images/favicons/manifest.json rename to frontend/app-images/favicons/manifest.json diff --git a/src/frontend/app-images/favicons/mstile-150x150.png b/frontend/app-images/favicons/mstile-150x150.png similarity index 100% rename from src/frontend/app-images/favicons/mstile-150x150.png rename to frontend/app-images/favicons/mstile-150x150.png diff --git a/src/frontend/app-images/favicons/safari-pinned-tab.svg b/frontend/app-images/favicons/safari-pinned-tab.svg similarity index 100% rename from src/frontend/app-images/favicons/safari-pinned-tab.svg rename to frontend/app-images/favicons/safari-pinned-tab.svg diff --git a/frontend/fonts b/frontend/fonts new file mode 120000 index 000000000..3af17ecb9 --- /dev/null +++ b/frontend/fonts @@ -0,0 +1 @@ +./node_modules/tabler-ui/dist/assets/fonts \ No newline at end of file diff --git a/src/backend/views/index.ejs b/frontend/html/index.ejs similarity index 87% rename from src/backend/views/index.ejs rename to frontend/html/index.ejs index a8b8da378..ae08b012e 100644 --- a/src/backend/views/index.ejs +++ b/frontend/html/index.ejs @@ -2,7 +2,7 @@ <%- include partials/header.ejs %>
- +
diff --git a/src/backend/views/login.ejs b/frontend/html/login.ejs similarity index 89% rename from src/backend/views/login.ejs rename to frontend/html/login.ejs index 18683b0b1..bc4b9a27f 100644 --- a/src/backend/views/login.ejs +++ b/frontend/html/login.ejs @@ -2,7 +2,7 @@ <%- include partials/header.ejs %>
- +
diff --git a/frontend/html/partials/footer.ejs b/frontend/html/partials/footer.ejs new file mode 100644 index 000000000..7fb2bd61b --- /dev/null +++ b/frontend/html/partials/footer.ejs @@ -0,0 +1,2 @@ + + diff --git a/frontend/html/partials/header.ejs b/frontend/html/partials/header.ejs new file mode 100644 index 000000000..49f5fc0b7 --- /dev/null +++ b/frontend/html/partials/header.ejs @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + <%- title %> + + + + + + + + + + + + + + + diff --git a/frontend/images b/frontend/images new file mode 120000 index 000000000..37c318540 --- /dev/null +++ b/frontend/images @@ -0,0 +1 @@ +./node_modules/tabler-ui/dist/assets/images \ No newline at end of file diff --git a/src/frontend/js/app/api.js b/frontend/js/app/api.js similarity index 100% rename from src/frontend/js/app/api.js rename to frontend/js/app/api.js diff --git a/src/frontend/js/app/audit-log/list/item.ejs b/frontend/js/app/audit-log/list/item.ejs similarity index 100% rename from src/frontend/js/app/audit-log/list/item.ejs rename to frontend/js/app/audit-log/list/item.ejs diff --git a/src/frontend/js/app/audit-log/list/item.js b/frontend/js/app/audit-log/list/item.js similarity index 100% rename from src/frontend/js/app/audit-log/list/item.js rename to frontend/js/app/audit-log/list/item.js diff --git a/src/frontend/js/app/audit-log/list/main.ejs b/frontend/js/app/audit-log/list/main.ejs similarity index 100% rename from src/frontend/js/app/audit-log/list/main.ejs rename to frontend/js/app/audit-log/list/main.ejs diff --git a/src/frontend/js/app/users/list/main.js b/frontend/js/app/audit-log/list/main.js similarity index 86% rename from src/frontend/js/app/users/list/main.js rename to frontend/js/app/audit-log/list/main.js index 88e639e80..9d3e26fb1 100644 --- a/src/frontend/js/app/users/list/main.js +++ b/frontend/js/app/audit-log/list/main.js @@ -9,7 +9,7 @@ const TableBody = Mn.CollectionView.extend({ module.exports = Mn.View.extend({ tagName: 'table', - className: 'table table-hover table-outline table-vcenter text-nowrap card-table', + className: 'table table-hover table-outline table-vcenter card-table', template: template, regions: { diff --git a/src/frontend/js/app/audit-log/main.ejs b/frontend/js/app/audit-log/main.ejs similarity index 100% rename from src/frontend/js/app/audit-log/main.ejs rename to frontend/js/app/audit-log/main.ejs diff --git a/src/frontend/js/app/audit-log/main.js b/frontend/js/app/audit-log/main.js similarity index 100% rename from src/frontend/js/app/audit-log/main.js rename to frontend/js/app/audit-log/main.js diff --git a/src/frontend/js/app/audit-log/meta.ejs b/frontend/js/app/audit-log/meta.ejs similarity index 100% rename from src/frontend/js/app/audit-log/meta.ejs rename to frontend/js/app/audit-log/meta.ejs diff --git a/src/frontend/js/app/audit-log/meta.js b/frontend/js/app/audit-log/meta.js similarity index 100% rename from src/frontend/js/app/audit-log/meta.js rename to frontend/js/app/audit-log/meta.js diff --git a/src/frontend/js/app/cache.js b/frontend/js/app/cache.js similarity index 100% rename from src/frontend/js/app/cache.js rename to frontend/js/app/cache.js diff --git a/src/frontend/js/app/controller.js b/frontend/js/app/controller.js similarity index 100% rename from src/frontend/js/app/controller.js rename to frontend/js/app/controller.js diff --git a/src/frontend/js/app/dashboard/main.ejs b/frontend/js/app/dashboard/main.ejs similarity index 100% rename from src/frontend/js/app/dashboard/main.ejs rename to frontend/js/app/dashboard/main.ejs diff --git a/src/frontend/js/app/dashboard/main.js b/frontend/js/app/dashboard/main.js similarity index 100% rename from src/frontend/js/app/dashboard/main.js rename to frontend/js/app/dashboard/main.js diff --git a/src/frontend/js/app/empty/main.ejs b/frontend/js/app/empty/main.ejs similarity index 100% rename from src/frontend/js/app/empty/main.ejs rename to frontend/js/app/empty/main.ejs diff --git a/src/frontend/js/app/empty/main.js b/frontend/js/app/empty/main.js similarity index 100% rename from src/frontend/js/app/empty/main.js rename to frontend/js/app/empty/main.js diff --git a/src/frontend/js/app/error/main.ejs b/frontend/js/app/error/main.ejs similarity index 100% rename from src/frontend/js/app/error/main.ejs rename to frontend/js/app/error/main.ejs diff --git a/src/frontend/js/app/error/main.js b/frontend/js/app/error/main.js similarity index 100% rename from src/frontend/js/app/error/main.js rename to frontend/js/app/error/main.js diff --git a/src/frontend/js/app/help/main.ejs b/frontend/js/app/help/main.ejs similarity index 100% rename from src/frontend/js/app/help/main.ejs rename to frontend/js/app/help/main.ejs diff --git a/src/frontend/js/app/help/main.js b/frontend/js/app/help/main.js similarity index 100% rename from src/frontend/js/app/help/main.js rename to frontend/js/app/help/main.js diff --git a/src/frontend/js/app/i18n.js b/frontend/js/app/i18n.js similarity index 100% rename from src/frontend/js/app/i18n.js rename to frontend/js/app/i18n.js diff --git a/src/frontend/js/app/main.js b/frontend/js/app/main.js similarity index 100% rename from src/frontend/js/app/main.js rename to frontend/js/app/main.js diff --git a/src/frontend/js/app/nginx/access/delete.ejs b/frontend/js/app/nginx/access/delete.ejs similarity index 100% rename from src/frontend/js/app/nginx/access/delete.ejs rename to frontend/js/app/nginx/access/delete.ejs diff --git a/src/frontend/js/app/nginx/access/delete.js b/frontend/js/app/nginx/access/delete.js similarity index 100% rename from src/frontend/js/app/nginx/access/delete.js rename to frontend/js/app/nginx/access/delete.js diff --git a/src/frontend/js/app/nginx/access/form.ejs b/frontend/js/app/nginx/access/form.ejs similarity index 100% rename from src/frontend/js/app/nginx/access/form.ejs rename to frontend/js/app/nginx/access/form.ejs diff --git a/src/frontend/js/app/nginx/access/form.js b/frontend/js/app/nginx/access/form.js similarity index 100% rename from src/frontend/js/app/nginx/access/form.js rename to frontend/js/app/nginx/access/form.js diff --git a/src/frontend/js/app/nginx/access/form/item.ejs b/frontend/js/app/nginx/access/form/item.ejs similarity index 100% rename from src/frontend/js/app/nginx/access/form/item.ejs rename to frontend/js/app/nginx/access/form/item.ejs diff --git a/src/frontend/js/app/nginx/access/form/item.js b/frontend/js/app/nginx/access/form/item.js similarity index 100% rename from src/frontend/js/app/nginx/access/form/item.js rename to frontend/js/app/nginx/access/form/item.js diff --git a/src/frontend/js/app/nginx/access/list/item.ejs b/frontend/js/app/nginx/access/list/item.ejs similarity index 100% rename from src/frontend/js/app/nginx/access/list/item.ejs rename to frontend/js/app/nginx/access/list/item.ejs diff --git a/src/frontend/js/app/nginx/access/list/item.js b/frontend/js/app/nginx/access/list/item.js similarity index 100% rename from src/frontend/js/app/nginx/access/list/item.js rename to frontend/js/app/nginx/access/list/item.js diff --git a/src/frontend/js/app/nginx/access/list/main.ejs b/frontend/js/app/nginx/access/list/main.ejs similarity index 100% rename from src/frontend/js/app/nginx/access/list/main.ejs rename to frontend/js/app/nginx/access/list/main.ejs diff --git a/src/frontend/js/app/nginx/access/list/main.js b/frontend/js/app/nginx/access/list/main.js similarity index 88% rename from src/frontend/js/app/nginx/access/list/main.js rename to frontend/js/app/nginx/access/list/main.js index a1fb65215..577a77ef2 100644 --- a/src/frontend/js/app/nginx/access/list/main.js +++ b/frontend/js/app/nginx/access/list/main.js @@ -10,7 +10,7 @@ const TableBody = Mn.CollectionView.extend({ module.exports = Mn.View.extend({ tagName: 'table', - className: 'table table-hover table-outline table-vcenter text-nowrap card-table', + className: 'table table-hover table-outline table-vcenter card-table', template: template, regions: { diff --git a/src/frontend/js/app/nginx/access/main.ejs b/frontend/js/app/nginx/access/main.ejs similarity index 100% rename from src/frontend/js/app/nginx/access/main.ejs rename to frontend/js/app/nginx/access/main.ejs diff --git a/src/frontend/js/app/nginx/access/main.js b/frontend/js/app/nginx/access/main.js similarity index 100% rename from src/frontend/js/app/nginx/access/main.js rename to frontend/js/app/nginx/access/main.js diff --git a/src/frontend/js/app/nginx/certificates-list-item.ejs b/frontend/js/app/nginx/certificates-list-item.ejs similarity index 100% rename from src/frontend/js/app/nginx/certificates-list-item.ejs rename to frontend/js/app/nginx/certificates-list-item.ejs diff --git a/src/frontend/js/app/nginx/certificates/delete.ejs b/frontend/js/app/nginx/certificates/delete.ejs similarity index 100% rename from src/frontend/js/app/nginx/certificates/delete.ejs rename to frontend/js/app/nginx/certificates/delete.ejs diff --git a/src/frontend/js/app/nginx/certificates/delete.js b/frontend/js/app/nginx/certificates/delete.js similarity index 100% rename from src/frontend/js/app/nginx/certificates/delete.js rename to frontend/js/app/nginx/certificates/delete.js diff --git a/src/frontend/js/app/nginx/certificates/form.ejs b/frontend/js/app/nginx/certificates/form.ejs similarity index 100% rename from src/frontend/js/app/nginx/certificates/form.ejs rename to frontend/js/app/nginx/certificates/form.ejs diff --git a/src/frontend/js/app/nginx/certificates/form.js b/frontend/js/app/nginx/certificates/form.js similarity index 100% rename from src/frontend/js/app/nginx/certificates/form.js rename to frontend/js/app/nginx/certificates/form.js diff --git a/src/frontend/js/app/nginx/certificates/list/item.ejs b/frontend/js/app/nginx/certificates/list/item.ejs similarity index 100% rename from src/frontend/js/app/nginx/certificates/list/item.ejs rename to frontend/js/app/nginx/certificates/list/item.ejs diff --git a/src/frontend/js/app/nginx/certificates/list/item.js b/frontend/js/app/nginx/certificates/list/item.js similarity index 100% rename from src/frontend/js/app/nginx/certificates/list/item.js rename to frontend/js/app/nginx/certificates/list/item.js diff --git a/src/frontend/js/app/nginx/certificates/list/main.ejs b/frontend/js/app/nginx/certificates/list/main.ejs similarity index 100% rename from src/frontend/js/app/nginx/certificates/list/main.ejs rename to frontend/js/app/nginx/certificates/list/main.ejs diff --git a/src/frontend/js/app/nginx/certificates/list/main.js b/frontend/js/app/nginx/certificates/list/main.js similarity index 88% rename from src/frontend/js/app/nginx/certificates/list/main.js rename to frontend/js/app/nginx/certificates/list/main.js index 6bc792451..d96b43e8f 100644 --- a/src/frontend/js/app/nginx/certificates/list/main.js +++ b/frontend/js/app/nginx/certificates/list/main.js @@ -10,7 +10,7 @@ const TableBody = Mn.CollectionView.extend({ module.exports = Mn.View.extend({ tagName: 'table', - className: 'table table-hover table-outline table-vcenter text-nowrap card-table', + className: 'table table-hover table-outline table-vcenter card-table', template: template, regions: { diff --git a/src/frontend/js/app/nginx/certificates/main.ejs b/frontend/js/app/nginx/certificates/main.ejs similarity index 100% rename from src/frontend/js/app/nginx/certificates/main.ejs rename to frontend/js/app/nginx/certificates/main.ejs diff --git a/src/frontend/js/app/nginx/certificates/main.js b/frontend/js/app/nginx/certificates/main.js similarity index 100% rename from src/frontend/js/app/nginx/certificates/main.js rename to frontend/js/app/nginx/certificates/main.js diff --git a/src/frontend/js/app/nginx/certificates/renew.ejs b/frontend/js/app/nginx/certificates/renew.ejs similarity index 100% rename from src/frontend/js/app/nginx/certificates/renew.ejs rename to frontend/js/app/nginx/certificates/renew.ejs diff --git a/src/frontend/js/app/nginx/certificates/renew.js b/frontend/js/app/nginx/certificates/renew.js similarity index 100% rename from src/frontend/js/app/nginx/certificates/renew.js rename to frontend/js/app/nginx/certificates/renew.js diff --git a/src/frontend/js/app/nginx/dead/delete.ejs b/frontend/js/app/nginx/dead/delete.ejs similarity index 100% rename from src/frontend/js/app/nginx/dead/delete.ejs rename to frontend/js/app/nginx/dead/delete.ejs diff --git a/src/frontend/js/app/nginx/dead/delete.js b/frontend/js/app/nginx/dead/delete.js similarity index 100% rename from src/frontend/js/app/nginx/dead/delete.js rename to frontend/js/app/nginx/dead/delete.js diff --git a/src/frontend/js/app/nginx/dead/form.ejs b/frontend/js/app/nginx/dead/form.ejs similarity index 100% rename from src/frontend/js/app/nginx/dead/form.ejs rename to frontend/js/app/nginx/dead/form.ejs diff --git a/src/frontend/js/app/nginx/dead/form.js b/frontend/js/app/nginx/dead/form.js similarity index 100% rename from src/frontend/js/app/nginx/dead/form.js rename to frontend/js/app/nginx/dead/form.js diff --git a/src/frontend/js/app/nginx/dead/list/item.ejs b/frontend/js/app/nginx/dead/list/item.ejs similarity index 100% rename from src/frontend/js/app/nginx/dead/list/item.ejs rename to frontend/js/app/nginx/dead/list/item.ejs diff --git a/src/frontend/js/app/nginx/dead/list/item.js b/frontend/js/app/nginx/dead/list/item.js similarity index 100% rename from src/frontend/js/app/nginx/dead/list/item.js rename to frontend/js/app/nginx/dead/list/item.js diff --git a/src/frontend/js/app/nginx/dead/list/main.ejs b/frontend/js/app/nginx/dead/list/main.ejs similarity index 100% rename from src/frontend/js/app/nginx/dead/list/main.ejs rename to frontend/js/app/nginx/dead/list/main.ejs diff --git a/src/frontend/js/app/nginx/dead/list/main.js b/frontend/js/app/nginx/dead/list/main.js similarity index 88% rename from src/frontend/js/app/nginx/dead/list/main.js rename to frontend/js/app/nginx/dead/list/main.js index 2c457bf5c..579314199 100644 --- a/src/frontend/js/app/nginx/dead/list/main.js +++ b/frontend/js/app/nginx/dead/list/main.js @@ -10,7 +10,7 @@ const TableBody = Mn.CollectionView.extend({ module.exports = Mn.View.extend({ tagName: 'table', - className: 'table table-hover table-outline table-vcenter text-nowrap card-table', + className: 'table table-hover table-outline table-vcenter card-table', template: template, regions: { diff --git a/src/frontend/js/app/nginx/dead/main.ejs b/frontend/js/app/nginx/dead/main.ejs similarity index 100% rename from src/frontend/js/app/nginx/dead/main.ejs rename to frontend/js/app/nginx/dead/main.ejs diff --git a/src/frontend/js/app/nginx/dead/main.js b/frontend/js/app/nginx/dead/main.js similarity index 100% rename from src/frontend/js/app/nginx/dead/main.js rename to frontend/js/app/nginx/dead/main.js diff --git a/src/frontend/js/app/nginx/proxy/access-list-item.ejs b/frontend/js/app/nginx/proxy/access-list-item.ejs similarity index 100% rename from src/frontend/js/app/nginx/proxy/access-list-item.ejs rename to frontend/js/app/nginx/proxy/access-list-item.ejs diff --git a/src/frontend/js/app/nginx/proxy/delete.ejs b/frontend/js/app/nginx/proxy/delete.ejs similarity index 100% rename from src/frontend/js/app/nginx/proxy/delete.ejs rename to frontend/js/app/nginx/proxy/delete.ejs diff --git a/src/frontend/js/app/nginx/proxy/delete.js b/frontend/js/app/nginx/proxy/delete.js similarity index 100% rename from src/frontend/js/app/nginx/proxy/delete.js rename to frontend/js/app/nginx/proxy/delete.js diff --git a/src/frontend/js/app/nginx/proxy/form.ejs b/frontend/js/app/nginx/proxy/form.ejs similarity index 100% rename from src/frontend/js/app/nginx/proxy/form.ejs rename to frontend/js/app/nginx/proxy/form.ejs diff --git a/src/frontend/js/app/nginx/proxy/form.js b/frontend/js/app/nginx/proxy/form.js similarity index 100% rename from src/frontend/js/app/nginx/proxy/form.js rename to frontend/js/app/nginx/proxy/form.js diff --git a/src/frontend/js/app/nginx/proxy/list/item.ejs b/frontend/js/app/nginx/proxy/list/item.ejs similarity index 99% rename from src/frontend/js/app/nginx/proxy/list/item.ejs rename to frontend/js/app/nginx/proxy/list/item.ejs index b1ce0449f..d90ace4c0 100644 --- a/src/frontend/js/app/nginx/proxy/list/item.ejs +++ b/frontend/js/app/nginx/proxy/list/item.ejs @@ -4,7 +4,7 @@ -
+
<% domain_names.map(function(host) { if (host.indexOf('*') === -1) { %> diff --git a/src/frontend/js/app/nginx/proxy/list/item.js b/frontend/js/app/nginx/proxy/list/item.js similarity index 100% rename from src/frontend/js/app/nginx/proxy/list/item.js rename to frontend/js/app/nginx/proxy/list/item.js diff --git a/src/frontend/js/app/nginx/proxy/list/main.ejs b/frontend/js/app/nginx/proxy/list/main.ejs similarity index 100% rename from src/frontend/js/app/nginx/proxy/list/main.ejs rename to frontend/js/app/nginx/proxy/list/main.ejs diff --git a/src/frontend/js/app/nginx/proxy/list/main.js b/frontend/js/app/nginx/proxy/list/main.js similarity index 88% rename from src/frontend/js/app/nginx/proxy/list/main.js rename to frontend/js/app/nginx/proxy/list/main.js index 054e856e7..09e984e62 100644 --- a/src/frontend/js/app/nginx/proxy/list/main.js +++ b/frontend/js/app/nginx/proxy/list/main.js @@ -10,7 +10,7 @@ const TableBody = Mn.CollectionView.extend({ module.exports = Mn.View.extend({ tagName: 'table', - className: 'table table-hover table-outline table-vcenter text-nowrap card-table', + className: 'table table-hover table-outline table-vcenter card-table', template: template, regions: { diff --git a/src/frontend/js/app/nginx/proxy/location-item.ejs b/frontend/js/app/nginx/proxy/location-item.ejs similarity index 100% rename from src/frontend/js/app/nginx/proxy/location-item.ejs rename to frontend/js/app/nginx/proxy/location-item.ejs diff --git a/src/frontend/js/app/nginx/proxy/location.js b/frontend/js/app/nginx/proxy/location.js similarity index 100% rename from src/frontend/js/app/nginx/proxy/location.js rename to frontend/js/app/nginx/proxy/location.js diff --git a/src/frontend/js/app/nginx/proxy/main.ejs b/frontend/js/app/nginx/proxy/main.ejs similarity index 100% rename from src/frontend/js/app/nginx/proxy/main.ejs rename to frontend/js/app/nginx/proxy/main.ejs diff --git a/src/frontend/js/app/nginx/proxy/main.js b/frontend/js/app/nginx/proxy/main.js similarity index 100% rename from src/frontend/js/app/nginx/proxy/main.js rename to frontend/js/app/nginx/proxy/main.js diff --git a/src/frontend/js/app/nginx/redirection/delete.ejs b/frontend/js/app/nginx/redirection/delete.ejs similarity index 100% rename from src/frontend/js/app/nginx/redirection/delete.ejs rename to frontend/js/app/nginx/redirection/delete.ejs diff --git a/src/frontend/js/app/nginx/redirection/delete.js b/frontend/js/app/nginx/redirection/delete.js similarity index 100% rename from src/frontend/js/app/nginx/redirection/delete.js rename to frontend/js/app/nginx/redirection/delete.js diff --git a/src/frontend/js/app/nginx/redirection/form.ejs b/frontend/js/app/nginx/redirection/form.ejs similarity index 100% rename from src/frontend/js/app/nginx/redirection/form.ejs rename to frontend/js/app/nginx/redirection/form.ejs diff --git a/src/frontend/js/app/nginx/redirection/form.js b/frontend/js/app/nginx/redirection/form.js similarity index 100% rename from src/frontend/js/app/nginx/redirection/form.js rename to frontend/js/app/nginx/redirection/form.js diff --git a/src/frontend/js/app/nginx/redirection/list/item.ejs b/frontend/js/app/nginx/redirection/list/item.ejs similarity index 100% rename from src/frontend/js/app/nginx/redirection/list/item.ejs rename to frontend/js/app/nginx/redirection/list/item.ejs diff --git a/src/frontend/js/app/nginx/redirection/list/item.js b/frontend/js/app/nginx/redirection/list/item.js similarity index 100% rename from src/frontend/js/app/nginx/redirection/list/item.js rename to frontend/js/app/nginx/redirection/list/item.js diff --git a/src/frontend/js/app/nginx/redirection/list/main.ejs b/frontend/js/app/nginx/redirection/list/main.ejs similarity index 100% rename from src/frontend/js/app/nginx/redirection/list/main.ejs rename to frontend/js/app/nginx/redirection/list/main.ejs diff --git a/src/frontend/js/app/nginx/redirection/list/main.js b/frontend/js/app/nginx/redirection/list/main.js similarity index 89% rename from src/frontend/js/app/nginx/redirection/list/main.js rename to frontend/js/app/nginx/redirection/list/main.js index 5aa501e62..d368cf6aa 100644 --- a/src/frontend/js/app/nginx/redirection/list/main.js +++ b/frontend/js/app/nginx/redirection/list/main.js @@ -10,7 +10,7 @@ const TableBody = Mn.CollectionView.extend({ module.exports = Mn.View.extend({ tagName: 'table', - className: 'table table-hover table-outline table-vcenter text-nowrap card-table', + className: 'table table-hover table-outline table-vcenter card-table', template: template, regions: { diff --git a/src/frontend/js/app/nginx/redirection/main.ejs b/frontend/js/app/nginx/redirection/main.ejs similarity index 100% rename from src/frontend/js/app/nginx/redirection/main.ejs rename to frontend/js/app/nginx/redirection/main.ejs diff --git a/src/frontend/js/app/nginx/redirection/main.js b/frontend/js/app/nginx/redirection/main.js similarity index 100% rename from src/frontend/js/app/nginx/redirection/main.js rename to frontend/js/app/nginx/redirection/main.js diff --git a/src/frontend/js/app/nginx/stream/delete.ejs b/frontend/js/app/nginx/stream/delete.ejs similarity index 100% rename from src/frontend/js/app/nginx/stream/delete.ejs rename to frontend/js/app/nginx/stream/delete.ejs diff --git a/src/frontend/js/app/nginx/stream/delete.js b/frontend/js/app/nginx/stream/delete.js similarity index 100% rename from src/frontend/js/app/nginx/stream/delete.js rename to frontend/js/app/nginx/stream/delete.js diff --git a/src/frontend/js/app/nginx/stream/form.ejs b/frontend/js/app/nginx/stream/form.ejs similarity index 100% rename from src/frontend/js/app/nginx/stream/form.ejs rename to frontend/js/app/nginx/stream/form.ejs diff --git a/src/frontend/js/app/nginx/stream/form.js b/frontend/js/app/nginx/stream/form.js similarity index 100% rename from src/frontend/js/app/nginx/stream/form.js rename to frontend/js/app/nginx/stream/form.js diff --git a/src/frontend/js/app/nginx/stream/list/item.ejs b/frontend/js/app/nginx/stream/list/item.ejs similarity index 100% rename from src/frontend/js/app/nginx/stream/list/item.ejs rename to frontend/js/app/nginx/stream/list/item.ejs diff --git a/src/frontend/js/app/nginx/stream/list/item.js b/frontend/js/app/nginx/stream/list/item.js similarity index 100% rename from src/frontend/js/app/nginx/stream/list/item.js rename to frontend/js/app/nginx/stream/list/item.js diff --git a/src/frontend/js/app/nginx/stream/list/main.ejs b/frontend/js/app/nginx/stream/list/main.ejs similarity index 100% rename from src/frontend/js/app/nginx/stream/list/main.ejs rename to frontend/js/app/nginx/stream/list/main.ejs diff --git a/src/frontend/js/app/nginx/stream/list/main.js b/frontend/js/app/nginx/stream/list/main.js similarity index 88% rename from src/frontend/js/app/nginx/stream/list/main.js rename to frontend/js/app/nginx/stream/list/main.js index 4b1e27e20..36be621d9 100644 --- a/src/frontend/js/app/nginx/stream/list/main.js +++ b/frontend/js/app/nginx/stream/list/main.js @@ -10,7 +10,7 @@ const TableBody = Mn.CollectionView.extend({ module.exports = Mn.View.extend({ tagName: 'table', - className: 'table table-hover table-outline table-vcenter text-nowrap card-table', + className: 'table table-hover table-outline table-vcenter card-table', template: template, regions: { diff --git a/src/frontend/js/app/nginx/stream/main.ejs b/frontend/js/app/nginx/stream/main.ejs similarity index 100% rename from src/frontend/js/app/nginx/stream/main.ejs rename to frontend/js/app/nginx/stream/main.ejs diff --git a/src/frontend/js/app/nginx/stream/main.js b/frontend/js/app/nginx/stream/main.js similarity index 100% rename from src/frontend/js/app/nginx/stream/main.js rename to frontend/js/app/nginx/stream/main.js diff --git a/src/frontend/js/app/router.js b/frontend/js/app/router.js similarity index 100% rename from src/frontend/js/app/router.js rename to frontend/js/app/router.js diff --git a/src/frontend/js/app/settings/default-site/main.ejs b/frontend/js/app/settings/default-site/main.ejs similarity index 100% rename from src/frontend/js/app/settings/default-site/main.ejs rename to frontend/js/app/settings/default-site/main.ejs diff --git a/src/frontend/js/app/settings/default-site/main.js b/frontend/js/app/settings/default-site/main.js similarity index 100% rename from src/frontend/js/app/settings/default-site/main.js rename to frontend/js/app/settings/default-site/main.js diff --git a/src/frontend/js/app/settings/list/item.ejs b/frontend/js/app/settings/list/item.ejs similarity index 100% rename from src/frontend/js/app/settings/list/item.ejs rename to frontend/js/app/settings/list/item.ejs diff --git a/src/frontend/js/app/settings/list/item.js b/frontend/js/app/settings/list/item.js similarity index 100% rename from src/frontend/js/app/settings/list/item.js rename to frontend/js/app/settings/list/item.js diff --git a/src/frontend/js/app/settings/list/main.ejs b/frontend/js/app/settings/list/main.ejs similarity index 100% rename from src/frontend/js/app/settings/list/main.ejs rename to frontend/js/app/settings/list/main.ejs diff --git a/src/frontend/js/app/audit-log/list/main.js b/frontend/js/app/settings/list/main.js similarity index 86% rename from src/frontend/js/app/audit-log/list/main.js rename to frontend/js/app/settings/list/main.js index 88e639e80..9d3e26fb1 100644 --- a/src/frontend/js/app/audit-log/list/main.js +++ b/frontend/js/app/settings/list/main.js @@ -9,7 +9,7 @@ const TableBody = Mn.CollectionView.extend({ module.exports = Mn.View.extend({ tagName: 'table', - className: 'table table-hover table-outline table-vcenter text-nowrap card-table', + className: 'table table-hover table-outline table-vcenter card-table', template: template, regions: { diff --git a/src/frontend/js/app/settings/main.ejs b/frontend/js/app/settings/main.ejs similarity index 100% rename from src/frontend/js/app/settings/main.ejs rename to frontend/js/app/settings/main.ejs diff --git a/src/frontend/js/app/settings/main.js b/frontend/js/app/settings/main.js similarity index 100% rename from src/frontend/js/app/settings/main.js rename to frontend/js/app/settings/main.js diff --git a/src/frontend/js/app/tokens.js b/frontend/js/app/tokens.js similarity index 100% rename from src/frontend/js/app/tokens.js rename to frontend/js/app/tokens.js diff --git a/src/frontend/js/app/ui/footer/main.ejs b/frontend/js/app/ui/footer/main.ejs similarity index 100% rename from src/frontend/js/app/ui/footer/main.ejs rename to frontend/js/app/ui/footer/main.ejs diff --git a/src/frontend/js/app/ui/footer/main.js b/frontend/js/app/ui/footer/main.js similarity index 100% rename from src/frontend/js/app/ui/footer/main.js rename to frontend/js/app/ui/footer/main.js diff --git a/src/frontend/js/app/ui/header/main.ejs b/frontend/js/app/ui/header/main.ejs similarity index 100% rename from src/frontend/js/app/ui/header/main.ejs rename to frontend/js/app/ui/header/main.ejs diff --git a/src/frontend/js/app/ui/header/main.js b/frontend/js/app/ui/header/main.js similarity index 100% rename from src/frontend/js/app/ui/header/main.js rename to frontend/js/app/ui/header/main.js diff --git a/src/frontend/js/app/ui/main.ejs b/frontend/js/app/ui/main.ejs similarity index 100% rename from src/frontend/js/app/ui/main.ejs rename to frontend/js/app/ui/main.ejs diff --git a/src/frontend/js/app/ui/main.js b/frontend/js/app/ui/main.js similarity index 100% rename from src/frontend/js/app/ui/main.js rename to frontend/js/app/ui/main.js diff --git a/src/frontend/js/app/ui/menu/main.ejs b/frontend/js/app/ui/menu/main.ejs similarity index 100% rename from src/frontend/js/app/ui/menu/main.ejs rename to frontend/js/app/ui/menu/main.ejs diff --git a/src/frontend/js/app/ui/menu/main.js b/frontend/js/app/ui/menu/main.js similarity index 100% rename from src/frontend/js/app/ui/menu/main.js rename to frontend/js/app/ui/menu/main.js diff --git a/src/frontend/js/app/user/delete.ejs b/frontend/js/app/user/delete.ejs similarity index 100% rename from src/frontend/js/app/user/delete.ejs rename to frontend/js/app/user/delete.ejs diff --git a/src/frontend/js/app/user/delete.js b/frontend/js/app/user/delete.js similarity index 100% rename from src/frontend/js/app/user/delete.js rename to frontend/js/app/user/delete.js diff --git a/src/frontend/js/app/user/form.ejs b/frontend/js/app/user/form.ejs similarity index 100% rename from src/frontend/js/app/user/form.ejs rename to frontend/js/app/user/form.ejs diff --git a/src/frontend/js/app/user/form.js b/frontend/js/app/user/form.js similarity index 100% rename from src/frontend/js/app/user/form.js rename to frontend/js/app/user/form.js diff --git a/src/frontend/js/app/user/password.ejs b/frontend/js/app/user/password.ejs similarity index 100% rename from src/frontend/js/app/user/password.ejs rename to frontend/js/app/user/password.ejs diff --git a/src/frontend/js/app/user/password.js b/frontend/js/app/user/password.js similarity index 100% rename from src/frontend/js/app/user/password.js rename to frontend/js/app/user/password.js diff --git a/src/frontend/js/app/user/permissions.ejs b/frontend/js/app/user/permissions.ejs similarity index 100% rename from src/frontend/js/app/user/permissions.ejs rename to frontend/js/app/user/permissions.ejs diff --git a/src/frontend/js/app/user/permissions.js b/frontend/js/app/user/permissions.js similarity index 100% rename from src/frontend/js/app/user/permissions.js rename to frontend/js/app/user/permissions.js diff --git a/src/frontend/js/app/users/list/item.ejs b/frontend/js/app/users/list/item.ejs similarity index 100% rename from src/frontend/js/app/users/list/item.ejs rename to frontend/js/app/users/list/item.ejs diff --git a/src/frontend/js/app/users/list/item.js b/frontend/js/app/users/list/item.js similarity index 100% rename from src/frontend/js/app/users/list/item.js rename to frontend/js/app/users/list/item.js diff --git a/src/frontend/js/app/users/list/main.ejs b/frontend/js/app/users/list/main.ejs similarity index 100% rename from src/frontend/js/app/users/list/main.ejs rename to frontend/js/app/users/list/main.ejs diff --git a/src/frontend/js/app/settings/list/main.js b/frontend/js/app/users/list/main.js similarity index 86% rename from src/frontend/js/app/settings/list/main.js rename to frontend/js/app/users/list/main.js index 88e639e80..9d3e26fb1 100644 --- a/src/frontend/js/app/settings/list/main.js +++ b/frontend/js/app/users/list/main.js @@ -9,7 +9,7 @@ const TableBody = Mn.CollectionView.extend({ module.exports = Mn.View.extend({ tagName: 'table', - className: 'table table-hover table-outline table-vcenter text-nowrap card-table', + className: 'table table-hover table-outline table-vcenter card-table', template: template, regions: { diff --git a/src/frontend/js/app/users/main.ejs b/frontend/js/app/users/main.ejs similarity index 100% rename from src/frontend/js/app/users/main.ejs rename to frontend/js/app/users/main.ejs diff --git a/src/frontend/js/app/users/main.js b/frontend/js/app/users/main.js similarity index 100% rename from src/frontend/js/app/users/main.js rename to frontend/js/app/users/main.js diff --git a/src/frontend/js/i18n/messages.json b/frontend/js/i18n/messages.json similarity index 100% rename from src/frontend/js/i18n/messages.json rename to frontend/js/i18n/messages.json diff --git a/src/frontend/js/index.js b/frontend/js/index.js similarity index 100% rename from src/frontend/js/index.js rename to frontend/js/index.js diff --git a/src/frontend/js/lib/helpers.js b/frontend/js/lib/helpers.js similarity index 100% rename from src/frontend/js/lib/helpers.js rename to frontend/js/lib/helpers.js diff --git a/src/frontend/js/lib/marionette.js b/frontend/js/lib/marionette.js similarity index 100% rename from src/frontend/js/lib/marionette.js rename to frontend/js/lib/marionette.js diff --git a/src/frontend/js/login.js b/frontend/js/login.js similarity index 100% rename from src/frontend/js/login.js rename to frontend/js/login.js diff --git a/src/frontend/js/login/main.js b/frontend/js/login/main.js similarity index 99% rename from src/frontend/js/login/main.js rename to frontend/js/login/main.js index 934a073a5..03fdc7e56 100644 --- a/src/frontend/js/login/main.js +++ b/frontend/js/login/main.js @@ -2,7 +2,6 @@ const Mn = require('backbone.marionette'); const LoginView = require('./ui/login'); const App = Mn.Application.extend({ - region: '#login', UI: null, diff --git a/src/frontend/js/login/ui/login.ejs b/frontend/js/login/ui/login.ejs similarity index 100% rename from src/frontend/js/login/ui/login.ejs rename to frontend/js/login/ui/login.ejs diff --git a/src/frontend/js/login/ui/login.js b/frontend/js/login/ui/login.js similarity index 100% rename from src/frontend/js/login/ui/login.js rename to frontend/js/login/ui/login.js diff --git a/src/frontend/js/models/access-list.js b/frontend/js/models/access-list.js similarity index 100% rename from src/frontend/js/models/access-list.js rename to frontend/js/models/access-list.js diff --git a/src/frontend/js/models/audit-log.js b/frontend/js/models/audit-log.js similarity index 100% rename from src/frontend/js/models/audit-log.js rename to frontend/js/models/audit-log.js diff --git a/src/frontend/js/models/certificate.js b/frontend/js/models/certificate.js similarity index 100% rename from src/frontend/js/models/certificate.js rename to frontend/js/models/certificate.js diff --git a/src/frontend/js/models/dead-host.js b/frontend/js/models/dead-host.js similarity index 100% rename from src/frontend/js/models/dead-host.js rename to frontend/js/models/dead-host.js diff --git a/src/frontend/js/models/proxy-host-location.js b/frontend/js/models/proxy-host-location.js similarity index 100% rename from src/frontend/js/models/proxy-host-location.js rename to frontend/js/models/proxy-host-location.js diff --git a/src/frontend/js/models/proxy-host.js b/frontend/js/models/proxy-host.js similarity index 100% rename from src/frontend/js/models/proxy-host.js rename to frontend/js/models/proxy-host.js diff --git a/src/frontend/js/models/redirection-host.js b/frontend/js/models/redirection-host.js similarity index 100% rename from src/frontend/js/models/redirection-host.js rename to frontend/js/models/redirection-host.js diff --git a/src/frontend/js/models/setting.js b/frontend/js/models/setting.js similarity index 100% rename from src/frontend/js/models/setting.js rename to frontend/js/models/setting.js diff --git a/src/frontend/js/models/stream.js b/frontend/js/models/stream.js similarity index 100% rename from src/frontend/js/models/stream.js rename to frontend/js/models/stream.js diff --git a/src/frontend/js/models/user.js b/frontend/js/models/user.js similarity index 100% rename from src/frontend/js/models/user.js rename to frontend/js/models/user.js diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 000000000..790afe9ea --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,48 @@ +{ + "name": "nginx-proxy-manager", + "version": "2.1.0", + "description": "A beautiful interface for creating Nginx endpoints", + "main": "js/index.js", + "devDependencies": { + "@babel/core": "^7.8.3", + "babel-core": "^6.26.3", + "babel-loader": "^8.0.6", + "babel-minify-webpack-plugin": "^0.3.1", + "babel-preset-env": "^1.7.0", + "backbone": "^1.4.0", + "backbone.marionette": "^4.1.2", + "copy-webpack-plugin": "^5.1.1", + "css-loader": "^3.4.2", + "ejs-lint": "^1.0.1", + "ejs-loader": "^0.3.5", + "ejs-webpack-loader": "^2.2.2", + "file-loader": "^5.0.2", + "html-webpack-plugin": "^3.2.0", + "imports-loader": "^0.8.0", + "jquery": "^3.4.1", + "jquery-mask-plugin": "^1.14.16", + "jquery-serializejson": "^2.9.0", + "marionette.approuter": "^1.0.2", + "marionette.templatecache": "^1.0.0", + "messageformat": "^2.3.0", + "messageformat-loader": "^0.8.1", + "mini-css-extract-plugin": "^0.9.0", + "moment": "^2.24.0", + "node-sass": "^4.13.1", + "nodemon": "^2.0.2", + "numeral": "^2.0.6", + "sass-loader": "^8.0.2", + "style-loader": "^1.1.3", + "tabler-ui": "git+https://github.com/tabler/tabler.git#00f78ad823311bc3ad974ac3e5b0126198f0a813", + "underscore": "^1.9.2", + "webpack": "^4.41.5", + "webpack-cli": "^3.3.10", + "webpack-visualizer-plugin": "^0.1.11" + }, + "scripts": { + "build": "webpack --mode production", + "watch": "webpack --watch --mode development" + }, + "author": "Jamie Curnow ", + "license": "MIT" +} diff --git a/src/frontend/scss/custom.scss b/frontend/scss/custom.scss similarity index 100% rename from src/frontend/scss/custom.scss rename to frontend/scss/custom.scss diff --git a/src/frontend/scss/selectize.scss b/frontend/scss/selectize.scss similarity index 100% rename from src/frontend/scss/selectize.scss rename to frontend/scss/selectize.scss diff --git a/src/frontend/scss/styles.scss b/frontend/scss/styles.scss similarity index 100% rename from src/frontend/scss/styles.scss rename to frontend/scss/styles.scss diff --git a/src/frontend/scss/tabler-extra.scss b/frontend/scss/tabler-extra.scss similarity index 100% rename from src/frontend/scss/tabler-extra.scss rename to frontend/scss/tabler-extra.scss diff --git a/frontend/webpack.config.js b/frontend/webpack.config.js new file mode 100644 index 000000000..8b911dc1b --- /dev/null +++ b/frontend/webpack.config.js @@ -0,0 +1,132 @@ +const path = require('path'); +const webpack = require('webpack'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const Visualizer = require('webpack-visualizer-plugin'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const PACKAGE = require('./package.json'); + +module.exports = { + entry: { + main: './js/index.js', + login: './js/login.js' + }, + output: { + path: path.resolve(__dirname, 'dist'), + filename: 'js/[name].bundle.js', + chunkFilename: 'js/[name].bundle.[id].js', + publicPath: '/' + }, + resolve: { + alias: { + 'tabler-core': 'tabler-ui/dist/assets/js/core', + 'bootstrap': 'tabler-ui/dist/assets/js/vendors/bootstrap.bundle.min', + 'sparkline': 'tabler-ui/dist/assets/js/vendors/jquery.sparkline.min', + 'selectize': 'tabler-ui/dist/assets/js/vendors/selectize.min', + 'tablesorter': 'tabler-ui/dist/assets/js/vendors/jquery.tablesorter.min', + 'vector-map': 'tabler-ui/dist/assets/js/vendors/jquery-jvectormap-2.0.3.min', + 'vector-map-de': 'tabler-ui/dist/assets/js/vendors/jquery-jvectormap-de-merc', + 'vector-map-world': 'tabler-ui/dist/assets/js/vendors/jquery-jvectormap-world-mill', + 'circle-progress': 'tabler-ui/dist/assets/js/vendors/circle-progress.min', + 'c3': 'tabler-ui/dist/assets/js/vendors/chart.bundle.min' + } + }, + module: { + rules: [ + // Shims for tabler-ui + { + test: /assets\/js\/core/, + loader: 'imports-loader?bootstrap' + }, + { + test: /jquery-jvectormap-de-merc/, + loader: 'imports-loader?vector-map' + }, + { + test: /jquery-jvectormap-world-mill/, + loader: 'imports-loader?vector-map' + }, + + // other: + { + type: 'javascript/auto', // <= Set the module.type explicitly + test: /\bmessages\.json$/, + loader: 'messageformat-loader', + options: { + biDiSupport: false, + disablePluralKeyChecks: false, + formatters: null, + intlSupport: false, + locale: ['en'], + strictNumberSign: false + } + }, + { + test: /\.js$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader' + } + }, + { + test: /\.ejs$/, + loader: 'ejs-loader' + }, + { + test: /\.scss$/, + use: [ + MiniCssExtractPlugin.loader, + 'css-loader', + 'sass-loader' + ] + }, + { + test: /.*tabler.*\.(jpe?g|gif|png|svg|eot|woff|ttf)$/, + use: [ + { + loader: 'file-loader', + options: { + outputPath: 'assets/tabler-ui/' + } + } + ] + } + ] + }, + plugins: [ + new webpack.ProvidePlugin({ + $: 'jquery', + jQuery: 'jquery', + _: 'underscore' + }), + new HtmlWebpackPlugin({ + template: '!!ejs-webpack-loader!html/index.ejs', + filename: 'index.html', + inject: false, + templateParameters: { + version: PACKAGE.version + } + }), + new HtmlWebpackPlugin({ + template: '!!ejs-webpack-loader!html/login.ejs', + filename: 'login.html', + inject: false, + templateParameters: { + version: PACKAGE.version + } + }), + new MiniCssExtractPlugin({ + filename: 'css/[name].css', + chunkFilename: 'css/[id].css' + }), + new Visualizer({ + filename: '../webpack_stats.html' + }), + new CopyWebpackPlugin([{ + from: 'app-images', + to: 'images', + toType: 'dir', + context: '/app/frontend' + }]) + ] +}; diff --git a/frontend/yarn.lock b/frontend/yarn.lock new file mode 100644 index 000000000..d07406c25 --- /dev/null +++ b/frontend/yarn.lock @@ -0,0 +1,6950 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + +"@babel/core@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.3.tgz#30b0ebb4dd1585de6923a0b4d179e0b9f5d82941" + integrity sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.8.3" + "@babel/helpers" "^7.8.3" + "@babel/parser" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.3.tgz#0e22c005b0a94c1c74eafe19ef78ce53a4d45c03" + integrity sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug== + dependencies: + "@babel/types" "^7.8.3" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" + integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/helper-get-function-arity@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helpers@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.3.tgz#382fbb0382ce7c4ce905945ab9641d688336ce85" + integrity sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ== + dependencies: + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/highlight@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" + integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.3.tgz#790874091d2001c9be6ec426c2eed47bc7679081" + integrity sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ== + +"@babel/runtime@^7.6.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.3.tgz#0811944f73a6c926bb2ad35e918dcc1bfab279f1" + integrity sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w== + dependencies: + regenerator-runtime "^0.13.2" + +"@babel/template@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8" + integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.3" + "@babel/types" "^7.8.3" + +"@babel/traverse@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.3.tgz#a826215b011c9b4f73f3a893afbc05151358bf9a" + integrity sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.8.3" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.8.3" + "@babel/types" "^7.8.3" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" + integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== + dependencies: + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== + +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== + +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== + +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== + dependencies: + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== + +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== + +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= + dependencies: + acorn "^3.0.4" + +acorn-node@^1.2.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.0.0.tgz#c8ba6f0f1aac4b0a9e32d1f0af12be769528f36b" + integrity sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg== + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= + +acorn@^5.2.1, acorn@^5.5.0: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.2.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" + integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== + +acorn@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + +ajv@^5.2.3, ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.5.5: + version "6.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9" + integrity sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types@0.9.6: + version "0.9.6" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" + integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= + +async@~0.2.6: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.26.0, babel-core@^6.26.3: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-evaluate-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.3.0.tgz#2439545e0b6eae5b7f49b790acbebd6b9a73df20" + integrity sha512-dRFlMTqUJRGzx5a2smKxmptDdNCXKSkPcXWzKLwAV72hvIZumrd/0z9RcewHkr7PmAEq+ETtpD1GK6wZ6ZUXzw== + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-flip-expressions@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.3.0.tgz#f5b6394bd5219b43cf8f7b201535ed540c6e7fa2" + integrity sha512-kNGohWmtAG3b7tN1xocRQ5rsKkH/hpvZsMiGOJ1VwGJKhnwzR5KlB3rvKBaBPl5/IGHcopB2JN+r1SUEX1iMAw== + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-is-nodes-equiv@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz#34e9b300b1479ddd98ec77ea0bbe9342dfe39684" + integrity sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ= + +babel-helper-is-void-0@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-is-void-0/-/babel-helper-is-void-0-0.3.0.tgz#95570d20bd27b2206f68083ae9980ee7003d8fe7" + integrity sha512-JVqdX8y7Rf/x4NwbqtUI7mdQjL9HWoDnoAEQ8Gv8oxzjvbJv+n75f7l36m9Y8C7sCUltX3V5edndrp7Hp1oSXQ== + +babel-helper-mark-eval-scopes@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.3.0.tgz#b4731314fdd7a89091271a5213b4e12d236e29e8" + integrity sha512-nrho5Dg4vl0VUgURVpGpEGiwbst5JX7efIyDHFxmkCx/ocQFnrPt8ze9Kxl6TKjR29bJ7D/XKY1NMlSxOQJRbQ== + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-remove-or-void@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.3.0.tgz#f43c86147c8fcc395a9528cbb31e7ff49d7e16e3" + integrity sha512-D68W1M3ibCcbg0ysh3ww4/O0g10X1CXK720oOuR8kpfY7w0yP4tVcpK7zDmI1JecynycTQYAZ1rhLJo9aVtIKQ== + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-to-multiple-sequence-expressions@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.3.0.tgz#8da2275ccc26995566118f7213abfd9af7214427" + integrity sha512-1uCrBD+EAaMnAYh7hc944n8Ga19y3daEnoXWPYDvFVsxMCc1l8aDjksApaCEaNSSuewq8BEcff47Cy1PbLg2Gw== + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-loader@^8.0.6: + version "8.0.6" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" + integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw== + dependencies: + find-cache-dir "^2.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + pify "^4.0.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-minify-webpack-plugin@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-minify-webpack-plugin/-/babel-minify-webpack-plugin-0.3.1.tgz#292aa240af190e2dcadf4f684d6d84d179b6d5a4" + integrity sha512-Johg6Ju0Gxevk2R55eutMqnyXwlyUzCtwunBpiyNzoxGnKum+x5nfNuYZYHGd5Bmc1gmhjwzb7GkxHWOtYWmtQ== + dependencies: + babel-core "^6.26.0" + babel-preset-minify "^0.3.0" + webpack-sources "^1.0.1" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-minify-builtins@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.3.0.tgz#4740117a6a784063aaf8f092989cf9e4bd484860" + integrity sha512-MqhSHlxkmgURqj3144qPksbZ/qof1JWdumcbucc4tysFcf3P3V3z3munTevQgKEFNMd8F5/ECGnwb63xogLjAg== + dependencies: + babel-helper-evaluate-path "^0.3.0" + +babel-plugin-minify-constant-folding@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.3.0.tgz#687e40336bd4ddd921e0e197f0006235ac184bb9" + integrity sha512-1XeRpx+aY1BuNY6QU/cm6P+FtEi3ar3XceYbmC+4q4W+2Ewq5pL7V68oHg1hKXkBIE0Z4/FjSoHz6vosZLOe/A== + dependencies: + babel-helper-evaluate-path "^0.3.0" + +babel-plugin-minify-dead-code-elimination@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.3.0.tgz#a323f686c404b824186ba5583cf7996cac81719e" + integrity sha512-SjM2Fzg85YZz+q/PNJ/HU4O3W98FKFOiP9K5z3sfonlamGOzvZw3Eup2OTiEBsbbqTeY8yzNCAv3qpJRYCgGmw== + dependencies: + babel-helper-evaluate-path "^0.3.0" + babel-helper-mark-eval-scopes "^0.3.0" + babel-helper-remove-or-void "^0.3.0" + lodash.some "^4.6.0" + +babel-plugin-minify-flip-comparisons@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.3.0.tgz#6627893a409c9f30ef7f2c89e0c6eea7ee97ddc4" + integrity sha512-B8lK+ekcpSNVH7PZpWDe5nC5zxjRiiT4nTsa6h3QkF3Kk6y9qooIFLemdGlqBq6j0zALEnebvCpw8v7gAdpgnw== + dependencies: + babel-helper-is-void-0 "^0.3.0" + +babel-plugin-minify-guarded-expressions@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.3.0.tgz#2552d96189ef45d9a463f1a6b5e4fa110703ac8d" + integrity sha512-O+6CvF5/Ttsth3LMg4/BhyvVZ82GImeKMXGdVRQGK/8jFiP15EjRpdgFlxv3cnqRjqdYxLCS6r28VfLpb9C/kA== + dependencies: + babel-helper-flip-expressions "^0.3.0" + +babel-plugin-minify-infinity@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.3.0.tgz#c5ec0edd433517cf31b3af17077c202beb48bbe7" + integrity sha512-Sj8ia3/w9158DWieUxU6/VvnYVy59geeFEkVgLZYBE8EBP+sN48tHtBM/jSgz0ejEdBlcfqJ6TnvPmVXTzR2BQ== + +babel-plugin-minify-mangle-names@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.3.0.tgz#f28561bad0dd2f0380816816bb946e219b3b6135" + integrity sha512-PYTonhFWURsfAN8achDwvR5Xgy6EeTClLz+fSgGRqjAIXb0OyFm3/xfccbQviVi1qDXmlSnt6oJhBg8KE4Fn7Q== + dependencies: + babel-helper-mark-eval-scopes "^0.3.0" + +babel-plugin-minify-numeric-literals@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.3.0.tgz#b57734a612e8a592005407323c321119f27d4b40" + integrity sha512-TgZj6ay8zDw74AS3yiIfoQ8vRSNJisYO/Du60S8nPV7EW7JM6fDMx5Sar6yVHlVuuwNgvDUBh191K33bVrAhpg== + +babel-plugin-minify-replace@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.3.0.tgz#980125bbf7cbb5a637439de9d0b1b030a4693893" + integrity sha512-VR6tTg2Lt0TicHIOw04fsUtpPw7RaRP8PC8YzSFwEixnzvguZjZJoL7TgG7ZyEWQD1cJ96UezswECmFNa815bg== + +babel-plugin-minify-simplify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.3.0.tgz#14574cc74d21c81d3060fafa041010028189f11b" + integrity sha512-2M16ytQOCqBi7bYMu4DCWn8e6KyFCA108F6+tVrBJxOmm5u2sOmTFEa8s94tR9RHRRNYmcUf+rgidfnzL3ik9Q== + dependencies: + babel-helper-flip-expressions "^0.3.0" + babel-helper-is-nodes-equiv "^0.0.1" + babel-helper-to-multiple-sequence-expressions "^0.3.0" + +babel-plugin-minify-type-constructors@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.3.0.tgz#7f5a86ef322c4746364e3c591b8514eeafea6ad4" + integrity sha512-XRXpvsUCPeVw9YEUw+9vSiugcSZfow81oIJT0yR9s8H4W7yJ6FHbImi5DJHoL8KcDUjYnL9wYASXk/fOkbyR6Q== + dependencies: + babel-helper-is-void-0 "^0.3.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= + +babel-plugin-transform-async-to-generator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-inline-consecutive-adds@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.3.0.tgz#f07d93689c0002ed2b2b62969bdd99f734e03f57" + integrity sha512-iZsYAIjYLLfLK0yN5WVT7Xf7Y3wQ9Z75j9A8q/0IglQSpUt2ppTdHlwl/GeaXnxdaSmsxBu861klbTBbv2n+RA== + +babel-plugin-transform-member-expression-literals@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz#37039c9a0c3313a39495faac2ff3a6b5b9d038bf" + integrity sha1-NwOcmgwzE6OUlfqsL/OmtbnQOL8= + +babel-plugin-transform-merge-sibling-variables@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz#85b422fc3377b449c9d1cde44087203532401dae" + integrity sha1-hbQi/DN3tEnJ0c3kQIcgNTJAHa4= + +babel-plugin-transform-minify-booleans@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz#acbb3e56a3555dd23928e4b582d285162dd2b198" + integrity sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg= + +babel-plugin-transform-property-literals@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz#98c1d21e255736573f93ece54459f6ce24985d39" + integrity sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk= + dependencies: + esutils "^2.0.2" + +babel-plugin-transform-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-regexp-constructors@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.3.0.tgz#9bb2c8dd082271a5cb1b3a441a7c52e8fd07e0f5" + integrity sha512-h92YHzyl042rb0naKO8frTHntpRFwRgKkfWD8602kFHoQingjJNtbvZzvxqHncJ6XmKVyYvfrBpDOSkCTDIIxw== + +babel-plugin-transform-remove-console@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz#b980360c067384e24b357a588d807d3c83527780" + integrity sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A= + +babel-plugin-transform-remove-debugger@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz#42b727631c97978e1eb2d199a7aec84a18339ef2" + integrity sha1-QrcnYxyXl44estGZp67IShgznvI= + +babel-plugin-transform-remove-undefined@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.3.0.tgz#03f5f0071867781e9beabbc7b77bf8095fd3f3ec" + integrity sha512-TYGQucc8iP3LJwN3kDZLEz5aa/2KuFrqpT+s8f8NnHsBU1sAgR3y8Opns0xhC+smyDYWscqFCKM1gbkWQOhhnw== + dependencies: + babel-helper-evaluate-path "^0.3.0" + +babel-plugin-transform-simplify-comparison-operators@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz#f62afe096cab0e1f68a2d753fdf283888471ceb9" + integrity sha1-9ir+CWyrDh9ootdT/fKDiIRxzrk= + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-undefined-to-void@^6.9.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz#be241ca81404030678b748717322b89d0c8fe280" + integrity sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA= + +babel-preset-env@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^3.2.6" + invariant "^2.2.2" + semver "^5.3.0" + +babel-preset-minify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-preset-minify/-/babel-preset-minify-0.3.0.tgz#7db64afa75f16f6e06c0aa5f25195f6f36784d77" + integrity sha512-+VV2GWEyak3eDOmzT1DDMuqHrw3VbE9nBNkx2LLVs4pH/Me32ND8DRpVDd8IRvk1xX5p75nygyRPtkMh6GIAbQ== + dependencies: + babel-plugin-minify-builtins "^0.3.0" + babel-plugin-minify-constant-folding "^0.3.0" + babel-plugin-minify-dead-code-elimination "^0.3.0" + babel-plugin-minify-flip-comparisons "^0.3.0" + babel-plugin-minify-guarded-expressions "^0.3.0" + babel-plugin-minify-infinity "^0.3.0" + babel-plugin-minify-mangle-names "^0.3.0" + babel-plugin-minify-numeric-literals "^0.3.0" + babel-plugin-minify-replace "^0.3.0" + babel-plugin-minify-simplify "^0.3.0" + babel-plugin-minify-type-constructors "^0.3.0" + babel-plugin-transform-inline-consecutive-adds "^0.3.0" + babel-plugin-transform-member-expression-literals "^6.9.0" + babel-plugin-transform-merge-sibling-variables "^6.9.0" + babel-plugin-transform-minify-booleans "^6.9.0" + babel-plugin-transform-property-literals "^6.9.0" + babel-plugin-transform-regexp-constructors "^0.3.0" + babel-plugin-transform-remove-console "^6.9.0" + babel-plugin-transform-remove-debugger "^6.9.0" + babel-plugin-transform-remove-undefined "^0.3.0" + babel-plugin-transform-simplify-comparison-operators "^6.9.0" + babel-plugin-transform-undefined-to-void "^6.9.0" + lodash.isplainobject "^4.0.6" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +"backbone.marionette@^4.0.0, 4.0.0-beta.1": + version "4.0.0-beta.1" + resolved "https://registry.yarnpkg.com/backbone.marionette/-/backbone.marionette-4.0.0-beta.1.tgz#793528fc5c60620200e2440e6dcd04ba16c3aab3" + integrity sha1-eTUo/FxgYgIA4kQObc0EuhbDqrM= + dependencies: + backbone.radio "^2.0.0" + +backbone.marionette@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/backbone.marionette/-/backbone.marionette-4.1.2.tgz#55de74363219f6d5c343dab5bff6aeb20fc44419" + integrity sha512-T8wWxZZnuYjylONTnWZsGsgXtdx2ZrE38pZWJI9LmPqzYK5j0T8uduapFO7OEpsW5rtdbBgwof30xhzAkbb5eQ== + dependencies: + backbone.radio "^2.0.0" + +backbone.radio@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/backbone.radio/-/backbone.radio-2.0.0.tgz#bbe8672b373e313f99f36d2fbcf583fe77d04f42" + integrity sha1-u+hnKzc+MT+Z820vvPWD/nfQT0I= + +backbone@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.4.0.tgz#54db4de9df7c3811c3f032f34749a4cd27f3bd12" + integrity sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ== + dependencies: + underscore ">=1.8.3" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base62@^1.1.0: + version "1.2.8" + resolved "https://registry.yarnpkg.com/base62/-/base62-1.2.8.tgz#1264cb0fb848d875792877479dbe8bae6bae3428" + integrity sha512-V6YHUbjLxN1ymqNLb1DPHoU1CpfdL7d2YTIp5W3U4hhoG4hhxNmsFDs66M9EXxBiSEke5Bt5dwdfMwwZF70iLA== + +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + dependencies: + inherits "~2.0.0" + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +bootstrap@^4.0.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.4.1.tgz#8582960eea0c5cd2bede84d8b0baf3789c3e8b01" + integrity sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA== + +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +cacache@^12.0.2, cacache@^12.0.3: + version "12.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= + +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + +camelcase@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-lite@^1.0.30000844: + version "1.0.30001023" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001023.tgz#b82155827f3f5009077bdd2df3d8968bcbcc6fc4" + integrity sha512-C5TDMiYG11EOhVOA62W1p3UsJ2z4DsHtMBQtjzp3ZsUglcQn62WOUgW0y795c7A5uZ+GCEIvzkMatLIlAsbNTA== + +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + 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" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= + +chokidar@^2.0.2: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.2.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" + integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.3.0" + optionalDependencies: + fsevents "~2.1.2" + +chownr@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-css@4.2.x: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@2.17.x: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== + +commander@^2.20.0, commander@^2.5.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@~2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + +common-prefix@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/common-prefix/-/common-prefix-1.1.0.tgz#e3a5ea7fafaefc7eb84e760523e1afb985f90f00" + integrity sha1-46Xqf6+u/H64TnYFI+GvuYX5DwA= + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +commoner@^0.10.1: + version "0.10.8" + resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5" + integrity sha1-NPw2cs0kOT6LtH5wyqApOBH08sU= + dependencies: + commander "^2.5.0" + detective "^4.3.1" + glob "^5.0.15" + graceful-fs "^4.1.2" + iconv-lite "^0.4.5" + mkdirp "^0.5.0" + private "^0.1.6" + q "^1.1.2" + recast "^0.11.17" + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0, concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +configstore@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +convert-source-map@^1.5.1, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-webpack-plugin@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz#5481a03dea1123d88a988c6ff8b78247214f0b88" + integrity sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg== + dependencies: + cacache "^12.0.3" + find-cache-dir "^2.1.0" + glob-parent "^3.1.0" + globby "^7.1.1" + is-glob "^4.0.1" + loader-utils "^1.2.3" + minimatch "^3.0.4" + normalize-path "^3.0.0" + p-limit "^2.2.1" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + webpack-log "^2.0.0" + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= + +core-js@^2.4.0, core-js@^2.5.0: + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@6.0.5, cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + 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@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +css-loader@^3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" + integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA== + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.23" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.1.1" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.0.2" + schema-utils "^2.6.0" + +css-select@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-what@2.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +d3@^3.5.6: + version "3.5.17" + resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8" + integrity sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g= + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.0, debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + +detective@^4.3.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e" + integrity sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig== + dependencies: + acorn "^5.2.1" + defined "^1.0.0" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +dom-converter@^0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ejs-include-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ejs-include-regex/-/ejs-include-regex-1.0.0.tgz#e2f71575cbfd551ac800b2474c1f62a38e70093a" + integrity sha1-4vcVdcv9VRrIALJHTB9io45wCTo= + +ejs-lint@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ejs-lint/-/ejs-lint-1.0.1.tgz#f4be32e836854c9c1da643166d18db2e5dbf14d0" + integrity sha512-m+zajpy3t7E6h5LPq9RyQzCjQkJiseo+mMJrUQFmfpFc8tSDVYFN9yNQ5Db46MlamXd1JhIzh4vOrcL1LbArCw== + dependencies: + ejs "3.0.1" + ejs-include-regex "^1.0.0" + globby "^11.0.0" + read-input "^0.3.1" + rewire "^4.0.0" + syntax-error "^1.1.6" + yargs "^15.0.0" + +ejs-loader@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/ejs-loader/-/ejs-loader-0.3.5.tgz#1105ac1a262e3f36079e8b2bd6ec6058434f60e7" + integrity sha512-96Zt17hrKINvbdYUxk5TC5a18J9lIdKLPKIngl9dSyZBsNDKAFibY3z/VBcyq0jWGQkIemLsjdIJIAu4T0CB8A== + dependencies: + loader-utils "^0.2.7" + lodash "^4.17.15" + +ejs-webpack-loader@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ejs-webpack-loader/-/ejs-webpack-loader-2.2.2.tgz#0536acdd79ba4cdbefb4248fcbe7441e264955d7" + integrity sha512-fuZ5djtVnvoMv4xlyQs3sh9JfIh167iPg7Q1ABFdQIbPHqRgeRWQCvodGybQhiRRCUIeqH9HPtfB8hJimPSPbA== + dependencies: + ejs "^2.0.0" + html-minifier "^3" + loader-utils "^0.2.7" + merge "^1.2.0" + uglify-js "~2.6.1" + +ejs@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.0.1.tgz#30c8f6ee9948502cc32e85c37a3f8b39b5a614a5" + integrity sha512-cuIMtJwxvzumSAkqaaoGY/L6Fc/t6YvoP9/VIaK0V/CyqKLEQ8sqODmYfy/cjXEdZ9+OOL8TecbJu+1RsofGDw== + +ejs@^2.0.0: + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== + +electron-to-chromium@^1.3.47: + version "1.3.342" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.342.tgz#138317aa7399e268735b9269fe374a8566425090" + integrity sha512-An/MLhGLIG/g7lZ5vqs4lar96zv74agd3ZcADDHLpjAa16T7Y/pO/33Q31JOwpmHeyjithtHtUcn7XLuaz78lw== + +elliptic@^6.0.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +enhanced-resolve@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" + integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + +envify@^3.0.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/envify/-/envify-3.4.1.tgz#d7122329e8df1688ba771b12501917c9ce5cbce8" + integrity sha1-1xIjKejfFoi6dxsSUBkXyc5cvOg= + dependencies: + jstransform "^11.0.3" + through "~2.3.4" + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.0-next.1: + version "1.17.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" + integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@^3.7.1: + version "3.7.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" + integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-visitor-keys@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@^4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ== + dependencies: + ajv "^5.3.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.4" + esquery "^1.0.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.0.1" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^3.0.6" + is-resolvable "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^1.0.1" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "4.0.2" + text-table "~0.2.0" + +espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== + dependencies: + acorn "^5.5.0" + acorn-jsx "^3.0.0" + +esprima-fb@^15001.1.0-dev-harmony-fb: + version "15001.1.0-dev-harmony-fb" + resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz#30a947303c6b8d5e955bee2b99b1d233206a6901" + integrity sha1-MKlHMDxrjV6VW+4rmbHSMyBqaQE= + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esprima@~3.1.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esquery@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + 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" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + 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" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^2.0.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-glob@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.1.tgz#87ee30e9e9f3eb40d6f254a7997655da753d7c82" + integrity sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastq@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" + integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== + dependencies: + reusify "^1.0.0" + +fbjs@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.6.1.tgz#9636b7705f5ba9684d44b72f78321254afc860f7" + integrity sha1-lja3cF9bqWhNRLcveDISVK/IYPc= + dependencies: + core-js "^1.0.0" + loose-envify "^1.0.0" + promise "^7.0.3" + ua-parser-js "^0.7.9" + whatwg-fetch "^0.9.0" + +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +file-loader@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-5.0.2.tgz#7f3d8b4ac85a5e8df61338cfec95d7405f971caa" + integrity sha512-QMiQ+WBkGLejKe81HU8SZ9PovsU/5uaLo0JdTCEXOYv7i7jfAjHZi1tcwp9tSASJPOmmHZtbdCervFmXMH/Dcg== + dependencies: + loader-utils "^1.2.3" + schema-utils "^2.5.0" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +findup-sync@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +flat-cache@^1.2.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" + integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== + dependencies: + circular-json "^0.3.1" + graceful-fs "^4.1.2" + rimraf "~2.6.2" + write "^0.2.1" + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.11" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" + integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + +fstream@^1.0.0, fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + 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" + +gaze@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + dependencies: + globule "^1.0.0" + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.1.0, glob-parent@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + 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" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.0.1, globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +globby@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.0.tgz#56fd0e9f0d4f8fb0c456f1ab0dee96e1380bc154" + integrity sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" + integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globule@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.0.tgz#41d0e9fb44afd4b80d93a23263714f90b3dec904" + integrity sha512-YlD4kdMqRCQHrhVdonet4TdRtv1/sZKepvoxNT4Nrhrp5HI8XFfc8kFlGlBn2myBo80aGp8Eft259mbcUJhgSg== + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.2.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.8.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" + integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== + +html-minifier@^3, html-minifier@^3.2.3: + version "3.5.21" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c" + integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA== + dependencies: + camel-case "3.0.x" + clean-css "4.2.x" + commander "2.17.x" + he "1.2.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.4.x" + +html-webpack-plugin@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" + integrity sha1-sBq71yOsqqeze2r0SS69oD2d03s= + dependencies: + html-minifier "^3.2.3" + loader-utils "^0.2.16" + lodash "^4.17.3" + pretty-error "^2.0.2" + tapable "^1.0.0" + toposort "^1.0.0" + util.promisify "1.0.0" + +htmlparser2@^3.3.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +iconv-lite@^0.4.17, iconv-lite@^0.4.5: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= + +ignore@^3.3.3, ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +ignore@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" + integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +import-local@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imports-loader@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.8.0.tgz#030ea51b8ca05977c40a3abfd9b4088fe0be9a69" + integrity sha512-kXWL7Scp8KQ4552ZcdVTeaQCZSLW+e6nJfp3cwUMB673T7Hr98Xjx5JK+ql7ADlJUvj1JS5O01RLbKoutN5QDQ== + dependencies: + loader-utils "^1.0.2" + source-map "^0.6.1" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +in-publish@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +interpret@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + +is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-retry-allowed@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +jquery-mask-plugin@^1.14.16: + version "1.14.16" + resolved "https://registry.yarnpkg.com/jquery-mask-plugin/-/jquery-mask-plugin-1.14.16.tgz#9ebb55947d984da5aade45315b2fe6b113e28aae" + integrity sha512-reywdHlYEkPbzWjTpcc1fk9XQ3PLvO5dzEAVqy8zI7NTF22tB1HbeU3iboZTLdkBEPaWAqeI2HtEjsGQ4roZKw== + +jquery-serializejson@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/jquery-serializejson/-/jquery-serializejson-2.9.0.tgz#03e3764e3a4b42c1c5aae9f93d7f19320c5f35a6" + integrity sha512-xR7rjl0tRKIVioV5lOkOSv7K8BHMvGzYzC7Ech1iAYuZiYf0ksEpLC8OqjA5VApXf/qn/49O9hTmW70+/EA0vA== + +jquery@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" + integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== + +js-base64@^2.1.8: + version "2.5.1" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" + integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@^3.9.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^0.5.0, json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== + dependencies: + minimist "^1.2.0" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +jstransform@^11.0.3: + version "11.0.3" + resolved "https://registry.yarnpkg.com/jstransform/-/jstransform-11.0.3.tgz#09a78993e0ae4d4ef4487f6155a91f6190cb4223" + integrity sha1-CaeJk+CuTU70SH9hVakfYZDLQiM= + dependencies: + base62 "^1.1.0" + commoner "^0.10.1" + esprima-fb "^15001.1.0-dev-harmony-fb" + object-assign "^2.0.0" + source-map "^0.4.2" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= + dependencies: + package-json "^4.0.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@^0.2.16, loader-utils@^0.2.7: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.some@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= + +lodash@^4.0.0, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.3.0, lodash@~4.17.10: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-plural@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-4.3.0.tgz#f23de08efdb0cac2e0c9ba9f315b0dff6b4c2735" + integrity sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA== + optionalDependencies: + minimist "^1.2.0" + +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +marionette.approuter@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/marionette.approuter/-/marionette.approuter-1.0.2.tgz#bd45b801762fea4ec5caa9505640413596cc432c" + integrity sha512-XjcKb1Y6KROCmdZxO/rtOdRhd3Hfrs+7zWjtfiuCFS3VZa2IQjNgKUuIGmaKDZte2AmKRRMaPvXMh22nKYFh8A== + +marionette.templatecache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/marionette.templatecache/-/marionette.templatecache-1.0.0.tgz#579b9a53b1b6428f8f0a0071cff2175a2d71e65b" + integrity sha1-V5uaU7G2Qo+PCgBxz/IXWi1x5ls= + dependencies: + backbone.marionette "^4.0.0, 4.0.0-beta.1" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memory-fs@^0.4.0, memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge2@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + +merge@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + +messageformat-convert@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/messageformat-convert/-/messageformat-convert-0.3.1.tgz#03b5453ee87e66da6eef1670ce0caf997ee64e51" + integrity sha512-fpNfsvFNj5VCAMN0Hpu9D4zhnGkEHL3cILJBAOydkzzdyrSoFlYIHAPRWRajOcHDgYXt+g0NIEzq0bfW3sd5Bw== + dependencies: + common-prefix "1.1.0" + make-plural "^4.3.0" + +messageformat-formatters@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz#0492c1402a48775f751c9b17c0354e92be012b08" + integrity sha512-E/lQRXhtHwGuiQjI7qxkLp8AHbMD5r2217XNe/SREbBlSawe0lOqsFb7rflZJmlQFSULNLIqlcjjsCPlB3m3Mg== + +messageformat-loader@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/messageformat-loader/-/messageformat-loader-0.8.1.tgz#709a8f38e36257b19a9492dbfdbc743c03351fa0" + integrity sha512-hk721fJttjqoIfW6cMcLjFPsJ7C2bL9lj7Jy2btfWf7zsu6gWlLFeTKIUfi7S1v4U1gP4dkzHa1giYsAwD+aVA== + dependencies: + loader-utils "^1.2.3" + messageformat-convert "^0.3.1" + yaml "^1.6.0" + +messageformat-parser@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/messageformat-parser/-/messageformat-parser-4.1.2.tgz#fd34ec39912a14868a1595eaeb742485ab8ab372" + integrity sha512-7dWuifeyldz7vhEuL96Kwq1fhZXBW+TUfbnHN4UCrCxoXQTYjHnR78eI66Gk9LaLLsAvzPNVJBaa66DRfFNaiA== + +messageformat@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/messageformat/-/messageformat-2.3.0.tgz#de263c49029d5eae65d7ee25e0754f57f425ad91" + integrity sha512-uTzvsv0lTeQxYI2y1NPa1lItL5VRI8Gb93Y2K2ue5gBPyrbJxfDi/EYWxh2PKv5yO42AJeeqblS9MJSh/IEk4w== + dependencies: + make-plural "^4.3.0" + messageformat-formatters "^2.0.1" + messageformat-parser "^4.1.2" + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.43.0: + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mini-css-extract-plugin@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e" + integrity sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A== + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +moment@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" + integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +nan@^2.12.1, nan@^2.13.2: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-sass@^4.13.1: + version "4.13.1" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.1.tgz#9db5689696bb2eec2c32b98bfea4c7a2e992d0a3" + integrity sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw== + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash "^4.17.15" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.13.2" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "^2.2.4" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +nodemon@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.2.tgz#9c7efeaaf9b8259295a97e5d4585ba8f0cbe50b0" + integrity sha512-GWhYPMfde2+M0FsHnggIHXTqPDHXia32HRhh6H0d75Mt9FKUoCBvumNHr7LdrpPBTKxsWmIEOjoN+P4IU6Hcaw== + dependencies: + chokidar "^3.2.2" + debug "^3.2.6" + ignore-by-default "^1.0.1" + minimatch "^3.0.4" + pstree.remy "^1.1.7" + semver "^5.7.1" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.2" + update-notifier "^2.5.0" + +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +numeral@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz#4ad080936d443c2561aed9f2197efffe25f4e506" + integrity sha1-StCAk21EPCVhrtnyGX7//iX05QY= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" + integrity sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo= + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +optionator@^0.8.2: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + +os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= + dependencies: + no-case "^2.2.0" + +parse-asn1@^5.0.0: + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7: + version "2.2.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" + integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" + integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.16" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.0" + +postcss-modules-scope@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz#33d4fc946602eb5e9355c4165d68a10727689dba" + integrity sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" + integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== + +postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.23, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587" + integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.0, prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +pretty-error@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" + integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= + dependencies: + renderkid "^2.0.1" + utila "~0.4" + +private@^0.1.6, private@^0.1.8, private@~0.1.5: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise@^7.0.3: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.24: + version "1.7.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" + integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + +pstree.remy@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.7.tgz#c76963a28047ed61542dc361aa26ee55a7fa15f3" + integrity sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +rc@^1.0.1, rc@^1.1.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-dom@^0.14.0: + version "0.14.9" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-0.14.9.tgz#05064a3dcf0fb1880a3b2bfc9d58c55d8d9f6293" + integrity sha1-BQZKPc8PsYgKOyv8nVjFXY2fYpM= + +react@^0.14.0: + version "0.14.9" + resolved "https://registry.yarnpkg.com/react/-/react-0.14.9.tgz#9110a6497c49d44ba1c0edd317aec29c2e0d91d1" + integrity sha1-kRCmSXxJ1EuhwO3TF67CnC4NkdE= + dependencies: + envify "^3.0.0" + fbjs "^0.6.1" + +read-input@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/read-input/-/read-input-0.3.1.tgz#5b3169308013464ffda6ec92e58d2d3cea948df1" + integrity sha1-WzFpMIATRk/9puyS5Y0tPOqUjfE= + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + 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" + +readable-stream@^3.1.1: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.5.0.tgz#465d70e6d1087f6162d079cd0b5db7fbebfd1606" + integrity sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" + integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== + dependencies: + picomatch "^2.0.7" + +recast@^0.11.17: + version "0.11.23" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" + integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM= + dependencies: + ast-types "0.9.6" + esprima "~3.1.0" + private "~0.1.5" + source-map "~0.5.0" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +regenerate@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.2: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" + integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +registry-auth-token@^3.0.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" + integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= + dependencies: + jsesc "~0.5.0" + +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +renderkid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" + integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== + dependencies: + css-select "^1.1.0" + dom-converter "^0.2" + htmlparser2 "^3.3.0" + strip-ansi "^3.0.0" + utila "^0.4.0" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +request@^2.87.0, request@^2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +require-uncached@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.10.0, resolve@^1.3.2: + version "1.15.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5" + integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw== + dependencies: + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +reusify@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rewire@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/rewire/-/rewire-4.0.1.tgz#ba1100d400a9da759fe599fc6e0233f0879ed6da" + integrity sha512-+7RQ/BYwTieHVXetpKhT11UbfF6v1kGhKFrtZN7UDL2PybMsSt/rpLWeEUGF5Ndsl1D5BxiCB14VDJyoX+noYw== + dependencies: + eslint "^4.19.1" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass-graph@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +sass-loader@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d" + integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ== + dependencies: + clone-deep "^4.0.1" + loader-utils "^1.2.3" + neo-async "^2.6.1" + schema-utils "^2.6.1" + semver "^6.3.0" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.4.tgz#a27efbf6e4e78689d91872ee3ccfa57d7bdd0f53" + integrity sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ== + dependencies: + ajv "^6.10.2" + ajv-keywords "^3.4.1" + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + dependencies: + semver "^5.0.3" + +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== + dependencies: + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + +source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stdout-stream@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== + dependencies: + readable-stream "^2.0.1" + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +style-loader@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.1.3.tgz#9e826e69c683c4d9bf9db924f85e9abb30d5e200" + integrity sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw== + dependencies: + loader-utils "^1.2.3" + schema-utils "^2.6.4" + +supports-color@6.1.0, supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +syntax-error@^1.1.6: + version "1.4.0" + resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" + integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w== + dependencies: + acorn-node "^1.2.0" + +table@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== + dependencies: + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + +"tabler-ui@git+https://github.com/tabler/tabler.git#00f78ad823311bc3ad974ac3e5b0126198f0a813": + version "0.0.31" + resolved "git+https://github.com/tabler/tabler.git#00f78ad823311bc3ad974ac3e5b0126198f0a813" + dependencies: + bootstrap "^4.0.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tar@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== + dependencies: + block-stream "*" + fstream "^1.0.12" + inherits "2" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + +terser-webpack-plugin@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.6.3" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.3.tgz#e33aa42461ced5238d352d2df2a67f21921f8d87" + integrity sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6, through@~2.3.4: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toposort@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" + integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk= + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +"true-case-path@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== + dependencies: + glob "^7.1.2" + +tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +ua-parser-js@^0.7.9: + version "0.7.21" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" + integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== + +uglify-js@3.4.x: + version "3.4.10" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" + integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw== + dependencies: + commander "~2.19.0" + source-map "~0.6.1" + +uglify-js@~2.6.1: + version "2.6.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.6.4.tgz#65ea2fb3059c9394692f15fed87c2b36c16b9adf" + integrity sha1-ZeovswWck5RpLxX+2HwrNsFrmt8= + dependencies: + async "~0.2.6" + source-map "~0.5.1" + uglify-to-browserify "~1.0.0" + yargs "~3.10.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= + +undefsafe@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" + integrity sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY= + dependencies: + debug "^2.2.0" + +underscore@>=1.8.3, underscore@^1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.2.tgz#0c8d6f536d6f378a5af264a72f7bec50feb7cf2f" + integrity sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +update-notifier@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utila@^0.4.0, utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" + integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +watchpack@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +webpack-cli@^3.3.10: + version "3.3.10" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.10.tgz#17b279267e9b4fb549023fae170da8e6e766da13" + integrity sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg== + dependencies: + chalk "2.4.2" + cross-spawn "6.0.5" + enhanced-resolve "4.1.0" + findup-sync "3.0.0" + global-modules "2.0.0" + import-local "2.0.0" + interpret "1.2.0" + loader-utils "1.2.3" + supports-color "6.1.0" + v8-compile-cache "2.0.3" + yargs "13.2.4" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-visualizer-plugin@^0.1.11: + version "0.1.11" + resolved "https://registry.yarnpkg.com/webpack-visualizer-plugin/-/webpack-visualizer-plugin-0.1.11.tgz#b8770ad86b4f652612c68b1b782253faf9f8a34e" + integrity sha1-uHcK2GtPZSYSxosbeCJT+vn4o04= + dependencies: + d3 "^3.5.6" + mkdirp "^0.5.1" + react "^0.14.0" + react-dom "^0.14.0" + +webpack@^4.41.5: + version "4.41.5" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.5.tgz#3210f1886bce5310e62bb97204d18c263341b77c" + integrity sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.0" + webpack-sources "^1.4.1" + +whatwg-fetch@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-0.9.0.tgz#0e3684c6cb9995b43efc9df03e4c365d95fd9cc0" + integrity sha1-DjaExsuZlbQ+/J3wPkw2XZX9nMA= + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1, which@^1.2.14, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^2.0.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= + dependencies: + mkdirp "^0.5.1" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + +xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yaml@^1.6.0: + version "1.7.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2" + integrity sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw== + dependencies: + "@babel/runtime" "^7.6.3" + +yargs-parser@^13.1.0: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^16.1.0: + version "16.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1" + integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= + dependencies: + camelcase "^3.0.0" + +yargs@13.2.4: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" + +yargs@^15.0.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.1.0.tgz#e111381f5830e863a89550bd4b136bb6a5f37219" + integrity sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^16.1.0" + +yargs@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" diff --git a/knexfile.js b/knexfile.js deleted file mode 100644 index 3d735ea7b..000000000 --- a/knexfile.js +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = { - development: { - client: 'mysql', - migrations: { - tableName: 'migrations', - stub: 'src/backend/lib/migrate_template.js', - directory: 'src/backend/migrations' - } - }, - - production: { - client: 'mysql', - migrations: { - tableName: 'migrations', - stub: 'src/backend/lib/migrate_template.js', - directory: 'src/backend/migrations' - } - } -}; diff --git a/package.json b/package.json deleted file mode 100644 index e35e6b6de..000000000 --- a/package.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "name": "nginx-proxy-manager", - "version": "2.0.14", - "description": "A beautiful interface for creating Nginx endpoints", - "main": "src/backend/index.js", - "devDependencies": { - "babel-core": "^6.26.3", - "babel-loader": "^7.1.4", - "babel-minify-webpack-plugin": "^0.3.1", - "babel-preset-env": "^1.7.0", - "backbone": "^1.3.3", - "backbone.marionette": "^4.0.0", - "copy-webpack-plugin": "^4.5.1", - "css-loader": "^1.0.0", - "ejs-loader": "^0.3.1", - "file-loader": "^1.1.11", - "imports-loader": "^0.8.0", - "jquery": "^3.3.1", - "jquery-mask-plugin": "^1.14.15", - "jquery-serializejson": "^2.8.1", - "marionette.approuter": "^1.0.0", - "marionette.templatecache": "^1.0.0", - "messageformat": "^2.0.2", - "messageformat-loader": "^0.7.0", - "mini-css-extract-plugin": "^0.4.0", - "node-sass": "^4.9.0", - "nodemon": "^1.17.5", - "numeral": "^2.0.6", - "sass-loader": "^7.0.3", - "style-loader": "^0.22.1", - "tabler-ui": "git+https://github.com/tabler/tabler.git#00f78ad823311bc3ad974ac3e5b0126198f0a813", - "underscore": "^1.8.3", - "webpack": "^4.25.1", - "webpack-cli": "^3.1.2", - "webpack-visualizer-plugin": "^0.1.11" - }, - "dependencies": { - "ajv": "^6.5.1", - "batchflow": "^0.4.0", - "bcrypt": "^3.0.0", - "body-parser": "^1.18.3", - "compression": "^1.7.2", - "config": "^2.0.1", - "diskdb": "^0.1.17", - "ejs": "^2.6.1", - "express": "^4.16.3", - "express-fileupload": "^0.4.0", - "gravatar": "^1.6.0", - "html-entities": "^1.2.1", - "json-schema-ref-parser": "^5.0.3", - "jsonwebtoken": "^8.3.0", - "knex": "^0.15.2", - "liquidjs": "^5.1.1", - "lodash": "^4.17.10", - "moment": "^2.22.2", - "mysql": "^2.15.0", - "node-rsa": "^1.0.0", - "objection": "^1.1.10", - "path": "^0.12.7", - "restler": "^3.4.0", - "signale": "^1.2.1", - "temp-write": "^3.4.0", - "unix-timestamp": "^0.2.0" - }, - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "dev": "webpack --mode development", - "build": "webpack --mode production", - "watch": "webpack-dev-server --mode development" - }, - "signale": { - "displayDate": true, - "displayTimestamp": true - }, - "author": "Jamie Curnow ", - "license": "MIT" -} diff --git a/rootfs/etc/nginx/conf.d/default.conf b/rootfs/etc/nginx/conf.d/default.conf deleted file mode 100644 index 9af28ed26..000000000 --- a/rootfs/etc/nginx/conf.d/default.conf +++ /dev/null @@ -1,53 +0,0 @@ -# Healthcheck Host which proxies to the Manager, -# thus the healthcheck ensures both services are running -server { - listen 9876 default; - server_name localhost; - - access_log /data/logs/manager.log proxy; - - include conf.d/include/block-exploits.conf; - - set $forward_scheme http; - set $server 127.0.0.1; - set $port 81; - - location /health { - access_log off; - include conf.d/include/proxy.conf; - } - - location / { - return 404; - } -} - -# "You are not configured" page, which is the default if another default doesn't exist -server { - listen 80; - server_name localhost-nginx-proxy-manager; - - access_log /data/logs/default.log proxy; - - include conf.d/include/assets.conf; - include conf.d/include/block-exploits.conf; - - location / { - index index.html; - root /var/www/html; - } -} - -# First 443 Host, which is the default if another default doesn't exist -server { - listen 443 ssl; - server_name localhost; - - access_log /data/logs/default.log proxy; - - ssl_certificate /data/nginx/dummycert.pem; - ssl_certificate_key /data/nginx/dummykey.pem; - include conf.d/include/ssl-ciphers.conf; - - return 444; -} diff --git a/rootfs/etc/nginx/conf.d/include/assets.conf b/rootfs/etc/nginx/conf.d/include/assets.conf deleted file mode 100644 index 7dd0f5cea..000000000 --- a/rootfs/etc/nginx/conf.d/include/assets.conf +++ /dev/null @@ -1,31 +0,0 @@ -location ~* ^.*\.(css|js|jpe?g|gif|png|woff|eot|ttf|svg|ico|css\.map|js\.map)$ { - if_modified_since off; - - # use the public cache - proxy_cache public-cache; - proxy_cache_key $host$request_uri; - - # ignore these headers for media - proxy_ignore_headers Set-Cookie Cache-Control Expires X-Accel-Expires; - - # cache 200s and also 404s (not ideal but there are a few 404 images for some reason) - proxy_cache_valid any 30m; - proxy_cache_valid 404 1m; - - # strip this header to avoid If-Modified-Since requests - proxy_hide_header Last-Modified; - proxy_hide_header Cache-Control; - proxy_hide_header Vary; - - proxy_cache_bypass 0; - proxy_no_cache 0; - - proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504 http_404; - proxy_connect_timeout 5s; - proxy_read_timeout 45s; - - expires @30m; - access_log off; - - include conf.d/include/proxy.conf; -} diff --git a/rootfs/etc/nginx/conf.d/include/force-ssl.conf b/rootfs/etc/nginx/conf.d/include/force-ssl.conf deleted file mode 100644 index 5fd4810f8..000000000 --- a/rootfs/etc/nginx/conf.d/include/force-ssl.conf +++ /dev/null @@ -1,3 +0,0 @@ -if ($scheme = "http") { - return 301 https://$host$request_uri; -} diff --git a/rootfs/etc/nginx/conf.d/include/ip_ranges.conf b/rootfs/etc/nginx/conf.d/include/ip_ranges.conf deleted file mode 100644 index 946244fd8..000000000 --- a/rootfs/etc/nginx/conf.d/include/ip_ranges.conf +++ /dev/null @@ -1,2 +0,0 @@ -# Intentionally left blank - diff --git a/rootfs/etc/nginx/conf.d/include/letsencrypt-acme-challenge.conf b/rootfs/etc/nginx/conf.d/include/letsencrypt-acme-challenge.conf deleted file mode 100644 index 22c6ca13c..000000000 --- a/rootfs/etc/nginx/conf.d/include/letsencrypt-acme-challenge.conf +++ /dev/null @@ -1,29 +0,0 @@ -# Rule for legitimate ACME Challenge requests (like /.well-known/acme-challenge/xxxxxxxxx) -# We use ^~ here, so that we don't check other regexes (for speed-up). We actually MUST cancel -# other regex checks, because in our other config files have regex rule that denies access to files with dotted names. -location ^~ /.well-known/acme-challenge/ { - # Since this is for letsencrypt authentication of a domain and they do not give IP ranges of their infrastructure - # we need to open up access by turning off auth and IP ACL for this location. - auth_basic off; - allow all; - - # Set correct content type. According to this: - # https://community.letsencrypt.org/t/using-the-webroot-domain-verification-method/1445/29 - # Current specification requires "text/plain" or no content header at all. - # It seems that "text/plain" is a safe option. - default_type "text/plain"; - - # This directory must be the same as in /etc/letsencrypt/cli.ini - # as "webroot-path" parameter. Also don't forget to set "authenticator" parameter - # there to "webroot". - # Do NOT use alias, use root! Target directory is located here: - # /var/www/common/letsencrypt/.well-known/acme-challenge/ - root /data/letsencrypt-acme-challenge; -} - -# Hide /acme-challenge subdirectory and return 404 on all requests. -# It is somewhat more secure than letting Nginx return 403. -# Ending slash is important! -location = /.well-known/acme-challenge/ { - return 404; -} diff --git a/rootfs/etc/nginx/conf.d/include/resolvers.conf b/rootfs/etc/nginx/conf.d/include/resolvers.conf deleted file mode 100644 index ccd9dcef9..000000000 --- a/rootfs/etc/nginx/conf.d/include/resolvers.conf +++ /dev/null @@ -1 +0,0 @@ -# Intentionally blank diff --git a/rootfs/etc/nginx/nginx.conf b/rootfs/etc/nginx/nginx.conf deleted file mode 100644 index ea45b53f4..000000000 --- a/rootfs/etc/nginx/nginx.conf +++ /dev/null @@ -1,90 +0,0 @@ -# run nginx in foreground -daemon off; - -user root; - -# Set number of worker processes automatically based on number of CPU cores. -worker_processes auto; - -# Enables the use of JIT for regular expressions to speed-up their processing. -pcre_jit on; - -error_log /data/logs/error.log warn; - -# Includes files with directives to load dynamic modules. -include /etc/nginx/modules/*.conf; - -events { - worker_connections 1024; -} - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - sendfile on; - server_tokens off; - tcp_nopush on; - tcp_nodelay on; - client_body_temp_path /tmp/nginx/body 1 2; - keepalive_timeout 65; - ssl_prefer_server_ciphers on; - gzip on; - proxy_ignore_client_abort off; - client_max_body_size 2000m; - server_names_hash_bucket_size 64; - proxy_http_version 1.1; - proxy_set_header X-Forwarded-Scheme $scheme; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header Accept-Encoding ""; - proxy_cache off; - proxy_cache_path /var/lib/nginx/cache/public levels=1:2 keys_zone=public-cache:30m max_size=192m; - proxy_cache_path /var/lib/nginx/cache/private levels=1:2 keys_zone=private-cache:5m max_size=1024m; - - # MISS - # BYPASS - # EXPIRED - expired, request was passed to backend - # UPDATING - expired, stale response was used due to proxy/fastcgi_cache_use_stale updating - # STALE - expired, stale response was used due to proxy/fastcgi_cache_use_stale - # HIT - # - (dash) - request never reached to upstream module. Most likely it was processed at Nginx-level only (e.g. forbidden, redirects, etc) (Ref: Mail Thread - log_format proxy '[$time_local] $upstream_cache_status $upstream_status $status - $request_method $scheme $host "$request_uri" [Client $remote_addr] [Length $body_bytes_sent] [Gzip $gzip_ratio] [Sent-to $server] "$http_user_agent" "$http_referer"'; - log_format standard '[$time_local] $status - $request_method $scheme $host "$request_uri" [Client $remote_addr] [Length $body_bytes_sent] [Gzip $gzip_ratio] "$http_user_agent" "$http_referer"'; - - access_log /data/logs/default.log proxy; - - # Dynamically generated resolvers file - include /etc/nginx/conf.d/include/resolvers.conf; - - # Default upstream scheme - map $host $forward_scheme { - default http; - } - - # Real IP Determination - # Docker subnet: - set_real_ip_from 172.0.0.0/8; - # NPM generated CDN ip ranges: - include conf.d/include/ip_ranges.conf; - # always put the following 2 lines after ip subnets: - real_ip_header X-Forwarded-For; - real_ip_recursive on; - - # Files generated by NPM - include /etc/nginx/conf.d/*.conf; - include /data/nginx/default_host/*.conf; - include /data/nginx/proxy_host/*.conf; - include /data/nginx/redirection_host/*.conf; - include /data/nginx/dead_host/*.conf; - include /data/nginx/temp/*.conf; - - # Custom - include /data/nginx/custom/http[.]conf; -} - -stream { - # Files generated by NPM - include /data/nginx/stream/*.conf; -} - -# Custom -include /data/nginx/custom/root[.]conf; diff --git a/rootfs/etc/services.d/manager/run b/rootfs/etc/services.d/manager/run deleted file mode 100755 index c4ade6d80..000000000 --- a/rootfs/etc/services.d/manager/run +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/with-contenv bash - -mkdir -p /data/letsencrypt-acme-challenge - -cd /app - -while : -do - node --abort_on_uncaught_exception --max_old_space_size=250 /app/src/backend/index.js - sleep 1 -done diff --git a/rootfs/etc/services.d/nginx/run b/rootfs/etc/services.d/nginx/run deleted file mode 100755 index a72046b92..000000000 --- a/rootfs/etc/services.d/nginx/run +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/with-contenv bash - -# Create required folders -mkdir -p /tmp/nginx/body \ - /var/log/nginx \ - /data/nginx \ - /data/custom_ssl \ - /data/logs \ - /data/access \ - /data/nginx/default_host \ - /data/nginx/default_www \ - /data/nginx/proxy_host \ - /data/nginx/redirection_host \ - /data/nginx/stream \ - /data/nginx/dead_host \ - /data/nginx/temp \ - /var/lib/nginx/cache/public \ - /var/lib/nginx/cache/private \ - /var/cache/nginx/proxy_temp - -touch /var/log/nginx/error.log && chmod 777 /var/log/nginx/error.log && chmod -R 777 /var/cache/nginx -chown root /tmp/nginx - -# Dynamically generate resolvers file, if resolver is IPv6, enclose in `[]` -echo resolver $(awk 'BEGIN{ORS=" "} $1=="nameserver" {print ($2 ~ ":")? "["$2"]": $2}' /etc/resolv.conf) ";" > /etc/nginx/conf.d/include/resolvers.conf - -# Generate dummy self-signed certificate. -if [ ! -f /data/nginx/dummycert.pem ] || [ ! -f /data/nginx/dummykey.pem ] -then - echo "Generating dummy SSL certificate..." - openssl req \ - -new \ - -newkey rsa:2048 \ - -days 3650 \ - -nodes \ - -x509 \ - -subj '/O=Nginx Proxy Manager/OU=Dummy Certificate/CN=localhost' \ - -keyout /data/nginx/dummykey.pem \ - -out /data/nginx/dummycert.pem - echo "Complete" -fi - -# Run -exec nginx diff --git a/rootfs/root/.bashrc b/rootfs/root/.bashrc deleted file mode 100644 index 045e6f20b..000000000 --- a/rootfs/root/.bashrc +++ /dev/null @@ -1,13 +0,0 @@ - -# Custom bash prompt via kirsle.net/wizards/ps1.html -if [ -t 1 ] ; then - export PS1="\e[1;34m[\e[1;33m\u@\e[1;32mdocker-\h\e[1;37m:\w\[\e[1;34m]\e[1;36m\\$ \e[0m" -fi - -# Aliases -alias l='ls -lAsh --color' -alias ls='ls -C1 --color' -alias cp='cp -ip' -alias rm='rm -i' -alias mv='mv -i' -alias h='cd ~;clear;' diff --git a/scripts/buildx b/scripts/buildx new file mode 100755 index 000000000..b22d881c7 --- /dev/null +++ b/scripts/buildx @@ -0,0 +1,39 @@ +#!/bin/bash + +CYAN='\E[1;36m' +YELLOW='\E[1;33m' +BLUE='\E[1;34m' +GREEN='\E[1;32m' +RESET='\E[0m' + +echo -e "${BLUE}❯ ${CYAN}Building docker multiarch: ${YELLOW}${*}${RESET}" + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "${DIR}/.." || exit 1 + +# determine commit if not already set +if [ "$BUILD_COMMIT" == "" ]; then + BUILD_COMMIT=$(git log -n 1 --format=%h) +fi + +# Buildx Builder +docker buildx create --name "${BUILDX_NAME:-npm}" || echo +docker buildx use "${BUILDX_NAME:-npm}" + +docker buildx build \ + --build-arg BUILD_VERSION="${BUILD_VERSION:-dev}" \ + --build-arg BUILD_COMMIT="${BUILD_COMMIT:-notset}" \ + --build-arg BUILD_DATE="$(date '+%Y-%m-%d %T %Z')" \ + --build-arg GOPROXY="${GOPROXY:-}" \ + --build-arg GOPRIVATE="${GOPRIVATE:-}" \ + --platform linux/amd64,linux/arm64,linux/arm/7 \ + --progress plain \ + --pull \ + -f docker/Dockerfile \ + $@ \ + . + +rc=$? +docker buildx rm "${BUILDX_NAME:-npm}" +echo -e "${BLUE}❯ ${GREEN}Multiarch build Complete${RESET}" +exit $rc diff --git a/scripts/destroy-dev b/scripts/destroy-dev new file mode 100755 index 000000000..e86b33fa5 --- /dev/null +++ b/scripts/destroy-dev @@ -0,0 +1,22 @@ +#!/bin/bash -e + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +CYAN='\E[1;36m' +BLUE='\E[1;34m' +RED='\E[1;31m' +RESET='\E[0m' + +COMPOSE_PROJECT_NAME="npmdev" +COMPOSE_FILE="docker/docker-compose.dev.yml" +export COMPOSE_FILE COMPOSE_PROJECT_NAME + +# Ensure docker-compose exists +# Make sure docker exists +if hash docker-compose 2>/dev/null; then + cd "${DIR}/.." + echo -e "${BLUE}❯ ${CYAN}Destroying Dev Stack ...${RESET}" + docker-compose down --remove-orphans --volumes +else + echo -e "${RED}❯ docker-compose command is not available${RESET}" +fi diff --git a/scripts/docs-build b/scripts/docs-build new file mode 100755 index 000000000..cdab81171 --- /dev/null +++ b/scripts/docs-build @@ -0,0 +1,19 @@ +#!/bin/bash -e + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +CYAN='\E[1;36m' +BLUE='\E[1;34m' +RED='\E[1;31m' +GREEN='\E[1;32m' +RESET='\E[0m' + +# Ensure docker-compose exists +if hash docker 2>/dev/null; then + cd "${DIR}/.." + echo -e "${BLUE}❯ ${CYAN}Building Docs ...${RESET}" + docker run --rm -e CI=true -v "$(pwd)/docs:/app/docs" -w /app/docs node:alpine sh -c "yarn install && yarn build && chown -R $(id -u):$(id -g) /app/docs" + echo -e "${BLUE}❯ ${GREEN}Building Docs Complete${RESET}" +else + echo -e "${RED}❯ docker command is not available${RESET}" +fi diff --git a/scripts/frontend-build b/scripts/frontend-build new file mode 100755 index 000000000..a54c46bc5 --- /dev/null +++ b/scripts/frontend-build @@ -0,0 +1,21 @@ +#!/bin/bash -e + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +CYAN='\E[1;36m' +BLUE='\E[1;34m' +RED='\E[1;31m' +GREEN='\E[1;32m' +RESET='\E[0m' + +DOCKER_IMAGE=jc21/alpine-nginx-full:node + +# Ensure docker exists +if hash docker 2>/dev/null; then + cd "${DIR}/.." + echo -e "${BLUE}❯ ${CYAN}Building Frontend ...${RESET}" + docker run --rm -e CI=true -v "$(pwd)/frontend:/app/frontend" -w /app/frontend "$DOCKER_IMAGE" sh -c "yarn install && yarn build && yarn build && chown -R $(id -u):$(id -g) /app/frontend" + echo -e "${BLUE}❯ ${GREEN}Building Frontend Complete${RESET}" +else + echo -e "${RED}❯ docker command is not available${RESET}" +fi diff --git a/scripts/start-dev b/scripts/start-dev new file mode 100755 index 000000000..a47a93584 --- /dev/null +++ b/scripts/start-dev @@ -0,0 +1,37 @@ +#!/bin/bash -e + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +CYAN='\E[1;36m' +BLUE='\E[1;34m' +YELLOW='\E[1;33m' +RED='\E[1;31m' +RESET='\E[0m' + +COMPOSE_PROJECT_NAME="npmdev" +COMPOSE_FILE="docker/docker-compose.dev.yml" +export COMPOSE_FILE COMPOSE_PROJECT_NAME + +# Ensure docker-compose exists +if hash docker-compose 2>/dev/null; then + cd "${DIR}/.." + echo -e "${BLUE}❯ ${CYAN}Starting Dev Stack ...${RESET}" + + docker-compose up -d --remove-orphans --force-recreate --build + + echo "" + echo -e "${CYAN}Admin UI: http://127.0.0.1:3081${RESET}" + echo -e "${CYAN}Nginx: http://127.0.0.1:3080${RESET}" + echo -e "${CYAN}Swagger Doc: http://127.0.0.1:3001${RESET}" + echo "" + + if [ "$1" == "-f" ]; then + echo -e "${BLUE}❯ ${YELLOW}Following Backend Container:${RESET}" + docker logs -f npmdev_npm_1 + else + echo -e "${YELLOW}Hint:${RESET} You can follow the output of some of the containers with:" + echo " docker logs -f npmdev_npm_1" + fi +else + echo -e "${RED}❯ docker-compose command is not available${RESET}" +fi diff --git a/scripts/stop-dev b/scripts/stop-dev new file mode 100755 index 000000000..97c68c854 --- /dev/null +++ b/scripts/stop-dev @@ -0,0 +1,22 @@ +#!/bin/bash -e + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +CYAN='\E[1;36m' +BLUE='\E[1;34m' +RED='\E[1;31m' +RESET='\E[0m' + +COMPOSE_PROJECT_NAME="npmdev" +COMPOSE_FILE="docker/docker-compose.dev.yml" +export COMPOSE_FILE COMPOSE_PROJECT_NAME + +# Ensure docker-compose exists +# Make sure docker exists +if hash docker-compose 2>/dev/null; then + cd "${DIR}/.." + echo -e "${BLUE}❯ ${CYAN}Stopping Dev Stack ...${RESET}" + docker-compose down --remove-orphans +else + echo -e "${RED}❯ docker-compose command is not available${RESET}" +fi diff --git a/scripts/test-dev b/scripts/test-dev new file mode 100755 index 000000000..d4ad0181c --- /dev/null +++ b/scripts/test-dev @@ -0,0 +1,21 @@ +#!/bin/bash -e + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +CYAN='\E[1;36m' +BLUE='\E[1;34m' +RED='\E[1;31m' +RESET='\E[0m' + +COMPOSE_PROJECT_NAME="npmdev" +COMPOSE_FILE="docker/docker-compose.dev.yml" +export COMPOSE_FILE COMPOSE_PROJECT_NAME + +# Ensure docker-compose exists +if hash docker-compose 2>/dev/null; then + cd "${DIR}/.." + echo -e "${BLUE}❯ ${CYAN}Testing Dev Stack ...${RESET}" + docker-compose exec -T npm bash -c "cd /app/backend && task test" +else + echo -e "${RED}❯ docker-compose command is not available${RESET}" +fi diff --git a/scripts/wait-healthy b/scripts/wait-healthy new file mode 100755 index 000000000..b89aef33c --- /dev/null +++ b/scripts/wait-healthy @@ -0,0 +1,38 @@ +#!/bin/bash + +CYAN='\E[1;36m' +YELLOW='\E[1;33m' +BLUE='\E[1;34m' +GREEN='\E[1;32m' +RED='\E[1;31m' +RESET='\E[0m' + +if [ "$1" == "" ]; then + echo "Waits for a docker container to be healthy." + echo "Usage: $0 docker-container" + exit 1 +fi + +SERVICE=$1 +LOOPCOUNT=0 +HEALTHY= +LIMIT=${2:-90} + +echo -e "${BLUE}❯ ${CYAN}Waiting for healthy: ${YELLOW}${SERVICE}${RESET}" + +until [ "${HEALTHY}" = "healthy" ]; do + echo -n "." + sleep 1 + HEALTHY="$(docker inspect -f '{{.State.Health.Status}}' $SERVICE)" + ((LOOPCOUNT++)) + + if [ "$LOOPCOUNT" == "$LIMIT" ]; then + echo "" + echo "" + echo -e "${BLUE}❯ ${RED}Timed out waiting for healthy${RESET}" + exit 1 + fi +done + +echo "" +echo -e "${BLUE}❯ ${GREEN}Healthy!${RESET}" diff --git a/src/backend/app.js b/src/backend/app.js deleted file mode 100644 index 03a7b8c78..000000000 --- a/src/backend/app.js +++ /dev/null @@ -1,105 +0,0 @@ -const path = require('path'); -const express = require('express'); -const bodyParser = require('body-parser'); -const fileUpload = require('express-fileupload'); -const compression = require('compression'); -const log = require('./logger').express; - -/** - * App - */ -const app = express(); -app.use(fileUpload()); -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({extended: true})); - -// Gzip -app.use(compression()); - -/** - * General Logging, BEFORE routes - */ - -app.disable('x-powered-by'); -app.enable('trust proxy', ['loopback', 'linklocal', 'uniquelocal']); -app.enable('strict routing'); - -// pretty print JSON when not live -if (process.env.NODE_ENV !== 'production') { - app.set('json spaces', 2); -} - -// set the view engine to ejs -app.set('view engine', 'ejs'); -app.set('views', path.join(__dirname, '/views')); - -// CORS for everything -app.use(require('./lib/express/cors')); - -// General security/cache related headers + server header -app.use(function (req, res, next) { - let x_frame_options = 'DENY'; - - if (typeof process.env.X_FRAME_OPTIONS !== 'undefined' && process.env.X_FRAME_OPTIONS) { - x_frame_options = process.env.X_FRAME_OPTIONS; - } - - res.set({ - 'Strict-Transport-Security': 'includeSubDomains; max-age=631138519; preload', - 'X-XSS-Protection': '1; mode=block', - 'X-Content-Type-Options': 'nosniff', - 'X-Frame-Options': x_frame_options, - 'Cache-Control': 'no-cache, no-store, max-age=0, must-revalidate', - Pragma: 'no-cache', - Expires: 0 - }); - next(); -}); - -// ATTACH JWT value - FOR ANY RATE LIMITERS and JWT DECODE -app.use(require('./lib/express/jwt')()); - -/** - * Routes - */ -app.use('/assets', express.static('dist/assets')); -app.use('/css', express.static('dist/css')); -app.use('/fonts', express.static('dist/fonts')); -app.use('/images', express.static('dist/images')); -app.use('/js', express.static('dist/js')); -app.use('/api', require('./routes/api/main')); -app.use('/', require('./routes/main')); - -// production error handler -// no stacktraces leaked to user -app.use(function (err, req, res, next) { - - let payload = { - error: { - code: err.status, - message: err.public ? err.message : 'Internal Error' - } - }; - - if (process.env.NODE_ENV === 'development') { - payload.debug = { - stack: typeof err.stack !== 'undefined' && err.stack ? err.stack.split('\n') : null, - previous: err.previous - }; - } - - // Not every error is worth logging - but this is good for now until it gets annoying. - if (typeof err.stack !== 'undefined' && err.stack) { - if (process.env.NODE_ENV === 'development') { - log.warn(err.stack); - } else { - log.warn(err.message); - } - } - - res - .status(err.status || 500) - .send(payload); -}); - -module.exports = app; diff --git a/src/backend/db.js b/src/backend/db.js deleted file mode 100644 index 6ad3f34c7..000000000 --- a/src/backend/db.js +++ /dev/null @@ -1,25 +0,0 @@ -const config = require('config'); - -if (!config.has('database')) { - throw new Error('Database config does not exist! Please read the instructions: https://github.com/jc21/nginx-proxy-manager/blob/master/doc/INSTALL.md'); -} - -let data = { - client: config.database.engine, - connection: { - host: config.database.host, - user: config.database.user, - password: config.database.password, - database: config.database.name, - port: config.database.port - }, - migrations: { - tableName: 'migrations' - } -}; - -if (typeof config.database.version !== 'undefined') { - data.version = config.database.version; -} - -module.exports = require('knex')(data); diff --git a/src/backend/importer.js b/src/backend/importer.js deleted file mode 100644 index 79b756c00..000000000 --- a/src/backend/importer.js +++ /dev/null @@ -1,543 +0,0 @@ -const fs = require('fs'); -const logger = require('./logger').import; -const utils = require('./lib/utils'); -const batchflow = require('batchflow'); -const debug_mode = process.env.NODE_ENV !== 'production' || !!process.env.DEBUG; - -const internalProxyHost = require('./internal/proxy-host'); -const internalRedirectionHost = require('./internal/redirection-host'); -const internalDeadHost = require('./internal/dead-host'); -const internalNginx = require('./internal/nginx'); -const internalAccessList = require('./internal/access-list'); -const internalStream = require('./internal/stream'); -const internalCertificate = require('./internal/certificate'); - -const accessListModel = require('./models/access_list'); -const accessListAuthModel = require('./models/access_list_auth'); -const proxyHostModel = require('./models/proxy_host'); -const redirectionHostModel = require('./models/redirection_host'); -const deadHostModel = require('./models/dead_host'); -const streamModel = require('./models/stream'); -const certificateModel = require('./models/certificate'); - -module.exports = function () { - - let access_map = {}; - let certificate_map = {}; - - /** - * @param {Access} access - * @param {Object} db - * @returns {Promise} - */ - const importAccessLists = function (access, db) { - return new Promise((resolve, reject) => { - let lists = db.access.find(); - - batchflow(lists).sequential() - .each((i, list, next) => { - - importAccessList(access, list) - .then(() => { - next(); - }) - .catch(err => { - next(err); - }); - }) - .end(results => { - resolve(results); - }); - }); - }; - - /** - * @param {Access} access - * @param {Object} list - * @returns {Promise} - */ - const importAccessList = function (access, list) { - // Create the list - logger.info('Creating Access List: ' + list.name); - - return accessListModel - .query() - .insertAndFetch({ - name: list.name, - owner_user_id: 1 - }) - .then(row => { - access_map[list._id] = row.id; - - return new Promise((resolve, reject) => { - batchflow(list.items).sequential() - .each((i, item, next) => { - if (typeof item.password !== 'undefined' && item.password.length) { - logger.info('Adding to Access List: ' + item.username); - - accessListAuthModel - .query() - .insert({ - access_list_id: row.id, - username: item.username, - password: item.password - }) - .then(() => { - next(); - }) - .catch(err => { - logger.error(err); - next(err); - }); - } - }) - .error(err => { - logger.error(err); - reject(err); - }) - .end(results => { - logger.success('Finished importing Access List: ' + list.name); - resolve(results); - }); - }) - .then(() => { - return internalAccessList.get(access, { - id: row.id, - expand: ['owner', 'items'] - }, true /* <- skip masking */); - }) - .then(full_list => { - return internalAccessList.build(full_list); - }); - }); - }; - - /** - * @param {Access} access - * @returns {Promise} - */ - const importCertificates = function (access) { - // This step involves transforming the letsencrypt folder structure significantly. - - // - /etc/letsencrypt/accounts Do not touch - // - /etc/letsencrypt/archive Modify directory names - // - /etc/letsencrypt/csr Do not touch - // - /etc/letsencrypt/keys Do not touch - // - /etc/letsencrypt/live Modify directory names, modify file symlinks - // - /etc/letsencrypt/renewal Modify filenames and file content - - return new Promise((resolve, reject) => { - // 1. List all folders in `archive` - // 2. Create certificates from those folders, rename them, add to map - // 3. - - try { - resolve(fs.readdirSync('/etc/letsencrypt/archive')); - } catch (err) { - reject(err); - } - }) - .then(archive_dirs => { - return new Promise((resolve, reject) => { - batchflow(archive_dirs).sequential() - .each((i, archive_dir_name, next) => { - importCertificate(access, archive_dir_name) - .then(() => { - next(); - }) - .catch(err => { - next(err); - }); - }) - .end(results => { - resolve(results); - }); - }); - - }); - }; - - /** - * @param {Access} access - * @param {String} archive_dir_name - * @returns {Promise} - */ - const importCertificate = function (access, archive_dir_name) { - logger.info('Importing Certificate: ' + archive_dir_name); - - let full_archive_path = '/etc/letsencrypt/archive/' + archive_dir_name; - let full_live_path = '/etc/letsencrypt/live/' + archive_dir_name; - - let new_archive_path = '/etc/letsencrypt/archive/'; - let new_live_path = '/etc/letsencrypt/live/'; - - // 1. Create certificate row to get the ID - return certificateModel - .query() - .insertAndFetch({ - owner_user_id: 1, - provider: 'letsencrypt', - nice_name: archive_dir_name, - domain_names: [archive_dir_name] - }) - .then(certificate => { - certificate_map[archive_dir_name] = certificate.id; - - // 2. rename archive folder name - new_archive_path = new_archive_path + 'npm-' + certificate.id; - fs.renameSync(full_archive_path, new_archive_path); - - return certificate; - }) - .then(certificate => { - // 3. rename live folder name - new_live_path = new_live_path + 'npm-' + certificate.id; - fs.renameSync(full_live_path, new_live_path); - - // and also update the symlinks in this folder: - process.chdir(new_live_path); - let version = getCertificateVersion(new_archive_path); - let names = [ - ['cert.pem', 'cert' + version + '.pem'], - ['chain.pem', 'chain' + version + '.pem'], - ['fullchain.pem', 'fullchain' + version + '.pem'], - ['privkey.pem', 'privkey' + version + '.pem'] - ]; - - names.map(function (name) { - // remove symlink - try { - fs.unlinkSync(new_live_path + '/' + name[0]); - } catch (err) { - // do nothing - logger.error(err); - } - - // create new symlink - fs.symlinkSync('../../archive/npm-' + certificate.id + '/' + name[1], name[0]); - }); - - return certificate; - }) - .then(certificate => { - // 4. rename and update renewal config file - let config_file = '/etc/letsencrypt/renewal/' + archive_dir_name + '.conf'; - - return utils.exec('sed -i \'s/\\/config/\\/data/g\' ' + config_file) - .then(() => { - let escaped = archive_dir_name.split('.').join('\\.'); - return utils.exec('sed -i \'s/\\/' + escaped + '/\\/npm-' + certificate.id + '/g\' ' + config_file); - }) - .then(() => { - //rename config file - fs.renameSync(config_file, '/etc/letsencrypt/renewal/npm-' + certificate.id + '.conf'); - return certificate; - }); - }) - .then(certificate => { - // 5. read the cert info back in to the db - return internalCertificate.getCertificateInfoFromFile(new_live_path + '/fullchain.pem') - .then(cert_info => { - return certificateModel - .query() - .patchAndFetchById(certificate.id, { - expires_on: certificateModel.raw('FROM_UNIXTIME(' + cert_info.dates.to + ')') - }); - }); - }); - }; - - /** - * @param {String} archive_path - * @returns {Integer} - */ - const getCertificateVersion = function (archive_path) { - let version = 1; - - try { - let files = fs.readdirSync(archive_path); - - files.map(function (file) { - let res = file.match(/fullchain([0-9])+?\.pem/im); - if (res && parseInt(res[1], 10) > version) { - version = parseInt(res[1], 10); - } - }); - - } catch (err) { - // do nothing - } - - return version; - }; - - /** - * @param {Access} access - * @param {Object} db - * @returns {Promise} - */ - const importHosts = function (access, db) { - return new Promise((resolve, reject) => { - let hosts = db.hosts.find(); - - batchflow(hosts).sequential() - .each((i, host, next) => { - importHost(access, host) - .then(() => { - next(); - }) - .catch(err => { - next(err); - }); - }) - .end(results => { - resolve(results); - }); - }); - }; - - /** - * @param {Access} access - * @param {Object} host - * @returns {Promise} - */ - const importHost = function (access, host) { - // Create the list - if (typeof host.type === 'undefined') { - host.type = 'proxy'; - } - - switch (host.type) { - case 'proxy': - return importProxyHost(access, host); - case '404': - return importDeadHost(access, host); - case 'redirection': - return importRedirectionHost(access, host); - case 'stream': - return importStream(access, host); - default: - return Promise.resolve(); - } - }; - - /** - * @param {Access} access - * @param {Object} host - * @returns {Promise} - */ - const importProxyHost = function (access, host) { - logger.info('Creating Proxy Host: ' + host.hostname); - - let access_list_id = 0; - let certificate_id = 0; - let meta = {}; - - if (typeof host.letsencrypt_email !== 'undefined') { - meta.letsencrypt_email = host.letsencrypt_email; - } - - // determine access_list_id - if (typeof host.access_list_id !== 'undefined' && host.access_list_id && typeof access_map[host.access_list_id] !== 'undefined') { - access_list_id = access_map[host.access_list_id]; - } - - // determine certificate_id - if (host.ssl && typeof certificate_map[host.hostname] !== 'undefined') { - certificate_id = certificate_map[host.hostname]; - } - - return proxyHostModel - .query() - .insertAndFetch({ - owner_user_id: 1, - domain_names: [host.hostname], - forward_host: host.forward_server, - forward_port: host.forward_port, - access_list_id: access_list_id, - certificate_id: certificate_id, - ssl_forced: host.force_ssl || false, - caching_enabled: host.asset_caching || false, - block_exploits: host.block_exploits || false, - advanced_config: host.advanced || '', - meta: meta - }) - .then(row => { - // re-fetch with cert - return internalProxyHost.get(access, { - id: row.id, - expand: ['certificate', 'owner', 'access_list'] - }); - }) - .then(row => { - // Configure nginx - return internalNginx.configure(proxyHostModel, 'proxy_host', row); - }); - }; - - /** - * @param {Access} access - * @param {Object} host - * @returns {Promise} - */ - const importDeadHost = function (access, host) { - logger.info('Creating 404 Host: ' + host.hostname); - - let certificate_id = 0; - let meta = {}; - - if (typeof host.letsencrypt_email !== 'undefined') { - meta.letsencrypt_email = host.letsencrypt_email; - } - - // determine certificate_id - if (host.ssl && typeof certificate_map[host.hostname] !== 'undefined') { - certificate_id = certificate_map[host.hostname]; - } - - return deadHostModel - .query() - .insertAndFetch({ - owner_user_id: 1, - domain_names: [host.hostname], - certificate_id: certificate_id, - ssl_forced: host.force_ssl || false, - advanced_config: host.advanced || '', - meta: meta - }) - .then(row => { - // re-fetch with cert - return internalDeadHost.get(access, { - id: row.id, - expand: ['certificate', 'owner'] - }); - }) - .then(row => { - // Configure nginx - return internalNginx.configure(deadHostModel, 'dead_host', row); - }); - }; - - /** - * @param {Access} access - * @param {Object} host - * @returns {Promise} - */ - const importRedirectionHost = function (access, host) { - logger.info('Creating Redirection Host: ' + host.hostname); - - let certificate_id = 0; - let meta = {}; - - if (typeof host.letsencrypt_email !== 'undefined') { - meta.letsencrypt_email = host.letsencrypt_email; - } - - // determine certificate_id - if (host.ssl && typeof certificate_map[host.hostname] !== 'undefined') { - certificate_id = certificate_map[host.hostname]; - } - - return redirectionHostModel - .query() - .insertAndFetch({ - owner_user_id: 1, - domain_names: [host.hostname], - forward_domain_name: host.forward_host, - block_exploits: host.block_exploits || false, - certificate_id: certificate_id, - ssl_forced: host.force_ssl || false, - advanced_config: host.advanced || '', - meta: meta - }) - .then(row => { - // re-fetch with cert - return internalRedirectionHost.get(access, { - id: row.id, - expand: ['certificate', 'owner'] - }); - }) - .then(row => { - // Configure nginx - return internalNginx.configure(redirectionHostModel, 'redirection_host', row); - }); - }; - - /** - * @param {Access} access - * @param {Object} host - * @returns {Promise} - */ - const importStream = function (access, host) { - logger.info('Creating Stream: ' + host.incoming_port); - - return streamModel - .query() - .insertAndFetch({ - owner_user_id: 1, - incoming_port: host.incoming_port, - forward_ip: host.forward_server, - forwarding_port: host.forward_port, - tcp_forwarding: host.protocols.indexOf('tcp') !== -1, - udp_forwarding: host.protocols.indexOf('udp') !== -1 - }) - .then(row => { - // re-fetch with cert - return internalStream.get(access, { - id: row.id, - expand: ['owner'] - }); - }) - .then(row => { - // Configure nginx - return internalNginx.configure(streamModel, 'stream', row); - }); - }; - - /** - * Returned Promise - */ - return new Promise((resolve, reject) => { - if (fs.existsSync('/config') && !fs.existsSync('/config/v2-imported')) { - - logger.info('Beginning import from V1 ...'); - - const db = require('diskdb'); - module.exports = db.connect('/config', ['hosts', 'access']); - - // Create a fake access object - const Access = require('./lib/access'); - let access = new Access(null); - - resolve(access.load(true) - .then(() => { - // Import access lists first - return importAccessLists(access, db) - .then(() => { - // Then import Lets Encrypt Certificates - return importCertificates(access); - }) - .then(() => { - // then hosts - return importHosts(access, db); - }) - .then(() => { - // Write the /config/v2-imported file so we don't import again - fs.writeFile('/config/v2-imported', 'true', function (err) { - if (err) { - logger.err(err); - } - }); - }); - }) - ); - - } else { - if (debug_mode) { - logger.debug('Importer skipped'); - } - - resolve(); - } - }); -}; diff --git a/src/backend/index.js b/src/backend/index.js deleted file mode 100644 index d97450e47..000000000 --- a/src/backend/index.js +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env node - -const logger = require('./logger').global; - -function appStart () { - const migrate = require('./migrate'); - const setup = require('./setup'); - const importer = require('./importer'); - const app = require('./app'); - const apiValidator = require('./lib/validator/api'); - const internalCertificate = require('./internal/certificate'); - const internalIpRanges = require('./internal/ip_ranges'); - - return migrate.latest() - .then(setup) - .then(importer) - .then(() => { - return apiValidator.loadSchemas; - }) - .then(internalIpRanges.fetch) - .then(() => { - - internalCertificate.initTimer(); - internalIpRanges.initTimer(); - - const server = app.listen(81, () => { - logger.info('PID ' + process.pid + ' listening on port 81 ...'); - - process.on('SIGTERM', () => { - logger.info('PID ' + process.pid + ' received SIGTERM'); - server.close(() => { - logger.info('Stopping.'); - process.exit(0); - }); - }); - }); - }) - .catch(err => { - logger.error(err.message); - setTimeout(appStart, 1000); - }); -} - -try { - appStart(); -} catch (err) { - logger.error(err.message, err); - process.exit(1); -} diff --git a/src/backend/internal/access-list.js b/src/backend/internal/access-list.js deleted file mode 100644 index 0b9f927f6..000000000 --- a/src/backend/internal/access-list.js +++ /dev/null @@ -1,482 +0,0 @@ -const _ = require('lodash'); -const fs = require('fs'); -const batchflow = require('batchflow'); -const logger = require('../logger').access; -const error = require('../lib/error'); -const accessListModel = require('../models/access_list'); -const accessListAuthModel = require('../models/access_list_auth'); -const proxyHostModel = require('../models/proxy_host'); -const internalAuditLog = require('./audit-log'); -const internalNginx = require('./nginx'); -const utils = require('../lib/utils'); - -function omissions () { - return ['is_deleted']; -} - -const internalAccessList = { - - /** - * @param {Access} access - * @param {Object} data - * @returns {Promise} - */ - create: (access, data) => { - return access.can('access_lists:create', data) - .then(access_data => { - return accessListModel - .query() - .omit(omissions()) - .insertAndFetch({ - name: data.name, - owner_user_id: access.token.getUserId(1) - }); - }) - .then(row => { - data.id = row.id; - - // Now add the items - let promises = []; - data.items.map(function (item) { - promises.push(accessListAuthModel - .query() - .insert({ - access_list_id: row.id, - username: item.username, - password: item.password - }) - ); - }); - - return Promise.all(promises); - }) - .then(() => { - // re-fetch with expansions - return internalAccessList.get(access, { - id: data.id, - expand: ['owner', 'items'] - }, true /* <- skip masking */); - }) - .then(row => { - // Audit log - data.meta = _.assign({}, data.meta || {}, row.meta); - - return internalAccessList.build(row) - .then(() => { - if (row.proxy_host_count) { - return internalNginx.reload(); - } - }) - .then(() => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'created', - object_type: 'access-list', - object_id: row.id, - meta: internalAccessList.maskItems(data) - }); - }) - .then(() => { - return internalAccessList.maskItems(row); - }); - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Integer} data.id - * @param {String} [data.name] - * @param {String} [data.items] - * @return {Promise} - */ - update: (access, data) => { - return access.can('access_lists:update', data.id) - .then(access_data => { - return internalAccessList.get(access, {id: data.id}); - }) - .then(row => { - if (row.id !== data.id) { - // Sanity check that something crazy hasn't happened - throw new error.InternalValidationError('Access List could not be updated, IDs do not match: ' + row.id + ' !== ' + data.id); - } - - }) - .then(() => { - // patch name if specified - if (typeof data.name !== 'undefined' && data.name) { - return accessListModel - .query() - .where({id: data.id}) - .patch({ - name: data.name - }); - } - }) - .then(() => { - // Check for items and add/update/remove them - if (typeof data.items !== 'undefined' && data.items) { - let promises = []; - let items_to_keep = []; - - data.items.map(function (item) { - if (item.password) { - promises.push(accessListAuthModel - .query() - .insert({ - access_list_id: data.id, - username: item.username, - password: item.password - }) - ); - } else { - // This was supplied with an empty password, which means keep it but don't change the password - items_to_keep.push(item.username); - } - }); - - let query = accessListAuthModel - .query() - .delete() - .where('access_list_id', data.id); - - if (items_to_keep.length) { - query.andWhere('username', 'NOT IN', items_to_keep); - } - - return query - .then(() => { - // Add new items - if (promises.length) { - return Promise.all(promises); - } - }); - } - }) - .then(() => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'updated', - object_type: 'access-list', - object_id: data.id, - meta: internalAccessList.maskItems(data) - }); - }) - .then(() => { - // re-fetch with expansions - return internalAccessList.get(access, { - id: data.id, - expand: ['owner', 'items'] - }, true /* <- skip masking */); - }) - .then(row => { - return internalAccessList.build(row) - .then(() => { - if (row.proxy_host_count) { - return internalNginx.reload(); - } - }) - .then(() => { - return internalAccessList.maskItems(row); - }); - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Integer} data.id - * @param {Array} [data.expand] - * @param {Array} [data.omit] - * @param {Boolean} [skip_masking] - * @return {Promise} - */ - get: (access, data, skip_masking) => { - if (typeof data === 'undefined') { - data = {}; - } - - return access.can('access_lists:get', data.id) - .then(access_data => { - let query = accessListModel - .query() - .select('access_list.*', accessListModel.raw('COUNT(proxy_host.id) as proxy_host_count')) - .joinRaw('LEFT JOIN `proxy_host` ON `proxy_host`.`access_list_id` = `access_list`.`id` AND `proxy_host`.`is_deleted` = 0') - .where('access_list.is_deleted', 0) - .andWhere('access_list.id', data.id) - .allowEager('[owner,items,proxy_hosts]') - .omit(['access_list.is_deleted']) - .first(); - - if (access_data.permission_visibility !== 'all') { - query.andWhere('access_list.owner_user_id', access.token.getUserId(1)); - } - - // Custom omissions - if (typeof data.omit !== 'undefined' && data.omit !== null) { - query.omit(data.omit); - } - - if (typeof data.expand !== 'undefined' && data.expand !== null) { - query.eager('[' + data.expand.join(', ') + ']'); - } - - return query; - }) - .then(row => { - if (row) { - if (!skip_masking && typeof row.items !== 'undefined' && row.items) { - row = internalAccessList.maskItems(row); - } - - return _.omit(row, omissions()); - } else { - throw new error.ItemNotFoundError(data.id); - } - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Integer} data.id - * @param {String} [data.reason] - * @returns {Promise} - */ - delete: (access, data) => { - return access.can('access_lists:delete', data.id) - .then(() => { - return internalAccessList.get(access, {id: data.id, expand: ['proxy_hosts', 'items']}); - }) - .then(row => { - if (!row) { - throw new error.ItemNotFoundError(data.id); - } - - // 1. update row to be deleted - // 2. update any proxy hosts that were using it (ignoring permissions) - // 3. reconfigure those hosts - // 4. audit log - - // 1. update row to be deleted - return accessListModel - .query() - .where('id', row.id) - .patch({ - is_deleted: 1 - }) - .then(() => { - // 2. update any proxy hosts that were using it (ignoring permissions) - if (row.proxy_hosts) { - return proxyHostModel - .query() - .where('access_list_id', '=', row.id) - .patch({access_list_id: 0}) - .then(() => { - // 3. reconfigure those hosts, then reload nginx - - // set the access_list_id to zero for these items - row.proxy_hosts.map(function (val, idx) { - row.proxy_hosts[idx].access_list_id = 0; - }); - - return internalNginx.bulkGenerateConfigs('proxy_host', row.proxy_hosts); - }) - .then(() => { - return internalNginx.reload(); - }); - } - }) - .then(() => { - // delete the htpasswd file - let htpasswd_file = internalAccessList.getFilename(row); - - try { - fs.unlinkSync(htpasswd_file); - } catch (err) { - // do nothing - } - }) - .then(() => { - // 4. audit log - return internalAuditLog.add(access, { - action: 'deleted', - object_type: 'access-list', - object_id: row.id, - meta: _.omit(internalAccessList.maskItems(row), ['is_deleted', 'proxy_hosts']) - }); - }) - }) - .then(() => { - return true; - }); - }, - - /** - * All Lists - * - * @param {Access} access - * @param {Array} [expand] - * @param {String} [search_query] - * @returns {Promise} - */ - getAll: (access, expand, search_query) => { - return access.can('access_lists:list') - .then(access_data => { - let query = accessListModel - .query() - .select('access_list.*', accessListModel.raw('COUNT(proxy_host.id) as proxy_host_count')) - .joinRaw('LEFT JOIN `proxy_host` ON `proxy_host`.`access_list_id` = `access_list`.`id` AND `proxy_host`.`is_deleted` = 0') - .where('access_list.is_deleted', 0) - .groupBy('access_list.id') - .omit(['access_list.is_deleted']) - .allowEager('[owner,items]') - .orderBy('access_list.name', 'ASC'); - - if (access_data.permission_visibility !== 'all') { - query.andWhere('owner_user_id', access.token.getUserId(1)); - } - - // Query is used for searching - if (typeof search_query === 'string') { - query.where(function () { - this.where('name', 'like', '%' + search_query + '%'); - }); - } - - if (typeof expand !== 'undefined' && expand !== null) { - query.eager('[' + expand.join(', ') + ']'); - } - - return query; - }) - .then(rows => { - if (rows) { - rows.map(function (row, idx) { - if (typeof row.items !== 'undefined' && row.items) { - rows[idx] = internalAccessList.maskItems(row); - } - }); - } - - return rows; - }); - }, - - /** - * Report use - * - * @param {Integer} user_id - * @param {String} visibility - * @returns {Promise} - */ - getCount: (user_id, visibility) => { - let query = accessListModel - .query() - .count('id as count') - .where('is_deleted', 0); - - if (visibility !== 'all') { - query.andWhere('owner_user_id', user_id); - } - - return query.first() - .then(row => { - return parseInt(row.count, 10); - }); - }, - - /** - * @param {Object} list - * @returns {Object} - */ - maskItems: list => { - if (list && typeof list.items !== 'undefined') { - list.items.map(function (val, idx) { - let repeat_for = 8; - let first_char = '*'; - - if (typeof val.password !== 'undefined' && val.password) { - repeat_for = val.password.length - 1; - first_char = val.password.charAt(0); - } - - list.items[idx].hint = first_char + ('*').repeat(repeat_for); - list.items[idx].password = ''; - }); - } - - return list; - }, - - /** - * @param {Object} list - * @param {Integer} list.id - * @returns {String} - */ - getFilename: list => { - return '/data/access/' + list.id; - }, - - /** - * @param {Object} list - * @param {Integer} list.id - * @param {String} list.name - * @param {Array} list.items - * @returns {Promise} - */ - build: list => { - logger.info('Building Access file #' + list.id + ' for: ' + list.name); - - return new Promise((resolve, reject) => { - let htpasswd_file = internalAccessList.getFilename(list); - - // 1. remove any existing access file - try { - fs.unlinkSync(htpasswd_file); - } catch (err) { - // do nothing - } - - // 2. create empty access file - try { - fs.writeFileSync(htpasswd_file, '', {encoding: 'utf8'}); - resolve(htpasswd_file); - } catch (err) { - reject(err); - } - }) - .then(htpasswd_file => { - // 3. generate password for each user - if (list.items.length) { - return new Promise((resolve, reject) => { - batchflow(list.items).sequential() - .each((i, item, next) => { - if (typeof item.password !== 'undefined' && item.password.length) { - logger.info('Adding: ' + item.username); - - utils.exec('/usr/bin/htpasswd -b "' + htpasswd_file + '" "' + item.username + '" "' + item.password + '"') - .then((/*result*/) => { - next(); - }) - .catch(err => { - logger.error(err); - next(err); - }); - } - }) - .error(err => { - logger.error(err); - reject(err); - }) - .end(results => { - logger.success('Built Access file #' + list.id + ' for: ' + list.name); - resolve(results); - }); - }); - } - }); - } -}; - -module.exports = internalAccessList; diff --git a/src/backend/internal/audit-log.js b/src/backend/internal/audit-log.js deleted file mode 100644 index 52090ebdc..000000000 --- a/src/backend/internal/audit-log.js +++ /dev/null @@ -1,78 +0,0 @@ -const error = require('../lib/error'); -const auditLogModel = require('../models/audit-log'); - -const internalAuditLog = { - - /** - * All logs - * - * @param {Access} access - * @param {Array} [expand] - * @param {String} [search_query] - * @returns {Promise} - */ - getAll: (access, expand, search_query) => { - return access.can('auditlog:list') - .then(() => { - let query = auditLogModel - .query() - .orderBy('created_on', 'DESC') - .orderBy('id', 'DESC') - .limit(100) - .allowEager('[user]'); - - // Query is used for searching - if (typeof search_query === 'string') { - query.where(function () { - this.where('meta', 'like', '%' + search_query + '%'); - }); - } - - if (typeof expand !== 'undefined' && expand !== null) { - query.eager('[' + expand.join(', ') + ']'); - } - - return query; - }); - }, - - /** - * This method should not be publicly used, it doesn't check certain things. It will be assumed - * that permission to add to audit log is already considered, however the access token is used for - * default user id determination. - * - * @param {Access} access - * @param {Object} data - * @param {String} data.action - * @param {Number} [data.user_id] - * @param {Number} [data.object_id] - * @param {Number} [data.object_type] - * @param {Object} [data.meta] - * @returns {Promise} - */ - add: (access, data) => { - return new Promise((resolve, reject) => { - // Default the user id - if (typeof data.user_id === 'undefined' || !data.user_id) { - data.user_id = access.token.getUserId(1); - } - - if (typeof data.action === 'undefined' || !data.action) { - reject(new error.InternalValidationError('Audit log entry must contain an Action')); - } else { - // Make sure at least 1 of the IDs are set and action - resolve(auditLogModel - .query() - .insert({ - user_id: data.user_id, - action: data.action, - object_type: data.object_type || '', - object_id: data.object_id || 0, - meta: data.meta || {} - })); - } - }); - } -}; - -module.exports = internalAuditLog; diff --git a/src/backend/internal/certificate.js b/src/backend/internal/certificate.js deleted file mode 100644 index 89d497673..000000000 --- a/src/backend/internal/certificate.js +++ /dev/null @@ -1,911 +0,0 @@ -const fs = require('fs'); -const _ = require('lodash'); -const logger = require('../logger').ssl; -const error = require('../lib/error'); -const certificateModel = require('../models/certificate'); -const internalAuditLog = require('./audit-log'); -const tempWrite = require('temp-write'); -const utils = require('../lib/utils'); -const moment = require('moment'); -const debug_mode = process.env.NODE_ENV !== 'production' || !!process.env.DEBUG; -const le_staging = process.env.NODE_ENV !== 'production'; -const internalNginx = require('./nginx'); -const internalHost = require('./host'); -const certbot_command = '/usr/bin/certbot'; - -function omissions() { - return ['is_deleted']; -} - -const internalCertificate = { - - allowed_ssl_files: ['certificate', 'certificate_key', 'intermediate_certificate'], - interval_timeout: 1000 * 60 * 60, // 1 hour - interval: null, - interval_processing: false, - - initTimer: () => { - logger.info('Let\'s Encrypt Renewal Timer initialized'); - internalCertificate.interval = setInterval(internalCertificate.processExpiringHosts, internalCertificate.interval_timeout); - }, - - /** - * Triggered by a timer, this will check for expiring hosts and renew their ssl certs if required - */ - processExpiringHosts: () => { - if (!internalCertificate.interval_processing) { - internalCertificate.interval_processing = true; - logger.info('Renewing SSL certs close to expiry...'); - - return utils.exec(certbot_command + ' renew -q ' + (le_staging ? '--staging' : '')) - .then(result => { - logger.info(result); - - return internalNginx.reload() - .then(() => { - logger.info('Renew Complete'); - return result; - }); - }) - .then(() => { - // Now go and fetch all the letsencrypt certs from the db and query the files and update expiry times - return certificateModel - .query() - .where('is_deleted', 0) - .andWhere('provider', 'letsencrypt') - .then(certificates => { - if (certificates && certificates.length) { - let promises = []; - - certificates.map(function (certificate) { - promises.push( - internalCertificate.getCertificateInfoFromFile('/etc/letsencrypt/live/npm-' + certificate.id + '/fullchain.pem') - .then(cert_info => { - return certificateModel - .query() - .where('id', certificate.id) - .andWhere('provider', 'letsencrypt') - .patch({ - expires_on: certificateModel.raw('FROM_UNIXTIME(' + cert_info.dates.to + ')') - }); - }) - .catch(err => { - // Don't want to stop the train here, just log the error - logger.error(err.message); - }) - ); - }); - - return Promise.all(promises); - } - }); - }) - .then(() => { - internalCertificate.interval_processing = false; - }) - .catch(err => { - logger.error(err); - internalCertificate.interval_processing = false; - }); - } - }, - - /** - * @param {Access} access - * @param {Object} data - * @returns {Promise} - */ - create: (access, data) => { - return access.can('certificates:create', data) - .then(() => { - data.owner_user_id = access.token.getUserId(1); - - if (data.provider === 'letsencrypt') { - data.nice_name = data.domain_names.sort().join(', '); - } - - return certificateModel - .query() - .omit(omissions()) - .insertAndFetch(data); - }) - .then(certificate => { - if (certificate.provider === 'letsencrypt') { - // Request a new Cert from LE. Let the fun begin. - - // 1. Find out any hosts that are using any of the hostnames in this cert - // 2. Disable them in nginx temporarily - // 3. Generate the LE config - // 4. Request cert - // 5. Remove LE config - // 6. Re-instate previously disabled hosts - - // 1. Find out any hosts that are using any of the hostnames in this cert - return internalHost.getHostsWithDomains(certificate.domain_names) - .then(in_use_result => { - // 2. Disable them in nginx temporarily - return internalCertificate.disableInUseHosts(in_use_result) - .then(() => { - return in_use_result; - }); - }) - .then(in_use_result => { - // 3. Generate the LE config - return internalNginx.generateLetsEncryptRequestConfig(certificate) - .then(internalNginx.reload) - .then(() => { - // 4. Request cert - return internalCertificate.requestLetsEncryptSsl(certificate); - }) - .then(() => { - // 5. Remove LE config - return internalNginx.deleteLetsEncryptRequestConfig(certificate); - }) - .then(internalNginx.reload) - .then(() => { - // 6. Re-instate previously disabled hosts - return internalCertificate.enableInUseHosts(in_use_result); - }) - .then(() => { - return certificate; - }) - .catch(err => { - // In the event of failure, revert things and throw err back - return internalNginx.deleteLetsEncryptRequestConfig(certificate) - .then(() => { - return internalCertificate.enableInUseHosts(in_use_result); - }) - .then(internalNginx.reload) - .then(() => { - throw err; - }); - }); - }) - .then(() => { - // At this point, the letsencrypt cert should exist on disk. - // Lets get the expiry date from the file and update the row silently - return internalCertificate.getCertificateInfoFromFile('/etc/letsencrypt/live/npm-' + certificate.id + '/fullchain.pem') - .then(cert_info => { - return certificateModel - .query() - .patchAndFetchById(certificate.id, { - expires_on: certificateModel.raw('FROM_UNIXTIME(' + cert_info.dates.to + ')') - }) - .then(saved_row => { - // Add cert data for audit log - saved_row.meta = _.assign({}, saved_row.meta, { - letsencrypt_certificate: cert_info - }); - - return saved_row; - }); - }); - }); - } else { - return certificate; - } - }).then(certificate => { - - data.meta = _.assign({}, data.meta || {}, certificate.meta); - - // Add to audit log - return internalAuditLog.add(access, { - action: 'created', - object_type: 'certificate', - object_id: certificate.id, - meta: data - }) - .then(() => { - return certificate; - }); - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {String} [data.email] - * @param {String} [data.name] - * @return {Promise} - */ - update: (access, data) => { - return access.can('certificates:update', data.id) - .then(access_data => { - return internalCertificate.get(access, {id: data.id}); - }) - .then(row => { - if (row.id !== data.id) { - // Sanity check that something crazy hasn't happened - throw new error.InternalValidationError('Certificate could not be updated, IDs do not match: ' + row.id + ' !== ' + data.id); - } - - return certificateModel - .query() - .omit(omissions()) - .patchAndFetchById(row.id, data) - .then(saved_row => { - saved_row.meta = internalCertificate.cleanMeta(saved_row.meta); - data.meta = internalCertificate.cleanMeta(data.meta); - - // Add row.nice_name for custom certs - if (saved_row.provider === 'other') { - data.nice_name = saved_row.nice_name; - } - - // Add to audit log - return internalAuditLog.add(access, { - action: 'updated', - object_type: 'certificate', - object_id: row.id, - meta: _.omit(data, ['expires_on']) // this prevents json circular reference because expires_on might be raw - }) - .then(() => { - return _.omit(saved_row, omissions()); - }); - }); - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {Array} [data.expand] - * @param {Array} [data.omit] - * @return {Promise} - */ - get: (access, data) => { - if (typeof data === 'undefined') { - data = {}; - } - - return access.can('certificates:get', data.id) - .then(access_data => { - let query = certificateModel - .query() - .where('is_deleted', 0) - .andWhere('id', data.id) - .allowEager('[owner]') - .first(); - - if (access_data.permission_visibility !== 'all') { - query.andWhere('owner_user_id', access.token.getUserId(1)); - } - - // Custom omissions - if (typeof data.omit !== 'undefined' && data.omit !== null) { - query.omit(data.omit); - } - - if (typeof data.expand !== 'undefined' && data.expand !== null) { - query.eager('[' + data.expand.join(', ') + ']'); - } - - return query; - }) - .then(row => { - if (row) { - return _.omit(row, omissions()); - } else { - throw new error.ItemNotFoundError(data.id); - } - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {String} [data.reason] - * @returns {Promise} - */ - delete: (access, data) => { - return access.can('certificates:delete', data.id) - .then(() => { - return internalCertificate.get(access, {id: data.id}); - }) - .then(row => { - if (!row) { - throw new error.ItemNotFoundError(data.id); - } - - return certificateModel - .query() - .where('id', row.id) - .patch({ - is_deleted: 1 - }) - .then(() => { - // Add to audit log - row.meta = internalCertificate.cleanMeta(row.meta); - - return internalAuditLog.add(access, { - action: 'deleted', - object_type: 'certificate', - object_id: row.id, - meta: _.omit(row, omissions()) - }); - }) - .then(() => { - if (row.provider === 'letsencrypt') { - // Revoke the cert - return internalCertificate.revokeLetsEncryptSsl(row); - } - }); - }) - .then(() => { - return true; - }); - }, - - /** - * All Certs - * - * @param {Access} access - * @param {Array} [expand] - * @param {String} [search_query] - * @returns {Promise} - */ - getAll: (access, expand, search_query) => { - return access.can('certificates:list') - .then(access_data => { - let query = certificateModel - .query() - .where('is_deleted', 0) - .groupBy('id') - .omit(['is_deleted']) - .allowEager('[owner]') - .orderBy('nice_name', 'ASC'); - - if (access_data.permission_visibility !== 'all') { - query.andWhere('owner_user_id', access.token.getUserId(1)); - } - - // Query is used for searching - if (typeof search_query === 'string') { - query.where(function () { - this.where('name', 'like', '%' + search_query + '%'); - }); - } - - if (typeof expand !== 'undefined' && expand !== null) { - query.eager('[' + expand.join(', ') + ']'); - } - - return query; - }); - }, - - /** - * Report use - * - * @param {Number} user_id - * @param {String} visibility - * @returns {Promise} - */ - getCount: (user_id, visibility) => { - let query = certificateModel - .query() - .count('id as count') - .where('is_deleted', 0); - - if (visibility !== 'all') { - query.andWhere('owner_user_id', user_id); - } - - return query.first() - .then(row => { - return parseInt(row.count, 10); - }); - }, - - /** - * @param {Object} certificate - * @returns {Promise} - */ - writeCustomCert: certificate => { - if (debug_mode) { - logger.info('Writing Custom Certificate:', certificate); - } - - let dir = '/data/custom_ssl/npm-' + certificate.id; - - return new Promise((resolve, reject) => { - if (certificate.provider === 'letsencrypt') { - reject(new Error('Refusing to write letsencrypt certs here')); - return; - } - - let cert_data = certificate.meta.certificate; - if (typeof certificate.meta.intermediate_certificate !== 'undefined') { - cert_data = cert_data + "\n" + certificate.meta.intermediate_certificate; - } - - try { - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir); - } - } catch (err) { - reject(err); - return; - } - - fs.writeFile(dir + '/fullchain.pem', cert_data, function (err) { - if (err) { - reject(err); - } else { - resolve(); - } - }); - }) - .then(() => { - return new Promise((resolve, reject) => { - fs.writeFile(dir + '/privkey.pem', certificate.meta.certificate_key, function (err) { - if (err) { - reject(err); - } else { - resolve(); - } - }); - }); - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Array} data.domain_names - * @param {String} data.meta.letsencrypt_email - * @param {Boolean} data.meta.letsencrypt_agree - * @returns {Promise} - */ - createQuickCertificate: (access, data) => { - return internalCertificate.create(access, { - provider: 'letsencrypt', - domain_names: data.domain_names, - meta: data.meta - }); - }, - - /** - * Validates that the certs provided are good. - * No access required here, nothing is changed or stored. - * - * @param {Object} data - * @param {Object} data.files - * @returns {Promise} - */ - validate: data => { - return new Promise(resolve => { - // Put file contents into an object - let files = {}; - _.map(data.files, (file, name) => { - if (internalCertificate.allowed_ssl_files.indexOf(name) !== -1) { - files[name] = file.data.toString(); - } - }); - - resolve(files); - }) - .then(files => { - // For each file, create a temp file and write the contents to it - // Then test it depending on the file type - let promises = []; - _.map(files, (content, type) => { - promises.push(new Promise((resolve, reject) => { - if (type === 'certificate_key') { - resolve(internalCertificate.checkPrivateKey(content)); - } else { - // this should handle `certificate` and intermediate certificate - resolve(internalCertificate.getCertificateInfo(content, true)); - } - }).then(res => { - return {[type]: res}; - })); - }); - - return Promise.all(promises) - .then(files => { - let data = {}; - - _.each(files, file => { - data = _.assign({}, data, file); - }); - - return data; - }); - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {Object} data.files - * @returns {Promise} - */ - upload: (access, data) => { - return internalCertificate.get(access, {id: data.id}) - .then(row => { - if (row.provider !== 'other') { - throw new error.ValidationError('Cannot upload certificates for this type of provider'); - } - - return internalCertificate.validate(data) - .then(validations => { - if (typeof validations.certificate === 'undefined') { - throw new error.ValidationError('Certificate file was not provided'); - } - - _.map(data.files, (file, name) => { - if (internalCertificate.allowed_ssl_files.indexOf(name) !== -1) { - row.meta[name] = file.data.toString(); - } - }); - - // TODO: This uses a mysql only raw function that won't translate to postgres - return internalCertificate.update(access, { - id: data.id, - expires_on: certificateModel.raw('FROM_UNIXTIME(' + validations.certificate.dates.to + ')'), - domain_names: [validations.certificate.cn], - meta: _.clone(row.meta) // Prevent the update method from changing this value that we'll use later - }) - .then(certificate => { - console.log('ROWMETA:', row.meta); - certificate.meta = row.meta; - return internalCertificate.writeCustomCert(certificate); - }) - }) - .then(() => { - return _.pick(row.meta, internalCertificate.allowed_ssl_files); - }); - }); - }, - - /** - * Uses the openssl command to validate the private key. - * It will save the file to disk first, then run commands on it, then delete the file. - * - * @param {String} private_key This is the entire key contents as a string - */ - checkPrivateKey: private_key => { - return tempWrite(private_key, '/tmp') - .then(filepath => { - return utils.exec('openssl rsa -in ' + filepath + ' -check -noout') - .then(result => { - if (!result.toLowerCase().includes('key ok')) { - throw new error.ValidationError(result); - } - - fs.unlinkSync(filepath); - return true; - }).catch(err => { - fs.unlinkSync(filepath); - throw new error.ValidationError('Certificate Key is not valid (' + err.message + ')', err); - }); - }); - }, - - /** - * Uses the openssl command to both validate and get info out of the certificate. - * It will save the file to disk first, then run commands on it, then delete the file. - * - * @param {String} certificate This is the entire cert contents as a string - * @param {Boolean} [throw_expired] Throw when the certificate is out of date - */ - getCertificateInfo: (certificate, throw_expired) => { - return tempWrite(certificate, '/tmp') - .then(filepath => { - return internalCertificate.getCertificateInfoFromFile(filepath, throw_expired) - .then(cert_data => { - fs.unlinkSync(filepath); - return cert_data; - }).catch(err => { - fs.unlinkSync(filepath); - throw err; - }); - }); - }, - - /** - * Uses the openssl command to both validate and get info out of the certificate. - * It will save the file to disk first, then run commands on it, then delete the file. - * - * @param {String} certificate_file The file location on disk - * @param {Boolean} [throw_expired] Throw when the certificate is out of date - */ - getCertificateInfoFromFile: (certificate_file, throw_expired) => { - let cert_data = {}; - - return utils.exec('openssl x509 -in ' + certificate_file + ' -subject -noout') - .then(result => { - // subject=CN = something.example.com - let regex = /(?:subject=)?[^=]+=\s+(\S+)/gim; - let match = regex.exec(result); - - if (typeof match[1] === 'undefined') { - throw new error.ValidationError('Could not determine subject from certificate: ' + result); - } - - cert_data['cn'] = match[1]; - }) - .then(() => { - return utils.exec('openssl x509 -in ' + certificate_file + ' -issuer -noout'); - }) - .then(result => { - // issuer=C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3 - let regex = /^(?:issuer=)?(.*)$/gim; - let match = regex.exec(result); - - if (typeof match[1] === 'undefined') { - throw new error.ValidationError('Could not determine issuer from certificate: ' + result); - } - - cert_data['issuer'] = match[1]; - }) - .then(() => { - return utils.exec('openssl x509 -in ' + certificate_file + ' -dates -noout'); - }) - .then(result => { - // notBefore=Jul 14 04:04:29 2018 GMT - // notAfter=Oct 12 04:04:29 2018 GMT - let valid_from = null; - let valid_to = null; - - let lines = result.split('\n'); - lines.map(function (str) { - let regex = /^(\S+)=(.*)$/gim; - let match = regex.exec(str.trim()); - - if (match && typeof match[2] !== 'undefined') { - let date = parseInt(moment(match[2], 'MMM DD HH:mm:ss YYYY z').format('X'), 10); - - if (match[1].toLowerCase() === 'notbefore') { - valid_from = date; - } else if (match[1].toLowerCase() === 'notafter') { - valid_to = date; - } - } - }); - - if (!valid_from || !valid_to) { - throw new error.ValidationError('Could not determine dates from certificate: ' + result); - } - - if (throw_expired && valid_to < parseInt(moment().format('X'), 10)) { - throw new error.ValidationError('Certificate has expired'); - } - - cert_data['dates'] = { - from: valid_from, - to: valid_to - }; - - return cert_data; - }).catch(err => { - throw new error.ValidationError('Certificate is not valid (' + err.message + ')', err); - }); - }, - - /** - * Cleans the ssl keys from the meta object and sets them to "true" - * - * @param {Object} meta - * @param {Boolean} [remove] - * @returns {Object} - */ - cleanMeta: function (meta, remove) { - internalCertificate.allowed_ssl_files.map(key => { - if (typeof meta[key] !== 'undefined' && meta[key]) { - if (remove) { - delete meta[key]; - } else { - meta[key] = true; - } - } - }); - - return meta; - }, - - /** - * @param {Object} certificate the certificate row - * @returns {Promise} - */ - requestLetsEncryptSsl: certificate => { - logger.info('Requesting Let\'sEncrypt certificates for Cert #' + certificate.id + ': ' + certificate.domain_names.join(', ')); - - let cmd = certbot_command + ' certonly --cert-name "npm-' + certificate.id + '" --agree-tos ' + - '--email "' + certificate.meta.letsencrypt_email + '" ' + - '--preferred-challenges "dns,http" ' + - '-n -a webroot -d "' + certificate.domain_names.join(',') + '" ' + - (le_staging ? '--staging' : ''); - - if (debug_mode) { - logger.info('Command:', cmd); - } - - return utils.exec(cmd) - .then(result => { - logger.success(result); - return result; - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @returns {Promise} - */ - renew: (access, data) => { - return access.can('certificates:update', data) - .then(() => { - return internalCertificate.get(access, data); - }) - .then((certificate) => { - if (certificate.provider === 'letsencrypt') { - return internalCertificate.renewLetsEncryptSsl(certificate) - .then(() => { - return internalCertificate.getCertificateInfoFromFile('/etc/letsencrypt/live/npm-' + certificate.id + '/fullchain.pem') - }) - .then(cert_info => { - return certificateModel - .query() - .patchAndFetchById(certificate.id, { - expires_on: certificateModel.raw('FROM_UNIXTIME(' + cert_info.dates.to + ')') - }); - }) - .then((updated_certificate) => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'renewed', - object_type: 'certificate', - object_id: updated_certificate.id, - meta: updated_certificate - }) - .then(() => { - return updated_certificate; - }); - }) - } else { - throw new error.ValidationError('Only Let\'sEncrypt certificates can be renewed'); - } - }) - }, - - /** - * @param {Object} certificate the certificate row - * @returns {Promise} - */ - renewLetsEncryptSsl: certificate => { - logger.info('Renewing Let\'sEncrypt certificates for Cert #' + certificate.id + ': ' + certificate.domain_names.join(', ')); - - let cmd = certbot_command + ' renew -n --force-renewal --disable-hook-validation --cert-name "npm-' + certificate.id + '" ' + (le_staging ? '--staging' : ''); - - if (debug_mode) { - logger.info('Command:', cmd); - } - - return utils.exec(cmd) - .then(result => { - logger.info(result); - return result; - }); - }, - - /** - * @param {Object} certificate the certificate row - * @param {Boolean} [throw_errors] - * @returns {Promise} - */ - revokeLetsEncryptSsl: (certificate, throw_errors) => { - logger.info('Revoking Let\'sEncrypt certificates for Cert #' + certificate.id + ': ' + certificate.domain_names.join(', ')); - - let revoke_cmd = certbot_command + ' revoke --cert-path "/etc/letsencrypt/live/npm-' + certificate.id + '/fullchain.pem" ' + (le_staging ? '--staging' : ''); - let delete_cmd = certbot_command + ' delete --cert-name "npm-' + certificate.id + '" ' + (le_staging ? '--staging' : ''); - - if (debug_mode) { - logger.info('Command:', revoke_cmd); - } - - return utils.exec(revoke_cmd) - .then((result) => { - logger.info(result); - return result; - }) - .then(() => { - if (debug_mode) { - logger.info('Command:', delete_cmd); - } - - return utils.exec(delete_cmd) - .then((result) => { - logger.info(result); - return result; - }) - }) - .catch(err => { - if (debug_mode) { - logger.error(err.message); - } - - if (throw_errors) { - throw err; - } - }); - }, - - /** - * @param {Object} certificate - * @returns {Boolean} - */ - hasLetsEncryptSslCerts: certificate => { - let le_path = '/etc/letsencrypt/live/npm-' + certificate.id; - - return fs.existsSync(le_path + '/fullchain.pem') && fs.existsSync(le_path + '/privkey.pem'); - }, - - /** - * @param {Object} in_use_result - * @param {Number} in_use_result.total_count - * @param {Array} in_use_result.proxy_hosts - * @param {Array} in_use_result.redirection_hosts - * @param {Array} in_use_result.dead_hosts - */ - disableInUseHosts: in_use_result => { - if (in_use_result.total_count) { - let promises = []; - - if (in_use_result.proxy_hosts.length) { - promises.push(internalNginx.bulkDeleteConfigs('proxy_host', in_use_result.proxy_hosts)); - } - - if (in_use_result.redirection_hosts.length) { - promises.push(internalNginx.bulkDeleteConfigs('redirection_host', in_use_result.redirection_hosts)); - } - - if (in_use_result.dead_hosts.length) { - promises.push(internalNginx.bulkDeleteConfigs('dead_host', in_use_result.dead_hosts)); - } - - return Promise.all(promises); - - } else { - return Promise.resolve(); - } - }, - - /** - * @param {Object} in_use_result - * @param {Number} in_use_result.total_count - * @param {Array} in_use_result.proxy_hosts - * @param {Array} in_use_result.redirection_hosts - * @param {Array} in_use_result.dead_hosts - */ - enableInUseHosts: in_use_result => { - if (in_use_result.total_count) { - let promises = []; - - if (in_use_result.proxy_hosts.length) { - promises.push(internalNginx.bulkGenerateConfigs('proxy_host', in_use_result.proxy_hosts)); - } - - if (in_use_result.redirection_hosts.length) { - promises.push(internalNginx.bulkGenerateConfigs('redirection_host', in_use_result.redirection_hosts)); - } - - if (in_use_result.dead_hosts.length) { - promises.push(internalNginx.bulkGenerateConfigs('dead_host', in_use_result.dead_hosts)); - } - - return Promise.all(promises); - - } else { - return Promise.resolve(); - } - } -}; - -module.exports = internalCertificate; diff --git a/src/backend/internal/dead-host.js b/src/backend/internal/dead-host.js deleted file mode 100644 index 9042db1d7..000000000 --- a/src/backend/internal/dead-host.js +++ /dev/null @@ -1,461 +0,0 @@ -const _ = require('lodash'); -const error = require('../lib/error'); -const deadHostModel = require('../models/dead_host'); -const internalHost = require('./host'); -const internalNginx = require('./nginx'); -const internalAuditLog = require('./audit-log'); -const internalCertificate = require('./certificate'); - -function omissions () { - return ['is_deleted']; -} - -const internalDeadHost = { - - /** - * @param {Access} access - * @param {Object} data - * @returns {Promise} - */ - create: (access, data) => { - let create_certificate = data.certificate_id === 'new'; - - if (create_certificate) { - delete data.certificate_id; - } - - return access.can('dead_hosts:create', data) - .then(access_data => { - // Get a list of the domain names and check each of them against existing records - let domain_name_check_promises = []; - - data.domain_names.map(function (domain_name) { - domain_name_check_promises.push(internalHost.isHostnameTaken(domain_name)); - }); - - return Promise.all(domain_name_check_promises) - .then(check_results => { - check_results.map(function (result) { - if (result.is_taken) { - throw new error.ValidationError(result.hostname + ' is already in use'); - } - }); - }); - }) - .then(() => { - // At this point the domains should have been checked - data.owner_user_id = access.token.getUserId(1); - data = internalHost.cleanSslHstsData(data); - - return deadHostModel - .query() - .omit(omissions()) - .insertAndFetch(data); - }) - .then(row => { - if (create_certificate) { - return internalCertificate.createQuickCertificate(access, data) - .then(cert => { - // update host with cert id - return internalDeadHost.update(access, { - id: row.id, - certificate_id: cert.id - }); - }) - .then(() => { - return row; - }); - } else { - return row; - } - }) - .then(row => { - // re-fetch with cert - return internalDeadHost.get(access, { - id: row.id, - expand: ['certificate', 'owner'] - }); - }) - .then(row => { - // Configure nginx - return internalNginx.configure(deadHostModel, 'dead_host', row) - .then(() => { - return row; - }); - }) - .then(row => { - data.meta = _.assign({}, data.meta || {}, row.meta); - - // Add to audit log - return internalAuditLog.add(access, { - action: 'created', - object_type: 'dead-host', - object_id: row.id, - meta: data - }) - .then(() => { - return row; - }); - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @return {Promise} - */ - update: (access, data) => { - let create_certificate = data.certificate_id === 'new'; - - if (create_certificate) { - delete data.certificate_id; - } - - return access.can('dead_hosts:update', data.id) - .then(access_data => { - // Get a list of the domain names and check each of them against existing records - let domain_name_check_promises = []; - - if (typeof data.domain_names !== 'undefined') { - data.domain_names.map(function (domain_name) { - domain_name_check_promises.push(internalHost.isHostnameTaken(domain_name, 'dead', data.id)); - }); - - return Promise.all(domain_name_check_promises) - .then(check_results => { - check_results.map(function (result) { - if (result.is_taken) { - throw new error.ValidationError(result.hostname + ' is already in use'); - } - }); - }); - } - }) - .then(() => { - return internalDeadHost.get(access, {id: data.id}); - }) - .then(row => { - if (row.id !== data.id) { - // Sanity check that something crazy hasn't happened - throw new error.InternalValidationError('404 Host could not be updated, IDs do not match: ' + row.id + ' !== ' + data.id); - } - - if (create_certificate) { - return internalCertificate.createQuickCertificate(access, { - domain_names: data.domain_names || row.domain_names, - meta: _.assign({}, row.meta, data.meta) - }) - .then(cert => { - // update host with cert id - data.certificate_id = cert.id; - }) - .then(() => { - return row; - }); - } else { - return row; - } - }) - .then(row => { - // Add domain_names to the data in case it isn't there, so that the audit log renders correctly. The order is important here. - data = _.assign({}, { - domain_names: row.domain_names - }, data); - - data = internalHost.cleanSslHstsData(data, row); - - return deadHostModel - .query() - .where({id: data.id}) - .patch(data) - .then(saved_row => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'updated', - object_type: 'dead-host', - object_id: row.id, - meta: data - }) - .then(() => { - return _.omit(saved_row, omissions()); - }); - }); - }) - .then(() => { - return internalDeadHost.get(access, { - id: data.id, - expand: ['owner', 'certificate'] - }) - .then(row => { - // Configure nginx - return internalNginx.configure(deadHostModel, 'dead_host', row) - .then(new_meta => { - row.meta = new_meta; - row = internalHost.cleanRowCertificateMeta(row); - return _.omit(row, omissions()); - }); - }); - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {Array} [data.expand] - * @param {Array} [data.omit] - * @return {Promise} - */ - get: (access, data) => { - if (typeof data === 'undefined') { - data = {}; - } - - return access.can('dead_hosts:get', data.id) - .then(access_data => { - let query = deadHostModel - .query() - .where('is_deleted', 0) - .andWhere('id', data.id) - .allowEager('[owner,certificate]') - .first(); - - if (access_data.permission_visibility !== 'all') { - query.andWhere('owner_user_id', access.token.getUserId(1)); - } - - // Custom omissions - if (typeof data.omit !== 'undefined' && data.omit !== null) { - query.omit(data.omit); - } - - if (typeof data.expand !== 'undefined' && data.expand !== null) { - query.eager('[' + data.expand.join(', ') + ']'); - } - - return query; - }) - .then(row => { - if (row) { - row = internalHost.cleanRowCertificateMeta(row); - return _.omit(row, omissions()); - } else { - throw new error.ItemNotFoundError(data.id); - } - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {String} [data.reason] - * @returns {Promise} - */ - delete: (access, data) => { - return access.can('dead_hosts:delete', data.id) - .then(() => { - return internalDeadHost.get(access, {id: data.id}); - }) - .then(row => { - if (!row) { - throw new error.ItemNotFoundError(data.id); - } - - return deadHostModel - .query() - .where('id', row.id) - .patch({ - is_deleted: 1 - }) - .then(() => { - // Delete Nginx Config - return internalNginx.deleteConfig('dead_host', row) - .then(() => { - return internalNginx.reload(); - }); - }) - .then(() => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'deleted', - object_type: 'dead-host', - object_id: row.id, - meta: _.omit(row, omissions()) - }); - }); - }) - .then(() => { - return true; - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {String} [data.reason] - * @returns {Promise} - */ - enable: (access, data) => { - return access.can('dead_hosts:update', data.id) - .then(() => { - return internalDeadHost.get(access, { - id: data.id, - expand: ['certificate', 'owner'] - }); - }) - .then(row => { - if (!row) { - throw new error.ItemNotFoundError(data.id); - } else if (row.enabled) { - throw new error.ValidationError('Host is already enabled'); - } - - row.enabled = 1; - - return deadHostModel - .query() - .where('id', row.id) - .patch({ - enabled: 1 - }) - .then(() => { - // Configure nginx - return internalNginx.configure(deadHostModel, 'dead_host', row); - }) - .then(() => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'enabled', - object_type: 'dead-host', - object_id: row.id, - meta: _.omit(row, omissions()) - }); - }); - }) - .then(() => { - return true; - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {String} [data.reason] - * @returns {Promise} - */ - disable: (access, data) => { - return access.can('dead_hosts:update', data.id) - .then(() => { - return internalDeadHost.get(access, {id: data.id}); - }) - .then(row => { - if (!row) { - throw new error.ItemNotFoundError(data.id); - } else if (!row.enabled) { - throw new error.ValidationError('Host is already disabled'); - } - - row.enabled = 0; - - return deadHostModel - .query() - .where('id', row.id) - .patch({ - enabled: 0 - }) - .then(() => { - // Delete Nginx Config - return internalNginx.deleteConfig('dead_host', row) - .then(() => { - return internalNginx.reload(); - }); - }) - .then(() => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'disabled', - object_type: 'dead-host', - object_id: row.id, - meta: _.omit(row, omissions()) - }); - }); - }) - .then(() => { - return true; - }); - }, - - /** - * All Hosts - * - * @param {Access} access - * @param {Array} [expand] - * @param {String} [search_query] - * @returns {Promise} - */ - getAll: (access, expand, search_query) => { - return access.can('dead_hosts:list') - .then(access_data => { - let query = deadHostModel - .query() - .where('is_deleted', 0) - .groupBy('id') - .omit(['is_deleted']) - .allowEager('[owner,certificate]') - .orderBy('domain_names', 'ASC'); - - if (access_data.permission_visibility !== 'all') { - query.andWhere('owner_user_id', access.token.getUserId(1)); - } - - // Query is used for searching - if (typeof search_query === 'string') { - query.where(function () { - this.where('domain_names', 'like', '%' + search_query + '%'); - }); - } - - if (typeof expand !== 'undefined' && expand !== null) { - query.eager('[' + expand.join(', ') + ']'); - } - - return query; - }) - .then(rows => { - if (typeof expand !== 'undefined' && expand !== null && expand.indexOf('certificate') !== -1) { - return internalHost.cleanAllRowsCertificateMeta(rows); - } - - return rows; - }); - }, - - /** - * Report use - * - * @param {Number} user_id - * @param {String} visibility - * @returns {Promise} - */ - getCount: (user_id, visibility) => { - let query = deadHostModel - .query() - .count('id as count') - .where('is_deleted', 0); - - if (visibility !== 'all') { - query.andWhere('owner_user_id', user_id); - } - - return query.first() - .then(row => { - return parseInt(row.count, 10); - }); - } -}; - -module.exports = internalDeadHost; diff --git a/src/backend/internal/host.js b/src/backend/internal/host.js deleted file mode 100644 index 3cffcd032..000000000 --- a/src/backend/internal/host.js +++ /dev/null @@ -1,235 +0,0 @@ -const _ = require('lodash'); -const proxyHostModel = require('../models/proxy_host'); -const redirectionHostModel = require('../models/redirection_host'); -const deadHostModel = require('../models/dead_host'); - -const internalHost = { - - /** - * Makes sure that the ssl_* and hsts_* fields play nicely together. - * ie: if there is no cert, then force_ssl is off. - * if force_ssl is off, then hsts_enabled is definitely off. - * - * @param {object} data - * @param {object} [existing_data] - * @returns {object} - */ - cleanSslHstsData: function (data, existing_data) { - existing_data = existing_data === undefined ? {} : existing_data; - - let combined_data = _.assign({}, existing_data, data); - - if (!combined_data.certificate_id) { - combined_data.ssl_forced = false; - combined_data.http2_support = false; - } - - if (!combined_data.ssl_forced) { - combined_data.hsts_enabled = false; - } - - if (!combined_data.hsts_enabled) { - combined_data.hsts_subdomains = false; - } - - return combined_data; - }, - - /** - * used by the getAll functions of hosts, this removes the certificate meta if present - * - * @param {Array} rows - * @returns {Array} - */ - cleanAllRowsCertificateMeta: function (rows) { - rows.map(function (row, idx) { - if (typeof rows[idx].certificate !== 'undefined' && rows[idx].certificate) { - rows[idx].certificate.meta = {}; - } - }); - - return rows; - }, - - /** - * used by the get/update functions of hosts, this removes the certificate meta if present - * - * @param {Object} row - * @returns {Object} - */ - cleanRowCertificateMeta: function (row) { - if (typeof row.certificate !== 'undefined' && row.certificate) { - row.certificate.meta = {}; - } - - return row; - }, - - /** - * This returns all the host types with any domain listed in the provided domain_names array. - * This is used by the certificates to temporarily disable any host that is using the domain - * - * @param {Array} domain_names - * @returns {Promise} - */ - getHostsWithDomains: function (domain_names) { - let promises = [ - proxyHostModel - .query() - .where('is_deleted', 0), - redirectionHostModel - .query() - .where('is_deleted', 0), - deadHostModel - .query() - .where('is_deleted', 0) - ]; - - return Promise.all(promises) - .then(promises_results => { - let response_object = { - total_count: 0, - dead_hosts: [], - proxy_hosts: [], - redirection_hosts: [] - }; - - if (promises_results[0]) { - // Proxy Hosts - response_object.proxy_hosts = internalHost._getHostsWithDomains(promises_results[0], domain_names); - response_object.total_count += response_object.proxy_hosts.length; - } - - if (promises_results[1]) { - // Redirection Hosts - response_object.redirection_hosts = internalHost._getHostsWithDomains(promises_results[1], domain_names); - response_object.total_count += response_object.redirection_hosts.length; - } - - if (promises_results[1]) { - // Dead Hosts - response_object.dead_hosts = internalHost._getHostsWithDomains(promises_results[2], domain_names); - response_object.total_count += response_object.dead_hosts.length; - } - - return response_object; - }); - }, - - /** - * Internal use only, checks to see if the domain is already taken by any other record - * - * @param {String} hostname - * @param {String} [ignore_type] 'proxy', 'redirection', 'dead' - * @param {Integer} [ignore_id] Must be supplied if type was also supplied - * @returns {Promise} - */ - isHostnameTaken: function (hostname, ignore_type, ignore_id) { - let promises = [ - proxyHostModel - .query() - .where('is_deleted', 0) - .andWhere('domain_names', 'like', '%' + hostname + '%'), - redirectionHostModel - .query() - .where('is_deleted', 0) - .andWhere('domain_names', 'like', '%' + hostname + '%'), - deadHostModel - .query() - .where('is_deleted', 0) - .andWhere('domain_names', 'like', '%' + hostname + '%') - ]; - - return Promise.all(promises) - .then(promises_results => { - let is_taken = false; - - if (promises_results[0]) { - // Proxy Hosts - if (internalHost._checkHostnameRecordsTaken(hostname, promises_results[0], ignore_type === 'proxy' && ignore_id ? ignore_id : 0)) { - is_taken = true; - } - } - - if (promises_results[1]) { - // Redirection Hosts - if (internalHost._checkHostnameRecordsTaken(hostname, promises_results[1], ignore_type === 'redirection' && ignore_id ? ignore_id : 0)) { - is_taken = true; - } - } - - if (promises_results[1]) { - // Dead Hosts - if (internalHost._checkHostnameRecordsTaken(hostname, promises_results[2], ignore_type === 'dead' && ignore_id ? ignore_id : 0)) { - is_taken = true; - } - } - - return { - hostname: hostname, - is_taken: is_taken - }; - }); - }, - - /** - * Private call only - * - * @param {String} hostname - * @param {Array} existing_rows - * @param {Integer} [ignore_id] - * @returns {Boolean} - */ - _checkHostnameRecordsTaken: function (hostname, existing_rows, ignore_id) { - let is_taken = false; - - if (existing_rows && existing_rows.length) { - existing_rows.map(function (existing_row) { - existing_row.domain_names.map(function (existing_hostname) { - // Does this domain match? - if (existing_hostname.toLowerCase() === hostname.toLowerCase()) { - if (!ignore_id || ignore_id !== existing_row.id) { - is_taken = true; - } - } - }); - }); - } - - return is_taken; - }, - - /** - * Private call only - * - * @param {Array} hosts - * @param {Array} domain_names - * @returns {Array} - */ - _getHostsWithDomains: function (hosts, domain_names) { - let response = []; - - if (hosts && hosts.length) { - hosts.map(function (host) { - let host_matches = false; - - domain_names.map(function (domain_name) { - host.domain_names.map(function (host_domain_name) { - if (domain_name.toLowerCase() === host_domain_name.toLowerCase()) { - host_matches = true; - } - }); - }); - - if (host_matches) { - response.push(host); - } - }); - } - - return response; - } - -}; - -module.exports = internalHost; diff --git a/src/backend/internal/ip_ranges.js b/src/backend/internal/ip_ranges.js deleted file mode 100644 index 8e7322a5c..000000000 --- a/src/backend/internal/ip_ranges.js +++ /dev/null @@ -1,147 +0,0 @@ -const https = require('https'); -const fs = require('fs'); -const logger = require('../logger').ip_ranges; -const error = require('../lib/error'); -const internalNginx = require('./nginx'); -const Liquid = require('liquidjs'); - -const CLOUDFRONT_URL = 'https://ip-ranges.amazonaws.com/ip-ranges.json'; -const CLOUDFARE_V4_URL = 'https://www.cloudflare.com/ips-v4'; -const CLOUDFARE_V6_URL = 'https://www.cloudflare.com/ips-v6'; - -const internalIpRanges = { - - interval_timeout: 1000 * 60 * 60 * 6, // 6 hours - interval: null, - interval_processing: false, - iteration_count: 0, - - initTimer: () => { - logger.info('IP Ranges Renewal Timer initialized'); - internalIpRanges.interval = setInterval(internalIpRanges.fetch, internalIpRanges.interval_timeout); - }, - - fetchUrl: url => { - return new Promise((resolve, reject) => { - logger.info('Fetching ' + url); - return https.get(url, res => { - res.setEncoding('utf8'); - let raw_data = ''; - res.on('data', chunk => { - raw_data += chunk; - }); - - res.on('end', () => { - resolve(raw_data); - }); - }).on('error', err => { - reject(err); - }); - }); - }, - - /** - * Triggered at startup and then later by a timer, this will fetch the ip ranges from services and apply them to nginx. - */ - fetch: () => { - if (!internalIpRanges.interval_processing) { - internalIpRanges.interval_processing = true; - logger.info('Fetching IP Ranges from online services...'); - - let ip_ranges = []; - - return internalIpRanges.fetchUrl(CLOUDFRONT_URL) - .then(cloudfront_data => { - let data = JSON.parse(cloudfront_data); - - if (data && typeof data.prefixes !== 'undefined') { - data.prefixes.map(item => { - if (item.service === 'CLOUDFRONT') { - ip_ranges.push(item.ip_prefix); - } - }); - } - - if (data && typeof data.ipv6_prefixes !== 'undefined') { - data.ipv6_prefixes.map(item => { - if (item.service === 'CLOUDFRONT') { - ip_ranges.push(item.ipv6_prefix); - } - }); - } - }) - .then(() => { - return internalIpRanges.fetchUrl(CLOUDFARE_V4_URL); - }) - .then(cloudfare_data => { - let items = cloudfare_data.split('\n'); - ip_ranges = [... ip_ranges, ... items]; - }) - .then(() => { - return internalIpRanges.fetchUrl(CLOUDFARE_V6_URL); - }) - .then(cloudfare_data => { - let items = cloudfare_data.split('\n'); - ip_ranges = [... ip_ranges, ... items]; - }) - .then(() => { - let clean_ip_ranges = []; - ip_ranges.map(range => { - if (range) { - clean_ip_ranges.push(range); - } - }); - - return internalIpRanges.generateConfig(clean_ip_ranges) - .then(() => { - if (internalIpRanges.iteration_count) { - // Reload nginx - return internalNginx.reload(); - } - }); - }) - .then(() => { - internalIpRanges.interval_processing = false; - internalIpRanges.iteration_count++; - }) - .catch(err => { - logger.error(err.message); - internalIpRanges.interval_processing = false; - }); - } - }, - - /** - * @param {Array} ip_ranges - * @returns {Promise} - */ - generateConfig: (ip_ranges) => { - let renderEngine = Liquid({ - root: __dirname + '/../templates/' - }); - - return new Promise((resolve, reject) => { - let template = null; - let filename = '/etc/nginx/conf.d/include/ip_ranges.conf'; - try { - template = fs.readFileSync(__dirname + '/../templates/ip_ranges.conf', {encoding: 'utf8'}); - } catch (err) { - reject(new error.ConfigurationError(err.message)); - return; - } - - renderEngine - .parseAndRender(template, {ip_ranges: ip_ranges}) - .then(config_text => { - fs.writeFileSync(filename, config_text, {encoding: 'utf8'}); - resolve(true); - }) - .catch(err => { - logger.warn('Could not write ' + filename + ':', err.message); - reject(new error.ConfigurationError(err.message)); - }); - }); - } -}; - -module.exports = internalIpRanges; diff --git a/src/backend/internal/nginx.js b/src/backend/internal/nginx.js deleted file mode 100644 index 21fdbc0a7..000000000 --- a/src/backend/internal/nginx.js +++ /dev/null @@ -1,401 +0,0 @@ -const _ = require('lodash'); -const fs = require('fs'); -const Liquid = require('liquidjs'); -const logger = require('../logger').nginx; -const utils = require('../lib/utils'); -const error = require('../lib/error'); -const debug_mode = process.env.NODE_ENV !== 'production' || !!process.env.DEBUG; - -const internalNginx = { - - /** - * This will: - * - test the nginx config first to make sure it's OK - * - create / recreate the config for the host - * - test again - * - IF OK: update the meta with online status - * - IF BAD: update the meta with offline status and remove the config entirely - * - then reload nginx - * - * @param {Object|String} model - * @param {String} host_type - * @param {Object} host - * @returns {Promise} - */ - configure: (model, host_type, host) => { - let combined_meta = {}; - - return internalNginx.test() - .then(() => { - // Nginx is OK - // We're deleting this config regardless. - return internalNginx.deleteConfig(host_type, host); // Don't throw errors, as the file may not exist at all - }) - .then(() => { - return internalNginx.generateConfig(host_type, host); - }) - .then(() => { - // Test nginx again and update meta with result - return internalNginx.test() - .then(() => { - // nginx is ok - combined_meta = _.assign({}, host.meta, { - nginx_online: true, - nginx_err: null - }); - - return model - .query() - .where('id', host.id) - .patch({ - meta: combined_meta - }); - }) - .catch(err => { - // Remove the error_log line because it's a docker-ism false positive that doesn't need to be reported. - // It will always look like this: - // nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (6: No such device or address) - - let valid_lines = []; - let err_lines = err.message.split("\n"); - err_lines.map(function (line) { - if (line.indexOf('/var/log/nginx/error.log') === -1) { - valid_lines.push(line); - } - }); - - if (debug_mode) { - logger.error('Nginx test failed:', valid_lines.join("\n")); - } - - // config is bad, update meta and delete config - combined_meta = _.assign({}, host.meta, { - nginx_online: false, - nginx_err: valid_lines.join("\n") - }); - - return model - .query() - .where('id', host.id) - .patch({ - meta: combined_meta - }) - .then(() => { - return internalNginx.deleteConfig(host_type, host, true); - }); - }); - }) - .then(() => { - return internalNginx.reload(); - }) - .then(() => { - return combined_meta; - }); - }, - - /** - * @returns {Promise} - */ - test: () => { - if (debug_mode) { - logger.info('Testing Nginx configuration'); - } - - return utils.exec('/usr/sbin/nginx -t -g "error_log off;"'); - }, - - /** - * @returns {Promise} - */ - reload: () => { - return internalNginx.test() - .then(() => { - logger.info('Reloading Nginx'); - return utils.exec('/usr/sbin/nginx -s reload'); - }); - }, - - /** - * @param {String} host_type - * @param {Integer} host_id - * @returns {String} - */ - getConfigName: (host_type, host_id) => { - host_type = host_type.replace(new RegExp('-', 'g'), '_'); - - if (host_type === 'default') { - return '/data/nginx/default_host/site.conf'; - } - - return '/data/nginx/' + host_type + '/' + host_id + '.conf'; - }, - - /** - * Generates custom locations - * @param {Object} host - * @returns {Promise} - */ - renderLocations: (host) => { - return new Promise((resolve, reject) => { - let template; - - try { - template = fs.readFileSync(__dirname + '/../templates/_location.conf', {encoding: 'utf8'}); - } catch (err) { - reject(new error.ConfigurationError(err.message)); - return; - } - - let renderer = new Liquid(); - let renderedLocations = ''; - - const locationRendering = async () => { - for (let i = 0; i < host.locations.length; i++) { - let locationCopy = Object.assign({}, host.locations[i]); - - if (locationCopy.forward_host.indexOf('/') > -1) { - const splitted = locationCopy.forward_host.split('/'); - - locationCopy.forward_host = splitted.shift(); - locationCopy.forward_path = `/${splitted.join('/')}`; - } - - renderedLocations += await renderer.parseAndRender(template, locationCopy); - } - }; - - locationRendering().then(() => resolve(renderedLocations)); - }); - }, - - /** - * @param {String} host_type - * @param {Object} host - * @returns {Promise} - */ - generateConfig: (host_type, host) => { - host_type = host_type.replace(new RegExp('-', 'g'), '_'); - - if (debug_mode) { - logger.info('Generating ' + host_type + ' Config:', host); - } - - let renderEngine = Liquid({ - root: __dirname + '/../templates/' - }); - - return new Promise((resolve, reject) => { - let template = null; - let filename = internalNginx.getConfigName(host_type, host.id); - - try { - template = fs.readFileSync(__dirname + '/../templates/' + host_type + '.conf', {encoding: 'utf8'}); - } catch (err) { - reject(new error.ConfigurationError(err.message)); - return; - } - - let locationsPromise; - let origLocations; - - // Manipulate the data a bit before sending it to the template - if (host_type !== 'default') { - host.use_default_location = true; - if (typeof host.advanced_config !== 'undefined' && host.advanced_config) { - host.use_default_location = !internalNginx.advancedConfigHasDefaultLocation(host.advanced_config); - } - } - - if (host.locations) { - origLocations = [].concat(host.locations); - locationsPromise = internalNginx.renderLocations(host).then((renderedLocations) => { - host.locations = renderedLocations; - }); - - // Allow someone who is using / custom location path to use it, and skip the default / location - _.map(host.locations, (location) => { - if (location.path === '/') { - host.use_default_location = false; - } - }); - - } else { - locationsPromise = Promise.resolve(); - } - - locationsPromise.then(() => { - renderEngine - .parseAndRender(template, host) - .then(config_text => { - fs.writeFileSync(filename, config_text, {encoding: 'utf8'}); - - if (debug_mode) { - logger.success('Wrote config:', filename, config_text); - } - - // Restore locations array - host.locations = origLocations; - - resolve(true); - }) - .catch(err => { - if (debug_mode) { - logger.warn('Could not write ' + filename + ':', err.message); - } - - reject(new error.ConfigurationError(err.message)); - }); - }); - }); - }, - - /** - * This generates a temporary nginx config listening on port 80 for the domain names listed - * in the certificate setup. It allows the letsencrypt acme challenge to be requested by letsencrypt - * when requesting a certificate without having a hostname set up already. - * - * @param {Object} certificate - * @returns {Promise} - */ - generateLetsEncryptRequestConfig: certificate => { - if (debug_mode) { - logger.info('Generating LetsEncrypt Request Config:', certificate); - } - - let renderEngine = Liquid({ - root: __dirname + '/../templates/' - }); - - return new Promise((resolve, reject) => { - let template = null; - let filename = '/data/nginx/temp/letsencrypt_' + certificate.id + '.conf'; - try { - template = fs.readFileSync(__dirname + '/../templates/letsencrypt-request.conf', {encoding: 'utf8'}); - } catch (err) { - reject(new error.ConfigurationError(err.message)); - return; - } - - renderEngine - .parseAndRender(template, certificate) - .then(config_text => { - fs.writeFileSync(filename, config_text, {encoding: 'utf8'}); - - if (debug_mode) { - logger.success('Wrote config:', filename, config_text); - } - - resolve(true); - }) - .catch(err => { - if (debug_mode) { - logger.warn('Could not write ' + filename + ':', err.message); - } - - reject(new error.ConfigurationError(err.message)); - }); - }); - }, - - /** - * This removes the temporary nginx config file generated by `generateLetsEncryptRequestConfig` - * - * @param {Object} certificate - * @param {Boolean} [throw_errors] - * @returns {Promise} - */ - deleteLetsEncryptRequestConfig: (certificate, throw_errors) => { - return new Promise((resolve, reject) => { - try { - let config_file = '/data/nginx/temp/letsencrypt_' + certificate.id + '.conf'; - - if (debug_mode) { - logger.warn('Deleting nginx config: ' + config_file); - } - - fs.unlinkSync(config_file); - } catch (err) { - if (debug_mode) { - logger.warn('Could not delete config:', err.message); - } - - if (throw_errors) { - reject(err); - } - } - - resolve(); - }); - }, - - /** - * @param {String} host_type - * @param {Object} [host] - * @param {Boolean} [throw_errors] - * @returns {Promise} - */ - deleteConfig: (host_type, host, throw_errors) => { - host_type = host_type.replace(new RegExp('-', 'g'), '_'); - - return new Promise((resolve, reject) => { - try { - let config_file = internalNginx.getConfigName(host_type, typeof host === 'undefined' ? 0 : host.id); - - if (debug_mode) { - logger.warn('Deleting nginx config: ' + config_file); - } - - fs.unlinkSync(config_file); - } catch (err) { - if (debug_mode) { - logger.warn('Could not delete config:', err.message); - } - - if (throw_errors) { - reject(err); - } - } - - resolve(); - }); - }, - - /** - * @param {String} host_type - * @param {Array} hosts - * @returns {Promise} - */ - bulkGenerateConfigs: (host_type, hosts) => { - let promises = []; - hosts.map(function (host) { - promises.push(internalNginx.generateConfig(host_type, host)); - }); - - return Promise.all(promises); - }, - - /** - * @param {String} host_type - * @param {Array} hosts - * @param {Boolean} [throw_errors] - * @returns {Promise} - */ - bulkDeleteConfigs: (host_type, hosts, throw_errors) => { - let promises = []; - hosts.map(function (host) { - promises.push(internalNginx.deleteConfig(host_type, host, throw_errors)); - }); - - return Promise.all(promises); - }, - - /** - * @param {string} config - * @returns {boolean} - */ - advancedConfigHasDefaultLocation: function (config) { - return !!config.match(/^(?:.*;)?\s*?location\s*?\/\s*?{/im); - } -}; - -module.exports = internalNginx; diff --git a/src/backend/internal/proxy-host.js b/src/backend/internal/proxy-host.js deleted file mode 100644 index c8a75ffd4..000000000 --- a/src/backend/internal/proxy-host.js +++ /dev/null @@ -1,462 +0,0 @@ -const _ = require('lodash'); -const error = require('../lib/error'); -const proxyHostModel = require('../models/proxy_host'); -const internalHost = require('./host'); -const internalNginx = require('./nginx'); -const internalAuditLog = require('./audit-log'); -const internalCertificate = require('./certificate'); - -function omissions () { - return ['is_deleted']; -} - -const internalProxyHost = { - - /** - * @param {Access} access - * @param {Object} data - * @returns {Promise} - */ - create: (access, data) => { - let create_certificate = data.certificate_id === 'new'; - - if (create_certificate) { - delete data.certificate_id; - } - - return access.can('proxy_hosts:create', data) - .then(() => { - // Get a list of the domain names and check each of them against existing records - let domain_name_check_promises = []; - - data.domain_names.map(function (domain_name) { - domain_name_check_promises.push(internalHost.isHostnameTaken(domain_name)); - }); - - return Promise.all(domain_name_check_promises) - .then(check_results => { - check_results.map(function (result) { - if (result.is_taken) { - throw new error.ValidationError(result.hostname + ' is already in use'); - } - }); - }); - }) - .then(() => { - // At this point the domains should have been checked - data.owner_user_id = access.token.getUserId(1); - data = internalHost.cleanSslHstsData(data); - - return proxyHostModel - .query() - .omit(omissions()) - .insertAndFetch(data); - }) - .then((row) => { - if (create_certificate) { - return internalCertificate.createQuickCertificate(access, data) - .then(cert => { - // update host with cert id - return internalProxyHost.update(access, { - id: row.id, - certificate_id: cert.id - }); - }) - .then(() => { - return row; - }); - } else { - return row; - } - }) - .then((row) => { - // re-fetch with cert - return internalProxyHost.get(access, { - id: row.id, - expand: ['certificate', 'owner', 'access_list'] - }); - }) - .then((row) => { - // Configure nginx - return internalNginx.configure(proxyHostModel, 'proxy_host', row) - .then(() => { - return row; - }); - }) - .then((row) => { - // Audit log - data.meta = _.assign({}, data.meta || {}, row.meta); - - // Add to audit log - return internalAuditLog.add(access, { - action: 'created', - object_type: 'proxy-host', - object_id: row.id, - meta: data - }) - .then(() => { - return row; - }); - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @return {Promise} - */ - update: (access, data) => { - let create_certificate = data.certificate_id === 'new'; - - if (create_certificate) { - delete data.certificate_id; - } - - return access.can('proxy_hosts:update', data.id) - .then(access_data => { - // Get a list of the domain names and check each of them against existing records - let domain_name_check_promises = []; - - if (typeof data.domain_names !== 'undefined') { - data.domain_names.map(function (domain_name) { - domain_name_check_promises.push(internalHost.isHostnameTaken(domain_name, 'proxy', data.id)); - }); - - return Promise.all(domain_name_check_promises) - .then(check_results => { - check_results.map(function (result) { - if (result.is_taken) { - throw new error.ValidationError(result.hostname + ' is already in use'); - } - }); - }); - } - }) - .then(() => { - return internalProxyHost.get(access, {id: data.id}); - }) - .then(row => { - if (row.id !== data.id) { - // Sanity check that something crazy hasn't happened - throw new error.InternalValidationError('Proxy Host could not be updated, IDs do not match: ' + row.id + ' !== ' + data.id); - } - - if (create_certificate) { - return internalCertificate.createQuickCertificate(access, { - domain_names: data.domain_names || row.domain_names, - meta: _.assign({}, row.meta, data.meta) - }) - .then(cert => { - // update host with cert id - data.certificate_id = cert.id; - }) - .then(() => { - return row; - }); - } else { - return row; - } - }) - .then(row => { - // Add domain_names to the data in case it isn't there, so that the audit log renders correctly. The order is important here. - data = _.assign({}, { - domain_names: row.domain_names - }, data); - - data = internalHost.cleanSslHstsData(data, row); - - return proxyHostModel - .query() - .where({id: data.id}) - .patch(data) - .then(saved_row => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'updated', - object_type: 'proxy-host', - object_id: row.id, - meta: data - }) - .then(() => { - return _.omit(saved_row, omissions()); - }); - }); - }) - .then(() => { - return internalProxyHost.get(access, { - id: data.id, - expand: ['owner', 'certificate', 'access_list'] - }) - .then(row => { - // Configure nginx - return internalNginx.configure(proxyHostModel, 'proxy_host', row) - .then(new_meta => { - row.meta = new_meta; - row = internalHost.cleanRowCertificateMeta(row); - return _.omit(row, omissions()); - }); - }); - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {Array} [data.expand] - * @param {Array} [data.omit] - * @return {Promise} - */ - get: (access, data) => { - if (typeof data === 'undefined') { - data = {}; - } - - return access.can('proxy_hosts:get', data.id) - .then(access_data => { - let query = proxyHostModel - .query() - .where('is_deleted', 0) - .andWhere('id', data.id) - .allowEager('[owner,access_list,certificate]') - .first(); - - if (access_data.permission_visibility !== 'all') { - query.andWhere('owner_user_id', access.token.getUserId(1)); - } - - // Custom omissions - if (typeof data.omit !== 'undefined' && data.omit !== null) { - query.omit(data.omit); - } - - if (typeof data.expand !== 'undefined' && data.expand !== null) { - query.eager('[' + data.expand.join(', ') + ']'); - } - - return query; - }) - .then(row => { - if (row) { - row = internalHost.cleanRowCertificateMeta(row); - return _.omit(row, omissions()); - } else { - throw new error.ItemNotFoundError(data.id); - } - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {String} [data.reason] - * @returns {Promise} - */ - delete: (access, data) => { - return access.can('proxy_hosts:delete', data.id) - .then(() => { - return internalProxyHost.get(access, {id: data.id}); - }) - .then(row => { - if (!row) { - throw new error.ItemNotFoundError(data.id); - } - - return proxyHostModel - .query() - .where('id', row.id) - .patch({ - is_deleted: 1 - }) - .then(() => { - // Delete Nginx Config - return internalNginx.deleteConfig('proxy_host', row) - .then(() => { - return internalNginx.reload(); - }); - }) - .then(() => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'deleted', - object_type: 'proxy-host', - object_id: row.id, - meta: _.omit(row, omissions()) - }); - }); - }) - .then(() => { - return true; - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {String} [data.reason] - * @returns {Promise} - */ - enable: (access, data) => { - return access.can('proxy_hosts:update', data.id) - .then(() => { - return internalProxyHost.get(access, { - id: data.id, - expand: ['certificate', 'owner', 'access_list'] - }); - }) - .then(row => { - if (!row) { - throw new error.ItemNotFoundError(data.id); - } else if (row.enabled) { - throw new error.ValidationError('Host is already enabled'); - } - - row.enabled = 1; - - return proxyHostModel - .query() - .where('id', row.id) - .patch({ - enabled: 1 - }) - .then(() => { - // Configure nginx - return internalNginx.configure(proxyHostModel, 'proxy_host', row); - }) - .then(() => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'enabled', - object_type: 'proxy-host', - object_id: row.id, - meta: _.omit(row, omissions()) - }); - }); - }) - .then(() => { - return true; - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {String} [data.reason] - * @returns {Promise} - */ - disable: (access, data) => { - return access.can('proxy_hosts:update', data.id) - .then(() => { - return internalProxyHost.get(access, {id: data.id}); - }) - .then(row => { - if (!row) { - throw new error.ItemNotFoundError(data.id); - } else if (!row.enabled) { - throw new error.ValidationError('Host is already disabled'); - } - - row.enabled = 0; - - return proxyHostModel - .query() - .where('id', row.id) - .patch({ - enabled: 0 - }) - .then(() => { - // Delete Nginx Config - return internalNginx.deleteConfig('proxy_host', row) - .then(() => { - return internalNginx.reload(); - }); - }) - .then(() => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'disabled', - object_type: 'proxy-host', - object_id: row.id, - meta: _.omit(row, omissions()) - }); - }); - }) - .then(() => { - return true; - }); - }, - - /** - * All Hosts - * - * @param {Access} access - * @param {Array} [expand] - * @param {String} [search_query] - * @returns {Promise} - */ - getAll: (access, expand, search_query) => { - return access.can('proxy_hosts:list') - .then(access_data => { - let query = proxyHostModel - .query() - .where('is_deleted', 0) - .groupBy('id') - .omit(['is_deleted']) - .allowEager('[owner,access_list,certificate]') - .orderBy('domain_names', 'ASC'); - - if (access_data.permission_visibility !== 'all') { - query.andWhere('owner_user_id', access.token.getUserId(1)); - } - - // Query is used for searching - if (typeof search_query === 'string') { - query.where(function () { - this.where('domain_names', 'like', '%' + search_query + '%'); - }); - } - - if (typeof expand !== 'undefined' && expand !== null) { - query.eager('[' + expand.join(', ') + ']'); - } - - return query; - }) - .then(rows => { - if (typeof expand !== 'undefined' && expand !== null && expand.indexOf('certificate') !== -1) { - return internalHost.cleanAllRowsCertificateMeta(rows); - } - - return rows; - }); - }, - - /** - * Report use - * - * @param {Number} user_id - * @param {String} visibility - * @returns {Promise} - */ - getCount: (user_id, visibility) => { - let query = proxyHostModel - .query() - .count('id as count') - .where('is_deleted', 0); - - if (visibility !== 'all') { - query.andWhere('owner_user_id', user_id); - } - - return query.first() - .then(row => { - return parseInt(row.count, 10); - }); - } -}; - -module.exports = internalProxyHost; diff --git a/src/backend/internal/redirection-host.js b/src/backend/internal/redirection-host.js deleted file mode 100644 index 7817ef29b..000000000 --- a/src/backend/internal/redirection-host.js +++ /dev/null @@ -1,461 +0,0 @@ -const _ = require('lodash'); -const error = require('../lib/error'); -const redirectionHostModel = require('../models/redirection_host'); -const internalHost = require('./host'); -const internalNginx = require('./nginx'); -const internalAuditLog = require('./audit-log'); -const internalCertificate = require('./certificate'); - -function omissions () { - return ['is_deleted']; -} - -const internalRedirectionHost = { - - /** - * @param {Access} access - * @param {Object} data - * @returns {Promise} - */ - create: (access, data) => { - let create_certificate = data.certificate_id === 'new'; - - if (create_certificate) { - delete data.certificate_id; - } - - return access.can('redirection_hosts:create', data) - .then(access_data => { - // Get a list of the domain names and check each of them against existing records - let domain_name_check_promises = []; - - data.domain_names.map(function (domain_name) { - domain_name_check_promises.push(internalHost.isHostnameTaken(domain_name)); - }); - - return Promise.all(domain_name_check_promises) - .then(check_results => { - check_results.map(function (result) { - if (result.is_taken) { - throw new error.ValidationError(result.hostname + ' is already in use'); - } - }); - }); - }) - .then(() => { - // At this point the domains should have been checked - data.owner_user_id = access.token.getUserId(1); - data = internalHost.cleanSslHstsData(data); - - return redirectionHostModel - .query() - .omit(omissions()) - .insertAndFetch(data); - }) - .then(row => { - if (create_certificate) { - return internalCertificate.createQuickCertificate(access, data) - .then(cert => { - // update host with cert id - return internalRedirectionHost.update(access, { - id: row.id, - certificate_id: cert.id - }); - }) - .then(() => { - return row; - }); - } else { - return row; - } - }) - .then(row => { - // re-fetch with cert - return internalRedirectionHost.get(access, { - id: row.id, - expand: ['certificate', 'owner'] - }); - }) - .then(row => { - // Configure nginx - return internalNginx.configure(redirectionHostModel, 'redirection_host', row) - .then(() => { - return row; - }); - }) - .then(row => { - data.meta = _.assign({}, data.meta || {}, row.meta); - - // Add to audit log - return internalAuditLog.add(access, { - action: 'created', - object_type: 'redirection-host', - object_id: row.id, - meta: data - }) - .then(() => { - return row; - }); - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @return {Promise} - */ - update: (access, data) => { - let create_certificate = data.certificate_id === 'new'; - - if (create_certificate) { - delete data.certificate_id; - } - - return access.can('redirection_hosts:update', data.id) - .then(access_data => { - // Get a list of the domain names and check each of them against existing records - let domain_name_check_promises = []; - - if (typeof data.domain_names !== 'undefined') { - data.domain_names.map(function (domain_name) { - domain_name_check_promises.push(internalHost.isHostnameTaken(domain_name, 'redirection', data.id)); - }); - - return Promise.all(domain_name_check_promises) - .then(check_results => { - check_results.map(function (result) { - if (result.is_taken) { - throw new error.ValidationError(result.hostname + ' is already in use'); - } - }); - }); - } - }) - .then(() => { - return internalRedirectionHost.get(access, {id: data.id}); - }) - .then(row => { - if (row.id !== data.id) { - // Sanity check that something crazy hasn't happened - throw new error.InternalValidationError('Redirection Host could not be updated, IDs do not match: ' + row.id + ' !== ' + data.id); - } - - if (create_certificate) { - return internalCertificate.createQuickCertificate(access, { - domain_names: data.domain_names || row.domain_names, - meta: _.assign({}, row.meta, data.meta) - }) - .then(cert => { - // update host with cert id - data.certificate_id = cert.id; - }) - .then(() => { - return row; - }); - } else { - return row; - } - }) - .then(row => { - // Add domain_names to the data in case it isn't there, so that the audit log renders correctly. The order is important here. - data = _.assign({}, { - domain_names: row.domain_names - }, data); - - data = internalHost.cleanSslHstsData(data, row); - - return redirectionHostModel - .query() - .where({id: data.id}) - .patch(data) - .then(saved_row => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'updated', - object_type: 'redirection-host', - object_id: row.id, - meta: data - }) - .then(() => { - return _.omit(saved_row, omissions()); - }); - }); - }) - .then(() => { - return internalRedirectionHost.get(access, { - id: data.id, - expand: ['owner', 'certificate'] - }) - .then(row => { - // Configure nginx - return internalNginx.configure(redirectionHostModel, 'redirection_host', row) - .then(new_meta => { - row.meta = new_meta; - row = internalHost.cleanRowCertificateMeta(row); - return _.omit(row, omissions()); - }); - }); - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {Array} [data.expand] - * @param {Array} [data.omit] - * @return {Promise} - */ - get: (access, data) => { - if (typeof data === 'undefined') { - data = {}; - } - - return access.can('redirection_hosts:get', data.id) - .then(access_data => { - let query = redirectionHostModel - .query() - .where('is_deleted', 0) - .andWhere('id', data.id) - .allowEager('[owner,certificate]') - .first(); - - if (access_data.permission_visibility !== 'all') { - query.andWhere('owner_user_id', access.token.getUserId(1)); - } - - // Custom omissions - if (typeof data.omit !== 'undefined' && data.omit !== null) { - query.omit(data.omit); - } - - if (typeof data.expand !== 'undefined' && data.expand !== null) { - query.eager('[' + data.expand.join(', ') + ']'); - } - - return query; - }) - .then(row => { - if (row) { - row = internalHost.cleanRowCertificateMeta(row); - return _.omit(row, omissions()); - } else { - throw new error.ItemNotFoundError(data.id); - } - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {String} [data.reason] - * @returns {Promise} - */ - delete: (access, data) => { - return access.can('redirection_hosts:delete', data.id) - .then(() => { - return internalRedirectionHost.get(access, {id: data.id}); - }) - .then(row => { - if (!row) { - throw new error.ItemNotFoundError(data.id); - } - - return redirectionHostModel - .query() - .where('id', row.id) - .patch({ - is_deleted: 1 - }) - .then(() => { - // Delete Nginx Config - return internalNginx.deleteConfig('redirection_host', row) - .then(() => { - return internalNginx.reload(); - }); - }) - .then(() => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'deleted', - object_type: 'redirection-host', - object_id: row.id, - meta: _.omit(row, omissions()) - }); - }); - }) - .then(() => { - return true; - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {String} [data.reason] - * @returns {Promise} - */ - enable: (access, data) => { - return access.can('redirection_hosts:update', data.id) - .then(() => { - return internalRedirectionHost.get(access, { - id: data.id, - expand: ['certificate', 'owner'] - }); - }) - .then(row => { - if (!row) { - throw new error.ItemNotFoundError(data.id); - } else if (row.enabled) { - throw new error.ValidationError('Host is already enabled'); - } - - row.enabled = 1; - - return redirectionHostModel - .query() - .where('id', row.id) - .patch({ - enabled: 1 - }) - .then(() => { - // Configure nginx - return internalNginx.configure(redirectionHostModel, 'redirection_host', row); - }) - .then(() => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'enabled', - object_type: 'redirection-host', - object_id: row.id, - meta: _.omit(row, omissions()) - }); - }); - }) - .then(() => { - return true; - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {String} [data.reason] - * @returns {Promise} - */ - disable: (access, data) => { - return access.can('redirection_hosts:update', data.id) - .then(() => { - return internalRedirectionHost.get(access, {id: data.id}); - }) - .then(row => { - if (!row) { - throw new error.ItemNotFoundError(data.id); - } else if (!row.enabled) { - throw new error.ValidationError('Host is already disabled'); - } - - row.enabled = 0; - - return redirectionHostModel - .query() - .where('id', row.id) - .patch({ - enabled: 0 - }) - .then(() => { - // Delete Nginx Config - return internalNginx.deleteConfig('redirection_host', row) - .then(() => { - return internalNginx.reload(); - }); - }) - .then(() => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'disabled', - object_type: 'redirection-host', - object_id: row.id, - meta: _.omit(row, omissions()) - }); - }); - }) - .then(() => { - return true; - }); - }, - - /** - * All Hosts - * - * @param {Access} access - * @param {Array} [expand] - * @param {String} [search_query] - * @returns {Promise} - */ - getAll: (access, expand, search_query) => { - return access.can('redirection_hosts:list') - .then(access_data => { - let query = redirectionHostModel - .query() - .where('is_deleted', 0) - .groupBy('id') - .omit(['is_deleted']) - .allowEager('[owner,certificate]') - .orderBy('domain_names', 'ASC'); - - if (access_data.permission_visibility !== 'all') { - query.andWhere('owner_user_id', access.token.getUserId(1)); - } - - // Query is used for searching - if (typeof search_query === 'string') { - query.where(function () { - this.where('domain_names', 'like', '%' + search_query + '%'); - }); - } - - if (typeof expand !== 'undefined' && expand !== null) { - query.eager('[' + expand.join(', ') + ']'); - } - - return query; - }) - .then(rows => { - if (typeof expand !== 'undefined' && expand !== null && expand.indexOf('certificate') !== -1) { - return internalHost.cleanAllRowsCertificateMeta(rows); - } - - return rows; - }); - }, - - /** - * Report use - * - * @param {Number} user_id - * @param {String} visibility - * @returns {Promise} - */ - getCount: (user_id, visibility) => { - let query = redirectionHostModel - .query() - .count('id as count') - .where('is_deleted', 0); - - if (visibility !== 'all') { - query.andWhere('owner_user_id', user_id); - } - - return query.first() - .then(row => { - return parseInt(row.count, 10); - }); - } -}; - -module.exports = internalRedirectionHost; diff --git a/src/backend/internal/report.js b/src/backend/internal/report.js deleted file mode 100644 index 6594f940b..000000000 --- a/src/backend/internal/report.js +++ /dev/null @@ -1,38 +0,0 @@ -const internalProxyHost = require('./proxy-host'); -const internalRedirectionHost = require('./redirection-host'); -const internalDeadHost = require('./dead-host'); -const internalStream = require('./stream'); - -const internalReport = { - - /** - * @param {Access} access - * @return {Promise} - */ - getHostsReport: access => { - return access.can('reports:hosts', 1) - .then(access_data => { - let user_id = access.token.getUserId(1); - - let promises = [ - internalProxyHost.getCount(user_id, access_data.visibility), - internalRedirectionHost.getCount(user_id, access_data.visibility), - internalStream.getCount(user_id, access_data.visibility), - internalDeadHost.getCount(user_id, access_data.visibility) - ]; - - return Promise.all(promises); - }) - .then(counts => { - return { - proxy: counts.shift(), - redirection: counts.shift(), - stream: counts.shift(), - dead: counts.shift() - }; - }); - - } -}; - -module.exports = internalReport; diff --git a/src/backend/internal/setting.js b/src/backend/internal/setting.js deleted file mode 100644 index eedb7d3b3..000000000 --- a/src/backend/internal/setting.js +++ /dev/null @@ -1,133 +0,0 @@ -const fs = require('fs'); -const error = require('../lib/error'); -const settingModel = require('../models/setting'); -const internalNginx = require('./nginx'); - -const internalSetting = { - - /** - * @param {Access} access - * @param {Object} data - * @param {String} data.id - * @return {Promise} - */ - update: (access, data) => { - return access.can('settings:update', data.id) - .then(access_data => { - return internalSetting.get(access, {id: data.id}); - }) - .then(row => { - if (row.id !== data.id) { - // Sanity check that something crazy hasn't happened - throw new error.InternalValidationError('Setting could not be updated, IDs do not match: ' + row.id + ' !== ' + data.id); - } - - return settingModel - .query() - .where({id: data.id}) - .patch(data); - }) - .then(() => { - return internalSetting.get(access, { - id: data.id - }); - }) - .then(row => { - if (row.id === 'default-site') { - // write the html if we need to - if (row.value === 'html') { - fs.writeFileSync('/data/nginx/default_www/index.html', row.meta.html, {encoding: 'utf8'}); - } - - // Configure nginx - return internalNginx.deleteConfig('default') - .then(() => { - return internalNginx.generateConfig('default', row); - }) - .then(() => { - return internalNginx.test(); - }) - .then(() => { - return internalNginx.reload(); - }) - .then(() => { - return row; - }) - .catch((err) => { - internalNginx.deleteConfig('default') - .then(() => { - return internalNginx.test(); - }) - .then(() => { - return internalNginx.reload(); - }) - .then(() => { - // I'm being slack here I know.. - throw new error.ValidationError('Could not reconfigure Nginx. Please check logs.'); - }) - }); - } else { - return row; - } - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {String} data.id - * @return {Promise} - */ - get: (access, data) => { - return access.can('settings:get', data.id) - .then(() => { - return settingModel - .query() - .where('id', data.id) - .first(); - }) - .then(row => { - if (row) { - return row; - } else { - throw new error.ItemNotFoundError(data.id); - } - }); - }, - - /** - * This will only count the settings - * - * @param {Access} access - * @returns {*} - */ - getCount: (access) => { - return access.can('settings:list') - .then(() => { - return settingModel - .query() - .count('id as count') - .first(); - }) - .then(row => { - return parseInt(row.count, 10); - }); - }, - - /** - * All settings - * - * @param {Access} access - * @returns {Promise} - */ - getAll: (access) => { - return access.can('settings:list') - .then(() => { - return settingModel - .query() - .orderBy('description', 'ASC'); - }); - } -}; - -module.exports = internalSetting; diff --git a/src/backend/internal/stream.js b/src/backend/internal/stream.js deleted file mode 100644 index 3abed218f..000000000 --- a/src/backend/internal/stream.js +++ /dev/null @@ -1,348 +0,0 @@ -const _ = require('lodash'); -const error = require('../lib/error'); -const streamModel = require('../models/stream'); -const internalNginx = require('./nginx'); -const internalAuditLog = require('./audit-log'); - -function omissions () { - return ['is_deleted']; -} - -const internalStream = { - - /** - * @param {Access} access - * @param {Object} data - * @returns {Promise} - */ - create: (access, data) => { - return access.can('streams:create', data) - .then(access_data => { - // TODO: At this point the existing ports should have been checked - data.owner_user_id = access.token.getUserId(1); - - if (typeof data.meta === 'undefined') { - data.meta = {}; - } - - return streamModel - .query() - .omit(omissions()) - .insertAndFetch(data); - }) - .then(row => { - // Configure nginx - return internalNginx.configure(streamModel, 'stream', row) - .then(() => { - return internalStream.get(access, {id: row.id, expand: ['owner']}); - }); - }) - .then(row => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'created', - object_type: 'stream', - object_id: row.id, - meta: data - }) - .then(() => { - return row; - }); - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @return {Promise} - */ - update: (access, data) => { - return access.can('streams:update', data.id) - .then(access_data => { - // TODO: at this point the existing streams should have been checked - return internalStream.get(access, {id: data.id}); - }) - .then(row => { - if (row.id !== data.id) { - // Sanity check that something crazy hasn't happened - throw new error.InternalValidationError('Stream could not be updated, IDs do not match: ' + row.id + ' !== ' + data.id); - } - - return streamModel - .query() - .omit(omissions()) - .patchAndFetchById(row.id, data) - .then(saved_row => { - return internalNginx.configure(streamModel, 'stream', saved_row) - .then(() => { - return internalStream.get(access, {id: row.id, expand: ['owner']}); - }); - }) - .then(saved_row => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'updated', - object_type: 'stream', - object_id: row.id, - meta: data - }) - .then(() => { - return _.omit(saved_row, omissions()); - }); - }); - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {Array} [data.expand] - * @param {Array} [data.omit] - * @return {Promise} - */ - get: (access, data) => { - if (typeof data === 'undefined') { - data = {}; - } - - return access.can('streams:get', data.id) - .then(access_data => { - let query = streamModel - .query() - .where('is_deleted', 0) - .andWhere('id', data.id) - .allowEager('[owner]') - .first(); - - if (access_data.permission_visibility !== 'all') { - query.andWhere('owner_user_id', access.token.getUserId(1)); - } - - // Custom omissions - if (typeof data.omit !== 'undefined' && data.omit !== null) { - query.omit(data.omit); - } - - if (typeof data.expand !== 'undefined' && data.expand !== null) { - query.eager('[' + data.expand.join(', ') + ']'); - } - - return query; - }) - .then(row => { - if (row) { - return _.omit(row, omissions()); - } else { - throw new error.ItemNotFoundError(data.id); - } - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {String} [data.reason] - * @returns {Promise} - */ - delete: (access, data) => { - return access.can('streams:delete', data.id) - .then(() => { - return internalStream.get(access, {id: data.id}); - }) - .then(row => { - if (!row) { - throw new error.ItemNotFoundError(data.id); - } - - return streamModel - .query() - .where('id', row.id) - .patch({ - is_deleted: 1 - }) - .then(() => { - // Delete Nginx Config - return internalNginx.deleteConfig('stream', row) - .then(() => { - return internalNginx.reload(); - }); - }) - .then(() => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'deleted', - object_type: 'stream', - object_id: row.id, - meta: _.omit(row, omissions()) - }); - }); - }) - .then(() => { - return true; - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {String} [data.reason] - * @returns {Promise} - */ - enable: (access, data) => { - return access.can('streams:update', data.id) - .then(() => { - return internalStream.get(access, { - id: data.id, - expand: ['owner'] - }); - }) - .then(row => { - if (!row) { - throw new error.ItemNotFoundError(data.id); - } else if (row.enabled) { - throw new error.ValidationError('Host is already enabled'); - } - - row.enabled = 1; - - return streamModel - .query() - .where('id', row.id) - .patch({ - enabled: 1 - }) - .then(() => { - // Configure nginx - return internalNginx.configure(streamModel, 'stream', row); - }) - .then(() => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'enabled', - object_type: 'stream', - object_id: row.id, - meta: _.omit(row, omissions()) - }); - }); - }) - .then(() => { - return true; - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Number} data.id - * @param {String} [data.reason] - * @returns {Promise} - */ - disable: (access, data) => { - return access.can('streams:update', data.id) - .then(() => { - return internalStream.get(access, {id: data.id}); - }) - .then(row => { - if (!row) { - throw new error.ItemNotFoundError(data.id); - } else if (!row.enabled) { - throw new error.ValidationError('Host is already disabled'); - } - - row.enabled = 0; - - return streamModel - .query() - .where('id', row.id) - .patch({ - enabled: 0 - }) - .then(() => { - // Delete Nginx Config - return internalNginx.deleteConfig('stream', row) - .then(() => { - return internalNginx.reload(); - }); - }) - .then(() => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'disabled', - object_type: 'stream-host', - object_id: row.id, - meta: _.omit(row, omissions()) - }); - }); - }) - .then(() => { - return true; - }); - }, - - /** - * All Streams - * - * @param {Access} access - * @param {Array} [expand] - * @param {String} [search_query] - * @returns {Promise} - */ - getAll: (access, expand, search_query) => { - return access.can('streams:list') - .then(access_data => { - let query = streamModel - .query() - .where('is_deleted', 0) - .groupBy('id') - .omit(['is_deleted']) - .allowEager('[owner]') - .orderBy('incoming_port', 'ASC'); - - if (access_data.permission_visibility !== 'all') { - query.andWhere('owner_user_id', access.token.getUserId(1)); - } - - // Query is used for searching - if (typeof search_query === 'string') { - query.where(function () { - this.where('incoming_port', 'like', '%' + search_query + '%'); - }); - } - - if (typeof expand !== 'undefined' && expand !== null) { - query.eager('[' + expand.join(', ') + ']'); - } - - return query; - }); - }, - - /** - * Report use - * - * @param {Number} user_id - * @param {String} visibility - * @returns {Promise} - */ - getCount: (user_id, visibility) => { - let query = streamModel - .query() - .count('id as count') - .where('is_deleted', 0); - - if (visibility !== 'all') { - query.andWhere('owner_user_id', user_id); - } - - return query.first() - .then(row => { - return parseInt(row.count, 10); - }); - } -}; - -module.exports = internalStream; diff --git a/src/backend/internal/token.js b/src/backend/internal/token.js deleted file mode 100644 index c216ce159..000000000 --- a/src/backend/internal/token.js +++ /dev/null @@ -1,164 +0,0 @@ -const _ = require('lodash'); -const error = require('../lib/error'); -const userModel = require('../models/user'); -const authModel = require('../models/auth'); -const helpers = require('../lib/helpers'); -const TokenModel = require('../models/token'); - -module.exports = { - - /** - * @param {Object} data - * @param {String} data.identity - * @param {String} data.secret - * @param {String} [data.scope] - * @param {String} [data.expiry] - * @param {String} [issuer] - * @returns {Promise} - */ - getTokenFromEmail: (data, issuer) => { - let Token = new TokenModel(); - - data.scope = data.scope || 'user'; - data.expiry = data.expiry || '30d'; - - return userModel - .query() - .where('email', data.identity) - .andWhere('is_deleted', 0) - .andWhere('is_disabled', 0) - .first() - .then(user => { - if (user) { - // Get auth - return authModel - .query() - .where('user_id', '=', user.id) - .where('type', '=', 'password') - .first() - .then(auth => { - if (auth) { - return auth.verifyPassword(data.secret) - .then(valid => { - if (valid) { - - if (data.scope !== 'user' && _.indexOf(user.roles, data.scope) === -1) { - // The scope requested doesn't exist as a role against the user, - // you shall not pass. - throw new error.AuthError('Invalid scope: ' + data.scope); - } - - // Create a moment of the expiry expression - let expiry = helpers.parseDatePeriod(data.expiry); - if (expiry === null) { - throw new error.AuthError('Invalid expiry time: ' + data.expiry); - } - - return Token.create({ - iss: issuer || 'api', - attrs: { - id: user.id - }, - scope: [data.scope] - }, { - expiresIn: expiry.unix() - }) - .then(signed => { - return { - token: signed.token, - expires: expiry.toISOString() - }; - }); - } else { - throw new error.AuthError('Invalid password'); - } - }); - } else { - throw new error.AuthError('No password auth for user'); - } - }); - } else { - throw new error.AuthError('No relevant user found'); - } - }); - }, - - /** - * @param {Access} access - * @param {Object} [data] - * @param {String} [data.expiry] - * @param {String} [data.scope] Only considered if existing token scope is admin - * @returns {Promise} - */ - getFreshToken: (access, data) => { - let Token = new TokenModel(); - - data = data || {}; - data.expiry = data.expiry || '30d'; - - if (access && access.token.getUserId(0)) { - - // Create a moment of the expiry expression - let expiry = helpers.parseDatePeriod(data.expiry); - if (expiry === null) { - throw new error.AuthError('Invalid expiry time: ' + data.expiry); - } - - let token_attrs = { - id: access.token.getUserId(0) - }; - - // Only admins can request otherwise scoped tokens - let scope = access.token.get('scope'); - if (data.scope && access.token.hasScope('admin')) { - scope = [data.scope]; - - if (data.scope === 'job-board' || data.scope === 'worker') { - token_attrs.id = 0; - } - } - - return Token.create({ - iss: 'api', - scope: scope, - attrs: token_attrs - }, { - expiresIn: expiry.unix() - }) - .then(signed => { - return { - token: signed.token, - expires: expiry.toISOString() - }; - }); - } else { - throw new error.AssertionFailedError('Existing token contained invalid user data'); - } - }, - - /** - * @param {Object} user - * @returns {Promise} - */ - getTokenFromUser: user => { - let Token = new TokenModel(); - let expiry = helpers.parseDatePeriod('1d'); - - return Token.create({ - iss: 'api', - attrs: { - id: user.id - }, - scope: ['user'] - }, { - expiresIn: expiry.unix() - }) - .then(signed => { - return { - token: signed.token, - expires: expiry.toISOString(), - user: user - }; - }); - } -}; diff --git a/src/backend/internal/user.js b/src/backend/internal/user.js deleted file mode 100644 index 2253c9564..000000000 --- a/src/backend/internal/user.js +++ /dev/null @@ -1,518 +0,0 @@ -const _ = require('lodash'); -const error = require('../lib/error'); -const userModel = require('../models/user'); -const userPermissionModel = require('../models/user_permission'); -const authModel = require('../models/auth'); -const gravatar = require('gravatar'); -const internalToken = require('./token'); -const internalAuditLog = require('./audit-log'); - -function omissions () { - return ['is_deleted']; -} - -const internalUser = { - - /** - * @param {Access} access - * @param {Object} data - * @returns {Promise} - */ - create: (access, data) => { - let auth = data.auth || null; - delete data.auth; - - data.avatar = data.avatar || ''; - data.roles = data.roles || []; - - if (typeof data.is_disabled !== 'undefined') { - data.is_disabled = data.is_disabled ? 1 : 0; - } - - return access.can('users:create', data) - .then(() => { - data.avatar = gravatar.url(data.email, {default: 'mm'}); - - return userModel - .query() - .omit(omissions()) - .insertAndFetch(data); - }) - .then(user => { - if (auth) { - return authModel - .query() - .insert({ - user_id: user.id, - type: auth.type, - secret: auth.secret, - meta: {} - }) - .then(() => { - return user; - }); - } else { - return user; - } - }) - .then(user => { - // Create permissions row as well - let is_admin = data.roles.indexOf('admin') !== -1; - - return userPermissionModel - .query() - .insert({ - user_id: user.id, - visibility: is_admin ? 'all' : 'user', - proxy_hosts: 'manage', - redirection_hosts: 'manage', - dead_hosts: 'manage', - streams: 'manage', - access_lists: 'manage', - certificates: 'manage' - }) - .then(() => { - return internalUser.get(access, {id: user.id, expand: ['permissions']}); - }); - }) - .then(user => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'created', - object_type: 'user', - object_id: user.id, - meta: user - }) - .then(() => { - return user; - }); - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Integer} data.id - * @param {String} [data.email] - * @param {String} [data.name] - * @return {Promise} - */ - update: (access, data) => { - if (typeof data.is_disabled !== 'undefined') { - data.is_disabled = data.is_disabled ? 1 : 0; - } - - return access.can('users:update', data.id) - .then(() => { - - // Make sure that the user being updated doesn't change their email to another user that is already using it - // 1. get user we want to update - return internalUser.get(access, {id: data.id}) - .then(user => { - - // 2. if email is to be changed, find other users with that email - if (typeof data.email !== 'undefined') { - data.email = data.email.toLowerCase().trim(); - - if (user.email !== data.email) { - return internalUser.isEmailAvailable(data.email, data.id) - .then(available => { - if (!available) { - throw new error.ValidationError('Email address already in use - ' + data.email); - } - - return user; - }); - } - } - - // No change to email: - return user; - }); - }) - .then(user => { - if (user.id !== data.id) { - // Sanity check that something crazy hasn't happened - throw new error.InternalValidationError('User could not be updated, IDs do not match: ' + user.id + ' !== ' + data.id); - } - - data.avatar = gravatar.url(data.email || user.email, {default: 'mm'}); - - return userModel - .query() - .omit(omissions()) - .patchAndFetchById(user.id, data) - .then(saved_user => { - return _.omit(saved_user, omissions()); - }); - }) - .then(() => { - return internalUser.get(access, {id: data.id}); - }) - .then(user => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'updated', - object_type: 'user', - object_id: user.id, - meta: data - }) - .then(() => { - return user; - }); - }); - }, - - /** - * @param {Access} access - * @param {Object} [data] - * @param {Integer} [data.id] Defaults to the token user - * @param {Array} [data.expand] - * @param {Array} [data.omit] - * @return {Promise} - */ - get: (access, data) => { - if (typeof data === 'undefined') { - data = {}; - } - - if (typeof data.id === 'undefined' || !data.id) { - data.id = access.token.getUserId(0); - } - - return access.can('users:get', data.id) - .then(() => { - let query = userModel - .query() - .where('is_deleted', 0) - .andWhere('id', data.id) - .allowEager('[permissions]') - .first(); - - // Custom omissions - if (typeof data.omit !== 'undefined' && data.omit !== null) { - query.omit(data.omit); - } - - if (typeof data.expand !== 'undefined' && data.expand !== null) { - query.eager('[' + data.expand.join(', ') + ']'); - } - - return query; - }) - .then(row => { - if (row) { - return _.omit(row, omissions()); - } else { - throw new error.ItemNotFoundError(data.id); - } - }); - }, - - /** - * Checks if an email address is available, but if a user_id is supplied, it will ignore checking - * against that user. - * - * @param email - * @param user_id - */ - isEmailAvailable: (email, user_id) => { - let query = userModel - .query() - .where('email', '=', email.toLowerCase().trim()) - .where('is_deleted', 0) - .first(); - - if (typeof user_id !== 'undefined') { - query.where('id', '!=', user_id); - } - - return query - .then(user => { - return !user; - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Integer} data.id - * @param {String} [data.reason] - * @returns {Promise} - */ - delete: (access, data) => { - return access.can('users:delete', data.id) - .then(() => { - return internalUser.get(access, {id: data.id}); - }) - .then(user => { - if (!user) { - throw new error.ItemNotFoundError(data.id); - } - - // Make sure user can't delete themselves - if (user.id === access.token.getUserId(0)) { - throw new error.PermissionError('You cannot delete yourself.'); - } - - return userModel - .query() - .where('id', user.id) - .patch({ - is_deleted: 1 - }) - .then(() => { - // Add to audit log - return internalAuditLog.add(access, { - action: 'deleted', - object_type: 'user', - object_id: user.id, - meta: _.omit(user, omissions()) - }); - }); - }) - .then(() => { - return true; - }); - }, - - /** - * This will only count the users - * - * @param {Access} access - * @param {String} [search_query] - * @returns {*} - */ - getCount: (access, search_query) => { - return access.can('users:list') - .then(() => { - let query = userModel - .query() - .count('id as count') - .where('is_deleted', 0) - .first(); - - // Query is used for searching - if (typeof search_query === 'string') { - query.where(function () { - this.where('user.name', 'like', '%' + search_query + '%') - .orWhere('user.email', 'like', '%' + search_query + '%'); - }); - } - - return query; - }) - .then(row => { - return parseInt(row.count, 10); - }); - }, - - /** - * All users - * - * @param {Access} access - * @param {Array} [expand] - * @param {String} [search_query] - * @returns {Promise} - */ - getAll: (access, expand, search_query) => { - return access.can('users:list') - .then(() => { - let query = userModel - .query() - .where('is_deleted', 0) - .groupBy('id') - .omit(['is_deleted']) - .allowEager('[permissions]') - .orderBy('name', 'ASC'); - - // Query is used for searching - if (typeof search_query === 'string') { - query.where(function () { - this.where('name', 'like', '%' + search_query + '%') - .orWhere('email', 'like', '%' + search_query + '%'); - }); - } - - if (typeof expand !== 'undefined' && expand !== null) { - query.eager('[' + expand.join(', ') + ']'); - } - - return query; - }); - }, - - /** - * @param {Access} access - * @param {Integer} [id_requested] - * @returns {[String]} - */ - getUserOmisionsByAccess: (access, id_requested) => { - let response = []; // Admin response - - if (!access.token.hasScope('admin') && access.token.getUserId(0) !== id_requested) { - response = ['roles', 'is_deleted']; // Restricted response - } - - return response; - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Integer} data.id - * @param {String} data.type - * @param {String} data.secret - * @return {Promise} - */ - setPassword: (access, data) => { - return access.can('users:password', data.id) - .then(() => { - return internalUser.get(access, {id: data.id}); - }) - .then(user => { - if (user.id !== data.id) { - // Sanity check that something crazy hasn't happened - throw new error.InternalValidationError('User could not be updated, IDs do not match: ' + user.id + ' !== ' + data.id); - } - - if (user.id === access.token.getUserId(0)) { - // they're setting their own password. Make sure their current password is correct - if (typeof data.current === 'undefined' || !data.current) { - throw new error.ValidationError('Current password was not supplied'); - } - - return internalToken.getTokenFromEmail({ - identity: user.email, - secret: data.current - }) - .then(() => { - return user; - }); - } - - return user; - }) - .then(user => { - // Get auth, patch if it exists - return authModel - .query() - .where('user_id', user.id) - .andWhere('type', data.type) - .first() - .then(existing_auth => { - if (existing_auth) { - // patch - return authModel - .query() - .where('user_id', user.id) - .andWhere('type', data.type) - .patch({ - type: data.type, // This is required for the model to encrypt on save - secret: data.secret - }); - } else { - // insert - return authModel - .query() - .insert({ - user_id: user.id, - type: data.type, - secret: data.secret, - meta: {} - }); - } - }) - .then(() => { - // Add to Audit Log - return internalAuditLog.add(access, { - action: 'updated', - object_type: 'user', - object_id: user.id, - meta: { - name: user.name, - password_changed: true, - auth_type: data.type - } - }); - }); - }) - .then(() => { - return true; - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @return {Promise} - */ - setPermissions: (access, data) => { - return access.can('users:permissions', data.id) - .then(() => { - return internalUser.get(access, {id: data.id}); - }) - .then(user => { - if (user.id !== data.id) { - // Sanity check that something crazy hasn't happened - throw new error.InternalValidationError('User could not be updated, IDs do not match: ' + user.id + ' !== ' + data.id); - } - - return user; - }) - .then(user => { - // Get perms row, patch if it exists - return userPermissionModel - .query() - .where('user_id', user.id) - .first() - .then(existing_auth => { - if (existing_auth) { - // patch - return userPermissionModel - .query() - .where('user_id', user.id) - .patchAndFetchById(existing_auth.id, _.assign({user_id: user.id}, data)); - } else { - // insert - return userPermissionModel - .query() - .insertAndFetch(_.assign({user_id: user.id}, data)); - } - }) - .then(permissions => { - // Add to Audit Log - return internalAuditLog.add(access, { - action: 'updated', - object_type: 'user', - object_id: user.id, - meta: { - name: user.name, - permissions: permissions - } - }); - - }); - }) - .then(() => { - return true; - }); - }, - - /** - * @param {Access} access - * @param {Object} data - * @param {Integer} data.id - */ - loginAs: (access, data) => { - return access.can('users:loginas', data.id) - .then(() => { - return internalUser.get(access, data); - }) - .then(user => { - return internalToken.getTokenFromUser(user); - }); - } -}; - -module.exports = internalUser; diff --git a/src/backend/lib/access.js b/src/backend/lib/access.js deleted file mode 100644 index 6f2da7395..000000000 --- a/src/backend/lib/access.js +++ /dev/null @@ -1,313 +0,0 @@ -/** - * Some Notes: This is a friggin complicated piece of code. - * - * "scope" in this file means "where did this token come from and what is using it", so 99% of the time - * the "scope" is going to be "user" because it would be a user token. This is not to be confused with - * the "role" which could be "user" or "admin". The scope in fact, could be "worker" or anything else. - * - * - */ - -const _ = require('lodash'); -const logger = require('../logger').access; -const validator = require('ajv'); -const error = require('./error'); -const userModel = require('../models/user'); -const proxyHostModel = require('../models/proxy_host'); -const TokenModel = require('../models/token'); -const roleSchema = require('./access/roles.json'); -const permsSchema = require('./access/permissions.json'); - -module.exports = function (token_string) { - let Token = new TokenModel(); - let token_data = null; - let initialised = false; - let object_cache = {}; - let allow_internal_access = false; - let user_roles = []; - let permissions = {}; - - /** - * Loads the Token object from the token string - * - * @returns {Promise} - */ - this.init = () => { - return new Promise((resolve, reject) => { - if (initialised) { - resolve(); - } else if (!token_string) { - reject(new error.PermissionError('Permission Denied')); - } else { - resolve(Token.load(token_string) - .then(data => { - token_data = data; - - // At this point we need to load the user from the DB and make sure they: - // - exist (and not soft deleted) - // - still have the appropriate scopes for this token - // This is only required when the User ID is supplied or if the token scope has `user` - - if (token_data.attrs.id || (typeof token_data.scope !== 'undefined' && _.indexOf(token_data.scope, 'user') !== -1)) { - // Has token user id or token user scope - return userModel - .query() - .where('id', token_data.attrs.id) - .andWhere('is_deleted', 0) - .andWhere('is_disabled', 0) - .allowEager('[permissions]') - .eager('[permissions]') - .first() - .then(user => { - if (user) { - // make sure user has all scopes of the token - // The `user` role is not added against the user row, so we have to just add it here to get past this check. - user.roles.push('user'); - - let is_ok = true; - _.forEach(token_data.scope, (scope_item) => { - if (_.indexOf(user.roles, scope_item) === -1) { - is_ok = false; - } - }); - - if (!is_ok) { - throw new error.AuthError('Invalid token scope for User'); - } else { - initialised = true; - user_roles = user.roles; - permissions = user.permissions; - } - - } else { - throw new error.AuthError('User cannot be loaded for Token'); - } - }); - } else { - initialised = true; - } - })); - } - }); - }; - - /** - * Fetches the object ids from the database, only once per object type, for this token. - * This only applies to USER token scopes, as all other tokens are not really bound - * by object scopes - * - * @param {String} object_type - * @returns {Promise} - */ - this.loadObjects = object_type => { - return new Promise((resolve, reject) => { - if (Token.hasScope('user')) { - if (typeof token_data.attrs.id === 'undefined' || !token_data.attrs.id) { - reject(new error.AuthError('User Token supplied without a User ID')); - } else { - let token_user_id = token_data.attrs.id ? token_data.attrs.id : 0; - - if (typeof object_cache[object_type] === 'undefined') { - switch (object_type) { - - // USERS - should only return yourself - case 'users': - resolve(token_user_id ? [token_user_id] : []); - break; - - // Proxy Hosts - case 'proxy_hosts': - let query = proxyHostModel - .query() - .select('id') - .andWhere('is_deleted', 0); - - if (permissions.visibility === 'user') { - query.andWhere('owner_user_id', token_user_id); - } - - resolve(query - .then(rows => { - let result = []; - _.forEach(rows, (rule_row) => { - result.push(rule_row.id); - }); - - // enum should not have less than 1 item - if (!result.length) { - result.push(0); - } - - return result; - }) - ); - break; - - // DEFAULT: null - default: - resolve(null); - break; - } - } else { - resolve(object_cache[object_type]); - } - } - } else { - resolve(null); - } - }) - .then(objects => { - object_cache[object_type] = objects; - return objects; - }); - }; - - /** - * Creates a schema object on the fly with the IDs and other values required to be checked against the permissionSchema - * - * @param {String} permission_label - * @returns {Object} - */ - this.getObjectSchema = permission_label => { - let base_object_type = permission_label.split(':').shift(); - - let schema = { - $id: 'objects', - $schema: 'http://json-schema.org/draft-07/schema#', - description: 'Actor Properties', - type: 'object', - additionalProperties: false, - properties: { - user_id: { - anyOf: [ - { - type: 'number', - enum: [Token.get('attrs').id] - } - ] - }, - scope: { - type: 'string', - pattern: '^' + Token.get('scope') + '$' - } - } - }; - - return this.loadObjects(base_object_type) - .then(object_result => { - if (typeof object_result === 'object' && object_result !== null) { - schema.properties[base_object_type] = { - type: 'number', - enum: object_result, - minimum: 1 - }; - } else { - schema.properties[base_object_type] = { - type: 'number', - minimum: 1 - }; - } - - return schema; - }); - }; - - return { - - token: Token, - - /** - * - * @param {Boolean} [allow_internal] - * @returns {Promise} - */ - load: allow_internal => { - return new Promise(function (resolve/*, reject*/) { - if (token_string) { - resolve(Token.load(token_string)); - } else { - allow_internal_access = allow_internal; - resolve(allow_internal_access || null); - } - }); - }, - - reloadObjects: this.loadObjects, - - /** - * - * @param {String} permission - * @param {*} [data] - * @returns {Promise} - */ - can: (permission, data) => { - if (allow_internal_access === true) { - return Promise.resolve(true); - //return true; - } else { - return this.init() - .then(() => { - // Initialised, token decoded ok - return this.getObjectSchema(permission) - .then(objectSchema => { - let data_schema = { - [permission]: { - data: data, - scope: Token.get('scope'), - roles: user_roles, - permission_visibility: permissions.visibility, - permission_proxy_hosts: permissions.proxy_hosts, - permission_redirection_hosts: permissions.redirection_hosts, - permission_dead_hosts: permissions.dead_hosts, - permission_streams: permissions.streams, - permission_access_lists: permissions.access_lists, - permission_certificates: permissions.certificates - } - }; - - let permissionSchema = { - $schema: 'http://json-schema.org/draft-07/schema#', - $async: true, - $id: 'permissions', - additionalProperties: false, - properties: {} - }; - - permissionSchema.properties[permission] = require('./access/' + permission.replace(/:/gim, '-') + '.json'); - - // logger.info('objectSchema', JSON.stringify(objectSchema, null, 2)); - // logger.info('permissionSchema', JSON.stringify(permissionSchema, null, 2)); - // logger.info('data_schema', JSON.stringify(data_schema, null, 2)); - - let ajv = validator({ - verbose: true, - allErrors: true, - format: 'full', - missingRefs: 'fail', - breakOnError: true, - coerceTypes: true, - schemas: [ - roleSchema, - permsSchema, - objectSchema, - permissionSchema - ] - }); - - return ajv.validate('permissions', data_schema) - .then(() => { - return data_schema[permission]; - }); - }); - }) - .catch(err => { - err.permission = permission; - err.permission_data = data; - logger.error(permission, data, err.message); - - throw new error.PermissionError('Permission Denied', err); - }); - } - } - }; -}; diff --git a/src/backend/lib/access/access_lists-create.json b/src/backend/lib/access/access_lists-create.json deleted file mode 100644 index f2a91ffe8..000000000 --- a/src/backend/lib/access/access_lists-create.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_access_lists", "roles"], - "properties": { - "permission_access_lists": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/access_lists-delete.json b/src/backend/lib/access/access_lists-delete.json deleted file mode 100644 index f2a91ffe8..000000000 --- a/src/backend/lib/access/access_lists-delete.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_access_lists", "roles"], - "properties": { - "permission_access_lists": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/access_lists-get.json b/src/backend/lib/access/access_lists-get.json deleted file mode 100644 index 12203b393..000000000 --- a/src/backend/lib/access/access_lists-get.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_access_lists", "roles"], - "properties": { - "permission_access_lists": { - "$ref": "perms#/definitions/view" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/access_lists-list.json b/src/backend/lib/access/access_lists-list.json deleted file mode 100644 index 12203b393..000000000 --- a/src/backend/lib/access/access_lists-list.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_access_lists", "roles"], - "properties": { - "permission_access_lists": { - "$ref": "perms#/definitions/view" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/access_lists-update.json b/src/backend/lib/access/access_lists-update.json deleted file mode 100644 index f2a91ffe8..000000000 --- a/src/backend/lib/access/access_lists-update.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_access_lists", "roles"], - "properties": { - "permission_access_lists": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/auditlog-list.json b/src/backend/lib/access/auditlog-list.json deleted file mode 100644 index d2709fd83..000000000 --- a/src/backend/lib/access/auditlog-list.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - } - ] -} diff --git a/src/backend/lib/access/certificates-create.json b/src/backend/lib/access/certificates-create.json deleted file mode 100644 index 3eea8a266..000000000 --- a/src/backend/lib/access/certificates-create.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_certificates", "roles"], - "properties": { - "permission_certificates": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/certificates-delete.json b/src/backend/lib/access/certificates-delete.json deleted file mode 100644 index 3eea8a266..000000000 --- a/src/backend/lib/access/certificates-delete.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_certificates", "roles"], - "properties": { - "permission_certificates": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/certificates-get.json b/src/backend/lib/access/certificates-get.json deleted file mode 100644 index 8966a4acd..000000000 --- a/src/backend/lib/access/certificates-get.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_certificates", "roles"], - "properties": { - "permission_certificates": { - "$ref": "perms#/definitions/view" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/certificates-list.json b/src/backend/lib/access/certificates-list.json deleted file mode 100644 index 8966a4acd..000000000 --- a/src/backend/lib/access/certificates-list.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_certificates", "roles"], - "properties": { - "permission_certificates": { - "$ref": "perms#/definitions/view" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/certificates-update.json b/src/backend/lib/access/certificates-update.json deleted file mode 100644 index 3eea8a266..000000000 --- a/src/backend/lib/access/certificates-update.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_certificates", "roles"], - "properties": { - "permission_certificates": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/dead_hosts-create.json b/src/backend/lib/access/dead_hosts-create.json deleted file mode 100644 index 12fc4af05..000000000 --- a/src/backend/lib/access/dead_hosts-create.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_dead_hosts", "roles"], - "properties": { - "permission_dead_hosts": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/dead_hosts-delete.json b/src/backend/lib/access/dead_hosts-delete.json deleted file mode 100644 index 12fc4af05..000000000 --- a/src/backend/lib/access/dead_hosts-delete.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_dead_hosts", "roles"], - "properties": { - "permission_dead_hosts": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/dead_hosts-get.json b/src/backend/lib/access/dead_hosts-get.json deleted file mode 100644 index 925b52ce9..000000000 --- a/src/backend/lib/access/dead_hosts-get.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_dead_hosts", "roles"], - "properties": { - "permission_dead_hosts": { - "$ref": "perms#/definitions/view" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/dead_hosts-list.json b/src/backend/lib/access/dead_hosts-list.json deleted file mode 100644 index 925b52ce9..000000000 --- a/src/backend/lib/access/dead_hosts-list.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_dead_hosts", "roles"], - "properties": { - "permission_dead_hosts": { - "$ref": "perms#/definitions/view" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/dead_hosts-update.json b/src/backend/lib/access/dead_hosts-update.json deleted file mode 100644 index 12fc4af05..000000000 --- a/src/backend/lib/access/dead_hosts-update.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_dead_hosts", "roles"], - "properties": { - "permission_dead_hosts": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/permissions.json b/src/backend/lib/access/permissions.json deleted file mode 100644 index cf64a7d67..000000000 --- a/src/backend/lib/access/permissions.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "perms", - "definitions": { - "view": { - "type": "string", - "pattern": "^(view|manage)$" - }, - "manage": { - "type": "string", - "pattern": "^(manage)$" - } - } -} - diff --git a/src/backend/lib/access/proxy_hosts-create.json b/src/backend/lib/access/proxy_hosts-create.json deleted file mode 100644 index 3ceb86cab..000000000 --- a/src/backend/lib/access/proxy_hosts-create.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_proxy_hosts", "roles"], - "properties": { - "permission_proxy_hosts": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/proxy_hosts-delete.json b/src/backend/lib/access/proxy_hosts-delete.json deleted file mode 100644 index 3ceb86cab..000000000 --- a/src/backend/lib/access/proxy_hosts-delete.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_proxy_hosts", "roles"], - "properties": { - "permission_proxy_hosts": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/proxy_hosts-get.json b/src/backend/lib/access/proxy_hosts-get.json deleted file mode 100644 index 10c47465d..000000000 --- a/src/backend/lib/access/proxy_hosts-get.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_proxy_hosts", "roles"], - "properties": { - "permission_proxy_hosts": { - "$ref": "perms#/definitions/view" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/proxy_hosts-list.json b/src/backend/lib/access/proxy_hosts-list.json deleted file mode 100644 index 10c47465d..000000000 --- a/src/backend/lib/access/proxy_hosts-list.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_proxy_hosts", "roles"], - "properties": { - "permission_proxy_hosts": { - "$ref": "perms#/definitions/view" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/proxy_hosts-update.json b/src/backend/lib/access/proxy_hosts-update.json deleted file mode 100644 index 3ceb86cab..000000000 --- a/src/backend/lib/access/proxy_hosts-update.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_proxy_hosts", "roles"], - "properties": { - "permission_proxy_hosts": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/redirection_hosts-create.json b/src/backend/lib/access/redirection_hosts-create.json deleted file mode 100644 index b27c1f48d..000000000 --- a/src/backend/lib/access/redirection_hosts-create.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_redirection_hosts", "roles"], - "properties": { - "permission_redirection_hosts": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/redirection_hosts-delete.json b/src/backend/lib/access/redirection_hosts-delete.json deleted file mode 100644 index b27c1f48d..000000000 --- a/src/backend/lib/access/redirection_hosts-delete.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_redirection_hosts", "roles"], - "properties": { - "permission_redirection_hosts": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/redirection_hosts-get.json b/src/backend/lib/access/redirection_hosts-get.json deleted file mode 100644 index 227fc5450..000000000 --- a/src/backend/lib/access/redirection_hosts-get.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_redirection_hosts", "roles"], - "properties": { - "permission_redirection_hosts": { - "$ref": "perms#/definitions/view" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/redirection_hosts-list.json b/src/backend/lib/access/redirection_hosts-list.json deleted file mode 100644 index 227fc5450..000000000 --- a/src/backend/lib/access/redirection_hosts-list.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_redirection_hosts", "roles"], - "properties": { - "permission_redirection_hosts": { - "$ref": "perms#/definitions/view" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/redirection_hosts-update.json b/src/backend/lib/access/redirection_hosts-update.json deleted file mode 100644 index b27c1f48d..000000000 --- a/src/backend/lib/access/redirection_hosts-update.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_redirection_hosts", "roles"], - "properties": { - "permission_redirection_hosts": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/reports-hosts.json b/src/backend/lib/access/reports-hosts.json deleted file mode 100644 index 4b02c77ec..000000000 --- a/src/backend/lib/access/reports-hosts.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/user" - } - ] -} diff --git a/src/backend/lib/access/roles.json b/src/backend/lib/access/roles.json deleted file mode 100644 index 18922a157..000000000 --- a/src/backend/lib/access/roles.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "roles", - "definitions": { - "admin": { - "type": "object", - "required": [ - "scope", - "roles" - ], - "properties": { - "scope": { - "type": "array", - "contains": { - "type": "string", - "pattern": "^user$" - } - }, - "roles": { - "type": "array", - "contains": { - "type": "string", - "pattern": "^admin$" - } - } - } - }, - "user": { - "type": "object", - "required": [ - "scope" - ], - "properties": { - "scope": { - "type": "array", - "contains": { - "type": "string", - "pattern": "^user$" - } - } - } - } - } -} - diff --git a/src/backend/lib/access/settings-get.json b/src/backend/lib/access/settings-get.json deleted file mode 100644 index d2709fd83..000000000 --- a/src/backend/lib/access/settings-get.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - } - ] -} diff --git a/src/backend/lib/access/settings-list.json b/src/backend/lib/access/settings-list.json deleted file mode 100644 index d2709fd83..000000000 --- a/src/backend/lib/access/settings-list.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - } - ] -} diff --git a/src/backend/lib/access/settings-update.json b/src/backend/lib/access/settings-update.json deleted file mode 100644 index d2709fd83..000000000 --- a/src/backend/lib/access/settings-update.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - } - ] -} diff --git a/src/backend/lib/access/streams-create.json b/src/backend/lib/access/streams-create.json deleted file mode 100644 index 6a745ec44..000000000 --- a/src/backend/lib/access/streams-create.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_streams", "roles"], - "properties": { - "permission_streams": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/streams-delete.json b/src/backend/lib/access/streams-delete.json deleted file mode 100644 index 6a745ec44..000000000 --- a/src/backend/lib/access/streams-delete.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_streams", "roles"], - "properties": { - "permission_streams": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/streams-get.json b/src/backend/lib/access/streams-get.json deleted file mode 100644 index 3443aa85d..000000000 --- a/src/backend/lib/access/streams-get.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_streams", "roles"], - "properties": { - "permission_streams": { - "$ref": "perms#/definitions/view" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/streams-list.json b/src/backend/lib/access/streams-list.json deleted file mode 100644 index 3443aa85d..000000000 --- a/src/backend/lib/access/streams-list.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_streams", "roles"], - "properties": { - "permission_streams": { - "$ref": "perms#/definitions/view" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/streams-update.json b/src/backend/lib/access/streams-update.json deleted file mode 100644 index 6a745ec44..000000000 --- a/src/backend/lib/access/streams-update.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["permission_streams", "roles"], - "properties": { - "permission_streams": { - "$ref": "perms#/definitions/manage" - }, - "roles": { - "type": "array", - "items": { - "type": "string", - "enum": ["user"] - } - } - } - } - ] -} diff --git a/src/backend/lib/access/users-create.json b/src/backend/lib/access/users-create.json deleted file mode 100644 index d2709fd83..000000000 --- a/src/backend/lib/access/users-create.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - } - ] -} diff --git a/src/backend/lib/access/users-delete.json b/src/backend/lib/access/users-delete.json deleted file mode 100644 index d2709fd83..000000000 --- a/src/backend/lib/access/users-delete.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - } - ] -} diff --git a/src/backend/lib/access/users-get.json b/src/backend/lib/access/users-get.json deleted file mode 100644 index 04b4e9e9c..000000000 --- a/src/backend/lib/access/users-get.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["data", "scope"], - "properties": { - "data": { - "$ref": "objects#/properties/users" - }, - "scope": { - "type": "array", - "contains": { - "type": "string", - "pattern": "^user$" - } - } - } - } - ] -} diff --git a/src/backend/lib/access/users-list.json b/src/backend/lib/access/users-list.json deleted file mode 100644 index d2709fd83..000000000 --- a/src/backend/lib/access/users-list.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - } - ] -} diff --git a/src/backend/lib/access/users-loginas.json b/src/backend/lib/access/users-loginas.json deleted file mode 100644 index d2709fd83..000000000 --- a/src/backend/lib/access/users-loginas.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - } - ] -} diff --git a/src/backend/lib/access/users-password.json b/src/backend/lib/access/users-password.json deleted file mode 100644 index 04b4e9e9c..000000000 --- a/src/backend/lib/access/users-password.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": ["data", "scope"], - "properties": { - "data": { - "$ref": "objects#/properties/users" - }, - "scope": { - "type": "array", - "contains": { - "type": "string", - "pattern": "^user$" - } - } - } - } - ] -} diff --git a/src/backend/lib/access/users-permissions.json b/src/backend/lib/access/users-permissions.json deleted file mode 100644 index d2709fd83..000000000 --- a/src/backend/lib/access/users-permissions.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - } - ] -} diff --git a/src/backend/lib/access/users-update.json b/src/backend/lib/access/users-update.json deleted file mode 100644 index a638780b3..000000000 --- a/src/backend/lib/access/users-update.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "anyOf": [ - { - "$ref": "roles#/definitions/admin" - }, - { - "type": "object", - "required": [ - "data", - "scope" - ], - "properties": { - "data": { - "$ref": "objects#/properties/users" - }, - "scope": { - "type": "array", - "contains": { - "type": "string", - "pattern": "^user$" - } - } - } - } - ] -} diff --git a/src/backend/lib/error.js b/src/backend/lib/error.js deleted file mode 100644 index 7c0f8cca1..000000000 --- a/src/backend/lib/error.js +++ /dev/null @@ -1,90 +0,0 @@ -const _ = require('lodash'); -const util = require('util'); - -module.exports = { - - PermissionError: function (message, previous) { - Error.captureStackTrace(this, this.constructor); - this.name = this.constructor.name; - this.previous = previous; - this.message = 'Permission Denied'; - this.public = true; - this.status = 403; - }, - - ItemNotFoundError: function (id, previous) { - Error.captureStackTrace(this, this.constructor); - this.name = this.constructor.name; - this.previous = previous; - this.message = 'Item Not Found - ' + id; - this.public = true; - this.status = 404; - }, - - AuthError: function (message, previous) { - Error.captureStackTrace(this, this.constructor); - this.name = this.constructor.name; - this.previous = previous; - this.message = message; - this.public = true; - this.status = 401; - }, - - InternalError: function (message, previous) { - Error.captureStackTrace(this, this.constructor); - this.name = this.constructor.name; - this.previous = previous; - this.message = message; - this.status = 500; - this.public = false; - }, - - InternalValidationError: function (message, previous) { - Error.captureStackTrace(this, this.constructor); - this.name = this.constructor.name; - this.previous = previous; - this.message = message; - this.status = 400; - this.public = false; - }, - - ConfigurationError: function (message, previous) { - Error.captureStackTrace(this, this.constructor); - this.name = this.constructor.name; - this.previous = previous; - this.message = message; - this.status = 400; - this.public = true; - }, - - CacheError: function (message, previous) { - Error.captureStackTrace(this, this.constructor); - this.name = this.constructor.name; - this.message = message; - this.previous = previous; - this.status = 500; - this.public = false; - }, - - ValidationError: function (message, previous) { - Error.captureStackTrace(this, this.constructor); - this.name = this.constructor.name; - this.previous = previous; - this.message = message; - this.public = true; - this.status = 400; - }, - - AssertionFailedError: function (message, previous) { - Error.captureStackTrace(this, this.constructor); - this.name = this.constructor.name; - this.previous = previous; - this.message = message; - this.public = false; - this.status = 400; - } -}; - -_.forEach(module.exports, function (error) { - util.inherits(error, Error); -}); diff --git a/src/backend/lib/express/cors.js b/src/backend/lib/express/cors.js deleted file mode 100644 index 8e241acbe..000000000 --- a/src/backend/lib/express/cors.js +++ /dev/null @@ -1,30 +0,0 @@ -const validator = require('../validator'); - -module.exports = function (req, res, next) { - - if (req.headers.origin) { - - // very relaxed validation.... - validator({ - type: 'string', - pattern: '^[a-z\\-]+:\\/\\/(?:[\\w\\-\\.]+(:[0-9]+)?/?)?$' - }, req.headers.origin) - .then(function () { - res.set({ - 'Access-Control-Allow-Origin': req.headers.origin, - 'Access-Control-Allow-Credentials': true, - 'Access-Control-Allow-Methods': 'OPTIONS, GET, POST', - 'Access-Control-Allow-Headers': 'Content-Type, Cache-Control, Pragma, Expires, Authorization, X-Dataset-Total, X-Dataset-Offset, X-Dataset-Limit', - 'Access-Control-Max-Age': 5 * 60, - 'Access-Control-Expose-Headers': 'X-Dataset-Total, X-Dataset-Offset, X-Dataset-Limit' - }); - next(); - }) - .catch(next); - - } else { - // No origin - next(); - } - -}; diff --git a/src/backend/lib/express/jwt-decode.js b/src/backend/lib/express/jwt-decode.js deleted file mode 100644 index d6c2b934f..000000000 --- a/src/backend/lib/express/jwt-decode.js +++ /dev/null @@ -1,15 +0,0 @@ -const Access = require('../access'); - -module.exports = () => { - return function (req, res, next) { - res.locals.access = null; - let access = new Access(res.locals.token || null); - access.load() - .then(() => { - res.locals.access = access; - next(); - }) - .catch(next); - }; -}; - diff --git a/src/backend/lib/express/jwt.js b/src/backend/lib/express/jwt.js deleted file mode 100644 index 66dba859e..000000000 --- a/src/backend/lib/express/jwt.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = function () { - return function (req, res, next) { - if (req.headers.authorization) { - let parts = req.headers.authorization.split(' '); - - if (parts && parts[0] === 'Bearer' && parts[1]) { - res.locals.token = parts[1]; - } - } - - next(); - }; -}; diff --git a/src/backend/lib/express/pagination.js b/src/backend/lib/express/pagination.js deleted file mode 100644 index 70404f64b..000000000 --- a/src/backend/lib/express/pagination.js +++ /dev/null @@ -1,55 +0,0 @@ -let _ = require('lodash'); - -module.exports = function (default_sort, default_offset, default_limit, max_limit) { - - /** - * This will setup the req query params with filtered data and defaults - * - * sort will be an array of fields and their direction - * offset will be an int, defaulting to zero if no other default supplied - * limit will be an int, defaulting to 50 if no other default supplied, and limited to the max if that was supplied - * - */ - - return function (req, res, next) { - - req.query.offset = typeof req.query.limit === 'undefined' ? default_offset || 0 : parseInt(req.query.offset, 10); - req.query.limit = typeof req.query.limit === 'undefined' ? default_limit || 50 : parseInt(req.query.limit, 10); - - if (max_limit && req.query.limit > max_limit) { - req.query.limit = max_limit; - } - - // Sorting - let sort = typeof req.query.sort === 'undefined' ? default_sort : req.query.sort; - let myRegexp = /.*\.(asc|desc)$/ig; - let sort_array = []; - - sort = sort.split(','); - _.map(sort, function (val) { - let matches = myRegexp.exec(val); - - if (matches !== null) { - let dir = matches[1]; - sort_array.push({ - field: val.substr(0, val.length - (dir.length + 1)), - dir: dir.toLowerCase() - }); - } else { - sort_array.push({ - field: val, - dir: 'asc' - }); - } - }); - - // Sort will now be in this format: - // [ - // { field: 'field1', dir: 'asc' }, - // { field: 'field2', dir: 'desc' } - // ] - - req.query.sort = sort_array; - next(); - }; -}; diff --git a/src/backend/lib/express/user-id-from-me.js b/src/backend/lib/express/user-id-from-me.js deleted file mode 100644 index ca18952e7..000000000 --- a/src/backend/lib/express/user-id-from-me.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = (req, res, next) => { - if (req.params.user_id === 'me' && res.locals.access) { - req.params.user_id = res.locals.access.token.get('attrs').id; - } else { - req.params.user_id = parseInt(req.params.user_id, 10); - } - - next(); -}; diff --git a/src/backend/lib/helpers.js b/src/backend/lib/helpers.js deleted file mode 100644 index 7f1aaac3d..000000000 --- a/src/backend/lib/helpers.js +++ /dev/null @@ -1,32 +0,0 @@ -const moment = require('moment'); - -module.exports = { - - /** - * Takes an expression such as 30d and returns a moment object of that date in future - * - * Key Shorthand - * ================== - * years y - * quarters Q - * months M - * weeks w - * days d - * hours h - * minutes m - * seconds s - * milliseconds ms - * - * @param {String} expression - * @returns {Object} - */ - parseDatePeriod: function (expression) { - let matches = expression.match(/^([0-9]+)(y|Q|M|w|d|h|m|s|ms)$/m); - if (matches) { - return moment().add(matches[1], matches[2]); - } - - return null; - } - -}; diff --git a/src/backend/lib/migrate_template.js b/src/backend/lib/migrate_template.js deleted file mode 100644 index 03c3d1328..000000000 --- a/src/backend/lib/migrate_template.js +++ /dev/null @@ -1,55 +0,0 @@ -const migrate_name = 'identifier_for_migrate'; -const logger = require('../logger').migrate; - -/** - * Migrate - * - * @see http://knexjs.org/#Schema - * - * @param {Object} knex - * @param {Promise} Promise - * @returns {Promise} - */ -exports.up = function (knex, Promise) { - - logger.info('[' + migrate_name + '] Migrating Up...'); - - // Create Table example: - - /*return knex.schema.createTable('notification', (table) => { - table.increments().primary(); - table.string('name').notNull(); - table.string('type').notNull(); - table.integer('created_on').notNull(); - table.integer('modified_on').notNull(); - }) - .then(function () { - logger.info('[' + migrate_name + '] Notification Table created'); - });*/ - - logger.info('[' + migrate_name + '] Migrating Up Complete'); - - return Promise.resolve(true); -}; - -/** - * Undo Migrate - * - * @param {Object} knex - * @param {Promise} Promise - * @returns {Promise} - */ -exports.down = function (knex, Promise) { - logger.info('[' + migrate_name + '] Migrating Down...'); - - // Drop table example: - - /*return knex.schema.dropTable('notification') - .then(() => { - logger.info('[' + migrate_name + '] Notification Table dropped'); - });*/ - - logger.info('[' + migrate_name + '] Migrating Down Complete'); - - return Promise.resolve(true); -}; diff --git a/src/backend/lib/utils.js b/src/backend/lib/utils.js deleted file mode 100644 index 910779eab..000000000 --- a/src/backend/lib/utils.js +++ /dev/null @@ -1,20 +0,0 @@ -const exec = require('child_process').exec; - -module.exports = { - - /** - * @param {String} cmd - * @returns {Promise} - */ - exec: function (cmd) { - return new Promise((resolve, reject) => { - exec(cmd, function (err, stdout, stderr) { - if (err && typeof err === 'object') { - reject(err); - } else { - resolve(stdout.trim()); - } - }); - }); - } -}; diff --git a/src/backend/lib/validator/api.js b/src/backend/lib/validator/api.js deleted file mode 100644 index fbf8c97d8..000000000 --- a/src/backend/lib/validator/api.js +++ /dev/null @@ -1,45 +0,0 @@ -const error = require('../error'); -const path = require('path'); -const parser = require('json-schema-ref-parser'); - -const ajv = require('ajv')({ - verbose: true, - validateSchema: true, - allErrors: false, - format: 'full', - coerceTypes: true -}); - -/** - * @param {Object} schema - * @param {Object} payload - * @returns {Promise} - */ -function apiValidator (schema, payload/*, description*/) { - return new Promise(function Promise_apiValidator (resolve, reject) { - if (typeof payload === 'undefined') { - reject(new error.ValidationError('Payload is undefined')); - } - - let validate = ajv.compile(schema); - let valid = validate(payload); - - if (valid && !validate.errors) { - resolve(payload); - } else { - let message = ajv.errorsText(validate.errors); - let err = new error.ValidationError(message); - err.debug = [validate.errors, payload]; - reject(err); - } - }); -} - -apiValidator.loadSchemas = parser - .dereference(path.resolve('src/backend/schema/index.json')) - .then(schema => { - ajv.addSchema(schema); - return schema; - }); - -module.exports = apiValidator; diff --git a/src/backend/lib/validator/index.js b/src/backend/lib/validator/index.js deleted file mode 100644 index 44cac50ce..000000000 --- a/src/backend/lib/validator/index.js +++ /dev/null @@ -1,49 +0,0 @@ -const _ = require('lodash'); -const error = require('../error'); -const definitions = require('../../schema/definitions.json'); - -RegExp.prototype.toJSON = RegExp.prototype.toString; - -const ajv = require('ajv')({ - verbose: true, //process.env.NODE_ENV === 'development', - allErrors: true, - format: 'full', // strict regexes for format checks - coerceTypes: true, - schemas: [ - definitions - ] -}); - -/** - * - * @param {Object} schema - * @param {Object} payload - * @returns {Promise} - */ -function validator (schema, payload) { - return new Promise(function (resolve, reject) { - if (!payload) { - reject(new error.InternalValidationError('Payload is falsy')); - } else { - try { - let validate = ajv.compile(schema); - - let valid = validate(payload); - if (valid && !validate.errors) { - resolve(_.cloneDeep(payload)); - } else { - let message = ajv.errorsText(validate.errors); - reject(new error.InternalValidationError(message)); - } - - } catch (err) { - reject(err); - } - - } - - }); - -} - -module.exports = validator; diff --git a/src/backend/logger.js b/src/backend/logger.js deleted file mode 100644 index b8f00f718..000000000 --- a/src/backend/logger.js +++ /dev/null @@ -1,13 +0,0 @@ -const {Signale} = require('signale'); - -module.exports = { - global: new Signale({scope: 'Global '}), - migrate: new Signale({scope: 'Migrate '}), - express: new Signale({scope: 'Express '}), - access: new Signale({scope: 'Access '}), - nginx: new Signale({scope: 'Nginx '}), - ssl: new Signale({scope: 'SSL '}), - import: new Signale({scope: 'Importer '}), - setup: new Signale({scope: 'Setup '}), - ip_ranges: new Signale({scope: 'IP Ranges'}) -}; diff --git a/src/backend/migrate.js b/src/backend/migrate.js deleted file mode 100644 index 2240cf499..000000000 --- a/src/backend/migrate.js +++ /dev/null @@ -1,15 +0,0 @@ -const db = require('./db'); -const logger = require('./logger').migrate; - -module.exports = { - latest: function () { - return db.migrate.currentVersion() - .then(version => { - logger.info('Current database version:', version); - return db.migrate.latest({ - tableName: 'migrations', - directory: 'src/backend/migrations' - }); - }); - } -}; diff --git a/src/backend/migrations/20180618015850_initial.js b/src/backend/migrations/20180618015850_initial.js deleted file mode 100644 index 999a29e11..000000000 --- a/src/backend/migrations/20180618015850_initial.js +++ /dev/null @@ -1,205 +0,0 @@ -const migrate_name = 'initial-schema'; -const logger = require('../logger').migrate; - -/** - * Migrate - * - * @see http://knexjs.org/#Schema - * - * @param {Object} knex - * @param {Promise} Promise - * @returns {Promise} - */ -exports.up = function (knex/*, Promise*/) { - logger.info('[' + migrate_name + '] Migrating Up...'); - - return knex.schema.createTable('auth', table => { - table.increments().primary(); - table.dateTime('created_on').notNull(); - table.dateTime('modified_on').notNull(); - table.integer('user_id').notNull().unsigned(); - table.string('type', 30).notNull(); - table.string('secret').notNull(); - table.json('meta').notNull(); - table.integer('is_deleted').notNull().unsigned().defaultTo(0); - }) - .then(() => { - logger.info('[' + migrate_name + '] auth Table created'); - - return knex.schema.createTable('user', table => { - table.increments().primary(); - table.dateTime('created_on').notNull(); - table.dateTime('modified_on').notNull(); - table.integer('is_deleted').notNull().unsigned().defaultTo(0); - table.integer('is_disabled').notNull().unsigned().defaultTo(0); - table.string('email').notNull(); - table.string('name').notNull(); - table.string('nickname').notNull(); - table.string('avatar').notNull(); - table.json('roles').notNull(); - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] user Table created'); - - return knex.schema.createTable('user_permission', table => { - table.increments().primary(); - table.dateTime('created_on').notNull(); - table.dateTime('modified_on').notNull(); - table.integer('user_id').notNull().unsigned(); - table.string('visibility').notNull(); - table.string('proxy_hosts').notNull(); - table.string('redirection_hosts').notNull(); - table.string('dead_hosts').notNull(); - table.string('streams').notNull(); - table.string('access_lists').notNull(); - table.string('certificates').notNull(); - table.unique('user_id'); - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] user_permission Table created'); - - return knex.schema.createTable('proxy_host', table => { - table.increments().primary(); - table.dateTime('created_on').notNull(); - table.dateTime('modified_on').notNull(); - table.integer('owner_user_id').notNull().unsigned(); - table.integer('is_deleted').notNull().unsigned().defaultTo(0); - table.json('domain_names').notNull(); - table.string('forward_ip').notNull(); - table.integer('forward_port').notNull().unsigned(); - table.integer('access_list_id').notNull().unsigned().defaultTo(0); - table.integer('certificate_id').notNull().unsigned().defaultTo(0); - table.integer('ssl_forced').notNull().unsigned().defaultTo(0); - table.integer('caching_enabled').notNull().unsigned().defaultTo(0); - table.integer('block_exploits').notNull().unsigned().defaultTo(0); - table.text('advanced_config').notNull().defaultTo(''); - table.json('meta').notNull(); - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] proxy_host Table created'); - - return knex.schema.createTable('redirection_host', table => { - table.increments().primary(); - table.dateTime('created_on').notNull(); - table.dateTime('modified_on').notNull(); - table.integer('owner_user_id').notNull().unsigned(); - table.integer('is_deleted').notNull().unsigned().defaultTo(0); - table.json('domain_names').notNull(); - table.string('forward_domain_name').notNull(); - table.integer('preserve_path').notNull().unsigned().defaultTo(0); - table.integer('certificate_id').notNull().unsigned().defaultTo(0); - table.integer('ssl_forced').notNull().unsigned().defaultTo(0); - table.integer('block_exploits').notNull().unsigned().defaultTo(0); - table.text('advanced_config').notNull().defaultTo(''); - table.json('meta').notNull(); - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] redirection_host Table created'); - - return knex.schema.createTable('dead_host', table => { - table.increments().primary(); - table.dateTime('created_on').notNull(); - table.dateTime('modified_on').notNull(); - table.integer('owner_user_id').notNull().unsigned(); - table.integer('is_deleted').notNull().unsigned().defaultTo(0); - table.json('domain_names').notNull(); - table.integer('certificate_id').notNull().unsigned().defaultTo(0); - table.integer('ssl_forced').notNull().unsigned().defaultTo(0); - table.text('advanced_config').notNull().defaultTo(''); - table.json('meta').notNull(); - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] dead_host Table created'); - - return knex.schema.createTable('stream', table => { - table.increments().primary(); - table.dateTime('created_on').notNull(); - table.dateTime('modified_on').notNull(); - table.integer('owner_user_id').notNull().unsigned(); - table.integer('is_deleted').notNull().unsigned().defaultTo(0); - table.integer('incoming_port').notNull().unsigned(); - table.string('forward_ip').notNull(); - table.integer('forwarding_port').notNull().unsigned(); - table.integer('tcp_forwarding').notNull().unsigned().defaultTo(0); - table.integer('udp_forwarding').notNull().unsigned().defaultTo(0); - table.json('meta').notNull(); - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] stream Table created'); - - return knex.schema.createTable('access_list', table => { - table.increments().primary(); - table.dateTime('created_on').notNull(); - table.dateTime('modified_on').notNull(); - table.integer('owner_user_id').notNull().unsigned(); - table.integer('is_deleted').notNull().unsigned().defaultTo(0); - table.string('name').notNull(); - table.json('meta').notNull(); - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] access_list Table created'); - - return knex.schema.createTable('certificate', table => { - table.increments().primary(); - table.dateTime('created_on').notNull(); - table.dateTime('modified_on').notNull(); - table.integer('owner_user_id').notNull().unsigned(); - table.integer('is_deleted').notNull().unsigned().defaultTo(0); - table.string('provider').notNull(); - table.string('nice_name').notNull().defaultTo(''); - table.json('domain_names').notNull(); - table.dateTime('expires_on').notNull(); - table.json('meta').notNull(); - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] certificate Table created'); - - return knex.schema.createTable('access_list_auth', table => { - table.increments().primary(); - table.dateTime('created_on').notNull(); - table.dateTime('modified_on').notNull(); - table.integer('access_list_id').notNull().unsigned(); - table.string('username').notNull(); - table.string('password').notNull(); - table.json('meta').notNull(); - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] access_list_auth Table created'); - - return knex.schema.createTable('audit_log', table => { - table.increments().primary(); - table.dateTime('created_on').notNull(); - table.dateTime('modified_on').notNull(); - table.integer('user_id').notNull().unsigned(); - table.string('object_type').notNull().defaultTo(''); - table.integer('object_id').notNull().unsigned().defaultTo(0); - table.string('action').notNull(); - table.json('meta').notNull(); - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] audit_log Table created'); - }); - -}; - -/** - * Undo Migrate - * - * @param {Object} knex - * @param {Promise} Promise - * @returns {Promise} - */ -exports.down = function (knex, Promise) { - logger.warn('[' + migrate_name + '] You can\'t migrate down the initial data.'); - return Promise.resolve(true); -}; diff --git a/src/backend/migrations/20180929054513_websockets.js b/src/backend/migrations/20180929054513_websockets.js deleted file mode 100644 index 22bafce11..000000000 --- a/src/backend/migrations/20180929054513_websockets.js +++ /dev/null @@ -1,35 +0,0 @@ -const migrate_name = 'websockets'; -const logger = require('../logger').migrate; - -/** - * Migrate - * - * @see http://knexjs.org/#Schema - * - * @param {Object} knex - * @param {Promise} Promise - * @returns {Promise} - */ -exports.up = function (knex/*, Promise*/) { - logger.info('[' + migrate_name + '] Migrating Up...'); - - return knex.schema.table('proxy_host', function (proxy_host) { - proxy_host.integer('allow_websocket_upgrade').notNull().unsigned().defaultTo(0); - }) - .then(() => { - logger.info('[' + migrate_name + '] proxy_host Table altered'); - }); - -}; - -/** - * Undo Migrate - * - * @param {Object} knex - * @param {Promise} Promise - * @returns {Promise} - */ -exports.down = function (knex, Promise) { - logger.warn('[' + migrate_name + '] You can\'t migrate down this one.'); - return Promise.resolve(true); -}; \ No newline at end of file diff --git a/src/backend/migrations/20181113041458_http2_support.js b/src/backend/migrations/20181113041458_http2_support.js deleted file mode 100644 index 16d916255..000000000 --- a/src/backend/migrations/20181113041458_http2_support.js +++ /dev/null @@ -1,49 +0,0 @@ -const migrate_name = 'http2_support'; -const logger = require('../logger').migrate; - -/** - * Migrate - * - * @see http://knexjs.org/#Schema - * - * @param {Object} knex - * @param {Promise} Promise - * @returns {Promise} - */ -exports.up = function (knex/*, Promise*/) { - logger.info('[' + migrate_name + '] Migrating Up...'); - - return knex.schema.table('proxy_host', function (proxy_host) { - proxy_host.integer('http2_support').notNull().unsigned().defaultTo(0); - }) - .then(() => { - logger.info('[' + migrate_name + '] proxy_host Table altered'); - - return knex.schema.table('redirection_host', function (redirection_host) { - redirection_host.integer('http2_support').notNull().unsigned().defaultTo(0); - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] redirection_host Table altered'); - - return knex.schema.table('dead_host', function (dead_host) { - dead_host.integer('http2_support').notNull().unsigned().defaultTo(0); - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] dead_host Table altered'); - }); -}; - -/** - * Undo Migrate - * - * @param {Object} knex - * @param {Promise} Promise - * @returns {Promise} - */ -exports.down = function (knex, Promise) { - logger.warn('[' + migrate_name + '] You can\'t migrate down this one.'); - return Promise.resolve(true); -}; - diff --git a/src/backend/migrations/20190104035154_disabled.js b/src/backend/migrations/20190104035154_disabled.js deleted file mode 100644 index 767112b24..000000000 --- a/src/backend/migrations/20190104035154_disabled.js +++ /dev/null @@ -1,55 +0,0 @@ -const migrate_name = 'disabled'; -const logger = require('../logger').migrate; - -/** - * Migrate - * - * @see http://knexjs.org/#Schema - * - * @param {Object} knex - * @param {Promise} Promise - * @returns {Promise} - */ -exports.up = function (knex/*, Promise*/) { - logger.info('[' + migrate_name + '] Migrating Up...'); - - return knex.schema.table('proxy_host', function (proxy_host) { - proxy_host.integer('enabled').notNull().unsigned().defaultTo(1); - }) - .then(() => { - logger.info('[' + migrate_name + '] proxy_host Table altered'); - - return knex.schema.table('redirection_host', function (redirection_host) { - redirection_host.integer('enabled').notNull().unsigned().defaultTo(1); - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] redirection_host Table altered'); - - return knex.schema.table('dead_host', function (dead_host) { - dead_host.integer('enabled').notNull().unsigned().defaultTo(1); - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] dead_host Table altered'); - - return knex.schema.table('stream', function (stream) { - stream.integer('enabled').notNull().unsigned().defaultTo(1); - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] stream Table altered'); - }); -}; - -/** - * Undo Migrate - * - * @param {Object} knex - * @param {Promise} Promise - * @returns {Promise} - */ -exports.down = function (knex, Promise) { - logger.warn('[' + migrate_name + '] You can\'t migrate down this one.'); - return Promise.resolve(true); -}; diff --git a/src/backend/migrations/20190218060101_hsts.js b/src/backend/migrations/20190218060101_hsts.js deleted file mode 100644 index 50812a30d..000000000 --- a/src/backend/migrations/20190218060101_hsts.js +++ /dev/null @@ -1,51 +0,0 @@ -const migrate_name = 'hsts'; -const logger = require('../logger').migrate; - -/** - * Migrate - * - * @see http://knexjs.org/#Schema - * - * @param {Object} knex - * @param {Promise} Promise - * @returns {Promise} - */ -exports.up = function (knex/*, Promise*/) { - logger.info('[' + migrate_name + '] Migrating Up...'); - - return knex.schema.table('proxy_host', function (proxy_host) { - proxy_host.integer('hsts_enabled').notNull().unsigned().defaultTo(0); - proxy_host.integer('hsts_subdomains').notNull().unsigned().defaultTo(0); - }) - .then(() => { - logger.info('[' + migrate_name + '] proxy_host Table altered'); - - return knex.schema.table('redirection_host', function (redirection_host) { - redirection_host.integer('hsts_enabled').notNull().unsigned().defaultTo(0); - redirection_host.integer('hsts_subdomains').notNull().unsigned().defaultTo(0); - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] redirection_host Table altered'); - - return knex.schema.table('dead_host', function (dead_host) { - dead_host.integer('hsts_enabled').notNull().unsigned().defaultTo(0); - dead_host.integer('hsts_subdomains').notNull().unsigned().defaultTo(0); - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] dead_host Table altered'); - }); -}; - -/** - * Undo Migrate - * - * @param {Object} knex - * @param {Promise} Promise - * @returns {Promise} - */ -exports.down = function (knex, Promise) { - logger.warn('[' + migrate_name + '] You can\'t migrate down this one.'); - return Promise.resolve(true); -}; diff --git a/src/backend/migrations/20190227065017_settings.js b/src/backend/migrations/20190227065017_settings.js deleted file mode 100644 index 6ba3653f9..000000000 --- a/src/backend/migrations/20190227065017_settings.js +++ /dev/null @@ -1,54 +0,0 @@ -const migrate_name = 'settings'; -const logger = require('../logger').migrate; - -/** - * Migrate - * - * @see http://knexjs.org/#Schema - * - * @param {Object} knex - * @param {Promise} Promise - * @returns {Promise} - */ -exports.up = function (knex/*, Promise*/) { - logger.info('[' + migrate_name + '] Migrating Up...'); - - return knex.schema.createTable('setting', table => { - table.string('id').notNull().primary(); - table.string('name', 100).notNull(); - table.string('description', 255).notNull(); - table.string('value', 255).notNull(); - table.json('meta').notNull(); - }) - .then(() => { - logger.info('[' + migrate_name + '] setting Table created'); - - // TODO: add settings - let settingModel = require('../models/setting'); - - return settingModel - .query() - .insert({ - id: 'default-site', - name: 'Default Site', - description: 'What to show when Nginx is hit with an unknown Host', - value: 'congratulations', - meta: {} - }); - }) - .then(() => { - logger.info('[' + migrate_name + '] Default settings added'); - }); -}; - -/** - * Undo Migrate - * - * @param {Object} knex - * @param {Promise} Promise - * @returns {Promise} - */ -exports.down = function (knex, Promise) { - logger.warn('[' + migrate_name + '] You can\'t migrate down the initial data.'); - return Promise.resolve(true); -}; diff --git a/src/backend/models/access_list.js b/src/backend/models/access_list.js deleted file mode 100644 index 1c7cb51ef..000000000 --- a/src/backend/models/access_list.js +++ /dev/null @@ -1,81 +0,0 @@ -// Objection Docs: -// http://vincit.github.io/objection.js/ - -const db = require('../db'); -const Model = require('objection').Model; -const User = require('./user'); -const AccessListAuth = require('./access_list_auth'); - -Model.knex(db); - -class AccessList extends Model { - $beforeInsert () { - this.created_on = Model.raw('NOW()'); - this.modified_on = Model.raw('NOW()'); - - // Default for meta - if (typeof this.meta === 'undefined') { - this.meta = {}; - } - } - - $beforeUpdate () { - this.modified_on = Model.raw('NOW()'); - } - - static get name () { - return 'AccessList'; - } - - static get tableName () { - return 'access_list'; - } - - static get jsonAttributes () { - return ['meta']; - } - - static get relationMappings () { - const ProxyHost = require('./proxy_host'); - - return { - owner: { - relation: Model.HasOneRelation, - modelClass: User, - join: { - from: 'access_list.owner_user_id', - to: 'user.id' - }, - modify: function (qb) { - qb.where('user.is_deleted', 0); - qb.omit(['id', 'created_on', 'modified_on', 'is_deleted', 'email', 'roles']); - } - }, - items: { - relation: Model.HasManyRelation, - modelClass: AccessListAuth, - join: { - from: 'access_list.id', - to: 'access_list_auth.access_list_id' - }, - modify: function (qb) { - qb.omit(['id', 'created_on', 'modified_on', 'access_list_id', 'meta']); - } - }, - proxy_hosts: { - relation: Model.HasManyRelation, - modelClass: ProxyHost, - join: { - from: 'access_list.id', - to: 'proxy_host.access_list_id' - }, - modify: function (qb) { - qb.where('proxy_host.is_deleted', 0); - qb.omit(['is_deleted', 'meta']); - } - } - }; - } -} - -module.exports = AccessList; diff --git a/src/backend/models/access_list_auth.js b/src/backend/models/access_list_auth.js deleted file mode 100644 index e4ebd204f..000000000 --- a/src/backend/models/access_list_auth.js +++ /dev/null @@ -1,54 +0,0 @@ -// Objection Docs: -// http://vincit.github.io/objection.js/ - -const db = require('../db'); -const Model = require('objection').Model; - -Model.knex(db); - -class AccessListAuth extends Model { - $beforeInsert () { - this.created_on = Model.raw('NOW()'); - this.modified_on = Model.raw('NOW()'); - - // Default for meta - if (typeof this.meta === 'undefined') { - this.meta = {}; - } - } - - $beforeUpdate () { - this.modified_on = Model.raw('NOW()'); - } - - static get name () { - return 'AccessListAuth'; - } - - static get tableName () { - return 'access_list_auth'; - } - - static get jsonAttributes () { - return ['meta']; - } - - static get relationMappings () { - return { - access_list: { - relation: Model.HasOneRelation, - modelClass: require('./access_list'), - join: { - from: 'access_list_auth.access_list_id', - to: 'access_list.id' - }, - modify: function (qb) { - qb.where('access_list.is_deleted', 0); - qb.omit(['created_on', 'modified_on', 'is_deleted', 'access_list_id']); - } - } - }; - } -} - -module.exports = AccessListAuth; diff --git a/src/backend/models/audit-log.js b/src/backend/models/audit-log.js deleted file mode 100644 index 31da17486..000000000 --- a/src/backend/models/audit-log.js +++ /dev/null @@ -1,54 +0,0 @@ -// Objection Docs: -// http://vincit.github.io/objection.js/ - -const db = require('../db'); -const Model = require('objection').Model; -const User = require('./user'); - -Model.knex(db); - -class AuditLog extends Model { - $beforeInsert () { - this.created_on = Model.raw('NOW()'); - this.modified_on = Model.raw('NOW()'); - - // Default for meta - if (typeof this.meta === 'undefined') { - this.meta = {}; - } - } - - $beforeUpdate () { - this.modified_on = Model.raw('NOW()'); - } - - static get name () { - return 'AuditLog'; - } - - static get tableName () { - return 'audit_log'; - } - - static get jsonAttributes () { - return ['meta']; - } - - static get relationMappings () { - return { - user: { - relation: Model.HasOneRelation, - modelClass: User, - join: { - from: 'audit_log.user_id', - to: 'user.id' - }, - modify: function (qb) { - qb.omit(['id', 'created_on', 'modified_on', 'roles']); - } - } - }; - } -} - -module.exports = AuditLog; diff --git a/src/backend/models/auth.js b/src/backend/models/auth.js deleted file mode 100644 index b793a6fd1..000000000 --- a/src/backend/models/auth.js +++ /dev/null @@ -1,85 +0,0 @@ -// Objection Docs: -// http://vincit.github.io/objection.js/ - -const bcrypt = require('bcrypt'); -const db = require('../db'); -const Model = require('objection').Model; -const User = require('./user'); - -Model.knex(db); - -function encryptPassword () { - /* jshint -W040 */ - let _this = this; - - if (_this.type === 'password' && _this.secret) { - return bcrypt.hash(_this.secret, 13) - .then(function (hash) { - _this.secret = hash; - }); - } - - return null; -} - -class Auth extends Model { - $beforeInsert (queryContext) { - this.created_on = Model.raw('NOW()'); - this.modified_on = Model.raw('NOW()'); - - // Default for meta - if (typeof this.meta === 'undefined') { - this.meta = {}; - } - - return encryptPassword.apply(this, queryContext); - } - - $beforeUpdate (queryContext) { - this.modified_on = Model.raw('NOW()'); - return encryptPassword.apply(this, queryContext); - } - - /** - * Verify a plain password against the encrypted password - * - * @param {String} password - * @returns {Promise} - */ - verifyPassword (password) { - return bcrypt.compare(password, this.secret); - } - - static get name () { - return 'Auth'; - } - - static get tableName () { - return 'auth'; - } - - static get jsonAttributes () { - return ['meta']; - } - - static get relationMappings () { - return { - user: { - relation: Model.HasOneRelation, - modelClass: User, - join: { - from: 'auth.user_id', - to: 'user.id' - }, - filter: { - is_deleted: 0 - }, - modify: function (qb) { - qb.omit(['is_deleted']); - } - } - }; - } -} - -module.exports = Auth; diff --git a/src/backend/models/certificate.js b/src/backend/models/certificate.js deleted file mode 100644 index 8d0167557..000000000 --- a/src/backend/models/certificate.js +++ /dev/null @@ -1,72 +0,0 @@ -// Objection Docs: -// http://vincit.github.io/objection.js/ - -const db = require('../db'); -const Model = require('objection').Model; -const User = require('./user'); - -Model.knex(db); - -class Certificate extends Model { - $beforeInsert () { - this.created_on = Model.raw('NOW()'); - this.modified_on = Model.raw('NOW()'); - - // Default for expires_on - if (typeof this.expires_on === 'undefined') { - this.expires_on = Model.raw('NOW()'); - } - - // Default for domain_names - if (typeof this.domain_names === 'undefined') { - this.domain_names = []; - } - - // Default for meta - if (typeof this.meta === 'undefined') { - this.meta = {}; - } - - this.domain_names.sort(); - } - - $beforeUpdate () { - this.modified_on = Model.raw('NOW()'); - - // Sort domain_names - if (typeof this.domain_names !== 'undefined') { - this.domain_names.sort(); - } - } - - static get name () { - return 'Certificate'; - } - - static get tableName () { - return 'certificate'; - } - - static get jsonAttributes () { - return ['domain_names', 'meta']; - } - - static get relationMappings () { - return { - owner: { - relation: Model.HasOneRelation, - modelClass: User, - join: { - from: 'certificate.owner_user_id', - to: 'user.id' - }, - modify: function (qb) { - qb.where('user.is_deleted', 0); - qb.omit(['id', 'created_on', 'modified_on', 'is_deleted', 'email', 'roles']); - } - } - }; - } -} - -module.exports = Certificate; diff --git a/src/backend/models/dead_host.js b/src/backend/models/dead_host.js deleted file mode 100644 index d83571574..000000000 --- a/src/backend/models/dead_host.js +++ /dev/null @@ -1,80 +0,0 @@ -// Objection Docs: -// http://vincit.github.io/objection.js/ - -const db = require('../db'); -const Model = require('objection').Model; -const User = require('./user'); -const Certificate = require('./certificate'); - -Model.knex(db); - -class DeadHost extends Model { - $beforeInsert () { - this.created_on = Model.raw('NOW()'); - this.modified_on = Model.raw('NOW()'); - - // Default for domain_names - if (typeof this.domain_names === 'undefined') { - this.domain_names = []; - } - - // Default for meta - if (typeof this.meta === 'undefined') { - this.meta = {}; - } - - this.domain_names.sort(); - } - - $beforeUpdate () { - this.modified_on = Model.raw('NOW()'); - - // Sort domain_names - if (typeof this.domain_names !== 'undefined') { - this.domain_names.sort(); - } - } - - static get name () { - return 'DeadHost'; - } - - static get tableName () { - return 'dead_host'; - } - - static get jsonAttributes () { - return ['domain_names', 'meta']; - } - - static get relationMappings () { - return { - owner: { - relation: Model.HasOneRelation, - modelClass: User, - join: { - from: 'dead_host.owner_user_id', - to: 'user.id' - }, - modify: function (qb) { - qb.where('user.is_deleted', 0); - qb.omit(['id', 'created_on', 'modified_on', 'is_deleted', 'email', 'roles']); - } - }, - certificate: { - relation: Model.HasOneRelation, - modelClass: Certificate, - join: { - from: 'dead_host.certificate_id', - to: 'certificate.id' - }, - modify: function (qb) { - qb.where('certificate.is_deleted', 0); - qb.omit(['id', 'created_on', 'modified_on', 'is_deleted']); - } - } - }; - } -} - -module.exports = DeadHost; diff --git a/src/backend/models/proxy_host.js b/src/backend/models/proxy_host.js deleted file mode 100644 index 801796a19..000000000 --- a/src/backend/models/proxy_host.js +++ /dev/null @@ -1,93 +0,0 @@ -// Objection Docs: -// http://vincit.github.io/objection.js/ - -const db = require('../db'); -const Model = require('objection').Model; -const User = require('./user'); -const AccessList = require('./access_list'); -const Certificate = require('./certificate'); - -Model.knex(db); - -class ProxyHost extends Model { - $beforeInsert () { - this.created_on = Model.raw('NOW()'); - this.modified_on = Model.raw('NOW()'); - - // Default for domain_names - if (typeof this.domain_names === 'undefined') { - this.domain_names = []; - } - - // Default for meta - if (typeof this.meta === 'undefined') { - this.meta = {}; - } - - this.domain_names.sort(); - } - - $beforeUpdate () { - this.modified_on = Model.raw('NOW()'); - - // Sort domain_names - if (typeof this.domain_names !== 'undefined') { - this.domain_names.sort(); - } - } - - static get name () { - return 'ProxyHost'; - } - - static get tableName () { - return 'proxy_host'; - } - - static get jsonAttributes () { - return ['domain_names', 'meta', 'locations']; - } - - static get relationMappings () { - return { - owner: { - relation: Model.HasOneRelation, - modelClass: User, - join: { - from: 'proxy_host.owner_user_id', - to: 'user.id' - }, - modify: function (qb) { - qb.where('user.is_deleted', 0); - qb.omit(['id', 'created_on', 'modified_on', 'is_deleted', 'email', 'roles']); - } - }, - access_list: { - relation: Model.HasOneRelation, - modelClass: AccessList, - join: { - from: 'proxy_host.access_list_id', - to: 'access_list.id' - }, - modify: function (qb) { - qb.where('access_list.is_deleted', 0); - qb.omit(['id', 'created_on', 'modified_on', 'is_deleted']); - } - }, - certificate: { - relation: Model.HasOneRelation, - modelClass: Certificate, - join: { - from: 'proxy_host.certificate_id', - to: 'certificate.id' - }, - modify: function (qb) { - qb.where('certificate.is_deleted', 0); - qb.omit(['id', 'created_on', 'modified_on', 'is_deleted']); - } - } - }; - } -} - -module.exports = ProxyHost; diff --git a/src/backend/models/redirection_host.js b/src/backend/models/redirection_host.js deleted file mode 100644 index c7157f650..000000000 --- a/src/backend/models/redirection_host.js +++ /dev/null @@ -1,80 +0,0 @@ -// Objection Docs: -// http://vincit.github.io/objection.js/ - -const db = require('../db'); -const Model = require('objection').Model; -const User = require('./user'); -const Certificate = require('./certificate'); - -Model.knex(db); - -class RedirectionHost extends Model { - $beforeInsert () { - this.created_on = Model.raw('NOW()'); - this.modified_on = Model.raw('NOW()'); - - // Default for domain_names - if (typeof this.domain_names === 'undefined') { - this.domain_names = []; - } - - // Default for meta - if (typeof this.meta === 'undefined') { - this.meta = {}; - } - - this.domain_names.sort(); - } - - $beforeUpdate () { - this.modified_on = Model.raw('NOW()'); - - // Sort domain_names - if (typeof this.domain_names !== 'undefined') { - this.domain_names.sort(); - } - } - - static get name () { - return 'RedirectionHost'; - } - - static get tableName () { - return 'redirection_host'; - } - - static get jsonAttributes () { - return ['domain_names', 'meta']; - } - - static get relationMappings () { - return { - owner: { - relation: Model.HasOneRelation, - modelClass: User, - join: { - from: 'redirection_host.owner_user_id', - to: 'user.id' - }, - modify: function (qb) { - qb.where('user.is_deleted', 0); - qb.omit(['id', 'created_on', 'modified_on', 'is_deleted', 'email', 'roles']); - } - }, - certificate: { - relation: Model.HasOneRelation, - modelClass: Certificate, - join: { - from: 'redirection_host.certificate_id', - to: 'certificate.id' - }, - modify: function (qb) { - qb.where('certificate.is_deleted', 0); - qb.omit(['id', 'created_on', 'modified_on', 'is_deleted']); - } - } - }; - } -} - -module.exports = RedirectionHost; diff --git a/src/backend/models/setting.js b/src/backend/models/setting.js deleted file mode 100644 index 2c3e57ee0..000000000 --- a/src/backend/models/setting.js +++ /dev/null @@ -1,30 +0,0 @@ -// Objection Docs: -// http://vincit.github.io/objection.js/ - -const db = require('../db'); -const Model = require('objection').Model; - -Model.knex(db); - -class Setting extends Model { - $beforeInsert () { - // Default for meta - if (typeof this.meta === 'undefined') { - this.meta = {}; - } - } - - static get name () { - return 'Setting'; - } - - static get tableName () { - return 'setting'; - } - - static get jsonAttributes () { - return ['meta']; - } -} - -module.exports = Setting; diff --git a/src/backend/models/stream.js b/src/backend/models/stream.js deleted file mode 100644 index 5394f7256..000000000 --- a/src/backend/models/stream.js +++ /dev/null @@ -1,55 +0,0 @@ -// Objection Docs: -// http://vincit.github.io/objection.js/ - -const db = require('../db'); -const Model = require('objection').Model; -const User = require('./user'); - -Model.knex(db); - -class Stream extends Model { - $beforeInsert () { - this.created_on = Model.raw('NOW()'); - this.modified_on = Model.raw('NOW()'); - - // Default for meta - if (typeof this.meta === 'undefined') { - this.meta = {}; - } - } - - $beforeUpdate () { - this.modified_on = Model.raw('NOW()'); - } - - static get name () { - return 'Stream'; - } - - static get tableName () { - return 'stream'; - } - - static get jsonAttributes () { - return ['meta']; - } - - static get relationMappings () { - return { - owner: { - relation: Model.HasOneRelation, - modelClass: User, - join: { - from: 'stream.owner_user_id', - to: 'user.id' - }, - modify: function (qb) { - qb.where('user.is_deleted', 0); - qb.omit(['id', 'created_on', 'modified_on', 'is_deleted', 'email', 'roles']); - } - } - }; - } -} - -module.exports = Stream; diff --git a/src/backend/models/token.js b/src/backend/models/token.js deleted file mode 100644 index 8db5d72a4..000000000 --- a/src/backend/models/token.js +++ /dev/null @@ -1,146 +0,0 @@ -/** - NOTE: This is not a database table, this is a model of a Token object that can be created/loaded - and then has abilities after that. - */ - -const _ = require('lodash'); -const config = require('config'); -const jwt = require('jsonwebtoken'); -const crypto = require('crypto'); -const error = require('../lib/error'); -const ALGO = 'RS256'; - -module.exports = function () { - const public_key = config.get('jwt.pub'); - const private_key = config.get('jwt.key'); - - let token_data = {}; - - let self = { - /** - * @param {Object} payload - * @param {Object} [user_options] - * @param {Integer} [user_options.expires] - * @returns {Promise} - */ - create: (payload, user_options) => { - - user_options = user_options || {}; - - // sign with RSA SHA256 - let options = { - algorithm: ALGO - }; - - if (typeof user_options.expires !== 'undefined' && user_options.expires) { - options.expiresIn = user_options.expires; - } - - payload.jti = crypto.randomBytes(12) - .toString('base64') - .substr(-8); - - return new Promise((resolve, reject) => { - jwt.sign(payload, private_key, options, (err, token) => { - if (err) { - reject(err); - } else { - token_data = payload; - resolve({ - token: token, - payload: payload - }); - } - - }); - }); - - }, - - /** - * @param {String} token - * @returns {Promise} - */ - load: function (token) { - return new Promise((resolve, reject) => { - try { - if (!token || token === null || token === 'null') { - reject('Empty token'); - } else { - jwt.verify(token, public_key, {ignoreExpiration: false, algorithms: [ALGO]}, (err, result) => { - if (err) { - - if (err.name === 'TokenExpiredError') { - reject(new error.AuthError('Token has expired', err)); - } else { - reject(err); - } - - } else { - token_data = result; - - // Hack: some tokens out in the wild have a scope of 'all' instead of 'user'. - // For 30 days at least, we need to replace 'all' with user. - if ((typeof token_data.scope !== 'undefined' && _.indexOf(token_data.scope, 'all') !== -1)) { - //console.log('Warning! Replacing "all" scope with "user"'); - - token_data.scope = ['user']; - } - - resolve(token_data); - } - }); - } - } catch (err) { - reject(err); - } - }); - - }, - - /** - * Does the token have the specified scope? - * - * @param {String} scope - * @returns {Boolean} - */ - hasScope: function (scope) { - return typeof token_data.scope !== 'undefined' && _.indexOf(token_data.scope, scope) !== -1; - }, - - /** - * @param {String} key - * @return {*} - */ - get: function (key) { - if (typeof token_data[key] !== 'undefined') { - return token_data[key]; - } - - return null; - }, - - /** - * @param {String} key - * @param {*} value - */ - set: function (key, value) { - token_data[key] = value; - }, - - /** - * @param [default_value] - * @returns {Integer} - */ - getUserId: default_value => { - let attrs = self.get('attrs'); - if (attrs && typeof attrs.id !== 'undefined' && attrs.id) { - return attrs.id; - } - - return default_value || 0; - } - }; - - return self; -}; diff --git a/src/backend/models/user.js b/src/backend/models/user.js deleted file mode 100644 index 09df952b1..000000000 --- a/src/backend/models/user.js +++ /dev/null @@ -1,55 +0,0 @@ -// Objection Docs: -// http://vincit.github.io/objection.js/ - -const db = require('../db'); -const Model = require('objection').Model; -const UserPermission = require('./user_permission'); - -Model.knex(db); - -class User extends Model { - $beforeInsert () { - this.created_on = Model.raw('NOW()'); - this.modified_on = Model.raw('NOW()'); - - // Default for roles - if (typeof this.roles === 'undefined') { - this.roles = []; - } - } - - $beforeUpdate () { - this.modified_on = Model.raw('NOW()'); - } - - static get name () { - return 'User'; - } - - static get tableName () { - return 'user'; - } - - static get jsonAttributes () { - return ['roles']; - } - - static get relationMappings () { - return { - permissions: { - relation: Model.HasOneRelation, - modelClass: UserPermission, - join: { - from: 'user.id', - to: 'user_permission.user_id' - }, - modify: function (qb) { - qb.omit(['id', 'created_on', 'modified_on', 'user_id']); - } - } - }; - } - -} - -module.exports = User; diff --git a/src/backend/models/user_permission.js b/src/backend/models/user_permission.js deleted file mode 100644 index 5ffcfa046..000000000 --- a/src/backend/models/user_permission.js +++ /dev/null @@ -1,28 +0,0 @@ -// Objection Docs: -// http://vincit.github.io/objection.js/ - -const db = require('../db'); -const Model = require('objection').Model; - -Model.knex(db); - -class UserPermission extends Model { - $beforeInsert () { - this.created_on = Model.raw('NOW()'); - this.modified_on = Model.raw('NOW()'); - } - - $beforeUpdate () { - this.modified_on = Model.raw('NOW()'); - } - - static get name () { - return 'UserPermission'; - } - - static get tableName () { - return 'user_permission'; - } -} - -module.exports = UserPermission; diff --git a/src/backend/routes/api/audit-log.js b/src/backend/routes/api/audit-log.js deleted file mode 100644 index ac60537d0..000000000 --- a/src/backend/routes/api/audit-log.js +++ /dev/null @@ -1,52 +0,0 @@ -const express = require('express'); -const validator = require('../../lib/validator'); -const jwtdecode = require('../../lib/express/jwt-decode'); -const internalAuditLog = require('../../internal/audit-log'); - -let router = express.Router({ - caseSensitive: true, - strict: true, - mergeParams: true -}); - -/** - * /api/audit-log - */ -router - .route('/') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * GET /api/audit-log - * - * Retrieve all logs - */ - .get((req, res, next) => { - validator({ - additionalProperties: false, - properties: { - expand: { - $ref: 'definitions#/definitions/expand' - }, - query: { - $ref: 'definitions#/definitions/query' - } - } - }, { - expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null), - query: (typeof req.query.query === 'string' ? req.query.query : null) - }) - .then(data => { - return internalAuditLog.getAll(res.locals.access, data.expand, data.query); - }) - .then(rows => { - res.status(200) - .send(rows); - }) - .catch(next); - }); - -module.exports = router; diff --git a/src/backend/routes/api/nginx/access_lists.js b/src/backend/routes/api/nginx/access_lists.js deleted file mode 100644 index 8c9cd16a5..000000000 --- a/src/backend/routes/api/nginx/access_lists.js +++ /dev/null @@ -1,148 +0,0 @@ -const express = require('express'); -const validator = require('../../../lib/validator'); -const jwtdecode = require('../../../lib/express/jwt-decode'); -const internalAccessList = require('../../../internal/access-list'); -const apiValidator = require('../../../lib/validator/api'); - -let router = express.Router({ - caseSensitive: true, - strict: true, - mergeParams: true -}); - -/** - * /api/nginx/access-lists - */ -router - .route('/') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * GET /api/nginx/access-lists - * - * Retrieve all access-lists - */ - .get((req, res, next) => { - validator({ - additionalProperties: false, - properties: { - expand: { - $ref: 'definitions#/definitions/expand' - }, - query: { - $ref: 'definitions#/definitions/query' - } - } - }, { - expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null), - query: (typeof req.query.query === 'string' ? req.query.query : null) - }) - .then(data => { - return internalAccessList.getAll(res.locals.access, data.expand, data.query); - }) - .then(rows => { - res.status(200) - .send(rows); - }) - .catch(next); - }) - - /** - * POST /api/nginx/access-lists - * - * Create a new access-list - */ - .post((req, res, next) => { - apiValidator({$ref: 'endpoints/access-lists#/links/1/schema'}, req.body) - .then(payload => { - return internalAccessList.create(res.locals.access, payload); - }) - .then(result => { - res.status(201) - .send(result); - }) - .catch(next); - }); - -/** - * Specific access-list - * - * /api/nginx/access-lists/123 - */ -router - .route('/:list_id') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * GET /api/nginx/access-lists/123 - * - * Retrieve a specific access-list - */ - .get((req, res, next) => { - validator({ - required: ['list_id'], - additionalProperties: false, - properties: { - list_id: { - $ref: 'definitions#/definitions/id' - }, - expand: { - $ref: 'definitions#/definitions/expand' - } - } - }, { - list_id: req.params.list_id, - expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null) - }) - .then(data => { - return internalAccessList.get(res.locals.access, { - id: parseInt(data.list_id, 10), - expand: data.expand - }); - }) - .then(row => { - res.status(200) - .send(row); - }) - .catch(next); - }) - - /** - * PUT /api/nginx/access-lists/123 - * - * Update and existing access-list - */ - .put((req, res, next) => { - apiValidator({$ref: 'endpoints/access-lists#/links/2/schema'}, req.body) - .then(payload => { - payload.id = parseInt(req.params.list_id, 10); - return internalAccessList.update(res.locals.access, payload); - }) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }) - - /** - * DELETE /api/nginx/access-lists/123 - * - * Delete and existing access-list - */ - .delete((req, res, next) => { - internalAccessList.delete(res.locals.access, {id: parseInt(req.params.list_id, 10)}) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }); - -module.exports = router; diff --git a/src/backend/routes/api/nginx/certificates.js b/src/backend/routes/api/nginx/certificates.js deleted file mode 100644 index 4c873bc06..000000000 --- a/src/backend/routes/api/nginx/certificates.js +++ /dev/null @@ -1,243 +0,0 @@ -const express = require('express'); -const validator = require('../../../lib/validator'); -const jwtdecode = require('../../../lib/express/jwt-decode'); -const internalCertificate = require('../../../internal/certificate'); -const apiValidator = require('../../../lib/validator/api'); - -let router = express.Router({ - caseSensitive: true, - strict: true, - mergeParams: true -}); - -/** - * /api/nginx/certificates - */ -router - .route('/') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * GET /api/nginx/certificates - * - * Retrieve all certificates - */ - .get((req, res, next) => { - validator({ - additionalProperties: false, - properties: { - expand: { - $ref: 'definitions#/definitions/expand' - }, - query: { - $ref: 'definitions#/definitions/query' - } - } - }, { - expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null), - query: (typeof req.query.query === 'string' ? req.query.query : null) - }) - .then(data => { - return internalCertificate.getAll(res.locals.access, data.expand, data.query); - }) - .then(rows => { - res.status(200) - .send(rows); - }) - .catch(next); - }) - - /** - * POST /api/nginx/certificates - * - * Create a new certificate - */ - .post((req, res, next) => { - apiValidator({$ref: 'endpoints/certificates#/links/1/schema'}, req.body) - .then(payload => { - return internalCertificate.create(res.locals.access, payload); - }) - .then(result => { - res.status(201) - .send(result); - }) - .catch(next); - }); - -/** - * Specific certificate - * - * /api/nginx/certificates/123 - */ -router - .route('/:certificate_id') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * GET /api/nginx/certificates/123 - * - * Retrieve a specific certificate - */ - .get((req, res, next) => { - validator({ - required: ['certificate_id'], - additionalProperties: false, - properties: { - certificate_id: { - $ref: 'definitions#/definitions/id' - }, - expand: { - $ref: 'definitions#/definitions/expand' - } - } - }, { - certificate_id: req.params.certificate_id, - expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null) - }) - .then(data => { - return internalCertificate.get(res.locals.access, { - id: parseInt(data.certificate_id, 10), - expand: data.expand - }); - }) - .then(row => { - res.status(200) - .send(row); - }) - .catch(next); - }) - - /** - * PUT /api/nginx/certificates/123 - * - * Update and existing certificate - */ - .put((req, res, next) => { - apiValidator({$ref: 'endpoints/certificates#/links/2/schema'}, req.body) - .then(payload => { - payload.id = parseInt(req.params.certificate_id, 10); - return internalCertificate.update(res.locals.access, payload); - }) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }) - - /** - * DELETE /api/nginx/certificates/123 - * - * Update and existing certificate - */ - .delete((req, res, next) => { - internalCertificate.delete(res.locals.access, {id: parseInt(req.params.certificate_id, 10)}) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }); - -/** - * Upload Certs - * - * /api/nginx/certificates/123/upload - */ -router - .route('/:certificate_id/upload') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * POST /api/nginx/certificates/123/upload - * - * Upload certificates - */ - .post((req, res, next) => { - if (!req.files) { - res.status(400) - .send({error: 'No files were uploaded'}); - } else { - internalCertificate.upload(res.locals.access, { - id: parseInt(req.params.certificate_id, 10), - files: req.files - }) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - } - }); - -/** - * Renew LE Certs - * - * /api/nginx/certificates/123/renew - */ -router - .route('/:certificate_id/renew') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * POST /api/nginx/certificates/123/renew - * - * Renew certificate - */ - .post((req, res, next) => { - internalCertificate.renew(res.locals.access, { - id: parseInt(req.params.certificate_id, 10) - }) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }); - -/** - * Validate Certs before saving - * - * /api/nginx/certificates/validate - */ -router - .route('/validate') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * POST /api/nginx/certificates/validate - * - * Validate certificates - */ - .post((req, res, next) => { - if (!req.files) { - res.status(400) - .send({error: 'No files were uploaded'}); - } else { - internalCertificate.validate({ - files: req.files - }) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - } - }); - -module.exports = router; diff --git a/src/backend/routes/api/nginx/dead_hosts.js b/src/backend/routes/api/nginx/dead_hosts.js deleted file mode 100644 index b0270a68d..000000000 --- a/src/backend/routes/api/nginx/dead_hosts.js +++ /dev/null @@ -1,196 +0,0 @@ -const express = require('express'); -const validator = require('../../../lib/validator'); -const jwtdecode = require('../../../lib/express/jwt-decode'); -const internalDeadHost = require('../../../internal/dead-host'); -const apiValidator = require('../../../lib/validator/api'); - -let router = express.Router({ - caseSensitive: true, - strict: true, - mergeParams: true -}); - -/** - * /api/nginx/dead-hosts - */ -router - .route('/') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * GET /api/nginx/dead-hosts - * - * Retrieve all dead-hosts - */ - .get((req, res, next) => { - validator({ - additionalProperties: false, - properties: { - expand: { - $ref: 'definitions#/definitions/expand' - }, - query: { - $ref: 'definitions#/definitions/query' - } - } - }, { - expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null), - query: (typeof req.query.query === 'string' ? req.query.query : null) - }) - .then(data => { - return internalDeadHost.getAll(res.locals.access, data.expand, data.query); - }) - .then(rows => { - res.status(200) - .send(rows); - }) - .catch(next); - }) - - /** - * POST /api/nginx/dead-hosts - * - * Create a new dead-host - */ - .post((req, res, next) => { - apiValidator({$ref: 'endpoints/dead-hosts#/links/1/schema'}, req.body) - .then(payload => { - return internalDeadHost.create(res.locals.access, payload); - }) - .then(result => { - res.status(201) - .send(result); - }) - .catch(next); - }); - -/** - * Specific dead-host - * - * /api/nginx/dead-hosts/123 - */ -router - .route('/:host_id') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * GET /api/nginx/dead-hosts/123 - * - * Retrieve a specific dead-host - */ - .get((req, res, next) => { - validator({ - required: ['host_id'], - additionalProperties: false, - properties: { - host_id: { - $ref: 'definitions#/definitions/id' - }, - expand: { - $ref: 'definitions#/definitions/expand' - } - } - }, { - host_id: req.params.host_id, - expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null) - }) - .then(data => { - return internalDeadHost.get(res.locals.access, { - id: parseInt(data.host_id, 10), - expand: data.expand - }); - }) - .then(row => { - res.status(200) - .send(row); - }) - .catch(next); - }) - - /** - * PUT /api/nginx/dead-hosts/123 - * - * Update and existing dead-host - */ - .put((req, res, next) => { - apiValidator({$ref: 'endpoints/dead-hosts#/links/2/schema'}, req.body) - .then(payload => { - payload.id = parseInt(req.params.host_id, 10); - return internalDeadHost.update(res.locals.access, payload); - }) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }) - - /** - * DELETE /api/nginx/dead-hosts/123 - * - * Update and existing dead-host - */ - .delete((req, res, next) => { - internalDeadHost.delete(res.locals.access, {id: parseInt(req.params.host_id, 10)}) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }); - -/** - * Enable dead-host - * - * /api/nginx/dead-hosts/123/enable - */ -router - .route('/:host_id/enable') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * POST /api/nginx/dead-hosts/123/enable - */ - .post((req, res, next) => { - internalDeadHost.enable(res.locals.access, {id: parseInt(req.params.host_id, 10)}) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }); - -/** - * Disable dead-host - * - * /api/nginx/dead-hosts/123/disable - */ -router - .route('/:host_id/disable') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * POST /api/nginx/dead-hosts/123/disable - */ - .post((req, res, next) => { - internalDeadHost.disable(res.locals.access, {id: parseInt(req.params.host_id, 10)}) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }); - -module.exports = router; diff --git a/src/backend/routes/api/nginx/proxy_hosts.js b/src/backend/routes/api/nginx/proxy_hosts.js deleted file mode 100644 index 97d04eda6..000000000 --- a/src/backend/routes/api/nginx/proxy_hosts.js +++ /dev/null @@ -1,196 +0,0 @@ -const express = require('express'); -const validator = require('../../../lib/validator'); -const jwtdecode = require('../../../lib/express/jwt-decode'); -const internalProxyHost = require('../../../internal/proxy-host'); -const apiValidator = require('../../../lib/validator/api'); - -let router = express.Router({ - caseSensitive: true, - strict: true, - mergeParams: true -}); - -/** - * /api/nginx/proxy-hosts - */ -router - .route('/') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * GET /api/nginx/proxy-hosts - * - * Retrieve all proxy-hosts - */ - .get((req, res, next) => { - validator({ - additionalProperties: false, - properties: { - expand: { - $ref: 'definitions#/definitions/expand' - }, - query: { - $ref: 'definitions#/definitions/query' - } - } - }, { - expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null), - query: (typeof req.query.query === 'string' ? req.query.query : null) - }) - .then(data => { - return internalProxyHost.getAll(res.locals.access, data.expand, data.query); - }) - .then(rows => { - res.status(200) - .send(rows); - }) - .catch(next); - }) - - /** - * POST /api/nginx/proxy-hosts - * - * Create a new proxy-host - */ - .post((req, res, next) => { - apiValidator({$ref: 'endpoints/proxy-hosts#/links/1/schema'}, req.body) - .then(payload => { - return internalProxyHost.create(res.locals.access, payload); - }) - .then(result => { - res.status(201) - .send(result); - }) - .catch(next); - }); - -/** - * Specific proxy-host - * - * /api/nginx/proxy-hosts/123 - */ -router - .route('/:host_id') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * GET /api/nginx/proxy-hosts/123 - * - * Retrieve a specific proxy-host - */ - .get((req, res, next) => { - validator({ - required: ['host_id'], - additionalProperties: false, - properties: { - host_id: { - $ref: 'definitions#/definitions/id' - }, - expand: { - $ref: 'definitions#/definitions/expand' - } - } - }, { - host_id: req.params.host_id, - expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null) - }) - .then(data => { - return internalProxyHost.get(res.locals.access, { - id: parseInt(data.host_id, 10), - expand: data.expand - }); - }) - .then(row => { - res.status(200) - .send(row); - }) - .catch(next); - }) - - /** - * PUT /api/nginx/proxy-hosts/123 - * - * Update and existing proxy-host - */ - .put((req, res, next) => { - apiValidator({$ref: 'endpoints/proxy-hosts#/links/2/schema'}, req.body) - .then(payload => { - payload.id = parseInt(req.params.host_id, 10); - return internalProxyHost.update(res.locals.access, payload); - }) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }) - - /** - * DELETE /api/nginx/proxy-hosts/123 - * - * Update and existing proxy-host - */ - .delete((req, res, next) => { - internalProxyHost.delete(res.locals.access, {id: parseInt(req.params.host_id, 10)}) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }); - -/** - * Enable proxy-host - * - * /api/nginx/proxy-hosts/123/enable - */ -router - .route('/:host_id/enable') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * POST /api/nginx/proxy-hosts/123/enable - */ - .post((req, res, next) => { - internalProxyHost.enable(res.locals.access, {id: parseInt(req.params.host_id, 10)}) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }); - -/** - * Disable proxy-host - * - * /api/nginx/proxy-hosts/123/disable - */ -router - .route('/:host_id/disable') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * POST /api/nginx/proxy-hosts/123/disable - */ - .post((req, res, next) => { - internalProxyHost.disable(res.locals.access, {id: parseInt(req.params.host_id, 10)}) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }); - -module.exports = router; diff --git a/src/backend/routes/api/nginx/redirection_hosts.js b/src/backend/routes/api/nginx/redirection_hosts.js deleted file mode 100644 index 48eef30e4..000000000 --- a/src/backend/routes/api/nginx/redirection_hosts.js +++ /dev/null @@ -1,196 +0,0 @@ -const express = require('express'); -const validator = require('../../../lib/validator'); -const jwtdecode = require('../../../lib/express/jwt-decode'); -const internalRedirectionHost = require('../../../internal/redirection-host'); -const apiValidator = require('../../../lib/validator/api'); - -let router = express.Router({ - caseSensitive: true, - strict: true, - mergeParams: true -}); - -/** - * /api/nginx/redirection-hosts - */ -router - .route('/') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * GET /api/nginx/redirection-hosts - * - * Retrieve all redirection-hosts - */ - .get((req, res, next) => { - validator({ - additionalProperties: false, - properties: { - expand: { - $ref: 'definitions#/definitions/expand' - }, - query: { - $ref: 'definitions#/definitions/query' - } - } - }, { - expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null), - query: (typeof req.query.query === 'string' ? req.query.query : null) - }) - .then(data => { - return internalRedirectionHost.getAll(res.locals.access, data.expand, data.query); - }) - .then(rows => { - res.status(200) - .send(rows); - }) - .catch(next); - }) - - /** - * POST /api/nginx/redirection-hosts - * - * Create a new redirection-host - */ - .post((req, res, next) => { - apiValidator({$ref: 'endpoints/redirection-hosts#/links/1/schema'}, req.body) - .then(payload => { - return internalRedirectionHost.create(res.locals.access, payload); - }) - .then(result => { - res.status(201) - .send(result); - }) - .catch(next); - }); - -/** - * Specific redirection-host - * - * /api/nginx/redirection-hosts/123 - */ -router - .route('/:host_id') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * GET /api/nginx/redirection-hosts/123 - * - * Retrieve a specific redirection-host - */ - .get((req, res, next) => { - validator({ - required: ['host_id'], - additionalProperties: false, - properties: { - host_id: { - $ref: 'definitions#/definitions/id' - }, - expand: { - $ref: 'definitions#/definitions/expand' - } - } - }, { - host_id: req.params.host_id, - expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null) - }) - .then(data => { - return internalRedirectionHost.get(res.locals.access, { - id: parseInt(data.host_id, 10), - expand: data.expand - }); - }) - .then(row => { - res.status(200) - .send(row); - }) - .catch(next); - }) - - /** - * PUT /api/nginx/redirection-hosts/123 - * - * Update and existing redirection-host - */ - .put((req, res, next) => { - apiValidator({$ref: 'endpoints/redirection-hosts#/links/2/schema'}, req.body) - .then(payload => { - payload.id = parseInt(req.params.host_id, 10); - return internalRedirectionHost.update(res.locals.access, payload); - }) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }) - - /** - * DELETE /api/nginx/redirection-hosts/123 - * - * Update and existing redirection-host - */ - .delete((req, res, next) => { - internalRedirectionHost.delete(res.locals.access, {id: parseInt(req.params.host_id, 10)}) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }); - -/** - * Enable redirection-host - * - * /api/nginx/redirection-hosts/123/enable - */ -router - .route('/:host_id/enable') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * POST /api/nginx/redirection-hosts/123/enable - */ - .post((req, res, next) => { - internalRedirectionHost.enable(res.locals.access, {id: parseInt(req.params.host_id, 10)}) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }); - -/** - * Disable redirection-host - * - * /api/nginx/redirection-hosts/123/disable - */ -router - .route('/:host_id/disable') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * POST /api/nginx/redirection-hosts/123/disable - */ - .post((req, res, next) => { - internalRedirectionHost.disable(res.locals.access, {id: parseInt(req.params.host_id, 10)}) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }); - -module.exports = router; diff --git a/src/backend/routes/api/nginx/streams.js b/src/backend/routes/api/nginx/streams.js deleted file mode 100644 index fd062ee09..000000000 --- a/src/backend/routes/api/nginx/streams.js +++ /dev/null @@ -1,196 +0,0 @@ -const express = require('express'); -const validator = require('../../../lib/validator'); -const jwtdecode = require('../../../lib/express/jwt-decode'); -const internalStream = require('../../../internal/stream'); -const apiValidator = require('../../../lib/validator/api'); - -let router = express.Router({ - caseSensitive: true, - strict: true, - mergeParams: true -}); - -/** - * /api/nginx/streams - */ -router - .route('/') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes - - /** - * GET /api/nginx/streams - * - * Retrieve all streams - */ - .get((req, res, next) => { - validator({ - additionalProperties: false, - properties: { - expand: { - $ref: 'definitions#/definitions/expand' - }, - query: { - $ref: 'definitions#/definitions/query' - } - } - }, { - expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null), - query: (typeof req.query.query === 'string' ? req.query.query : null) - }) - .then(data => { - return internalStream.getAll(res.locals.access, data.expand, data.query); - }) - .then(rows => { - res.status(200) - .send(rows); - }) - .catch(next); - }) - - /** - * POST /api/nginx/streams - * - * Create a new stream - */ - .post((req, res, next) => { - apiValidator({$ref: 'endpoints/streams#/links/1/schema'}, req.body) - .then(payload => { - return internalStream.create(res.locals.access, payload); - }) - .then(result => { - res.status(201) - .send(result); - }) - .catch(next); - }); - -/** - * Specific stream - * - * /api/nginx/streams/123 - */ -router - .route('/:stream_id') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) // preferred so it doesn't apply to nonexistent routes - - /** - * GET /api/nginx/streams/123 - * - * Retrieve a specific stream - */ - .get((req, res, next) => { - validator({ - required: ['stream_id'], - additionalProperties: false, - properties: { - stream_id: { - $ref: 'definitions#/definitions/id' - }, - expand: { - $ref: 'definitions#/definitions/expand' - } - } - }, { - stream_id: req.params.stream_id, - expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null) - }) - .then(data => { - return internalStream.get(res.locals.access, { - id: parseInt(data.stream_id, 10), - expand: data.expand - }); - }) - .then(row => { - res.status(200) - .send(row); - }) - .catch(next); - }) - - /** - * PUT /api/nginx/streams/123 - * - * Update and existing stream - */ - .put((req, res, next) => { - apiValidator({$ref: 'endpoints/streams#/links/2/schema'}, req.body) - .then(payload => { - payload.id = parseInt(req.params.stream_id, 10); - return internalStream.update(res.locals.access, payload); - }) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }) - - /** - * DELETE /api/nginx/streams/123 - * - * Update and existing stream - */ - .delete((req, res, next) => { - internalStream.delete(res.locals.access, {id: parseInt(req.params.stream_id, 10)}) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }); - -/** - * Enable stream - * - * /api/nginx/streams/123/enable - */ -router - .route('/:host_id/enable') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * POST /api/nginx/streams/123/enable - */ - .post((req, res, next) => { - internalStream.enable(res.locals.access, {id: parseInt(req.params.host_id, 10)}) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }); - -/** - * Disable stream - * - * /api/nginx/streams/123/disable - */ -router - .route('/:host_id/disable') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * POST /api/nginx/streams/123/disable - */ - .post((req, res, next) => { - internalStream.disable(res.locals.access, {id: parseInt(req.params.host_id, 10)}) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }); - -module.exports = router; diff --git a/src/backend/routes/api/reports.js b/src/backend/routes/api/reports.js deleted file mode 100644 index a02e6da0e..000000000 --- a/src/backend/routes/api/reports.js +++ /dev/null @@ -1,29 +0,0 @@ -const express = require('express'); -const jwtdecode = require('../../lib/express/jwt-decode'); -const internalReport = require('../../internal/report'); - -let router = express.Router({ - caseSensitive: true, - strict: true, - mergeParams: true -}); - -router - .route('/hosts') - .options((req, res) => { - res.sendStatus(204); - }) - - /** - * GET /reports/hosts - */ - .get(jwtdecode(), (req, res, next) => { - internalReport.getHostsReport(res.locals.access) - .then(data => { - res.status(200) - .send(data); - }) - .catch(next); - }); - -module.exports = router; diff --git a/src/backend/routes/api/settings.js b/src/backend/routes/api/settings.js deleted file mode 100644 index cc56db8fc..000000000 --- a/src/backend/routes/api/settings.js +++ /dev/null @@ -1,96 +0,0 @@ -const express = require('express'); -const validator = require('../../lib/validator'); -const jwtdecode = require('../../lib/express/jwt-decode'); -const internalSetting = require('../../internal/setting'); -const apiValidator = require('../../lib/validator/api'); - -let router = express.Router({ - caseSensitive: true, - strict: true, - mergeParams: true -}); - -/** - * /api/settings - */ -router - .route('/') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * GET /api/settings - * - * Retrieve all settings - */ - .get((req, res, next) => { - internalSetting.getAll(res.locals.access) - .then(rows => { - res.status(200) - .send(rows); - }) - .catch(next); - }); - -/** - * Specific setting - * - * /api/settings/something - */ -router - .route('/:setting_id') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * GET /settings/something - * - * Retrieve a specific setting - */ - .get((req, res, next) => { - validator({ - required: ['setting_id'], - additionalProperties: false, - properties: { - setting_id: { - $ref: 'definitions#/definitions/setting_id' - } - } - }, { - setting_id: req.params.setting_id - }) - .then(data => { - return internalSetting.get(res.locals.access, { - id: data.setting_id - }); - }) - .then(row => { - res.status(200) - .send(row); - }) - .catch(next); - }) - - /** - * PUT /api/settings/something - * - * Update and existing setting - */ - .put((req, res, next) => { - apiValidator({$ref: 'endpoints/settings#/links/1/schema'}, req.body) - .then(payload => { - payload.id = req.params.setting_id; - return internalSetting.update(res.locals.access, payload); - }) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }); - -module.exports = router; diff --git a/src/backend/routes/api/tokens.js b/src/backend/routes/api/tokens.js deleted file mode 100644 index 1fdf25126..000000000 --- a/src/backend/routes/api/tokens.js +++ /dev/null @@ -1,54 +0,0 @@ -const express = require('express'); -const jwtdecode = require('../../lib/express/jwt-decode'); -const internalToken = require('../../internal/token'); -const apiValidator = require('../../lib/validator/api'); - -let router = express.Router({ - caseSensitive: true, - strict: true, - mergeParams: true -}); - -router - .route('/') - .options((req, res) => { - res.sendStatus(204); - }) - - /** - * GET /tokens - * - * Get a new Token, given they already have a token they want to refresh - * We also piggy back on to this method, allowing admins to get tokens - * for services like Job board and Worker. - */ - .get(jwtdecode(), (req, res, next) => { - internalToken.getFreshToken(res.locals.access, { - expiry: (typeof req.query.expiry !== 'undefined' ? req.query.expiry : null), - scope: (typeof req.query.scope !== 'undefined' ? req.query.scope : null) - }) - .then(data => { - res.status(200) - .send(data); - }) - .catch(next); - }) - - /** - * POST /tokens - * - * Create a new Token - */ - .post((req, res, next) => { - apiValidator({$ref: 'endpoints/tokens#/links/0/schema'}, req.body) - .then(payload => { - return internalToken.getTokenFromEmail(payload); - }) - .then(data => { - res.status(200) - .send(data); - }) - .catch(next); - }); - -module.exports = router; diff --git a/src/backend/routes/api/users.js b/src/backend/routes/api/users.js deleted file mode 100644 index 1d5593707..000000000 --- a/src/backend/routes/api/users.js +++ /dev/null @@ -1,239 +0,0 @@ -const express = require('express'); -const validator = require('../../lib/validator'); -const jwtdecode = require('../../lib/express/jwt-decode'); -const userIdFromMe = require('../../lib/express/user-id-from-me'); -const internalUser = require('../../internal/user'); -const apiValidator = require('../../lib/validator/api'); - -let router = express.Router({ - caseSensitive: true, - strict: true, - mergeParams: true -}); - -/** - * /api/users - */ -router - .route('/') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * GET /api/users - * - * Retrieve all users - */ - .get((req, res, next) => { - validator({ - additionalProperties: false, - properties: { - expand: { - $ref: 'definitions#/definitions/expand' - }, - query: { - $ref: 'definitions#/definitions/query' - } - } - }, { - expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null), - query: (typeof req.query.query === 'string' ? req.query.query : null) - }) - .then(data => { - return internalUser.getAll(res.locals.access, data.expand, data.query); - }) - .then(users => { - res.status(200) - .send(users); - }) - .catch(next); - }) - - /** - * POST /api/users - * - * Create a new User - */ - .post((req, res, next) => { - apiValidator({$ref: 'endpoints/users#/links/1/schema'}, req.body) - .then(payload => { - return internalUser.create(res.locals.access, payload); - }) - .then(result => { - res.status(201) - .send(result); - }) - .catch(next); - }); - -/** - * Specific user - * - * /api/users/123 - */ -router - .route('/:user_id') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - .all(userIdFromMe) - - /** - * GET /users/123 or /users/me - * - * Retrieve a specific user - */ - .get((req, res, next) => { - validator({ - required: ['user_id'], - additionalProperties: false, - properties: { - user_id: { - $ref: 'definitions#/definitions/id' - }, - expand: { - $ref: 'definitions#/definitions/expand' - } - } - }, { - user_id: req.params.user_id, - expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null) - }) - .then(data => { - return internalUser.get(res.locals.access, { - id: data.user_id, - expand: data.expand, - omit: internalUser.getUserOmisionsByAccess(res.locals.access, data.user_id) - }); - }) - .then(user => { - res.status(200) - .send(user); - }) - .catch(next); - }) - - /** - * PUT /api/users/123 - * - * Update and existing user - */ - .put((req, res, next) => { - apiValidator({$ref: 'endpoints/users#/links/2/schema'}, req.body) - .then(payload => { - payload.id = req.params.user_id; - return internalUser.update(res.locals.access, payload); - }) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }) - - /** - * DELETE /api/users/123 - * - * Update and existing user - */ - .delete((req, res, next) => { - internalUser.delete(res.locals.access, {id: req.params.user_id}) - .then(result => { - res.status(200) - .send(result); - }) - .catch(next); - }); - -/** - * Specific user auth - * - * /api/users/123/auth - */ -router - .route('/:user_id/auth') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - .all(userIdFromMe) - - /** - * PUT /api/users/123/auth - * - * Update password for a user - */ - .put((req, res, next) => { - apiValidator({$ref: 'endpoints/users#/links/4/schema'}, req.body) - .then(payload => { - payload.id = req.params.user_id; - return internalUser.setPassword(res.locals.access, payload); - }) - .then(result => { - res.status(201) - .send(result); - }) - .catch(next); - }); - -/** - * Specific user permissions - * - * /api/users/123/permissions - */ -router - .route('/:user_id/permissions') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - .all(userIdFromMe) - - /** - * PUT /api/users/123/permissions - * - * Set some or all permissions for a user - */ - .put((req, res, next) => { - apiValidator({$ref: 'endpoints/users#/links/5/schema'}, req.body) - .then(payload => { - payload.id = req.params.user_id; - return internalUser.setPermissions(res.locals.access, payload); - }) - .then(result => { - res.status(201) - .send(result); - }) - .catch(next); - }); - -/** - * Specific user login as - * - * /api/users/123/login - */ -router - .route('/:user_id/login') - .options((req, res) => { - res.sendStatus(204); - }) - .all(jwtdecode()) - - /** - * POST /api/users/123/login - * - * Log in as a user - */ - .post((req, res, next) => { - internalUser.loginAs(res.locals.access, {id: parseInt(req.params.user_id, 10)}) - .then(result => { - res.status(201) - .send(result); - }) - .catch(next); - }); - -module.exports = router; diff --git a/src/backend/routes/main.js b/src/backend/routes/main.js deleted file mode 100644 index 27731ab3e..000000000 --- a/src/backend/routes/main.js +++ /dev/null @@ -1,50 +0,0 @@ -const express = require('express'); -const fs = require('fs'); -const PACKAGE = require('../../../package.json'); -const path = require('path') - -const router = express.Router({ - caseSensitive: true, - strict: true, - mergeParams: true -}); - -/** - * GET /login - */ -router.get('/login', function (req, res, next) { - res.render('login', { - version: PACKAGE.version - }); -}); - -/** - * GET .* - */ -router.get(/(.*)/, function (req, res, next) { - req.params.page = req.params['0']; - if (req.params.page === '/') { - res.render('index', { - version: PACKAGE.version - }); - } else { - var p = path.normalize('dist' + req.params.page) - if (p.startsWith('dist')) { // Allow access to ressources under 'dist' directory only. - fs.readFile(p, 'utf8', function (err, data) { - if (err) { - res.render('index', { - version: PACKAGE.version - }); - } else { - res.contentType('text/html').end(data); - } - }); - } else { - res.render('index', { - version: PACKAGE.version - }); - } - } -}); - -module.exports = router; diff --git a/src/backend/setup.js b/src/backend/setup.js deleted file mode 100644 index ef870cbee..000000000 --- a/src/backend/setup.js +++ /dev/null @@ -1,115 +0,0 @@ -const fs = require('fs'); -const NodeRSA = require('node-rsa'); -const config = require('config'); -const logger = require('./logger').setup; -const userModel = require('./models/user'); -const userPermissionModel = require('./models/user_permission'); -const authModel = require('./models/auth'); -const debug_mode = process.env.NODE_ENV !== 'production' || !!process.env.DEBUG; - -module.exports = function () { - return new Promise((resolve, reject) => { - // Now go and check if the jwt gpg keys have been created and if not, create them - if (!config.has('jwt') || !config.has('jwt.key') || !config.has('jwt.pub')) { - logger.info('Creating a new JWT key pair...'); - - // jwt keys are not configured properly - const filename = config.util.getEnv('NODE_CONFIG_DIR') + '/' + (config.util.getEnv('NODE_ENV') || 'default') + '.json'; - let config_data = {}; - - try { - config_data = require(filename); - } catch (err) { - // do nothing - if (debug_mode) { - logger.debug(filename + ' config file could not be required'); - } - } - - // Now create the keys and save them in the config. - let key = new NodeRSA({b: 2048}); - key.generateKeyPair(); - - config_data.jwt = { - key: key.exportKey('private').toString(), - pub: key.exportKey('public').toString() - }; - - // Write config - fs.writeFile(filename, JSON.stringify(config_data, null, 2), (err) => { - if (err) { - logger.error('Could not write JWT key pair to config file: ' + filename); - reject(err); - } else { - logger.info('Wrote JWT key pair to config file: ' + filename); - - logger.warn('Restarting interface to apply new configuration'); - process.exit(0); - } - }); - - } else { - // JWT key pair exists - if (debug_mode) { - logger.debug('JWT Keypair already exists'); - } - - resolve(); - } - }) - .then(() => { - return userModel - .query() - .select(userModel.raw('COUNT(`id`) as `count`')) - .where('is_deleted', 0) - .first(); - }) - .then(row => { - if (!row.count) { - // Create a new user and set password - logger.info('Creating a new user: admin@example.com with password: changeme'); - - let data = { - is_deleted: 0, - email: 'admin@example.com', - name: 'Administrator', - nickname: 'Admin', - avatar: '', - roles: ['admin'] - }; - - return userModel - .query() - .insertAndFetch(data) - .then(user => { - return authModel - .query() - .insert({ - user_id: user.id, - type: 'password', - secret: 'changeme', - meta: {} - }) - .then(() => { - return userPermissionModel - .query() - .insert({ - user_id: user.id, - visibility: 'all', - proxy_hosts: 'manage', - redirection_hosts: 'manage', - dead_hosts: 'manage', - streams: 'manage', - access_lists: 'manage', - certificates: 'manage' - }); - }); - }) - .then(() => { - logger.info('Initial setup completed'); - }); - } else if (debug_mode) { - logger.debug('Admin user setup not required'); - } - }); -}; diff --git a/src/backend/views/partials/footer.ejs b/src/backend/views/partials/footer.ejs deleted file mode 100644 index 2ab5c0d1f..000000000 --- a/src/backend/views/partials/footer.ejs +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/src/backend/views/partials/header.ejs b/src/backend/views/partials/header.ejs deleted file mode 100644 index cef92e157..000000000 --- a/src/backend/views/partials/header.ejs +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - <%- title %> - - - - - - - - - - - - - - - diff --git a/src/frontend/fonts b/src/frontend/fonts deleted file mode 120000 index 84b6a8e08..000000000 --- a/src/frontend/fonts +++ /dev/null @@ -1 +0,0 @@ -../../node_modules/tabler-ui/dist/assets/fonts \ No newline at end of file diff --git a/src/frontend/images b/src/frontend/images deleted file mode 120000 index 6f1cb6a6c..000000000 --- a/src/frontend/images +++ /dev/null @@ -1 +0,0 @@ -../../node_modules/tabler-ui/dist/assets/images \ No newline at end of file diff --git a/test/.eslintrc.json b/test/.eslintrc.json new file mode 100644 index 000000000..6939fec49 --- /dev/null +++ b/test/.eslintrc.json @@ -0,0 +1,76 @@ +{ + "env": { + "browser": true, + "es6": true, + "cypress/globals": true + }, + "extends": [ + "eslint:recommended", + "plugin:cypress/recommended" + ], + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module" + }, + "plugins": [ + "cypress", + "chai-friendly", + "align-assignments" + ], + "rules": { + "indent": [ + "error", + "tab" + ], + "linebreak-style": [ + "error", + "unix" + ], + "quotes": [ + "error", + "single" + ], + "semi": [ + "error", + "always" + ], + "key-spacing": [ + "error", + { + "align": "value" + } + ], + "comma-spacing": [ + "error", + { + "before": false, + "after": true + } + ], + "func-call-spacing": [ + "error", + "never" + ], + "keyword-spacing": [ + "error", + { + "before": true + } + ], + "no-irregular-whitespace": "error", + "cypress/no-assigning-return-values": "error", + "cypress/no-unnecessary-waiting": "warn", + "no-unused-expressions": 0, + "chai-friendly/no-unused-expressions": 2, + "align-assignments/align-assignments": [ + 2, + { + "requiresOnly": false + } + ] + } +} \ No newline at end of file diff --git a/test/.gitignore b/test/.gitignore new file mode 100644 index 000000000..5a01eb242 --- /dev/null +++ b/test/.gitignore @@ -0,0 +1,3 @@ +.vscode +node_modules + diff --git a/test/.prettierrc b/test/.prettierrc new file mode 100644 index 000000000..e19dc930d --- /dev/null +++ b/test/.prettierrc @@ -0,0 +1,11 @@ +{ + "printWidth": 160, + "tabWidth": 4, + "useTabs": true, + "semi": true, + "singleQuote": true, + "bracketSpacing": true, + "jsxBracketSameLine": true, + "trailingComma": "all", + "proseWrap": "always" +} diff --git a/test/README.md b/test/README.md new file mode 100644 index 000000000..63a2453b7 --- /dev/null +++ b/test/README.md @@ -0,0 +1,46 @@ +# Cypress Test Suite + +## Running Locally + +``` +cd nginxproxymanager/test +yarn install +yarn run cypress +``` + +## VS Code + +Editor settings are not committed to the repository, typically because each developer has their own settings. Below is a list of common setting that may help, +so feel free to try them or ignore them, you are a strong independent developer. You can add settings to either "user" or "workspace" but we recommend using +"workspace" as each project is different. + +### ESLint + +The ESLint extension only works on JavaScript files by default, so add the following to your workspace settings and reload VSCode. + +``` +"eslint.autoFixOnSave": true, +"eslint.validate": [ + { "language": "javascript", "autoFix": true }, + "html" +] +``` + +> NOTE: If you've also set the editor.formatOnSave option to true in your settings.json, you'll need to add the following config to prevent running 2 formatting +> commands on save for JavaScript and TypeScript files: + +``` +"editor.formatOnSave": true, +"[javascript]": { + "editor.formatOnSave": false, +}, +"[javascriptreact]": { + "editor.formatOnSave": false, +}, +"[typescript]": { + "editor.formatOnSave": false, +}, +"[typescriptreact]": { + "editor.formatOnSave": false, +}, +``` diff --git a/test/cypress/Dockerfile b/test/cypress/Dockerfile new file mode 100644 index 000000000..2e9d12039 --- /dev/null +++ b/test/cypress/Dockerfile @@ -0,0 +1,8 @@ +FROM cypress/included:3.8.3 + +COPY --chown=1000 ./test /test + +WORKDIR /test +RUN yarn install +ENTRYPOINT [] +CMD ["cypress", "run"] diff --git a/test/cypress/config/ci.json b/test/cypress/config/ci.json new file mode 100644 index 000000000..838da6e2a --- /dev/null +++ b/test/cypress/config/ci.json @@ -0,0 +1,17 @@ +{ + "requestTimeout": 30000, + "defaultCommandTimeout": 20000, + "reporter": "mocha-junit-reporter", + "reporterOptions": { + "jenkinsMode": true, + "rootSuiteTitle": "Cypress", + "jenkinsClassnamePrefix": "Cypress.", + "mochaFile": "/results/junit/my-test-output-[hash].xml" + }, + "videosFolder": "/results/videos", + "screenshotsFolder": "/results/screenshots", + "env": { + "swaggerBase": "{{baseUrl}}/api/schema", + "RETRIES": 4 + } +} diff --git a/test/cypress/config/dev.json b/test/cypress/config/dev.json new file mode 100644 index 000000000..79f2bc537 --- /dev/null +++ b/test/cypress/config/dev.json @@ -0,0 +1,13 @@ +{ + "requestTimeout": 30000, + "defaultCommandTimeout": 20000, + "reporter": "junit", + "reporterOptions": { + "mochaFile": "results/junit/my-test-output-[hash].xml" + }, + "video": false, + "screenshotsFolder": "cypress/results/screenshots", + "env": { + "swaggerBase": "{{baseUrl}}/api/schema" + } +} diff --git a/test/cypress/fixtures/example.json b/test/cypress/fixtures/example.json new file mode 100644 index 000000000..da18d9352 --- /dev/null +++ b/test/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} \ No newline at end of file diff --git a/test/cypress/integration/Health.spec.js b/test/cypress/integration/Health.spec.js new file mode 100644 index 000000000..93f5971f7 --- /dev/null +++ b/test/cypress/integration/Health.spec.js @@ -0,0 +1,22 @@ +/// + +describe('Basic API checks', () => { + it('Should return a valid health payload', function () { + cy.wait(2000); + cy.task('backendApiGet', { + path: '/api/', + }).then((data) => { + // Check the swagger schema: + cy.validateSwaggerSchema('get', '/', data); + }); + }); + + it('Should return a valid schema payload', function () { + cy.wait(2000); + cy.task('backendApiGet', { + path: '/api/schema', + }).then((data) => { + expect(data.openapi).to.be.equal('3.0.0'); + }); + }); +}); diff --git a/test/cypress/plugins/backendApi/client.js b/test/cypress/plugins/backendApi/client.js new file mode 100644 index 000000000..4de398186 --- /dev/null +++ b/test/cypress/plugins/backendApi/client.js @@ -0,0 +1,142 @@ +const logger = require('./logger'); +const restler = require('@jc21/restler'); + +const BackendApi = function(config, token) { + this.config = config; + this.token = token; +}; + +/** + * @param {string} token + */ +BackendApi.prototype.setToken = function(token) { + this.token = token; +}; + +/** + * @param {string} path + * @param {bool} [returnOnError] + * @returns {Promise} + */ +BackendApi.prototype.get = function(path, returnOnError) { + return new Promise((resolve, reject) => { + let headers = { + Accept: 'application/json' + }; + if (this.token) { + headers.Authorization = 'Bearer ' + this.token; + } + + logger('GET ', this.config.baseUrl + path); + + restler + .get(this.config.baseUrl + path, { + headers: headers, + }) + .on('complete', function(data, response) { + logger('Response data:', data); + if (!returnOnError && data instanceof Error) { + reject(data); + } else if (!returnOnError && response.statusCode != 200) { + if (typeof data === 'object' && typeof data.error === 'object' && typeof data.error.message !== 'undefined') { + reject(new Error(data.error.code + ': ' + data.error.message)); + } else { + reject(new Error('Error ' + response.statusCode)); + } + } else { + resolve(data); + } + }); + }); +}; + +/** + * @param {string} path + * @param {bool} [returnOnError] + * @returns {Promise} + */ +BackendApi.prototype.delete = function(path, returnOnError) { + return new Promise((resolve, reject) => { + let headers = { + Accept: 'application/json' + }; + if (this.token) { + headers.Authorization = 'Bearer ' + this.token; + } + + logger('DELETE ', this.config.baseUrl + path); + + restler + .del(this.config.baseUrl + path, { + headers: headers, + }) + .on('complete', function(data, response) { + logger('Response data:', data); + if (!returnOnError && data instanceof Error) { + reject(data); + } else if (!returnOnError && response.statusCode != 200) { + if (typeof data === 'object' && typeof data.error === 'object' && typeof data.error.message !== 'undefined') { + reject(new Error(data.error.code + ': ' + data.error.message)); + } else { + reject(new Error('Error ' + response.statusCode)); + } + } else { + resolve(data); + } + }); + }); +}; + +/** + * @param {string} path + * @param {object} data + * @param {bool} [returnOnError] + * @returns {Promise} + */ +BackendApi.prototype.postJson = function(path, data, returnOnError) { + logger('POST ', this.config.baseUrl + path); + return this._putPostJson('postJson', path, data, returnOnError); +}; + +/** + * @param {string} path + * @param {object} data + * @param {bool} [returnOnError] + * @returns {Promise} + */ +BackendApi.prototype.putJson = function(path, data, returnOnError) { + logger('PUT ', this.config.baseUrl + path); + return this._putPostJson('putJson', path, data, returnOnError); +}; + +/** + * @param {string} path + * @param {object} data + * @param {bool} [returnOnError] + * @returns {Promise} + */ +BackendApi.prototype._putPostJson = function(fn, path, data, returnOnError) { + return new Promise((resolve, reject) => { + restler[fn](this.config.baseUrl + path, data, { + headers: { + Accept: 'application/json', + Authorization: 'Bearer ' + this.token, + }, + }).on('complete', function(data, response) { + logger('Response data:', data); + if (!returnOnError && data instanceof Error) { + reject(data); + } else if (!returnOnError && response.statusCode != 200) { + if (typeof data === 'object' && typeof data.error === 'object' && typeof data.error.message !== 'undefined') { + reject(new Error(data.error.code + ': ' + data.error.message)); + } else { + reject(new Error('Error ' + response.statusCode)); + } + } else { + resolve(data); + } + }); + }); +}; + +module.exports = BackendApi; diff --git a/test/cypress/plugins/backendApi/logger.js b/test/cypress/plugins/backendApi/logger.js new file mode 100644 index 000000000..4c5c8fb8c --- /dev/null +++ b/test/cypress/plugins/backendApi/logger.js @@ -0,0 +1,8 @@ +const _ = require('lodash'); +const chalk = require('chalk'); + +module.exports = function () { + var arr = _.values(arguments); + arr.unshift(chalk.blue.bold('[') + chalk.yellow.bold('Backend API') + chalk.blue.bold(']')); + console.log.apply(null, arr); +}; diff --git a/test/cypress/plugins/backendApi/task.js b/test/cypress/plugins/backendApi/task.js new file mode 100644 index 000000000..2f67902d5 --- /dev/null +++ b/test/cypress/plugins/backendApi/task.js @@ -0,0 +1,64 @@ +const logger = require('./logger'); +const Client = require('./client'); + +module.exports = function (config) { + + logger('Client Ready using', config.baseUrl); + + return { + + /** + * @param {object} options + * @param {string} options.path API path + * @param {string} [options.token] JWT + * @param {bool} [options.returnOnError] If true, will return instead of throwing errors + * @returns {string} + */ + backendApiGet: (options) => { + const api = new Client(config); + api.setToken(options.token); + return api.get(options.path, options.returnOnError || false); + }, + + /** + * @param {object} options + * @param {string} options.token JWT + * @param {string} options.path API path + * @param {object} options.data + * @param {bool} [options.returnOnError] If true, will return instead of throwing errors + * @returns {string} + */ + backendApiPost: (options) => { + const api = new Client(config); + api.setToken(options.token); + return api.postJson(options.path, options.data, options.returnOnError || false); + }, + + /** + * @param {object} options + * @param {string} options.token JWT + * @param {string} options.path API path + * @param {object} options.data + * @param {bool} [options.returnOnError] If true, will return instead of throwing errors + * @returns {string} + */ + backendApiPut: (options) => { + const api = new Client(config); + api.setToken(options.token); + return api.putJson(options.path, options.data, options.returnOnError || false); + }, + + /** + * @param {object} options + * @param {string} options.token JWT + * @param {string} options.path API path + * @param {bool} [options.returnOnError] If true, will return instead of throwing errors + * @returns {string} + */ + backendApiDelete: (options) => { + const api = new Client(config); + api.setToken(options.token); + return api.delete(options.path, options.returnOnError || false); + } + }; +}; \ No newline at end of file diff --git a/test/cypress/plugins/index.js b/test/cypress/plugins/index.js new file mode 100644 index 000000000..8cf6eef6c --- /dev/null +++ b/test/cypress/plugins/index.js @@ -0,0 +1,20 @@ +const {SwaggerValidation} = require('@jc21/cypress-swagger-validation'); + +module.exports = (on, config) => { + // Replace swaggerBase config var wildcard + if (typeof config.env.swaggerBase !== 'undefined') { + config.env.swaggerBase = config.env.swaggerBase.replace('{{baseUrl}}', config.baseUrl); + } + + // Plugin Events + on('task', SwaggerValidation(config)); + on('task', require('./backendApi/task')(config)); + on('task', { + log(message) { + console.log(message); + return null; + } + }); + + return config; +}; diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js new file mode 100644 index 000000000..15b9ac276 --- /dev/null +++ b/test/cypress/support/commands.js @@ -0,0 +1,94 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// + +/** + * Check the swagger schema: + * + * @param {string} method API Method in swagger doc, "get", "put", "post", "delete" + * @param {string} path Swagger doc endpoint path, exactly as defined in swagger doc + * @param {*} data The API response data to check against the swagger schema + */ +Cypress.Commands.add('validateSwaggerSchema', (method, path, data) => { + cy.task('validateSwaggerSchema', { + file: Cypress.env('swaggerBase'), + endpoint: path, + method: method, + statusCode: 200, + responseSchema: data, + verbose: true + }).should('equal', null); +}); + +Cypress.Commands.add('getToken', () => { + cy.task('backendApiGet', { + path: '/api/', + }).then((data) => { + // Check the swagger schema: + cy.task('validateSwaggerSchema', { + endpoint: '/', + method: 'get', + statusCode: 200, + responseSchema: data, + verbose: true, + }).should('equal', null); + + if (!data.result.setup) { + cy.log('Setup = false'); + // create a new user + cy.createInitialUser().then(() => { + return cy.getToken(); + }); + } else { + cy.log('Setup = true'); + // login with existing user + cy.task('backendApiPost', { + path: '/api/tokens', + data: { + type: 'password', + identity: 'jc@jc21.com', + secret: 'changeme' + } + }).then(res => { + cy.wrap(res.result.token); + }); + } + }); +}); + +Cypress.Commands.add('createInitialUser', () => { + return cy.task('backendApiPost', { + path: '/api/users', + data: { + name: 'Jamie Curnow', + nickname: 'James', + email: 'jc@jc21.com', + roles: [], + is_disabled: false, + auth: { + type: 'password', + secret: 'changeme' + } + } + }).then((data) => { + // Check the swagger schema: + cy.task('validateSwaggerSchema', { + endpoint: '/users', + method: 'post', + statusCode: 201, + responseSchema: data, + verbose: true + }).should('equal', null); + + expect(data.result).to.have.property('id'); + expect(data.result.id).to.be.greaterThan(0); + cy.wrap(data.result); + }); +}); diff --git a/test/cypress/support/index.js b/test/cypress/support/index.js new file mode 100644 index 000000000..4fc9aafec --- /dev/null +++ b/test/cypress/support/index.js @@ -0,0 +1,9 @@ +require('cypress-plugin-retries'); + +import './commands'; + +Cypress.on('uncaught:exception', (/*err, runnable*/) => { + // returning false here prevents Cypress from + // failing the test + return false; +}); diff --git a/test/jsconfig.json b/test/jsconfig.json new file mode 100644 index 000000000..4cd997711 --- /dev/null +++ b/test/jsconfig.json @@ -0,0 +1,6 @@ +{ + "include": [ + "./node_modules/cypress", + "cypress/**/*.js" + ] +} \ No newline at end of file diff --git a/test/package.json b/test/package.json new file mode 100644 index 000000000..d7115f1a8 --- /dev/null +++ b/test/package.json @@ -0,0 +1,25 @@ +{ + "name": "test", + "version": "1.0.0", + "description": "", + "main": "index.js", + "dependencies": { + "@jc21/cypress-swagger-validation": "^0.0.5", + "@jc21/restler": "^3.4.0", + "chalk": "^3.0.0", + "cypress": "^3.8.3", + "cypress-plugin-retries": "^1.5.2", + "eslint": "^6.7.2", + "eslint-plugin-align-assignments": "^1.1.2", + "eslint-plugin-chai-friendly": "^0.5.0", + "eslint-plugin-cypress": "^2.8.0", + "lodash": "^4.17.15", + "mocha": "^6.2.2", + "mocha-junit-reporter": "^1.23.1" + }, + "scripts": { + "cypress": "cypress open --config-file=cypress/config/dev.json --config baseUrl=http://127.0.0.1:3081" + }, + "author": "", + "license": "ISC" +} diff --git a/test/yarn.lock b/test/yarn.lock new file mode 100644 index 000000000..f6c313c81 --- /dev/null +++ b/test/yarn.lock @@ -0,0 +1,2426 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" + integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/highlight@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" + integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@cypress/listr-verbose-renderer@0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#a77492f4b11dcc7c446a34b3e28721afd33c642a" + integrity sha1-p3SS9LEdzHxEajSz4ochr9M8ZCo= + dependencies: + chalk "^1.1.3" + cli-cursor "^1.0.2" + date-fns "^1.27.2" + figures "^1.7.0" + +"@cypress/xvfb@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" + integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== + dependencies: + debug "^3.1.0" + lodash.once "^4.1.1" + +"@jc21/cypress-swagger-validation@^0.0.5": + version "0.0.5" + resolved "https://registry.yarnpkg.com/@jc21/cypress-swagger-validation/-/cypress-swagger-validation-0.0.5.tgz#420401dcef40d91ac6a8f7eabb298fce106ccb49" + integrity sha512-unz8OXDgOU4KE8FPljpg0drZgEoL0OU9gUFWraG0ecBHlU4MFxC0+oWS8IeaxU+RxoOkOooq0UhStm38IV5Geg== + dependencies: + ajv "^6.10.2" + chalk "^2.4.2" + json-schema "^0.2.5" + json-schema-ref-parser "^7.1.1" + jsonpath "^1.0.2" + lodash "^4.17.15" + +"@jc21/restler@^3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@jc21/restler/-/restler-3.4.0.tgz#cfa214ddb9946a800c6fe472529f72b01e93c763" + integrity sha512-P1Nl2ifoQwqtxcqJKYHvxgPfckeIZWbVSYMlNAP+cL2KNk3U5eErPKt4xr5YLIQ+NarFsHMGH8+CBa00FKAGrw== + dependencies: + iconv-lite "0.2.11" + qs "1.2.0" + xml2js "0.4.0" + yaml "0.2.3" + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/sizzle@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" + integrity sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg== + +acorn-jsx@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" + integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== + +acorn@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + +ansi-escapes@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= + +ansi-escapes@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" + integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + dependencies: + type-fest "^0.8.1" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + +arch@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" + integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== + dependencies: + lodash "^4.17.10" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.0.tgz#24390e6ad61386b0a747265754d2a17219de862c" + integrity sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +bluebird@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + integrity sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +cachedir@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-1.3.0.tgz#5e01928bf2d95b5edd94b0942188246740e0dbc4" + integrity sha512-O1ji32oyON9laVPJL1IZ5bmwd2cB46VfpxkDequezH+15FDzzVddEyrGEeX4WusDSqKxdyFdDQDEG1yo1GoWkg== + dependencies: + os-homedir "^1.0.1" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + 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" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +charenc@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= + +check-more-types@2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA= + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +cli-cursor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= + dependencies: + restore-cursor "^1.0.1" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" + integrity sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw= + +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== + +common-tags@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" + integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypt@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= + +cypress-plugin-retries@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/cypress-plugin-retries/-/cypress-plugin-retries-1.5.2.tgz#21d5247cd77013b95bbfdd914f2de66f91f76a2e" + integrity sha512-o1xVIGtv4WvNVxoVJ2X08eAuvditPHrePRzHqhwwHbMKu3C2rtxCdanRCZdO5fjh8ww+q4v4V0e9GmysbOvu3A== + dependencies: + chalk "^3.0.0" + +cypress@^3.8.3: + version "3.8.3" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-3.8.3.tgz#e921f5482f1cbe5814891c878f26e704bbffd8f4" + integrity sha512-I9L/d+ilTPPA4vq3NC1OPKmw7jJIpMKNdyfR8t1EXYzYCjyqbc59migOm1YSse/VRbISLJ+QGb5k4Y3bz2lkYw== + dependencies: + "@cypress/listr-verbose-renderer" "0.4.1" + "@cypress/xvfb" "1.2.4" + "@types/sizzle" "2.3.2" + arch "2.1.1" + bluebird "3.5.0" + cachedir "1.3.0" + chalk "2.4.2" + check-more-types "2.24.0" + commander "2.15.1" + common-tags "1.8.0" + debug "3.2.6" + eventemitter2 "4.1.2" + execa "0.10.0" + executable "4.1.1" + extract-zip "1.6.7" + fs-extra "5.0.0" + getos "3.1.1" + is-ci "1.2.1" + is-installed-globally "0.1.0" + lazy-ass "1.6.0" + listr "0.12.0" + lodash "4.17.15" + log-symbols "2.2.0" + minimist "1.2.0" + moment "2.24.0" + ramda "0.24.1" + request "2.88.0" + request-progress "3.0.0" + supports-color "5.5.0" + tmp "0.1.0" + untildify "3.0.3" + url "0.11.0" + yauzl "2.10.0" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +date-fns@^1.27.2: + version "1.30.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== + +debug@2.6.9, debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@3.2.6, debug@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +diff@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +es-abstract@^1.17.0-next.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" + integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@^1.8.1: + version "1.12.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" + integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-plugin-align-assignments@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-align-assignments/-/eslint-plugin-align-assignments-1.1.2.tgz#83e1a8a826d4adf29e82b52d0bb39c88b301b576" + integrity sha512-I1ZJgk9EjHfGVU9M2Ex8UkVkkjLL5Y9BS6VNnQHq79eHj2H4/Cgxf36lQSUTLgm2ntB03A2NtF+zg9fyi5vChg== + +eslint-plugin-chai-friendly@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.5.0.tgz#42418c35c4a83584f3b98449b7b8f4f56205a0a3" + integrity sha512-Pxe6z8C9fP0pn2X2nGFU/b3GBOCM/5FVus1hsMwJsXP3R7RiXFl7g0ksJbsc0GxiLyidTW4mEFk77qsNn7Tk7g== + +eslint-plugin-cypress@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-cypress/-/eslint-plugin-cypress-2.8.1.tgz#981a0f3658b40de430bcf05cabc96b396487c91f" + integrity sha512-jDpcP+MmjmqQO/x3bwIXgp4cl7Q66RYS5/IsuOQP4Qo2sEqE3DI8tTxBQ1EhnV5qEDd2Z2TYHR+5vYI6oCN4uw== + dependencies: + globals "^11.12.0" + +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@^6.7.2: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" + integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== + dependencies: + acorn "^7.1.0" + acorn-jsx "^5.1.0" + eslint-visitor-keys "^1.1.0" + +esprima@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" + integrity sha1-dqD9Zvz+FU/SkmZ9wmQBl1CxZXs= + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eventemitter2@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-4.1.2.tgz#0e1a8477af821a6ef3995b311bf74c23a5247f15" + integrity sha1-DhqEd6+CGm7zmVsxG/dMI6UkfxU= + +execa@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== + dependencies: + 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" + +executable@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extract-zip@1.6.7: + version "1.6.7" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" + integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= + dependencies: + concat-stream "1.6.2" + debug "2.6.9" + mkdirp "0.5.1" + yauzl "2.4.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU= + dependencies: + pend "~1.2.0" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + +figures@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +figures@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" + integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +find-up@3.0.0, find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flat@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" + integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== + dependencies: + is-buffer "~2.0.3" + +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fs-extra@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +getos@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.1.1.tgz#967a813cceafee0156b0483f7cffa5b3eff029c5" + integrity sha512-oUP1rnEhAr97rkitiszGP9EgDVYnmchgFzfqRzSkgtfv7ai6tEi7Ko8GgjNXts7VLWEqrTWyhsOKLe5C5b/Zkg== + dependencies: + async "2.6.1" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + 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" + +glob@^7.1.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + 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" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +globals@^11.12.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" + integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== + dependencies: + type-fest "^0.8.1" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.2.11: + version "0.2.11" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.2.11.tgz#1ce60a3a57864a292d1321ff4609ca4bb965adc8" + integrity sha1-HOYKOleGSiktEyH/RgnKS7llrcg= + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +import-fresh@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inquirer@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.1.tgz#13f7980eedc73c689feff3994b109c4e799c6ebb" + integrity sha512-V1FFQ3TIO15det8PijPLFR9M9baSlnRs9nL7zWu1MNVA2T9YVl9ZbrHJhYs7e9X8jeMZ3lr2JH/rdHFgNCBdYw== + dependencies: + 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.5.3" + string-width "^4.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +is-buffer@~1.1.1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-buffer@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + +is-ci@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@3.13.1, js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +json-schema-ref-parser@^7.1.1: + version "7.1.3" + resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-7.1.3.tgz#21468cd180b2f1939ce93fe291f743b441e97d49" + integrity sha512-/Lmyl0PW27dOmCO03PI339+1gs4Z2PlqIyUgzIOtoRp08zkkMCB30TRbdppbPO7WWzZX0uT98HqkDiZSujkmbA== + dependencies: + call-me-maybe "^1.0.1" + js-yaml "^3.13.1" + ono "^6.0.0" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-schema@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.5.tgz#97997f50972dd0500214e208c407efa4b5d7063b" + integrity sha512-gWJOWYFrhQ8j7pVm0EM8Slr+EPVq1Phf6lvzvD/WCeqkrx/f2xBI0xOsRRS9xCn3I4vKtP519dvs3TP09r24wQ== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonpath@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-1.0.2.tgz#e6aae681d03e9a77b4651d5d96eac5fc63b1fd13" + integrity sha512-rmzlgFZiQPc6q4HDyK8s9Qb4oxBnI5sF61y/Co5PV0lc3q2bIuRsNdueVbhoSHdKM4fxeimphOAtfz47yjCfeA== + dependencies: + esprima "1.2.2" + static-eval "2.0.2" + underscore "1.7.0" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +lazy-ass@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + integrity sha1-eZllXoZGwX8In90YfRUNMyTVRRM= + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= + +listr-update-renderer@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz#ca80e1779b4e70266807e8eed1ad6abe398550f9" + integrity sha1-yoDhd5tOcCZoB+ju0a1qvjmFUPk= + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^1.0.2" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35" + integrity sha1-ggb0z21S3cWCfl/RSYng6WWTOjU= + dependencies: + chalk "^1.1.3" + cli-cursor "^1.0.2" + date-fns "^1.27.2" + figures "^1.7.0" + +listr@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.12.0.tgz#6bce2c0f5603fa49580ea17cd6a00cc0e5fa451a" + integrity sha1-a84sD1YD+klYDqF81qAMwOX6RRo= + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + figures "^1.7.0" + indent-string "^2.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.2.0" + listr-verbose-renderer "^0.4.0" + log-symbols "^1.0.2" + log-update "^1.0.2" + ora "^0.2.3" + p-map "^1.1.1" + rxjs "^5.0.0-beta.11" + stream-to-observable "^0.1.0" + strip-ansi "^3.0.1" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash.once@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + +lodash@4.17.15, lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +log-symbols@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= + dependencies: + chalk "^1.0.0" + +log-update@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" + integrity sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE= + dependencies: + ansi-escapes "^1.0.0" + cli-cursor "^1.0.2" + +md5@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + +mime-db@1.42.0: + version "1.42.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" + integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.25" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.25.tgz#39772d46621f93e2a80a856c53b86a62156a6437" + integrity sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg== + dependencies: + mime-db "1.42.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +mkdirp@0.5.1, mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mocha-junit-reporter@^1.23.1: + version "1.23.1" + resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-1.23.1.tgz#ba11519c0b967f404e4123dd69bc4ba022ab0f12" + integrity sha512-qeDvKlZyAH2YJE1vhryvjUQ06t2hcnwwu4k5Ddwn0GQINhgEYFhlGM0DwYCVUHq5cuo32qAW6HDsTHt7zz99Ng== + dependencies: + debug "^2.2.0" + md5 "^2.1.0" + mkdirp "~0.5.1" + strip-ansi "^4.0.0" + xml "^1.0.0" + +mocha@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.2.tgz#5d8987e28940caf8957a7d7664b910dc5b2fea20" + integrity sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A== + dependencies: + ansi-colors "3.2.3" + browser-stdout "1.3.1" + debug "3.2.6" + diff "3.5.0" + escape-string-regexp "1.0.5" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "2.2.0" + minimatch "3.0.4" + mkdirp "0.5.1" + ms "2.1.1" + node-environment-flags "1.0.5" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.0" + yargs-parser "13.1.1" + yargs-unparser "1.6.0" + +moment@2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" + integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-environment-flags@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" + integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@4.1.0, object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= + +onetime@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" + integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + dependencies: + mimic-fn "^2.1.0" + +ono@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/ono/-/ono-6.0.0.tgz#c0c51b61f6ee56fccd56421620f351de7e8e3200" + integrity sha512-vhx50giT0dDBLYYXwKU/tuNsT6CwPzGZmd6yypPsXrkq+ujT0lX0q4tvMQ/5jxM6HKntk7p3N51Ts0fD8qL5dA== + +optionator@^0.8.1, optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +ora@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" + integrity sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q= + dependencies: + chalk "^1.1.1" + cli-cursor "^1.0.2" + cli-spinners "^0.1.2" + object-assign "^4.0.1" + +os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +pify@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +psl@^1.1.24: + version "1.7.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" + integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-1.2.0.tgz#ed079be28682147e6fd9a34cc2b0c1e0ec6453ee" + integrity sha1-7Qeb4oaCFH5v2aNMwrDB4OxkU+4= + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +ramda@0.24.1: + version "0.24.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.24.1.tgz#c3b7755197f35b8dc3502228262c4c91ddb6b857" + integrity sha1-w7d1UZfzW43DUCIoJixMkd22uFc= + +readable-stream@^2.2.2: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + 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" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +request-progress@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + integrity sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4= + dependencies: + throttleit "^1.0.0" + +request@2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE= + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +rxjs@^5.0.0-beta.11: + version "5.5.12" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" + integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== + dependencies: + symbol-observable "1.0.1" + +rxjs@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" + integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@0.5.x: + version "0.5.8" + resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" + integrity sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE= + +semver@^5.5.0, semver@^5.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.1.2: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +static-eval@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" + integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== + dependencies: + escodegen "^1.8.1" + +stream-to-observable@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.1.0.tgz#45bf1d9f2d7dc09bed81f1c307c430e68b84cffe" + integrity sha1-Rb8dny19wJvtgfHDB8Qw5ouEz/4= + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-json-comments@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +supports-color@5.5.0, supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== + dependencies: + has-flag "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tmp@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" + integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== + dependencies: + rimraf "^2.6.3" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +underscore@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" + integrity sha1-a7rwh3UA02vjTsqlhODbn+8DUgk= + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +untildify@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" + integrity sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +url@0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +uuid@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" + integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== + +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1.3.1, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +xml2js@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.0.tgz#124fc4114b4129c810800ecb2ac86cf25462cb9a" + integrity sha1-Ek/EEUtBKcgQgA7LKshs8lRiy5o= + dependencies: + sax "0.5.x" + xmlbuilder ">=0.4.2" + +xml@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" + integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU= + +xmlbuilder@>=0.4.2: + version "13.0.2" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-13.0.2.tgz#02ae33614b6a047d1c32b5389c1fdacb2bce47a7" + integrity sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ== + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yaml@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-0.2.3.tgz#b5450e92e76ef36b5dd24e3660091ebaeef3e5c7" + integrity sha1-tUUOkudu82td0k42YAkeuu7z5cc= + +yargs-parser@13.1.1, yargs-parser@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-unparser@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" + integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== + dependencies: + flat "^4.1.0" + lodash "^4.17.15" + yargs "^13.3.0" + +yargs@13.3.0, yargs@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1" + +yauzl@2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yauzl@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= + dependencies: + fd-slicer "~1.0.1" diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 011290f7d..000000000 --- a/webpack.config.js +++ /dev/null @@ -1,114 +0,0 @@ -const path = require('path'); -const webpack = require('webpack'); -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const Visualizer = require('webpack-visualizer-plugin'); -const CopyWebpackPlugin = require('copy-webpack-plugin'); - -module.exports = { - entry: { - main: './src/frontend/js/index.js', - login: './src/frontend/js/login.js' - }, - output: { - path: path.resolve(__dirname, 'dist'), - filename: 'js/[name].bundle.js', - chunkFilename: 'js/[name].bundle.[id].js', - publicPath: '/' - }, - resolve: { - alias: { - 'tabler-core': 'tabler-ui/dist/assets/js/core', - 'bootstrap': 'tabler-ui/dist/assets/js/vendors/bootstrap.bundle.min', - 'sparkline': 'tabler-ui/dist/assets/js/vendors/jquery.sparkline.min', - 'selectize': 'tabler-ui/dist/assets/js/vendors/selectize.min', - 'tablesorter': 'tabler-ui/dist/assets/js/vendors/jquery.tablesorter.min', - 'vector-map': 'tabler-ui/dist/assets/js/vendors/jquery-jvectormap-2.0.3.min', - 'vector-map-de': 'tabler-ui/dist/assets/js/vendors/jquery-jvectormap-de-merc', - 'vector-map-world': 'tabler-ui/dist/assets/js/vendors/jquery-jvectormap-world-mill', - 'circle-progress': 'tabler-ui/dist/assets/js/vendors/circle-progress.min', - 'c3': 'tabler-ui/dist/assets/js/vendors/chart.bundle.min' - } - }, - module: { - rules: [ - // Shims for tabler-ui - { - test: /assets\/js\/core/, - loader: 'imports-loader?bootstrap' - }, - { - test: /jquery-jvectormap-de-merc/, - loader: 'imports-loader?vector-map' - }, - { - test: /jquery-jvectormap-world-mill/, - loader: 'imports-loader?vector-map' - }, - - // other: - { - type: 'javascript/auto', // <= Set the module.type explicitly - test: /\bmessages\.json$/, - loader: 'messageformat-loader', - options: { - biDiSupport: false, - disablePluralKeyChecks: false, - formatters: null, - intlSupport: false, - locale: ['en'/*, 'es'*/], - strictNumberSign: false - } - }, - { - test: /\.js$/, - exclude: /node_modules/, - use: { - loader: 'babel-loader' - } - }, - { - test: /\.ejs$/, - loader: 'ejs-loader' - }, - { - test: /\.scss$/, - use: [ - MiniCssExtractPlugin.loader, - 'css-loader', - 'sass-loader' - ] - }, - { - test: /.*tabler.*\.(jpe?g|gif|png|svg|eot|woff|ttf)$/, - use: [ - { - loader: 'file-loader', - options: { - outputPath: 'assets/tabler-ui/' - } - } - ] - } - ] - }, - plugins: [ - new webpack.ProvidePlugin({ - $: 'jquery', - jQuery: 'jquery', - _: 'underscore' - }), - new MiniCssExtractPlugin({ - filename: 'css/[name].css', - chunkFilename: 'css/[id].css' - }), - new Visualizer({ - filename: '../webpack_stats.html' - }), - new CopyWebpackPlugin([{ - from: 'src/frontend/app-images', - to: 'images', - toType: 'dir', - context: '/app' - }]) - ] -}; From 447cf12629f95c33fe2078cd72e7d024d3e5a585 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Wed, 19 Feb 2020 15:28:27 +1000 Subject: [PATCH 003/914] Fix master docker pushes, hopefully --- Jenkinsfile | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 04089ed14..ec79d5eb6 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -15,9 +15,6 @@ pipeline { COMPOSE_INTERACTIVE_NO_CLI = 1 BUILDX_NAME = "${COMPOSE_PROJECT_NAME}" BRANCH_LOWER = "${BRANCH_NAME.toLowerCase()}" - - // Defaults to the Branch name, which is applies to all branches AND pr's - BUILDX_PUSH_TAGS = "-t docker.io/jc21/${IMAGE}:github-${BRANCH_LOWER}" } stages { stage('Environment') { @@ -32,6 +29,19 @@ pipeline { } } } + stage('Other') { + when { + not { + branch 'master' + } + } + steps { + script { + // Defaults to the Branch name, which is applies to all branches AND pr's + env.BUILDX_PUSH_TAGS = "-t docker.io/jc21/${IMAGE}:github-${BRANCH_LOWER}" + } + } + } } } stage('Frontend') { From f9e15a44707c41cc539b45df7cbedf7bb4d278bd Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Wed, 19 Feb 2020 15:46:52 +1000 Subject: [PATCH 004/914] Fix docker push for branches containing slashes --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index ec79d5eb6..497ce8bb4 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -14,7 +14,7 @@ pipeline { COMPOSE_FILE = 'docker/docker-compose.ci.yml' COMPOSE_INTERACTIVE_NO_CLI = 1 BUILDX_NAME = "${COMPOSE_PROJECT_NAME}" - BRANCH_LOWER = "${BRANCH_NAME.toLowerCase()}" + BRANCH_LOWER = "${BRANCH_NAME.toLowerCase().replaceAll('/', '-')}" } stages { stage('Environment') { From a25f196ceb64898337ce09135737d271d705ddf1 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Wed, 19 Feb 2020 15:49:32 +1000 Subject: [PATCH 005/914] Push to latest for master branch as well --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 497ce8bb4..2b3743d57 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -25,7 +25,7 @@ pipeline { } steps { script { - env.BUILDX_PUSH_TAGS = "-t docker.io/jc21/${IMAGE}:${BUILD_VERSION} -t docker.io/jc21/${IMAGE}:${MAJOR_VERSION}" + env.BUILDX_PUSH_TAGS = "-t docker.io/jc21/${IMAGE}:${BUILD_VERSION} -t docker.io/jc21/${IMAGE}:${MAJOR_VERSION} -t docker.io/jc21/${IMAGE}:latest" } } } From 43b5720532e73f680f1a79da55c1bfab13c17af1 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Wed, 19 Feb 2020 16:11:52 +1000 Subject: [PATCH 006/914] Fix docker push for branches containing slashes, again --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 2b3743d57..322f22f7f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -10,11 +10,11 @@ pipeline { IMAGE = "nginx-proxy-manager" BUILD_VERSION = getVersion() MAJOR_VERSION = "2" - COMPOSE_PROJECT_NAME = "npm_${GIT_BRANCH}_${BUILD_NUMBER}" + BRANCH_LOWER = "${BRANCH_NAME.toLowerCase().replaceAll('/', '-')}" + COMPOSE_PROJECT_NAME = "npm_${BRANCH_LOWER}_${BUILD_NUMBER}" COMPOSE_FILE = 'docker/docker-compose.ci.yml' COMPOSE_INTERACTIVE_NO_CLI = 1 BUILDX_NAME = "${COMPOSE_PROJECT_NAME}" - BRANCH_LOWER = "${BRANCH_NAME.toLowerCase().replaceAll('/', '-')}" } stages { stage('Environment') { From 26a8e234fae8845421ead0172014a37986dd06eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Feb 2020 16:32:19 +1000 Subject: [PATCH 007/914] Bump knex from 0.15.2 to 0.19.5 in /backend (#294) Bumps [knex](https://github.com/knex/knex) from 0.15.2 to 0.19.5. - [Release notes](https://github.com/knex/knex/releases) - [Changelog](https://github.com/knex/knex/blob/master/CHANGELOG.md) - [Commits](https://github.com/knex/knex/compare/0.15.2...0.19.5) Signed-off-by: dependabot[bot] Co-authored-by: jc21 --- backend/package.json | 2 +- backend/yarn.lock | 168 +++++++++++++++++-------------------------- 2 files changed, 68 insertions(+), 102 deletions(-) diff --git a/backend/package.json b/backend/package.json index 9a1a12b08..86efc4239 100644 --- a/backend/package.json +++ b/backend/package.json @@ -17,7 +17,7 @@ "html-entities": "^1.2.1", "json-schema-ref-parser": "^5.0.3", "jsonwebtoken": "^8.3.0", - "knex": "^0.15.2", + "knex": "^0.19.5", "liquidjs": "^5.1.1", "lodash": "^4.17.10", "moment": "^2.22.2", diff --git a/backend/yarn.lock b/backend/yarn.lock index d37dfa98e..7ee2adc86 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -182,14 +182,6 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -231,7 +223,7 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== -bluebird@^3.5.1, bluebird@^3.5.5: +bluebird@^3.5.5, bluebird@^3.7.0: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -359,15 +351,6 @@ capture-stack-trace@^1.0.0: resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== -chalk@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" - integrity sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" @@ -482,10 +465,15 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -commander@^2.16.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +colorette@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.1.0.tgz#1f943e5a357fac10b4e0f5aaef3b14cdc1af6ec7" + integrity sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg== + +commander@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== component-emitter@^1.2.1: version "1.3.0" @@ -568,11 +556,6 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js@^2.4.0: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== - core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -622,12 +605,12 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== +debug@4.1.1, debug@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: - ms "2.0.0" + ms "^2.1.1" debug@^3.1.0, debug@^3.2.6: version "3.2.6" @@ -636,13 +619,6 @@ debug@^3.1.0, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1121,13 +1097,13 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" -findup-sync@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" - integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= +findup-sync@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== dependencies: detect-file "^1.0.0" - is-glob "^3.1.0" + is-glob "^4.0.0" micromatch "^3.0.4" resolve-dir "^1.0.1" @@ -1262,6 +1238,11 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= +getopts@2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.5.tgz#67a0fe471cacb9c687d817cab6450b96dde8313b" + integrity sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA== + glob-parent@^5.0.0, glob-parent@~5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" @@ -1482,7 +1463,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1516,7 +1497,7 @@ inquirer@^7.0.0: strip-ansi "^5.1.0" through "^2.3.6" -interpret@^1.1.0: +interpret@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== @@ -1621,7 +1602,7 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^2.1.0, is-extglob@^2.1.1: +is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= @@ -1643,13 +1624,6 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" @@ -1876,27 +1850,26 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -knex@^0.15.2: - version "0.15.2" - resolved "https://registry.yarnpkg.com/knex/-/knex-0.15.2.tgz#6059b87489605f4cc87599a6d2a9d265709e9340" - integrity sha1-YFm4dIlgX0zIdZmm0qnSZXCek0A= - dependencies: - babel-runtime "^6.26.0" - bluebird "^3.5.1" - chalk "2.3.2" - commander "^2.16.0" - debug "3.1.0" - inherits "~2.0.3" - interpret "^1.1.0" - liftoff "2.5.0" - lodash "^4.17.10" - minimist "1.2.0" +knex@^0.19.5: + version "0.19.5" + resolved "https://registry.yarnpkg.com/knex/-/knex-0.19.5.tgz#3597ebecf88a5942f18c3e6d91af53bda59eeb5d" + integrity sha512-Hy258avCVircQq+oj3WBqPzl8jDIte438Qlq+8pt1i/TyLYVA4zPh2uKc7Bx0t+qOpa6D42HJ2jjtl2vagzilw== + dependencies: + bluebird "^3.7.0" + colorette "1.1.0" + commander "^3.0.2" + debug "4.1.1" + getopts "2.2.5" + inherits "~2.0.4" + interpret "^1.2.0" + liftoff "3.1.0" + lodash "^4.17.15" mkdirp "^0.5.1" - pg-connection-string "2.0.0" - tarn "^1.1.4" - tildify "1.2.0" - uuid "^3.3.2" - v8flags "^3.1.1" + pg-connection-string "2.1.0" + tarn "^2.0.0" + tildify "2.0.0" + uuid "^3.3.3" + v8flags "^3.1.3" latest-version@^3.0.0: version "3.1.0" @@ -1920,13 +1893,13 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -liftoff@2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" - integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew= +liftoff@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3" + integrity sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog== dependencies: extend "^3.0.0" - findup-sync "^2.0.0" + findup-sync "^3.0.0" fined "^1.0.1" flagged-respawn "^1.0.0" is-plain-object "^2.0.4" @@ -2136,7 +2109,7 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@1.2.0, minimist@^1.2.0: +minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= @@ -2619,10 +2592,10 @@ path@^0.12.7: process "^0.11.1" util "^0.10.3" -pg-connection-string@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.0.0.tgz#3eefe5997e06d94821e4d502e42b6a1c73f8df82" - integrity sha1-Pu/lmX4G2Ugh5NUC5CtqHHP434I= +pg-connection-string@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.1.0.tgz#e07258f280476540b24818ebb5dca29e101ca502" + integrity sha512-bhlV7Eq09JrRIvo1eKngpwuqKtJnNhZdpdOlvrPrA4dxqXPjxSrbNrfnIDmTpwMyRszrcV4kU5ZA4mMsQUrjdg== picomatch@^2.0.4, picomatch@^2.0.7: version "2.2.1" @@ -2785,11 +2758,6 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -3268,10 +3236,10 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.3" -tarn@^1.1.4: - version "1.1.5" - resolved "https://registry.yarnpkg.com/tarn/-/tarn-1.1.5.tgz#7be88622e951738b9fa3fb77477309242cdddc2d" - integrity sha512-PMtJ3HCLAZeedWjJPgGnCvcphbCOMbtZpjKgLq3qM5Qq9aQud+XHrL0WlrlgnTyS8U+jrjGbEXprFcQrxPy52g== +tarn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tarn/-/tarn-2.0.0.tgz#c68499f69881f99ae955b4317ca7d212d942fdee" + integrity sha512-7rNMCZd3s9bhQh47ksAQd92ADFcJUjjbyOvyFjNLwTPpGieFHMC84S+LOzw0fx1uh6hnDz/19r8CPMnIjJlMMA== temp-dir@^1.0.0: version "1.0.0" @@ -3307,12 +3275,10 @@ through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -tildify@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" - integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo= - dependencies: - os-homedir "^1.0.0" +tildify@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a" + integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw== timed-out@^4.0.0: version "4.0.1" @@ -3509,7 +3475,7 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.1, uuid@^3.3.2: +uuid@^3.0.1, uuid@^3.3.3: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -3519,7 +3485,7 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== -v8flags@^3.1.1: +v8flags@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8" integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w== From 6f298ada61936c13b432d17f574170ce7fa2fa06 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Wed, 19 Feb 2020 16:48:18 +1000 Subject: [PATCH 008/914] Updated version in readme label --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 179295085..5b75857fe 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # Nginx Proxy Manager -![Version](https://img.shields.io/badge/version-2.0.14-green.svg?style=for-the-badge) +![Version](https://img.shields.io/badge/version-2.1.0-green.svg?style=for-the-badge) ![Stars](https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge) ![Pulls](https://img.shields.io/docker/pulls/jc21/nginx-proxy-manager.svg?style=for-the-badge) From e869c76e63c08d538e3deee1794dd9116f9bcc0f Mon Sep 17 00:00:00 2001 From: jc21 Date: Wed, 19 Feb 2020 17:48:49 +1100 Subject: [PATCH 009/914] Updated version in readme label (#295) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 179295085..5b75857fe 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # Nginx Proxy Manager -![Version](https://img.shields.io/badge/version-2.0.14-green.svg?style=for-the-badge) +![Version](https://img.shields.io/badge/version-2.1.0-green.svg?style=for-the-badge) ![Stars](https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge) ![Pulls](https://img.shields.io/docker/pulls/jc21/nginx-proxy-manager.svg?style=for-the-badge) From f040de578861a9d30f9584df634581790733188d Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Thu, 20 Feb 2020 09:17:45 +1000 Subject: [PATCH 010/914] Update backend packages Liquid required some changes Version bump --- .version | 2 +- README.md | 2 +- backend/internal/ip_ranges.js | 4 +- backend/internal/nginx.js | 6 +- backend/package.json | 89 +++++----- backend/yarn.lock | 319 ++++++++++++++-------------------- frontend/package.json | 2 +- 7 files changed, 181 insertions(+), 243 deletions(-) diff --git a/.version b/.version index 50aea0e7a..7c3272873 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.1.0 \ No newline at end of file +2.1.1 \ No newline at end of file diff --git a/README.md b/README.md index 5b75857fe..680304f9f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # Nginx Proxy Manager -![Version](https://img.shields.io/badge/version-2.1.0-green.svg?style=for-the-badge) +![Version](https://img.shields.io/badge/version-2.1.1-green.svg?style=for-the-badge) ![Stars](https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge) ![Pulls](https://img.shields.io/docker/pulls/jc21/nginx-proxy-manager.svg?style=for-the-badge) diff --git a/backend/internal/ip_ranges.js b/backend/internal/ip_ranges.js index 3f07cb39e..edf5c3a01 100644 --- a/backend/internal/ip_ranges.js +++ b/backend/internal/ip_ranges.js @@ -3,7 +3,7 @@ const fs = require('fs'); const logger = require('../logger').ip_ranges; const error = require('../lib/error'); const internalNginx = require('./nginx'); -const Liquid = require('liquidjs'); +const { Liquid } = require('liquidjs'); const CLOUDFRONT_URL = 'https://ip-ranges.amazonaws.com/ip-ranges.json'; const CLOUDFARE_V4_URL = 'https://www.cloudflare.com/ips-v4'; @@ -116,7 +116,7 @@ const internalIpRanges = { * @returns {Promise} */ generateConfig: (ip_ranges) => { - let renderEngine = Liquid({ + let renderEngine = new Liquid({ root: __dirname + '/../templates/' }); diff --git a/backend/internal/nginx.js b/backend/internal/nginx.js index 6d4aa5fc7..8bfc77a43 100644 --- a/backend/internal/nginx.js +++ b/backend/internal/nginx.js @@ -1,9 +1,9 @@ const _ = require('lodash'); const fs = require('fs'); -const Liquid = require('liquidjs'); const logger = require('../logger').nginx; const utils = require('../lib/utils'); const error = require('../lib/error'); +const { Liquid } = require('liquidjs'); const debug_mode = process.env.NODE_ENV !== 'production' || !!process.env.DEBUG; const internalNginx = { @@ -181,7 +181,7 @@ const internalNginx = { logger.info('Generating ' + host_type + ' Config:', host); } - let renderEngine = Liquid({ + let renderEngine = new Liquid({ root: __dirname + '/../templates/' }); @@ -263,7 +263,7 @@ const internalNginx = { logger.info('Generating LetsEncrypt Request Config:', certificate); } - let renderEngine = Liquid({ + let renderEngine = new Liquid({ root: __dirname + '/../templates/' }); diff --git a/backend/package.json b/backend/package.json index 86efc4239..f58b22565 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,48 +1,45 @@ { - "name": "nginx-proxy-manager", - "version": "2.1.0", - "description": "A beautiful interface for creating Nginx endpoints", - "main": "js/index.js", - "dependencies": { - "ajv": "^6.5.1", - "batchflow": "^0.4.0", - "bcrypt": "^3.0.0", - "body-parser": "^1.18.3", - "compression": "^1.7.2", - "config": "^2.0.1", - "diskdb": "^0.1.17", - "express": "^4.16.3", - "express-fileupload": "^0.4.0", - "gravatar": "^1.6.0", - "html-entities": "^1.2.1", - "json-schema-ref-parser": "^5.0.3", - "jsonwebtoken": "^8.3.0", - "knex": "^0.19.5", - "liquidjs": "^5.1.1", - "lodash": "^4.17.10", - "moment": "^2.22.2", - "mysql": "^2.15.0", - "node-rsa": "^1.0.0", - "nodemon": "^2.0.2", - "objection": "^1.1.10", - "path": "^0.12.7", - "restler": "^3.4.0", - "signale": "^1.2.1", - "temp-write": "^3.4.0", - "unix-timestamp": "^0.2.0" - }, - "scripts": { - "build": "webpack --mode production" - }, - "signale": { - "displayDate": true, - "displayTimestamp": true - }, - "author": "Jamie Curnow ", - "license": "MIT", - "devDependencies": { - "eslint": "^6.8.0", - "eslint-plugin-align-assignments": "^1.1.2", - "prettier": "^1.19.1" - } + "name": "nginx-proxy-manager", + "version": "2.1.1", + "description": "A beautiful interface for creating Nginx endpoints", + "main": "js/index.js", + "dependencies": { + "ajv": "^6.11.0", + "batchflow": "^0.4.0", + "bcrypt": "^3.0.8", + "body-parser": "^1.19.0", + "compression": "^1.7.4", + "config": "^3.2.5", + "diskdb": "^0.1.17", + "express": "^4.17.1", + "express-fileupload": "^1.1.6", + "gravatar": "^1.8.0", + "html-entities": "^1.2.1", + "json-schema-ref-parser": "^7.1.3", + "jsonwebtoken": "^8.5.1", + "knex": "^0.20.10", + "liquidjs": "^9.7.1", + "lodash": "^4.17.15", + "moment": "^2.24.0", + "mysql": "^2.18.1", + "node-rsa": "^1.0.7", + "nodemon": "^2.0.2", + "objection": "^2.1.3", + "path": "^0.12.7", + "restler": "^3.4.0", + "signale": "^1.4.0", + "temp-write": "^4.0.0", + "unix-timestamp": "^0.2.0" + }, + "signale": { + "displayDate": true, + "displayTimestamp": true + }, + "author": "Jamie Curnow ", + "license": "MIT", + "devDependencies": { + "eslint": "^6.8.0", + "eslint-plugin-align-assignments": "^1.1.2", + "prettier": "^1.19.1" + } } diff --git a/backend/yarn.lock b/backend/yarn.lock index 7ee2adc86..e6fcb37a4 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -41,7 +41,7 @@ acorn@^7.1.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.1: +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.11.0: version "6.11.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9" integrity sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA== @@ -205,13 +205,13 @@ batchflow@^0.4.0: resolved "https://registry.yarnpkg.com/batchflow/-/batchflow-0.4.0.tgz#7d419df79b6b7587b06f9ea34f96ccef6f74e5b5" integrity sha1-fUGd95trdYewb56jT5bM72905bU= -bcrypt@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-3.0.7.tgz#1187d29df2e1cde44268152b13e3d4a655a7c7de" - integrity sha512-K5UglF9VQvBMHl/1elNyyFvAfOY9Bj+rpKrCSR9sFwcW8FywAYJSRwTURNej5TaAK2TEJkcJ6r6lh1YPmspx5Q== +bcrypt@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-3.0.8.tgz#fe437b7569faffc1105c3c3f6e7d2913e3d3bea5" + integrity sha512-jKV6RvLhI36TQnPDvUFqBEnGX9c8dRRygKxCZu7E+MgLfKZbmmXL8a7/SFFOyHoPNX9nV81cKRC5tbQfvEQtpw== dependencies: nan "2.14.0" - node-pre-gyp "0.13.0" + node-pre-gyp "0.14.0" bignumber.js@9.0.0: version "9.0.0" @@ -223,7 +223,7 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== -bluebird@^3.5.5, bluebird@^3.7.0: +bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -233,7 +233,7 @@ blueimp-md5@^2.3.0: resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.12.0.tgz#be7367938a889dec3ffbb71138617c117e9c130a" integrity sha512-zo+HIdIhzojv6F1siQPqPFROyVy7C50KzHv/k/Iz+BtvtVzSHXiMXOpq2wCfNkeBqdCv+V8XOV96tsEt2W/3rQ== -body-parser@1.19.0, body-parser@^1.18.3: +body-parser@1.19.0, body-parser@^1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== @@ -298,13 +298,12 @@ buffer-equal-constant-time@1.0.1: resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= -busboy@^0.2.14: - version "0.2.14" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" - integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM= +busboy@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" + integrity sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw== dependencies: - dicer "0.2.5" - readable-stream "1.1.x" + dicer "0.3.0" bytes@3.0.0: version "3.0.0" @@ -374,11 +373,6 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -charenc@~0.0.1: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= - chokidar@^3.2.2: version "3.3.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" @@ -395,9 +389,9 @@ chokidar@^3.2.2: fsevents "~2.1.2" chownr@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== ci-info@^1.5.0: version "1.6.0" @@ -470,10 +464,10 @@ colorette@1.1.0: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.1.0.tgz#1f943e5a357fac10b4e0f5aaef3b14cdc1af6ec7" integrity sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg== -commander@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== component-emitter@^1.2.1: version "1.3.0" @@ -487,7 +481,7 @@ compressible@~2.0.16: dependencies: mime-db ">= 1.43.0 < 2" -compression@^1.7.2: +compression@^1.7.4: version "1.7.4" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== @@ -505,10 +499,10 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -config@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/config/-/config-2.0.2.tgz#b81c8f4e05203e1da7752864c19a11604ca923d7" - integrity sha512-duIbkKb0gls0bOtGwd1vaD4236MwepQlZcrMheOGrn3/9Px7oYFh8G4LB3ylGOlPr5wGoJRm8Grb2RihJZxuHQ== +config@^3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/config/-/config-3.2.5.tgz#ab10ab88b61a873fbf9a5f0c6b4a22750422f243" + integrity sha512-8itpjyR01lAJanhAlPncBngYRZez/LoRLW8wnGi+6SEcsUyA1wvHvbpIrAJYDJT+W9BScnj4mYoUgbtp9I+0+Q== dependencies: json5 "^1.0.1" @@ -588,16 +582,16 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -crypt@~0.0.1: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= - crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= +db-errors@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/db-errors/-/db-errors-0.2.3.tgz#a6a38952e00b20e790f2695a6446b3c65497ffa2" + integrity sha512-OOgqgDuCavHXjYSJoV2yGhv6SeG8nk42aoCSoyXLZUH7VwFG27rxbavU1z+VrZbZjphw5UkDQwUlD21MwZpUng== + debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -612,7 +606,7 @@ debug@4.1.1, debug@^4.0.1: dependencies: ms "^2.1.1" -debug@^3.1.0, debug@^3.2.6: +debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -686,12 +680,11 @@ detect-libc@^1.0.2: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -dicer@0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" - integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8= +dicer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" + integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== dependencies: - readable-stream "1.1.x" streamsearch "0.1.2" diskdb@^0.1.17: @@ -846,6 +839,11 @@ eslint@^6.8.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" +esm@^3.2.25: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + espree@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" @@ -935,17 +933,14 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" -express-fileupload@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/express-fileupload/-/express-fileupload-0.4.0.tgz#de6d1dbe3122732c416f6965aa88bbf70721ad84" - integrity sha512-jPv3aCdTIdQrGAUXQ1e1hU0Vnl+0jE9IbzEsI7VRIevQybrUrIMUgvwNwBThnsetandW8+9ICgflAkhKwLUuLw== +express-fileupload@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/express-fileupload/-/express-fileupload-1.1.6.tgz#0ac2659ad8c1128c92c8580fd6e15b8b15343db0" + integrity sha512-w24zPWT8DkoIxSVkbxYPo9hkTiLpCQQzNsLRTCnecBhfbYv+IkIC5uLw2MIUAxBZ+7UMmXPjGxlhzUXo4RcbZw== dependencies: - busboy "^0.2.14" - fs-extra "^4.0.1" - md5 "^2.2.1" - streamifier "^0.1.1" + busboy "^0.3.1" -express@^4.16.3: +express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== @@ -1149,11 +1144,6 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" -format-util@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" - integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== - forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -1171,15 +1161,6 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -fs-extra@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-minipass@^1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" @@ -1313,12 +1294,12 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== -gravatar@^1.6.0: +gravatar@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/gravatar/-/gravatar-1.8.0.tgz#1dd9ce0f6bb625802377233b96796181b39af8ff" integrity sha512-00KTHk0tIgOdTGShjE64JS66WHlOAnku7nRyER4OsU5ekFvWZICpV0JYgwyp9NdId2KbJWqK03rn87LXBd1U4g== @@ -1463,7 +1444,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1497,10 +1478,10 @@ inquirer@^7.0.0: strip-ansi "^5.1.0" through "^2.3.6" -interpret@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== +interpret@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.0.0.tgz#b783ffac0b8371503e9ab39561df223286aa5433" + integrity sha512-e0/LknJ8wpMMhTiWcjivB+ESwIuvHnBSlBbmP/pSb8CQJldoj1p2qv7xGZ/+BtbTziYRFSz8OsvdbiX45LtYQA== invert-kv@^2.0.0: version "2.0.0" @@ -1546,7 +1527,7 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-buffer@^1.1.5, is-buffer@~1.1.1: +is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== @@ -1702,6 +1683,11 @@ is-stream@^1.0.0, is-stream@^1.1.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + is-unc-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" @@ -1714,11 +1700,6 @@ is-windows@^1.0.1, is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -1746,7 +1727,7 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.12.0, js-yaml@^3.13.1: +js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -1759,15 +1740,14 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-schema-ref-parser@^5.0.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-5.1.3.tgz#f86c5868f40898e69169e1bbc854725a4fd0e1ad" - integrity sha512-CpDFlBwz/6la78hZxyB9FECVKGYjIIl3Ms3KLqFj99W7IIb7D00/RDgc++IGB4BBALl0QRhh5m4q5WNSopvLtQ== +json-schema-ref-parser@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-7.1.3.tgz#21468cd180b2f1939ce93fe291f743b441e97d49" + integrity sha512-/Lmyl0PW27dOmCO03PI339+1gs4Z2PlqIyUgzIOtoRp08zkkMCB30TRbdppbPO7WWzZX0uT98HqkDiZSujkmbA== dependencies: call-me-maybe "^1.0.1" - debug "^3.1.0" - js-yaml "^3.12.0" - ono "^4.0.6" + js-yaml "^3.13.1" + ono "^6.0.0" json-schema-traverse@^0.4.1: version "0.4.1" @@ -1786,14 +1766,7 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonwebtoken@^8.3.0: +jsonwebtoken@^8.5.1: version "8.5.1" resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== @@ -1850,25 +1823,26 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -knex@^0.19.5: - version "0.19.5" - resolved "https://registry.yarnpkg.com/knex/-/knex-0.19.5.tgz#3597ebecf88a5942f18c3e6d91af53bda59eeb5d" - integrity sha512-Hy258avCVircQq+oj3WBqPzl8jDIte438Qlq+8pt1i/TyLYVA4zPh2uKc7Bx0t+qOpa6D42HJ2jjtl2vagzilw== +knex@^0.20.10: + version "0.20.10" + resolved "https://registry.yarnpkg.com/knex/-/knex-0.20.10.tgz#48c22abe38fdc6856b5e9d948685ca009b3fbd77" + integrity sha512-07D6fvY5NdvrfRPmkLLG+OrHvmAy55OX7eXkN8TMiOOI5lWJh1dC2zKjeEQJqUILMOsTnZCGqTKGaRm4t1E9xg== dependencies: - bluebird "^3.7.0" + bluebird "^3.7.2" colorette "1.1.0" - commander "^3.0.2" + commander "^4.1.1" debug "4.1.1" + esm "^3.2.25" getopts "2.2.5" inherits "~2.0.4" - interpret "^1.2.0" + interpret "^2.0.0" liftoff "3.1.0" lodash "^4.17.15" mkdirp "^0.5.1" pg-connection-string "2.1.0" tarn "^2.0.0" tildify "2.0.0" - uuid "^3.3.3" + uuid "^3.4.0" v8flags "^3.1.3" latest-version@^3.0.0: @@ -1907,12 +1881,10 @@ liftoff@3.1.0: rechoir "^0.6.2" resolve "^1.1.7" -liquidjs@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/liquidjs/-/liquidjs-5.2.0.tgz#fe219154cfc66dc5da580bd6b2ecd592d1d8c6b2" - integrity sha512-bIDYRWlo8f09dNd8Hz3lHVPOpgw33jtDCebMEDj2D9g54/KhTao7/lVv+3hYtsWTW2PId4hH+1X0iuuYnQHnTg== - dependencies: - resolve-url "^0.2.1" +liquidjs@^9.7.1: + version "9.7.1" + resolved "https://registry.yarnpkg.com/liquidjs/-/liquidjs-9.7.1.tgz#31aa7f7d563b4596fc5a03300f667af0d098d660" + integrity sha512-CdZFSL5Md0VObIGjJdswjQ1volHG1/GpbvAr4pDUjA9u2a6HKQVOYzWugiBe6iZ5v8Gfm2h77KN0ckso3bLCiQ== load-json-file@^4.0.0: version "4.0.0" @@ -1967,7 +1939,7 @@ lodash.once@^4.0.0: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15: +lodash@^4.17.14, lodash@^4.17.15: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -1992,6 +1964,13 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +make-dir@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" + integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== + dependencies: + semver "^6.0.0" + make-iterator@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" @@ -2018,15 +1997,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -md5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" - integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= - dependencies: - charenc "~0.0.1" - crypt "~0.0.1" - is-buffer "~1.1.1" - media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -2144,7 +2114,7 @@ mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "0.0.8" -moment@^2.22.2: +moment@^2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== @@ -2169,7 +2139,7 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -mysql@^2.15.0: +mysql@^2.18.1: version "2.18.1" resolved "https://registry.yarnpkg.com/mysql/-/mysql-2.18.1.tgz#2254143855c5a8c73825e4522baf2ea021766717" integrity sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig== @@ -2207,9 +2177,9 @@ natural-compare@^1.4.0: integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= needle@^2.2.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" - integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== + version "2.3.2" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.2.tgz#3342dea100b7160960a450dc8c22160ac712a528" + integrity sha512-DUzITvPVDUy6vczKKYTnWc/pBZ0EnjMJnQ3y+Jo5zfKFimJs7S3HFCxCRZYB9FUZcrzUQr3WsmvZgddMEIZv6w== dependencies: debug "^3.2.6" iconv-lite "^0.4.4" @@ -2225,10 +2195,10 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-pre-gyp@0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz#df9ab7b68dd6498137717838e4f92a33fc9daa42" - integrity sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ== +node-pre-gyp@0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" + integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -2239,9 +2209,9 @@ node-pre-gyp@0.13.0: rc "^1.2.7" rimraf "^2.6.1" semver "^5.3.0" - tar "^4" + tar "^4.4.2" -node-rsa@^1.0.0: +node-rsa@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/node-rsa/-/node-rsa-1.0.7.tgz#85b7a6d6fa8ee624be6402a6b41be49272d58055" integrity sha512-idwRXma6scFufZmbaKkHpJoLL93yynRefP6yur13wZ5i9FR35ex451KCoF2OORDeJanyRVahmjjiwmUlCnTqJA== @@ -2378,14 +2348,13 @@ object.pick@^1.2.0, object.pick@^1.3.0: dependencies: isobject "^3.0.1" -objection@^1.1.10: - version "1.6.11" - resolved "https://registry.yarnpkg.com/objection/-/objection-1.6.11.tgz#6755c15300277eee76c44faf4295704d8e2e02e2" - integrity sha512-/W6iR6+YvFg1U4k5DyX1MrY+xqodDM8AAOU1J0b3HlptsNw8V3uDHjZgTi1cFPPe5+ZeTTMvhIFhNiUP6+nqYQ== +objection@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/objection/-/objection-2.1.3.tgz#ca90675d4f6489766bbbf806af973d86aaf6036f" + integrity sha512-aKr28HntHoX6wPiFw3BWLx0Ufqmu4h4Ygj/xCYgFXrgftxB7+lWtAA/J13zcLlSmLl9Jifs6HEJFMjFrbH358w== dependencies: - ajv "^6.10.0" - bluebird "^3.5.5" - lodash "^4.17.11" + ajv "^6.10.2" + db-errors "^0.2.3" on-finished@~2.3.0: version "2.3.0" @@ -2413,12 +2382,10 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" -ono@^4.0.6: - version "4.0.11" - resolved "https://registry.yarnpkg.com/ono/-/ono-4.0.11.tgz#c7f4209b3e396e8a44ef43b9cedc7f5d791d221d" - integrity sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g== - dependencies: - format-util "^1.0.3" +ono@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ono/-/ono-6.0.1.tgz#1bc14ffb8af1e5db3f7397f75b88e4a2d64bbd71" + integrity sha512-5rdYW/106kHqLeG22GE2MHKq+FlsxMERZev9DCzQX1zwkxnFwBivSn5i17a5O/rDmOJOdf4Wyt80UZljzx9+DA== optionator@^0.8.3: version "0.8.3" @@ -2721,16 +2688,6 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -readable-stream@1.1.x: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readable-stream@2.3.7, readable-stream@^2.0.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -2825,9 +2782,9 @@ resolve-url@^0.2.1: integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@^1.1.6, resolve@^1.1.7: - version "1.15.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5" - integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw== + version "1.15.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" + integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== dependencies: path-parse "^1.0.6" @@ -2926,7 +2883,7 @@ semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semve resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.1.2: +semver@^6.0.0, semver@^6.1.2: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -2997,7 +2954,7 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -signale@^1.2.1: +signale@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/signale/-/signale-1.4.0.tgz#c4be58302fb0262ac00fc3d886a7c113759042f1" integrity sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w== @@ -3096,11 +3053,6 @@ static-extend@^0.1.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -streamifier@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/streamifier/-/streamifier-0.1.1.tgz#97e98d8fa4d105d62a2691d1dc07e820db8dfc4f" - integrity sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8= - streamsearch@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" @@ -3141,11 +3093,6 @@ string-width@^4.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -3223,7 +3170,7 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -tar@^4: +tar@^4.4.2: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== @@ -3246,17 +3193,16 @@ temp-dir@^1.0.0: resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= -temp-write@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-3.4.0.tgz#8cff630fb7e9da05f047c74ce4ce4d685457d492" - integrity sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI= +temp-write@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-4.0.0.tgz#cd2e0825fc826ae72d201dc26eef3bf7e6fc9320" + integrity sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw== dependencies: - graceful-fs "^4.1.2" - is-stream "^1.1.0" - make-dir "^1.0.0" - pify "^3.0.0" + graceful-fs "^4.1.15" + is-stream "^2.0.0" + make-dir "^3.0.0" temp-dir "^1.0.0" - uuid "^3.0.1" + uuid "^3.3.2" term-size@^1.2.0: version "1.2.0" @@ -3367,9 +3313,9 @@ unc-path-regex@^0.1.2: integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= undefsafe@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" - integrity sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY= + version "2.0.3" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae" + integrity sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A== dependencies: debug "^2.2.0" @@ -3390,11 +3336,6 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - unix-timestamp@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/unix-timestamp/-/unix-timestamp-0.2.0.tgz#e1cdc2808df6327d27e635d9351e72815288733e" @@ -3475,7 +3416,7 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.1, uuid@^3.3.3: +uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -3571,9 +3512,9 @@ xml2js@0.4.0: xmlbuilder ">=0.4.2" xmlbuilder@>=0.4.2: - version "13.0.2" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-13.0.2.tgz#02ae33614b6a047d1c32b5389c1fdacb2bce47a7" - integrity sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ== + version "14.0.0" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-14.0.0.tgz#876b5aec4f05ffd5feb97b0a871c855d16fbeb8c" + integrity sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg== y18n@^3.2.1: version "3.2.1" diff --git a/frontend/package.json b/frontend/package.json index 790afe9ea..85aeaa80b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "nginx-proxy-manager", - "version": "2.1.0", + "version": "2.1.1", "description": "A beautiful interface for creating Nginx endpoints", "main": "js/index.js", "devDependencies": { From a1cebb889c5889f3e3e669692df75a3d8139afa6 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Thu, 20 Feb 2020 12:58:47 +1000 Subject: [PATCH 011/914] Use cypress 4.0.2 --- test/cypress/Dockerfile | 2 +- test/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/cypress/Dockerfile b/test/cypress/Dockerfile index 2e9d12039..6447a1639 100644 --- a/test/cypress/Dockerfile +++ b/test/cypress/Dockerfile @@ -1,4 +1,4 @@ -FROM cypress/included:3.8.3 +FROM cypress/included:4.0.2 COPY --chown=1000 ./test /test diff --git a/test/package.json b/test/package.json index d7115f1a8..3636fb965 100644 --- a/test/package.json +++ b/test/package.json @@ -7,7 +7,7 @@ "@jc21/cypress-swagger-validation": "^0.0.5", "@jc21/restler": "^3.4.0", "chalk": "^3.0.0", - "cypress": "^3.8.3", + "cypress": "^4.0.2", "cypress-plugin-retries": "^1.5.2", "eslint": "^6.7.2", "eslint-plugin-align-assignments": "^1.1.2", From b7e1e4fd9eb555517428c112dbcd6e0a73d27ba9 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Fri, 21 Feb 2020 10:52:43 +1000 Subject: [PATCH 012/914] Use the corresponding s6 binary for the built arch - fixes #298 --- docker/Dockerfile | 8 +++++--- scripts/install-s6 | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) create mode 100755 scripts/install-s6 diff --git a/docker/Dockerfile b/docker/Dockerfile index d3cb40dc2..f07b5f072 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -5,6 +5,8 @@ FROM --platform=${TARGETPLATFORM:-linux/amd64} jc21/alpine-nginx-full:node +ARG TARGETPLATFORM +ARG BUILDPLATFORM ARG BUILD_VERSION ARG BUILD_COMMIT ARG BUILD_DATE @@ -22,8 +24,8 @@ RUN echo "fs.file-max = 65535" > /etc/sysctl.conf \ ENV NPM_BUILD_VERSION="${BUILD_VERSION}" NPM_BUILD_COMMIT="${BUILD_COMMIT}" NPM_BUILD_DATE="${BUILD_DATE}" # s6 overlay -RUN curl -L -o /tmp/s6-overlay-amd64.tar.gz "https://github.com/just-containers/s6-overlay/releases/download/v1.22.1.0/s6-overlay-amd64.tar.gz" \ - && tar -xzf /tmp/s6-overlay-amd64.tar.gz -C / +COPY scripts/install-s6 /tmp/install-s6 +RUN /tmp/install-s6 "${TARGETPLATFORM}" && rm -f /tmp/install-s6 EXPOSE 80 EXPOSE 81 @@ -43,4 +45,4 @@ RUN rm -rf /etc/services.d/frontend RUN rm -f /etc/nginx/conf.d/dev.conf VOLUME [ "/data", "/etc/letsencrypt" ] CMD [ "/init" ] -HEALTHCHECK --interval=5s --timeout=3s CMD /bin/check-health \ No newline at end of file +HEALTHCHECK --interval=5s --timeout=3s CMD /bin/check-health diff --git a/scripts/install-s6 b/scripts/install-s6 new file mode 100755 index 000000000..8bb85e421 --- /dev/null +++ b/scripts/install-s6 @@ -0,0 +1,34 @@ +#!/bin/bash -e + +# Note: This script is designed to be run inside a Docker Build for a container + +CYAN='\E[1;36m' +YELLOW='\E[1;33m' +BLUE='\E[1;34m' +GREEN='\E[1;32m' +RESET='\E[0m' + +S6_OVERLAY_VERSION=1.22.1.0 +TARGETPLATFORM=$1 + +# Determine the correct binary file for the architecture given +case $TARGETPLATFORM in + linux/arm64) + S6_ARCH=aarch64 + ;; + + linux/arm/v7) + S6_ARCH=armhf + ;; + + *) + S6_ARCH=amd64 + ;; +esac + +echo -e "${BLUE}❯ ${CYAN}Installing S6-overlay v${S6_OVERLAY_VERSION} for ${YELLOW}${TARGETPLATFORM} (${S6_ARCH})${RESET}" + +curl -L -o "/tmp/s6-overlay-${S6_ARCH}.tar.gz" "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-${S6_ARCH}.tar.gz" \ + && tar -xzf "/tmp/s6-overlay-${S6_ARCH}.tar.gz" -C / + +echo -e "${BLUE}❯ ${GREEN}S6-overlay install Complete${RESET}" From 93f29734b745fcdaf59ac2c2540a21c0346f25b3 Mon Sep 17 00:00:00 2001 From: jc21 Date: Fri, 6 Mar 2020 11:04:42 +1000 Subject: [PATCH 013/914] Version 2.1.2 (#317) * Tweaks and backend vscode settings * Version bump --- .version | 2 +- README.md | 2 +- backend/.vscode/settings.json | 8 ++++++++ backend/package.json | 2 +- docker/Dockerfile | 1 - frontend/package.json | 2 +- 6 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 backend/.vscode/settings.json diff --git a/.version b/.version index 7c3272873..eca07e4c1 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.1.1 \ No newline at end of file +2.1.2 diff --git a/README.md b/README.md index 680304f9f..61f4d59b0 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # Nginx Proxy Manager -![Version](https://img.shields.io/badge/version-2.1.1-green.svg?style=for-the-badge) +![Version](https://img.shields.io/badge/version-2.1.2-green.svg?style=for-the-badge) ![Stars](https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge) ![Pulls](https://img.shields.io/docker/pulls/jc21/nginx-proxy-manager.svg?style=for-the-badge) diff --git a/backend/.vscode/settings.json b/backend/.vscode/settings.json new file mode 100644 index 000000000..4e540ab30 --- /dev/null +++ b/backend/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "editor.insertSpaces": false, + "editor.formatOnSave": true, + "files.trimTrailingWhitespace": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + } +} \ No newline at end of file diff --git a/backend/package.json b/backend/package.json index f58b22565..709e984cb 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "nginx-proxy-manager", - "version": "2.1.1", + "version": "2.1.2", "description": "A beautiful interface for creating Nginx endpoints", "main": "js/index.js", "dependencies": { diff --git a/docker/Dockerfile b/docker/Dockerfile index f07b5f072..a08549a08 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -30,7 +30,6 @@ RUN /tmp/install-s6 "${TARGETPLATFORM}" && rm -f /tmp/install-s6 EXPOSE 80 EXPOSE 81 EXPOSE 443 -EXPOSE 9876 COPY docker/rootfs / ADD backend /app diff --git a/frontend/package.json b/frontend/package.json index 85aeaa80b..8ad6ca81c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "nginx-proxy-manager", - "version": "2.1.1", + "version": "2.1.2", "description": "A beautiful interface for creating Nginx endpoints", "main": "js/index.js", "devDependencies": { From 8fb2821343888d2f036d07f72e5b26efabe90067 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Fri, 6 Mar 2020 12:54:05 +1000 Subject: [PATCH 014/914] Get artifacts on build fail --- Jenkinsfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Jenkinsfile b/Jenkinsfile index 322f22f7f..d8921cd12 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -149,6 +149,7 @@ pipeline { sh 'figlet "SUCCESS"' } failure { + archiveArtifacts(artifacts: 'debug/**.*', allowEmptyArchive: true) juxtapose event: 'failure' sh 'figlet "FAILURE"' } From 3ddd3b49fd13131a90bde1373fbd3fe56f0867f4 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Fri, 6 Mar 2020 13:11:04 +1000 Subject: [PATCH 015/914] Re-order post testing steps --- Jenkinsfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index d8921cd12..fbb769c8c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -93,14 +93,14 @@ pipeline { } post { always { - junit 'test/results/junit/*' + // Dumps to analyze later + sh 'mkdir -p debug' + sh 'docker-compose logs fullstack | gzip > debug/docker_fullstack.log.gz' // Cypress videos and screenshot artifacts dir(path: 'test/results') { archiveArtifacts allowEmptyArchive: true, artifacts: '**/*', excludes: '**/*.xml' } - // Dumps to analyze later - sh 'mkdir -p debug' - sh 'docker-compose logs fullstack | gzip > debug/docker_fullstack.log.gz' + junit 'test/results/junit/*' } } } From 1a15b4f18d550a374d069392fa3512b2520e688d Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Fri, 6 Mar 2020 13:21:13 +1000 Subject: [PATCH 016/914] Also archive db ci log --- Jenkinsfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Jenkinsfile b/Jenkinsfile index fbb769c8c..34a73b690 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -96,6 +96,7 @@ pipeline { // Dumps to analyze later sh 'mkdir -p debug' sh 'docker-compose logs fullstack | gzip > debug/docker_fullstack.log.gz' + sh 'docker-compose logs db | gzip > debug/docker_db.log.gz' // Cypress videos and screenshot artifacts dir(path: 'test/results') { archiveArtifacts allowEmptyArchive: true, artifacts: '**/*', excludes: '**/*.xml' From af319b472967c788eda6cdc8a020808ccd06979d Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Mon, 9 Mar 2020 15:22:24 +1000 Subject: [PATCH 017/914] Updated doc and example to use jc21/mariadb-aria now that it supports multiple arch --- doc/INSTALL.md | 2 +- doc/example/docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/INSTALL.md b/doc/INSTALL.md index f86a17844..1309a889b 100644 --- a/doc/INSTALL.md +++ b/doc/INSTALL.md @@ -74,7 +74,7 @@ services: depends_on: - db db: - image: mariadb:latest + image: jc21/mariadb-aria:latest restart: always environment: MYSQL_ROOT_PASSWORD: "npm" diff --git a/doc/example/docker-compose.yml b/doc/example/docker-compose.yml index e6707b957..3526e8e59 100644 --- a/doc/example/docker-compose.yml +++ b/doc/example/docker-compose.yml @@ -17,7 +17,7 @@ services: # if you want pretty colors in your docker logs: - FORCE_COLOR=1 db: - image: mariadb:latest + image: jc21/mariadb-aria:latest restart: always environment: MYSQL_ROOT_PASSWORD: "npm" From 1b6993ee709d191ad3d3d63de98d46b9a459166c Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Tue, 10 Mar 2020 09:59:34 +1000 Subject: [PATCH 018/914] Added better Build Badge --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 61f4d59b0..bd8c5f361 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,7 @@ ![Version](https://img.shields.io/badge/version-2.1.2-green.svg?style=for-the-badge) ![Stars](https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge) ![Pulls](https://img.shields.io/docker/pulls/jc21/nginx-proxy-manager.svg?style=for-the-badge) - -[![Build Status](https://ci.nginxproxymanager.jc21.com/buildStatus/icon?job=nginx-proxy-manager%2Fmaster&style=flat-square)](https://ci.nginxproxymanager.jc21.com/job/nginx-proxy-manager/job/master/) +![Jenkins](https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fci.nginxproxymanager.com%2Fjob%2Fnginx-proxy-manager%2Fjob%2Fmaster&style=for-the-badge) This project comes as a pre-built docker image that enables you to easily forward to your websites running at home or otherwise, including free SSL, without having to know too much about Nginx or Letsencrypt. From 256bd2336f97aeb72de9fe68132eefab4a1e7487 Mon Sep 17 00:00:00 2001 From: jc21 Date: Wed, 11 Mar 2020 16:54:10 +1000 Subject: [PATCH 019/914] v2.2.0 New Brand (#319) * Tweaks and backend vscode settings * Version bump * Updated Icon to be more vibrant * New logo and new login screen layout, version bump * New documentation! * Use CI to update package versions because I was sick of changing it everywhere * Generate docs * Docs upload * Fix pipeline * Fix pipeline * Update readme version before generating docs * Testing docs deploy * Fix pipeline * Updated CI link * Fix docs upload * Docs upload fixes * Fix s3 upload grrr * Docs tweaks * Updated readme * Updated screenshots Co-authored-by: Jamie Curnow --- .version | 2 +- Jenkinsfile | 62 + README.md | 72 +- backend/package.json | 2 +- doc/example/config.json | 10 - doc/example/docker-compose.yml | 28 - docs/.gitignore | 3 + docs/.vuepress/config.js | 80 + docs/.vuepress/public/github.png | Bin 0 -> 13552 bytes docs/.vuepress/public/icon.png | Bin 0 -> 18021 bytes docs/.vuepress/public/logo.png | Bin 0 -> 58016 bytes docs/.vuepress/public/logo.svg | 1 + docs/.vuepress/public/nerd-font.woff2 | Bin 0 -> 378316 bytes docs/.vuepress/public/robots.txt | 2 + .../public/screenshots/access-lists.png | Bin 0 -> 108163 bytes .../public/screenshots/audit-log.png | Bin 0 -> 181842 bytes .../public/screenshots/certificates.png | Bin 0 -> 177095 bytes .../public/screenshots/custom-settings.png | Bin 0 -> 144187 bytes .../public/screenshots/dashboard.png | Bin 0 -> 104489 bytes .../public/screenshots/dead-hosts.png | Bin 0 -> 154016 bytes docs/.vuepress/public/screenshots/login.png | Bin 0 -> 94267 bytes .../public/screenshots/permissions.png | Bin 0 -> 154171 bytes .../public/screenshots/proxy-hosts-add.png | Bin 0 -> 212128 bytes .../public/screenshots/proxy-hosts.png | Bin 0 -> 184949 bytes .../public/screenshots/redirection-hosts.png | Bin 0 -> 165825 bytes docs/.vuepress/styles/index.styl | 23 + docs/.vuepress/styles/palette.styl | 4 + docs/README.md | 93 + .../advanced-config/README.md | 17 +- docs/guide/README.md | 1 + docs/package.json | 777 ++ docs/screenshots/README.md | 12 + doc/INSTALL.md => docs/setup/README.md | 50 +- docs/third-party/README.md | 12 + docs/yarn.lock | 7964 +++++++++++++++++ .../favicons/android-chrome-192x192.png | Bin 15638 -> 18021 bytes .../favicons/android-chrome-512x512.png | Bin 35095 -> 56854 bytes .../app-images/favicons/apple-touch-icon.png | Bin 11338 -> 16709 bytes .../app-images/favicons/browserconfig.xml | 4 +- .../app-images/favicons/favicon-16x16.png | Bin 958 -> 1512 bytes .../app-images/favicons/favicon-32x32.png | Bin 1993 -> 2696 bytes frontend/app-images/favicons/favicon.ico | Bin 15086 -> 15086 bytes .../app-images/favicons/mstile-150x150.png | Bin 10368 -> 12397 bytes .../app-images/favicons/safari-pinned-tab.svg | 91 +- .../{manifest.json => site.webmanifest} | 7 +- frontend/app-images/logo-256.png | Bin 0 -> 31064 bytes .../app-images/logo-text-vertical-grey.png | Bin 0 -> 14281 bytes frontend/html/partials/header.ejs | 18 +- frontend/js/login/ui/login.ejs | 41 +- frontend/package.json | 2 +- frontend/scss/custom.scss | 4 + scripts/docs-upload | 55 + 52 files changed, 9245 insertions(+), 192 deletions(-) delete mode 100644 doc/example/config.json delete mode 100644 doc/example/docker-compose.yml create mode 100644 docs/.gitignore create mode 100644 docs/.vuepress/config.js create mode 100644 docs/.vuepress/public/github.png create mode 100644 docs/.vuepress/public/icon.png create mode 100644 docs/.vuepress/public/logo.png create mode 100644 docs/.vuepress/public/logo.svg create mode 100644 docs/.vuepress/public/nerd-font.woff2 create mode 100644 docs/.vuepress/public/robots.txt create mode 100644 docs/.vuepress/public/screenshots/access-lists.png create mode 100644 docs/.vuepress/public/screenshots/audit-log.png create mode 100644 docs/.vuepress/public/screenshots/certificates.png create mode 100644 docs/.vuepress/public/screenshots/custom-settings.png create mode 100644 docs/.vuepress/public/screenshots/dashboard.png create mode 100644 docs/.vuepress/public/screenshots/dead-hosts.png create mode 100644 docs/.vuepress/public/screenshots/login.png create mode 100644 docs/.vuepress/public/screenshots/permissions.png create mode 100644 docs/.vuepress/public/screenshots/proxy-hosts-add.png create mode 100644 docs/.vuepress/public/screenshots/proxy-hosts.png create mode 100644 docs/.vuepress/public/screenshots/redirection-hosts.png create mode 100644 docs/.vuepress/styles/index.styl create mode 100644 docs/.vuepress/styles/palette.styl create mode 100644 docs/README.md rename doc/ADVANCED_NGINX.md => docs/advanced-config/README.md (70%) create mode 120000 docs/guide/README.md create mode 100644 docs/package.json create mode 100644 docs/screenshots/README.md rename doc/INSTALL.md => docs/setup/README.md (77%) create mode 100644 docs/third-party/README.md create mode 100644 docs/yarn.lock rename frontend/app-images/favicons/{manifest.json => site.webmanifest} (65%) create mode 100644 frontend/app-images/logo-256.png create mode 100644 frontend/app-images/logo-text-vertical-grey.png create mode 100755 scripts/docs-upload diff --git a/.version b/.version index eca07e4c1..ccbccc3dc 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.1.2 +2.2.0 diff --git a/Jenkinsfile b/Jenkinsfile index 34a73b690..719c7d0a1 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -42,6 +42,15 @@ pipeline { } } } + stage('Versions') { + steps { + sh 'cat frontend/package.json | jq --arg BUILD_VERSION "${BUILD_VERSION}" \'.version = $BUILD_VERSION\' | sponge frontend/package.json' + sh 'echo -e "\\E[1;36mFrontend Version is:\\E[1;33m $(cat frontend/package.json | jq -r .version)\\E[0m"' + sh 'cat backend/package.json | jq --arg BUILD_VERSION "${BUILD_VERSION}" \'.version = $BUILD_VERSION\' | sponge backend/package.json' + sh 'echo -e "\\E[1;36mBackend Version is:\\E[1;33m $(cat backend/package.json | jq -r .version)\\E[0m"' + sh 'sed -i -E "s/(version-)[0-9]+\\.[0-9]+\\.[0-9]+(-green)/\\1${BUILD_VERSION}\\2/" README.md' + } + } } } stage('Frontend') { @@ -105,6 +114,27 @@ pipeline { } } } + stage('Docs') { + when { + not { + equals expected: 'UNSTABLE', actual: currentBuild.result + } + } + steps { + ansiColor('xterm') { + dir(path: 'docs') { + sh 'yarn install' + sh 'yarn build' + } + + dir(path: 'docs/.vuepress/dist') { + sh 'tar -czf ../../docs.tgz *' + } + + archiveArtifacts(artifacts: 'docs/docs.tgz', allowEmptyArchive: false) + } + } + } stage('MultiArch Build') { when { not { @@ -121,6 +151,38 @@ pipeline { } } } + stage('Docs Deploy') { + when { + allOf { + branch 'master' + not { + equals expected: 'UNSTABLE', actual: currentBuild.result + } + } + } + steps { + withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', accessKeyVariable: 'AWS_ACCESS_KEY_ID', credentialsId: 'npm-s3-docs', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) { + sh """docker run --rm \\ + --name \${COMPOSE_PROJECT_NAME}-docs-upload \\ + -e S3_BUCKET=jc21-npm-site \\ + -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \\ + -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \\ + -v \$(pwd):/app \\ + -w /app \\ + jc21/ci-tools \\ + scripts/docs-upload /app/docs/.vuepress/dist/ + """ + + sh """docker run --rm \\ + --name \${COMPOSE_PROJECT_NAME}-docs-invalidate \\ + -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \\ + -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \\ + jc21/ci-tools \\ + aws cloudfront create-invalidation --distribution-id EYAMDX2I8TPDZ --paths '/*' + """ + } + } + } stage('PR Comment') { when { allOf { diff --git a/README.md b/README.md index bd8c5f361..ba8e9533a 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,16 @@ ![Nginx Proxy Manager](https://public.jc21.com/nginx-proxy-manager/github.png "Nginx Proxy Manager") -# Nginx Proxy Manager - -![Version](https://img.shields.io/badge/version-2.1.2-green.svg?style=for-the-badge) -![Stars](https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge) -![Pulls](https://img.shields.io/docker/pulls/jc21/nginx-proxy-manager.svg?style=for-the-badge) -![Jenkins](https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fci.nginxproxymanager.com%2Fjob%2Fnginx-proxy-manager%2Fjob%2Fmaster&style=for-the-badge) +![Version](https://img.shields.io/badge/version-2.2.0-green.svg?style=for-the-badge) +[![Stars](https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge)](https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager) +[![Pulls](https://img.shields.io/docker/pulls/jc21/nginx-proxy-manager.svg?style=for-the-badge)](https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager) +[![Jenkins](https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fci.nginxproxymanager.com%2Fjob%2Fnginx-proxy-manager%2Fjob%2Fmaster&style=for-the-badge)](https://ci.nginxproxymanager.com/blue/organizations/jenkins/nginx-proxy-manager/branches/) This project comes as a pre-built docker image that enables you to easily forward to your websites running at home or otherwise, including free SSL, without having to know too much about Nginx or Letsencrypt. +- [Quick Setup](https://nginxproxymanager.com#quick-setup) +- [Full Setup](https://nginxproxymanager.com/setup/) +- [Screenshots](https://nginxproxymanager.com/screenshots/) ## Project Goal @@ -31,54 +32,6 @@ so that the barrier for entry here is low. - User management, permissions and audit log -## Screenshots - -[![Login](https://public.jc21.com/nginx-proxy-manager/v2/small/login.jpg "Login")](https://public.jc21.com/nginx-proxy-manager/v2/large/login.jpg) -[![Dashboard](https://public.jc21.com/nginx-proxy-manager/v2/small/dashboard.jpg "Dashboard")](https://public.jc21.com/nginx-proxy-manager/v2/large/dashboard.jpg) -[![Proxy Hosts](https://public.jc21.com/nginx-proxy-manager/v2/small/proxy-hosts.jpg "Proxy Hosts")](https://public.jc21.com/nginx-proxy-manager/v2/large/proxy-hosts.jpg) -[![Proxy Host Settings](https://public.jc21.com/nginx-proxy-manager/v2/small/proxy-hosts-new1.jpg "Proxy Host Settings")](https://public.jc21.com/nginx-proxy-manager/v2/large/proxy-hosts-new1.jpg) -[![Proxy Host SSL](https://public.jc21.com/nginx-proxy-manager/v2/small/proxy-hosts-new2.jpg "Proxy Host SSL")](https://public.jc21.com/nginx-proxy-manager/v2/large/proxy-hosts-new2.jpg) -[![Redirection Hosts](https://public.jc21.com/nginx-proxy-manager/v2/small/redirection-hosts.jpg "Redirection Hosts")](https://public.jc21.com/nginx-proxy-manager/v2/large/redirection-hosts.jpg) -[![Redirection Host Settings](https://public.jc21.com/nginx-proxy-manager/v2/small/redirection-hosts-new1.jpg "Redirection Host Settings")](https://public.jc21.com/nginx-proxy-manager/v2/large/redirection-hosts-new1.jpg) -[![Streams](https://public.jc21.com/nginx-proxy-manager/v2/small/streams.jpg "Streams")](https://public.jc21.com/nginx-proxy-manager/v2/large/streams.jpg) -[![Stream Settings](https://public.jc21.com/nginx-proxy-manager/v2/small/streams-new1.jpg "Stream Settings")](https://public.jc21.com/nginx-proxy-manager/v2/large/streams-new1.jpg) -[![404 Hosts](https://public.jc21.com/nginx-proxy-manager/v2/small/dead-hosts.jpg "404 Hosts")](https://public.jc21.com/nginx-proxy-manager/v2/large/dead-hosts.jpg) -[![404 Host Settings](https://public.jc21.com/nginx-proxy-manager/v2/small/dead-hosts-new1.jpg "404 Host Settings")](https://public.jc21.com/nginx-proxy-manager/v2/large/dead-hosts-new1.jpg) -[![Certificates](https://public.jc21.com/nginx-proxy-manager/v2/small/certificates.jpg "Certificates")](https://public.jc21.com/nginx-proxy-manager/v2/large/certificates.jpg) -[![Lets Encrypt Certificates](https://public.jc21.com/nginx-proxy-manager/v2/small/certificates-new1.jpg "Lets Encrypt Certificates")](https://public.jc21.com/nginx-proxy-manager/v2/large/certificates-new1.jpg) -[![Custom Certificates](https://public.jc21.com/nginx-proxy-manager/v2/small/certificates-new2.jpg "Custom Certificates")](https://public.jc21.com/nginx-proxy-manager/v2/large/certificates-new2.jpg) -[![Access Lists](https://public.jc21.com/nginx-proxy-manager/v2/small/access-lists.jpg "Access Lists")](https://public.jc21.com/nginx-proxy-manager/v2/large/access-lists.jpg) -[![Access List Users](https://public.jc21.com/nginx-proxy-manager/v2/small/access-lists-new1.jpg "Access List Users")](https://public.jc21.com/nginx-proxy-manager/v2/large/access-lists-new1.jpg) -[![Users](https://public.jc21.com/nginx-proxy-manager/v2/small/users.jpg "Users")](https://public.jc21.com/nginx-proxy-manager/v2/large/users.jpg) -[![User Permissions](https://public.jc21.com/nginx-proxy-manager/v2/small/users-permissions.jpg "User Permissions")](https://public.jc21.com/nginx-proxy-manager/v2/large/users-permissions.jpg) -[![Audit Log](https://public.jc21.com/nginx-proxy-manager/v2/small/audit-log.jpg "Audit Log")](https://public.jc21.com/nginx-proxy-manager/v2/large/audit-log.jpg) - - -## Getting started - -Please consult the [installation instructions](doc/INSTALL.md) for a complete guide or -if you just want to get up and running in the quickest time possible, grab all the files in the `doc/example/` folder and run `docker-compose up -d` - - -## Administration - -When your docker container is running, connect to it on port `81` for the admin interface. - -[http://localhost:81](http://localhost:81) - -Note: Requesting SSL Certificates won't work until this project is accessible from the outside world, as explained below. - - -### Default Administrator User - -``` -Email: admin@example.com -Password: changeme -``` - -Immediately after logging in with this default user you will be asked to modify your details and change your password. - - ## Hosting your home network I won't go in to too much detail here but here are the basics for someone new to this self-hosted world. @@ -87,14 +40,3 @@ I won't go in to too much detail here but here are the basics for someone new to 2. Add port forwarding for port 80 and 443 to the server hosting this project 3. Configure your domain name details to point to your home, either with a static ip or a service like DuckDNS or [Amazon Route53](https://github.com/jc21/route53-ddns) 4. Use the Nginx Proxy Manager as your gateway to forward to your other web based services - - -## Nginx Proxy Manager in the wild - -As this software gains popularity it's common to see it integrated with other platforms. Please be aware that unless specifically mentioned in the documenation of those -integrations, they are *not supported* by me and any donation links on the pages of those integrations will not come to me even though it looks like it. - -Known integrations: - -- [HomeAssistant Hass.io plugin](https://github.com/hassio-addons/addon-nginx-proxy-manager) -- [UnRaid / Synology](https://github.com/jlesage/docker-nginx-proxy-manager) diff --git a/backend/package.json b/backend/package.json index 709e984cb..11fd1bb1f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "nginx-proxy-manager", - "version": "2.1.2", + "version": "0.0.0", "description": "A beautiful interface for creating Nginx endpoints", "main": "js/index.js", "dependencies": { diff --git a/doc/example/config.json b/doc/example/config.json deleted file mode 100644 index 64ab577c8..000000000 --- a/doc/example/config.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "database": { - "engine": "mysql", - "host": "db", - "name": "npm", - "user": "npm", - "password": "npm", - "port": 3306 - } -} diff --git a/doc/example/docker-compose.yml b/doc/example/docker-compose.yml deleted file mode 100644 index 3526e8e59..000000000 --- a/doc/example/docker-compose.yml +++ /dev/null @@ -1,28 +0,0 @@ -version: "3" -services: - app: - image: jc21/nginx-proxy-manager:latest - restart: always - ports: - - 80:80 - - 81:81 - - 443:443 - volumes: - - ./config.json:/app/config/production.json - - ./data:/data - - ./letsencrypt:/etc/letsencrypt - depends_on: - - db - environment: - # if you want pretty colors in your docker logs: - - FORCE_COLOR=1 - db: - image: jc21/mariadb-aria:latest - restart: always - environment: - MYSQL_ROOT_PASSWORD: "npm" - MYSQL_DATABASE: "npm" - MYSQL_USER: "npm" - MYSQL_PASSWORD: "npm" - volumes: - - ./data/mysql:/var/lib/mysql diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 000000000..38353fb5f --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,3 @@ +.vuepress/dist +node_modules +ts diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js new file mode 100644 index 000000000..8ddfd43c3 --- /dev/null +++ b/docs/.vuepress/config.js @@ -0,0 +1,80 @@ +module.exports = { + locales: { + "/": { + lang: "en-US", + title: "Nginx Proxy Manager", + description: "Expose your services easily and securely" + } + }, + head: [ + ["link", { rel: "icon", href: "/icon.png" }], + ["meta", { name: "description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt" }], + ["meta", { property: "og:title", content: "Nginx Proxy Manager" }], + ["meta", { property: "og:description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt"}], + ["meta", { property: "og:type", content: "website" }], + ["meta", { property: "og:url", content: "https://nginxproxymanager.com/" }], + ["meta", { property: "og:image", content: "https://nginxproxymanager.com/icon.png" }], + ["meta", { name: "twitter:card", content: "summary"}], + ["meta", { name: "twitter:title", content: "Nginx Proxy Manager"}], + ["meta", { name: "twitter:description", content: "Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt"}], + ["meta", { name: "twitter:image", content: "https://nginxproxymanager.com/icon.png"}], + ["meta", { name: "twitter:alt", content: "Nginx Proxy Manager"}], + ], + themeConfig: { + logo: "/icon.png", + // the GitHub repo path + repo: "jc21/nginx-proxy-manager", + // the label linking to the repo + repoLabel: "GitHub", + // if your docs are not at the root of the repo: + docsDir: "docs", + // defaults to false, set to true to enable + editLinks: true, + locales: { + "/": { + // text for the language dropdown + selectText: "Languages", + // label for this locale in the language dropdown + label: "English", + // Custom text for edit link. Defaults to "Edit this page" + editLinkText: "Edit this page on GitHub", + // Custom navbar values + nav: [{ text: "Setup", link: "/setup/" }], + // Custom sidebar values + sidebar: [ + "/", + ["/guide/", "Guide"], + ["/screenshots/", "Screenshots"], + ["/setup/", "Setup Instructions"], + ["/advanced-config/", "Advanced Configuration"], + ["/third-party/", "Third Party"] + ] + } + } + }, + plugins: [ + [ + "@vuepress/google-analytics", + { + ga: "UA-99675467-4" + } + ], + [ + "sitemap", + { + hostname: "https://nginxproxymanager.com" + } + ], + [ + 'vuepress-plugin-zooming', + { + selector: '.zooming', + delay: 1000, + options: { + bgColor: 'black', + zIndex: 10000, + }, + }, + ], + ] +}; diff --git a/docs/.vuepress/public/github.png b/docs/.vuepress/public/github.png new file mode 100644 index 0000000000000000000000000000000000000000..1480f031b9de1d364a81d5285e9e61377b96e5bc GIT binary patch literal 13552 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 Q3#i~ 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 DhJ~R9 literal 0 HcmV?d00001 diff --git a/docs/.vuepress/public/logo.svg b/docs/.vuepress/public/logo.svg new file mode 100644 index 000000000..23fa24529 --- /dev/null +++ b/docs/.vuepress/public/logo.svg @@ -0,0 +1 @@ +logo \ No newline at end of file diff --git a/docs/.vuepress/public/nerd-font.woff2 b/docs/.vuepress/public/nerd-font.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..60f70029f33240c86d5e764887a41e04efa53230 GIT binary patch literal 378316 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

P9nO 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%0AXxManda0z|CDu>un%xX|gRa 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 literal 0 HcmV?d00001 diff --git a/docs/.vuepress/public/screenshots/audit-log.png b/docs/.vuepress/public/screenshots/audit-log.png new file mode 100644 index 0000000000000000000000000000000000000000..82de4ad068b4b6cb712bf708d46cef93aca4d7fd GIT binary patch literal 181842 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 literal 0 HcmV?d00001 diff --git a/docs/.vuepress/public/screenshots/certificates.png b/docs/.vuepress/public/screenshots/certificates.png new file mode 100644 index 0000000000000000000000000000000000000000..222c79d292bf865db6a268db9b7ffd7916d1ea4d GIT binary patch literal 177095 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

s_iq}y-|6pUVZf;}5r3IFKvsi=ZW+D`wY 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 Nts5rS3$8gl|6gBO_nrU% literal 0 HcmV?d00001 diff --git a/docs/.vuepress/public/screenshots/dead-hosts.png b/docs/.vuepress/public/screenshots/dead-hosts.png new file mode 100644 index 0000000000000000000000000000000000000000..0c36de3f69212c84bdf213d1897c3f852de1db20 GIT binary patch literal 154016 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

>0tSt~L4Yqm97W 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 Bs%-!O literal 0 HcmV?d00001 diff --git a/docs/.vuepress/public/screenshots/custom-settings.png b/docs/.vuepress/public/screenshots/custom-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..6ea4d58f7e4511af11d2f7bbd8bf47db22baab0a GIT binary patch literal 144187 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