From 1b6da62233f9ad1c905dd8261d1278a24abce5f9 Mon Sep 17 00:00:00 2001 From: Shaun Warman Date: Sat, 20 Jun 2020 03:54:04 -0500 Subject: [PATCH] chore: sync upstream --- template/api.js | 23 +- template/app/controllers/api/v1/users.js | 40 +- template/app/controllers/web/admin/users.js | 8 +- template/app/controllers/web/auth.js | 154 +- template/app/controllers/web/index.js | 23 +- template/app/controllers/web/my-account.js | 15 +- template/app/controllers/web/otp/disable.js | 12 +- template/app/controllers/web/otp/recovery.js | 7 +- template/app/controllers/web/otp/setup.js | 4 +- template/app/controllers/web/report.js | 5 + template/app/models/user.js | 140 +- template/app/views/500.pug | 2 +- template/app/views/_register-or-login.pug | 29 +- template/app/views/admin/index.pug | 2 +- template/app/views/forgot-password.pug | 30 +- template/app/views/layout.pug | 85 +- template/app/views/my-account/security.pug | 31 +- template/app/views/otp/enable.pug | 3 +- template/app/views/otp/keys.pug | 20 +- template/app/views/otp/login.pug | 33 +- template/app/views/reset-password.pug | 34 +- template/app/views/verify.pug | 14 +- template/assets/css/_btn-auth.scss | 4 +- template/assets/css/_custom.scss | 15 +- template/assets/css/_markdown.scss | 9 +- template/assets/css/_responsive-rounded.scss | 52 + template/assets/css/_variables.scss | 20 +- template/assets/css/app.scss | 21 +- template/assets/js/core.js | 221 +- template/assets/js/uncaught.js | 19 +- template/assets/manifest.json | 7 - template/assets/site.webmanifest | 19 + template/bull.js | 71 +- template/config/api.js | 13 + template/config/cookies.js | 15 + template/config/filters.js | 35 +- template/config/i18n.js | 4 +- template/config/index.js | 17 +- template/config/koa-cash.js | 33 + template/config/locales.js | 27 + template/config/logger.js | 11 + template/config/meta.js | 12 +- template/config/phrases.js | 3 +- template/config/utilities.js | 28 +- template/config/web.js | 35 + template/ecosystem.json | 10 +- template/emails/welcome/guide.md | 104 + template/gulpfile.js | 251 +- template/helpers/i18n.js | 2 + template/helpers/markdown.js | 22 + template/helpers/policies.js | 10 +- template/helpers/send-verification-email.js | 27 + template/helpers/to-object.js | 14 + template/package-scripts.js | 3 +- template/package.json | 111 +- template/proxy.js | 2 +- template/queues/email.js | 3 +- template/queues/index.js | 17 + template/queues/translate-markdown.js | 15 +- template/queues/translate-phrases.js | 15 +- template/queues/welcome-email.js | 62 + template/routes/web/auth.js | 34 +- template/routes/web/index.js | 3 + template/routes/web/otp.js | 7 +- template/web.js | 24 +- template/yarn.lock | 2860 ++++++++++++------ 66 files changed, 3317 insertions(+), 1684 deletions(-) create mode 100644 template/app/controllers/web/report.js create mode 100644 template/assets/css/_responsive-rounded.scss delete mode 100644 template/assets/manifest.json create mode 100644 template/assets/site.webmanifest create mode 100644 template/config/api.js create mode 100644 template/config/cookies.js create mode 100644 template/config/koa-cash.js create mode 100644 template/config/locales.js create mode 100644 template/config/web.js create mode 100644 template/emails/welcome/guide.md create mode 100644 template/helpers/markdown.js create mode 100644 template/helpers/send-verification-email.js create mode 100644 template/helpers/to-object.js create mode 100644 template/queues/welcome-email.js diff --git a/template/api.js b/template/api.js index cbd5b3f7..2ea89855 100644 --- a/template/api.js +++ b/template/api.js @@ -1,32 +1,15 @@ const API = require('@ladjs/api'); const Graceful = require('@ladjs/graceful'); const Mongoose = require('@ladjs/mongoose'); -const _ = require('lodash'); const ip = require('ip'); -const config = require('./config'); -const routes = require('./routes'); -const i18n = require('./helpers/i18n'); const logger = require('./helpers/logger'); -const passport = require('./helpers/passport'); +const apiConfig = require('./config/api'); -const api = new API({ - routes: routes.api, - logger, - i18n, - passport -}); +const api = new API(apiConfig); if (!module.parent) { - const mongoose = new Mongoose( - _.merge( - { - logger - }, - api.config.mongoose, - config.mongoose - ) - ); + const mongoose = new Mongoose({ ...api.config.mongoose, logger }); const graceful = new Graceful({ mongooses: [mongoose], diff --git a/template/app/controllers/api/v1/users.js b/template/app/controllers/api/v1/users.js index dca1112a..e89b30e2 100644 --- a/template/app/controllers/api/v1/users.js +++ b/template/app/controllers/api/v1/users.js @@ -1,7 +1,8 @@ const Boom = require('@hapi/boom'); +const _ = require('lodash'); const isSANB = require('is-string-and-not-blank'); -const { select } = require('mongoose-json-select'); +const sendVerificationEmail = require('../../../../helpers/send-verification-email'); const config = require('../../../../config'); const { Users } = require('../../../models'); @@ -9,41 +10,50 @@ async function create(ctx) { const { body } = ctx.request; if (!isSANB(body.password)) - return ctx.throw(Boom.badRequest(ctx.translate('INVALID_PASSWORD'))); + return ctx.throw(Boom.badRequest(ctx.translateError('INVALID_PASSWORD'))); // register the user - const query = { email: body.email }; + const query = { email: body.email, locale: ctx.locale }; query[config.userFields.hasVerifiedEmail] = false; query[config.userFields.hasSetPassword] = true; query[config.userFields.pendingRecovery] = false; - const user = await Users.register(query, body.password); + query[config.lastLocaleField] = ctx.locale; + + ctx.state.user = await Users.register(query, body.password); // send a verification email - await user.sendVerificationEmail(); + ctx.state.user = await sendVerificationEmail(ctx); // send the response - const object = select(user.toObject(), Users.schema.options.toJSON.select); - object[config.userFields.apiToken] = user[config.userFields.apiToken]; + const object = ctx.state.user.toObject(); + object[config.userFields.apiToken] = + ctx.state.user[config.userFields.apiToken]; ctx.body = object; } async function retrieve(ctx) { // since we already have the user object // just send it over as a response - ctx.body = ctx.state.user; + ctx.body = ctx.state.user.toObject(); } async function update(ctx) { const { body } = ctx.request; - ctx.state.user.email = body.email; - ctx.state.user[config.passport.fields.givenName] = - body[config.passport.fields.givenName]; - ctx.state.user[config.passport.fields.familyName] = - body[config.passport.fields.familyName]; - ctx.state.user.avatar_url = body.avatar_url; + if (_.isString(body.email)) ctx.state.user.email = body.email; + + if (_.isString(body[config.passport.fields.givenName])) + ctx.state.user[config.passport.fields.givenName] = + body[config.passport.fields.givenName]; + + if (_.isString(body[config.passport.fields.familyName])) + ctx.state.user[config.passport.fields.familyName] = + body[config.passport.fields.familyName]; + + if (_.isString(body.avatar_url)) ctx.state.user.avatar_url = body.avatar_url; - ctx.body = await ctx.state.user.save(); + ctx.state.user = await ctx.state.user.save(); + ctx.body = ctx.state.user.toObject(); } module.exports = { create, retrieve, update }; diff --git a/template/app/controllers/web/admin/users.js b/template/app/controllers/web/admin/users.js index 0039d9b5..2d77c734 100644 --- a/template/app/controllers/web/admin/users.js +++ b/template/app/controllers/web/admin/users.js @@ -27,13 +27,13 @@ async function list(ctx) { async function retrieve(ctx) { ctx.state.result = await Users.findById(ctx.params.id); - if (!ctx.state.result) throw new Error(ctx.translate('INVALID_USER')); + if (!ctx.state.result) throw ctx.translateError('INVALID_USER'); await ctx.render('admin/users/retrieve'); } async function update(ctx) { const user = await Users.findById(ctx.params.id); - if (!user) throw new Error(ctx.translate('INVALID_USER')); + if (!user) throw ctx.translateError('INVALID_USER'); const { body } = ctx.request; user[config.passport.fields.givenName] = @@ -68,7 +68,7 @@ async function update(ctx) { async function remove(ctx) { const user = await Users.findById(ctx.params.id); - if (!user) throw new Error(ctx.translate('INVALID_USER')); + if (!user) throw ctx.translateError('INVALID_USER'); await user.remove(); ctx.flash('custom', { title: ctx.request.t('Success'), @@ -86,7 +86,7 @@ async function remove(ctx) { async function login(ctx) { const user = await Users.findById(ctx.params.id); - if (!user) throw new Error(ctx.translate('INVALID_USER')); + if (!user) throw ctx.translateError('INVALID_USER'); ctx.logout(); diff --git a/template/app/controllers/web/auth.js b/template/app/controllers/web/auth.js index ae5bb78b..7c458df5 100644 --- a/template/app/controllers/web/auth.js +++ b/template/app/controllers/web/auth.js @@ -3,15 +3,15 @@ const _ = require('lodash'); const cryptoRandomString = require('crypto-random-string'); const isSANB = require('is-string-and-not-blank'); const moment = require('moment'); +const qrcode = require('qrcode'); const sanitizeHtml = require('sanitize-html'); const validator = require('validator'); -const { boolean } = require('boolean'); const { authenticator } = require('otplib'); -const qrcode = require('qrcode'); +const { boolean } = require('boolean'); -const bull = require('../../../bull'); const Users = require('../../models/user'); const passport = require('../../../helpers/passport'); +const sendVerificationEmail = require('../../../helpers/send-verification-email'); const config = require('../../../config'); const { Inquiries } = require('../../models'); @@ -22,7 +22,7 @@ const sanitize = string => }); function logout(ctx) { - if (!ctx.isAuthenticated()) return ctx.redirect(`/${ctx.locale}`); + if (!ctx.isAuthenticated()) return ctx.redirect(ctx.state.l()); if (ctx.session.otp && !ctx.session.otp_remember_me) delete ctx.session.otp; ctx.logout(); ctx.flash('custom', { @@ -34,7 +34,7 @@ function logout(ctx) { timer: 3000, position: 'top' }); - ctx.redirect(`/${ctx.locale}`); + ctx.redirect(ctx.state.l()); } function parseReturnOrRedirectTo(ctx, next) { @@ -63,6 +63,23 @@ function parseReturnOrRedirectTo(ctx, next) { } async function registerOrLogin(ctx) { + if (ctx.isAuthenticated()) { + let redirectTo = ctx.state.l( + config.passportCallbackOptions.successReturnToOrRedirect + ); + + if (ctx.session && ctx.session.returnTo) { + redirectTo = ctx.session.returnTo; + delete ctx.session.returnTo; + } + + ctx.flash('success', ctx.translate('ALREADY_SIGNED_IN')); + + if (ctx.accepts('html')) ctx.redirect(redirectTo); + else ctx.body = { redirectTo }; + return; + } + ctx.state.verb = ctx.pathWithoutLocale === '/register' ? 'sign up' : 'sign in'; @@ -88,13 +105,29 @@ async function homeOrDashboard(ctx) { } async function login(ctx, next) { - // eslint-disable-next-line complexity + if (ctx.isAuthenticated()) { + let redirectTo = ctx.state.l( + config.passportCallbackOptions.successReturnToOrRedirect + ); + + if (ctx.session && ctx.session.returnTo) { + redirectTo = ctx.session.returnTo; + delete ctx.session.returnTo; + } + + ctx.flash('success', ctx.translate('ALREADY_SIGNED_IN')); + + if (ctx.accepts('html')) ctx.redirect(redirectTo); + else ctx.body = { redirectTo }; + return; + } + await passport.authenticate('local', async (err, user, info) => { if (err) throw err; if (!user) { if (info) throw info; - throw new Error(ctx.translate('UNKNOWN_ERROR')); + throw ctx.translateError('UNKNOWN_ERROR'); } // redirect user to their last locale they were using @@ -108,25 +141,27 @@ async function login(ctx, next) { ctx.locale = ctx.request.locale; } - let redirectTo = `/${ctx.locale}${config.passportCallbackOptions.successReturnToOrRedirect}`; + let redirectTo = ctx.state.l( + config.passportCallbackOptions.successReturnToOrRedirect + ); if (ctx.session && ctx.session.returnTo) { redirectTo = ctx.session.returnTo; delete ctx.session.returnTo; } + let greeting = 'Good morning'; + if (moment().format('HH') >= 12 && moment().format('HH') <= 17) + greeting = 'Good afternoon'; + else if (moment().format('HH') >= 17) greeting = 'Good evening'; + if (user) { await ctx.login(user); - let greeting = 'Good morning'; - if (moment().format('HH') >= 12 && moment().format('HH') <= 17) - greeting = 'Good afternoon'; - else if (moment().format('HH') >= 17) greeting = 'Good evening'; - ctx.flash('custom', { title: `${ctx.request.t('Hello')} ${ctx.state.emoji('wave')}`, - text: user[config.passport.fields.givenName] - ? `${greeting} ${user[config.passport.fields.givenName]}` + text: user[config.userFields.givenName] + ? `${greeting} ${user[config.userFields.givenName]}` : greeting, type: 'success', toast: true, @@ -142,7 +177,7 @@ async function login(ctx, next) { ); ctx.state.user.qrcode = await qrcode.toDataURL(uri); - await ctx.state.user.save(); + ctx.state.user = await ctx.state.user.save(); if (user[config.passport.fields.otpEnabled] && !ctx.session.otp) redirectTo = ctx.state.l(config.loginOtpRoute); @@ -156,16 +191,9 @@ async function login(ctx, next) { return; } - let greeting = 'Good morning'; - if (moment().format('HH') >= 12 && moment().format('HH') <= 17) - greeting = 'Good afternoon'; - else if (moment().format('HH') >= 17) greeting = 'Good evening'; - ctx.flash('custom', { - title: `${ctx.request.t('Hello')} ${ctx.state.emoji('wave')}`, - text: user[config.passport.fields.givenName] - ? `${greeting} ${user[config.passport.fields.givenName]}` - : greeting, + title: `${ctx.translate('HELLO')} ${ctx.state.emoji('wave')}`, + text: ctx.translate('SIGNED_IN'), type: 'success', toast: true, showConfirmButton: false, @@ -181,23 +209,26 @@ async function login(ctx, next) { async function loginOtp(ctx, next) { await passport.authenticate('otp', (err, user) => { if (err) throw err; - if (!user) throw Boom.unauthorized(ctx.translate('INVALID_OTP_PASSCODE')); + if (!user) + throw Boom.unauthorized(ctx.translateError('INVALID_OTP_PASSCODE')); ctx.session.otp_remember_me = boolean(ctx.request.body.otp_remember_me); ctx.session.otp = 'totp'; - const redirectTo = `/${ctx.locale}/dashboard`; + const redirectTo = ctx.state.l('/dashboard'); - if (ctx.accepts('html')) { - ctx.redirect(redirectTo); - } else { + if (ctx.accepts('json')) { ctx.body = { redirectTo }; + } else { + ctx.redirect(redirectTo); } })(ctx, next); } async function recoveryKey(ctx) { - let redirectTo = `/${ctx.locale}${config.passportCallbackOptions.successReturnToOrRedirect}`; + let redirectTo = ctx.state.l( + config.passportCallbackOptions.successReturnToOrRedirect + ); if (ctx.session && ctx.session.returnTo) { redirectTo = ctx.session.returnTo; @@ -210,24 +241,24 @@ async function recoveryKey(ctx) { // ensure recovery matches user list of keys if ( - !isSANB(ctx.request.body.recovery_passcode) || + !isSANB(ctx.request.body.recovery_key) || !Array.isArray(recoveryKeys) || recoveryKeys.length === 0 || - !recoveryKeys.includes(ctx.request.body.recovery_passcode) + !recoveryKeys.includes(ctx.request.body.recovery_key) ) return ctx.throw( - Boom.badRequest(ctx.translate('INVALID_RECOVERY_PASSCODE')) + Boom.badRequest(ctx.translateError('INVALID_RECOVERY_KEY')) ); - // remove used passcode from recovery key list + // remove used key from recovery key list recoveryKeys = recoveryKeys.filter( - key => key !== ctx.request.body.recovery_passcode + key => key !== ctx.request.body.recovery_key ); const emptyRecoveryKeys = recoveryKeys.length === 0; const type = emptyRecoveryKeys ? 'warning' : 'success'; redirectTo = emptyRecoveryKeys - ? `/${ctx.locale}/my-account/security` + ? ctx.state.l('/my-account/security') : redirectTo; // handle case if the user runs out of keys @@ -237,7 +268,7 @@ async function recoveryKey(ctx) { } ctx.state.user[config.userFields.otpRecoveryKeys] = recoveryKeys; - await ctx.state.user.save(); + ctx.state.user = await ctx.state.user.save(); ctx.session.otp = 'totp-recovery'; @@ -267,10 +298,10 @@ async function register(ctx) { const { body } = ctx.request; if (!_.isString(body.email) || !validator.isEmail(body.email)) - throw Boom.badRequest(ctx.translate('INVALID_EMAIL')); + throw Boom.badRequest(ctx.translateError('INVALID_EMAIL')); if (!isSANB(body.password)) - throw Boom.badRequest(ctx.translate('INVALID_PASSWORD')); + throw Boom.badRequest(ctx.translateError('INVALID_PASSWORD')); // register the user const count = await Users.countDocuments({ group: 'admin' }); @@ -309,10 +340,10 @@ async function forgotPassword(ctx) { const { body } = ctx.request; if (!_.isString(body.email) || !validator.isEmail(body.email)) - throw Boom.badRequest(ctx.translate('INVALID_EMAIL')); + throw Boom.badRequest(ctx.translateError('INVALID_EMAIL')); // lookup the user - const user = await Users.findOne({ email: body.email }); + let user = await Users.findOne({ email: body.email }); // to prevent people from being able to find out valid email accounts // we always say "a password reset request has been sent to your email" @@ -339,7 +370,7 @@ async function forgotPassword(ctx) { ) ) throw Boom.badRequest( - ctx.translate( + ctx.translateError( 'PASSWORD_RESET_LIMIT', moment(user[config.userFields.resetTokenExpiresAt]).fromNow() ) @@ -351,7 +382,7 @@ async function forgotPassword(ctx) { .toDate(); user[config.userFields.resetToken] = cryptoRandomString({ length: 32 }); - await user.save(); + user = await user.save(); if (ctx.accepts('html')) { ctx.flash('success', ctx.translate('PASSWORD_RESET_SENT')); @@ -364,14 +395,14 @@ async function forgotPassword(ctx) { // queue password reset email try { - const job = await bull.add('email', { + const job = await ctx.bull.add('email', { template: 'reset-password', message: { to: user[config.userFields.fullEmail] }, locals: { user: _.pick(user, [ - config.passport.fields.displayName, + config.userFields.displayName, config.userFields.resetTokenExpiresAt ]), link: `${config.urls.web}/reset-password/${ @@ -379,7 +410,7 @@ async function forgotPassword(ctx) { }` } }); - ctx.logger.info('added job', bull.getMeta({ job })); + ctx.logger.info('added job', ctx.bull.getMeta({ job })); } catch (err) { ctx.logger.error(err); } @@ -389,31 +420,32 @@ async function resetPassword(ctx) { const { body } = ctx.request; if (!_.isString(body.email) || !validator.isEmail(body.email)) - throw Boom.badRequest(ctx.translate('INVALID_EMAIL')); + throw Boom.badRequest(ctx.translateError('INVALID_EMAIL')); if (!isSANB(body.password)) - throw Boom.badRequest(ctx.translate('INVALID_PASSWORD')); + throw Boom.badRequest(ctx.translateError('INVALID_PASSWORD')); if (!isSANB(ctx.params.token)) - throw Boom.badRequest(ctx.translate('INVALID_RESET_TOKEN')); + throw Boom.badRequest(ctx.translateError('INVALID_RESET_TOKEN')); // lookup the user that has this token and if it matches the email passed const query = { email: body.email }; query[config.userFields.resetToken] = ctx.params.token; // ensure that the reset token expires at value is in the future (hasn't expired) query[config.userFields.resetTokenExpiresAt] = { $gte: new Date() }; - const user = await Users.findOne(query); + let user = await Users.findOne(query); - if (!user) throw Boom.badRequest(ctx.translate('INVALID_RESET_PASSWORD')); + if (!user) + throw Boom.badRequest(ctx.translateError('INVALID_RESET_PASSWORD')); user[config.userFields.resetToken] = null; user[config.userFields.resetTokenExpiresAt] = null; await user.setPassword(body.password); - await user.save(); + user = await user.save(); await ctx.login(user); const message = ctx.translate('RESET_PASSWORD'); - const redirectTo = `/${ctx.locale}`; + const redirectTo = ctx.state.l(); if (ctx.accepts('html')) { ctx.flash('success', message); ctx.redirect(redirectTo); @@ -439,7 +471,9 @@ async function catchError(ctx, next) { // eslint-disable-next-line complexity async function verify(ctx) { - let redirectTo = `/${ctx.locale}${config.passportCallbackOptions.successReturnToOrRedirect}`; + let redirectTo = ctx.state.l( + config.passportCallbackOptions.successReturnToOrRedirect + ); if (ctx.session && ctx.session.returnTo) { redirectTo = ctx.session.returnTo; @@ -474,7 +508,7 @@ async function verify(ctx) { resend ) { try { - ctx.state.user = await ctx.state.user.sendVerificationEmail(ctx); + ctx.state.user = await sendVerificationEmail(ctx); } catch (err) { // wrap with try/catch to prevent redirect looping // (even though the koa redirect loop package will help here) @@ -523,12 +557,12 @@ async function verify(ctx) { pin !== ctx.state.user[config.userFields.verificationPin] ) return ctx.throw( - Boom.badRequest(ctx.translate('INVALID_VERIFICATION_PIN')) + Boom.badRequest(ctx.translateError('INVALID_VERIFICATION_PIN')) ); // set has verified to true ctx.state.user[config.userFields.hasVerifiedEmail] = true; - await ctx.state.user.save(); + ctx.state.user = await ctx.state.user.save(); const pendingRecovery = ctx.state.user[config.userFields.pendingRecovery]; if (pendingRecovery) { @@ -543,7 +577,7 @@ async function verify(ctx) { ctx.logger.debug('created inquiry', inquiry); - const job = await bull.add('email', { + const job = await ctx.bull.add('email', { template: 'recovery', message: { to: ctx.state.user.email, @@ -555,7 +589,7 @@ async function verify(ctx) { } }); - ctx.logger.info('added job', bull.getMeta({ job })); + ctx.logger.info('added job', ctx.bull.getMeta({ job })); } const message = pendingRecovery diff --git a/template/app/controllers/web/index.js b/template/app/controllers/web/index.js index bb1d43bf..4c9df281 100644 --- a/template/app/controllers/web/index.js +++ b/template/app/controllers/web/index.js @@ -4,11 +4,14 @@ const _ = require('lodash'); const humanize = require('humanize-string'); const titleize = require('titleize'); +const config = require('../../../config'); + const admin = require('./admin'); const auth = require('./auth'); const myAccount = require('./my-account'); const support = require('./support'); const otp = require('./otp'); +const report = require('./report'); function breadcrumbs(ctx, next) { // return early if its not a pure path (e.g. ignore static assets) @@ -18,14 +21,18 @@ function breadcrumbs(ctx, next) { const breadcrumbs = _.compact(ctx.path.split('/')).slice(1); ctx.state.breadcrumbs = breadcrumbs; - ctx.state.meta.title = ctx.request.t( - breadcrumbs.length === 1 - ? titleize(humanize(breadcrumbs[0])) - : `${titleize(humanize(breadcrumbs[0]))} - ${titleize( - humanize(breadcrumbs[1]) - )}` - ); + + // only override the title if the match was not accurate + if (!config.meta[ctx.pathWithoutLocale]) + ctx.state.meta.title = ctx.request.t( + breadcrumbs.length === 1 + ? titleize(humanize(breadcrumbs[0])) + : `${titleize(humanize(breadcrumbs[0]))} - ${titleize( + humanize(breadcrumbs[1]) + )}` + ); + return next(); } -module.exports = { support, auth, admin, myAccount, breadcrumbs, otp }; +module.exports = { support, auth, admin, myAccount, breadcrumbs, otp, report }; diff --git a/template/app/controllers/web/my-account.js b/template/app/controllers/web/my-account.js index dcd4fec0..3dddfc4d 100644 --- a/template/app/controllers/web/my-account.js +++ b/template/app/controllers/web/my-account.js @@ -1,7 +1,6 @@ const Boom = require('@hapi/boom'); const humanize = require('humanize-string'); const isSANB = require('is-string-and-not-blank'); -const { boolean } = require('boolean'); const config = require('../../../config'); @@ -13,16 +12,16 @@ async function update(ctx) { if (hasSetPassword) requiredFields.push('old_password'); - if (boolean(body.change_password)) { + if (body.change_password === 'true') { requiredFields.forEach(prop => { if (!isSANB(body[prop])) throw Boom.badRequest( - ctx.translate('INVALID_STRING', ctx.request.t(humanize(prop))) + ctx.translateError('INVALID_STRING', ctx.request.t(humanize(prop))) ); }); if (body.password !== body.confirm_password) - throw Boom.badRequest(ctx.translate('INVALID_PASSWORD_CONFIRM')); + throw Boom.badRequest(ctx.translateError('INVALID_PASSWORD_CONFIRM')); if (hasSetPassword) await ctx.state.user.changePassword(body.old_password, body.password); @@ -41,7 +40,7 @@ async function update(ctx) { ctx.state.user.email = body.email; } - await ctx.state.user.save(); + ctx.state.user = await ctx.state.user.save(); ctx.flash('custom', { title: ctx.request.t('Success'), @@ -59,7 +58,7 @@ async function update(ctx) { async function resetAPIToken(ctx) { ctx.state.user[config.userFields.apiToken] = null; - await ctx.state.user.save(); + ctx.state.user = await ctx.state.user.save(); ctx.flash('custom', { title: ctx.request.t('Success'), @@ -87,6 +86,6 @@ async function recoveryKeys(ctx) { module.exports = { update, - recoveryKeys, - resetAPIToken + resetAPIToken, + recoveryKeys }; diff --git a/template/app/controllers/web/otp/disable.js b/template/app/controllers/web/otp/disable.js index 20e9fba2..f9764335 100644 --- a/template/app/controllers/web/otp/disable.js +++ b/template/app/controllers/web/otp/disable.js @@ -6,13 +6,15 @@ const config = require('../../../../config'); async function disable(ctx) { const { body } = ctx.request; - const redirectTo = `/${ctx.locale}/my-account/security`; + const redirectTo = ctx.state.l('/my-account/security'); - if (!isSANB(body.password)) - throw Boom.badRequest(ctx.translate('INVALID_PASSWORD')); + if (ctx.state.user[config.userFields.hasSetPassword]) { + if (!isSANB(body.password)) + throw Boom.badRequest(ctx.translateError('INVALID_PASSWORD')); - const { user } = await ctx.state.user.authenticate(body.password); - if (!user) throw Boom.badRequest(ctx.translate('INVALID_PASSWORD')); + const { user } = await ctx.state.user.authenticate(body.password); + if (!user) throw Boom.badRequest(ctx.translateError('INVALID_PASSWORD')); + } ctx.state.user[config.passport.fields.otpEnabled] = false; ctx.state.user[config.passport.fields.otpToken] = null; diff --git a/template/app/controllers/web/otp/recovery.js b/template/app/controllers/web/otp/recovery.js index b162390f..459098d4 100644 --- a/template/app/controllers/web/otp/recovery.js +++ b/template/app/controllers/web/otp/recovery.js @@ -1,7 +1,8 @@ const config = require('../../../../config'); +const sendVerificationEmail = require('../../../../helpers/send-verification-email'); async function recovery(ctx) { - const redirectTo = `/${ctx.locale}/verify`; + const redirectTo = ctx.state.l(config.verifyRoute); ctx.state.redirectTo = redirectTo; @@ -9,7 +10,7 @@ async function recovery(ctx) { await ctx.state.user.save(); try { - ctx.state.user = await ctx.state.user.sendVerificationEmail(ctx); + ctx.state.user = await sendVerificationEmail(ctx); } catch (err) { // wrap with try/catch to prevent redirect looping // (even though the koa redirect loop package will help here) @@ -17,7 +18,7 @@ async function recovery(ctx) { ctx.logger.warn(err); if (ctx.accepts('html')) { ctx.flash('warning', err.message); - ctx.redirect('/login'); + ctx.redirect(ctx.state.l(config.loginRoute)); } else { ctx.body = { message: err.message }; } diff --git a/template/app/controllers/web/otp/setup.js b/template/app/controllers/web/otp/setup.js index 99a727f4..6e7c3c35 100644 --- a/template/app/controllers/web/otp/setup.js +++ b/template/app/controllers/web/otp/setup.js @@ -61,10 +61,10 @@ async function setup(ctx) { if (ctx.state.user[config.userFields.hasSetPassword]) { if (!isSANB(body.password)) - throw Boom.badRequest(ctx.translate('INVALID_PASSWORD')); + throw Boom.badRequest(ctx.translateError('INVALID_PASSWORD')); const { user } = await ctx.state.user.authenticate(body.password); - if (!user) throw Boom.badRequest(ctx.translate('INVALID_PASSWORD')); + if (!user) throw Boom.badRequest(ctx.translateError('INVALID_PASSWORD')); } ctx.state.otpTokenURI = authenticator.keyuri( diff --git a/template/app/controllers/web/report.js b/template/app/controllers/web/report.js new file mode 100644 index 00000000..ffd4c986 --- /dev/null +++ b/template/app/controllers/web/report.js @@ -0,0 +1,5 @@ +async function report(ctx) { + ctx.body = 'OK'; +} + +module.exports = report; diff --git a/template/app/models/user.js b/template/app/models/user.js index 49304601..38e522f4 100644 --- a/template/app/models/user.js +++ b/template/app/models/user.js @@ -1,35 +1,46 @@ const Boom = require('@hapi/boom'); -const StoreIPAddress = require('@ladjs/store-ip-address'); +const _ = require('lodash'); const cryptoRandomString = require('crypto-random-string'); const isSANB = require('is-string-and-not-blank'); const moment = require('moment'); const mongoose = require('mongoose'); const mongooseCommonPlugin = require('mongoose-common-plugin'); +const mongooseOmitCommonFields = require('mongoose-omit-common-fields'); const passportLocalMongoose = require('passport-local-mongoose'); const validator = require('validator'); const { authenticator } = require('otplib'); const { boolean } = require('boolean'); -const { select } = require('mongoose-json-select'); // mongoose.Error.messages = require('@ladjs/mongoose-error-messages'); const config = require('../../config'); const i18n = require('../../helpers/i18n'); -const logger = require('../../helpers/logger'); -const bull = require('../../bull'); - -const opts = { length: 10, characters: '1234567890' }; -const storeIPAddress = new StoreIPAddress({ - logger, - ...config.storeIPAddress -}); if (config.passportLocalMongoose.usernameField !== 'email') throw new Error( 'User model and @ladjs/passport requires that the usernameField is email' ); +const opts = { length: 10, characters: '1234567890' }; +const { fields } = config.passport; +const omitExtraFields = [ + ..._.without(mongooseOmitCommonFields.underscored.keys, 'email'), + config.userFields.apiToken, + config.userFields.resetTokenExpiresAt, + config.userFields.resetToken, + config.userFields.hasSetPassword, + config.userFields.hasVerifiedEmail, + config.userFields.verificationPinExpiresAt, + config.userFields.verificationPin, + config.userFields.verificationPinSentAt, + config.userFields.welcomeEmailSentAt, + config.userFields.otpRecoveryKeys, + config.userFields.pendingRecovery, + fields.otpEnabled, + fields.otpToken +]; + // set relative threshold for messages moment.relativeTimeThreshold('ss', 5); @@ -49,22 +60,13 @@ const User = new mongoose.Schema({ trim: true, lowercase: true, unique: true, - validate: value => validator.isEmail(value) - }, - - // password reset - reset_token_expires_at: Date, - reset_token: String, - has_set_password: { - type: Boolean, - default: false + validate: val => validator.isEmail(val) } }); // additional variable based properties to add to the schema const object = {}; -// user fields object[config.userFields.fullEmail] = { type: String, required: true, @@ -106,13 +108,18 @@ object[config.userFields.verificationPin] = { trim: true, validate: value => isSANB(value) && value.replace(/\D/g, '').length === 6 }; + +object[config.userFields.pendingRecovery] = { + type: Boolean, + default: false +}; + object[config.userFields.pendingRecovery] = { type: Boolean, default: false }; // shared field names with @ladjs/passport for consistency -const { fields } = config.passport; object[fields.displayName] = { type: String, required: true, @@ -153,7 +160,6 @@ object[fields.otpEnabled] = { type: Boolean, default: false }; - object[fields.otpToken] = String; // shared field names with @ladjs/i18n and email-templates @@ -188,9 +194,10 @@ User.pre('validate', function(next) { } // set the user's full email address (incl display name) - this[config.userFields.fullEmail] = this[fields.displayName] - ? `${this[fields.displayName]} <${this.email}>` - : this.email; + this[config.userFields.fullEmail] = + this[fields.displayName] && this[fields.displayName] !== this.email + ? `${this[fields.displayName]} <${this.email}>` + : this.email; // if otp authentication values no longer valid // then disable it completely @@ -216,34 +223,11 @@ User.pre('validate', function(next) { next(); }); -User.post('save', async user => { - // return early if the user already received welcome email - // or if they have not yet verified their email address - if ( - user[config.userFields.welcomeEmailSentAt] || - !user[config.userFields.hasVerifiedEmail] - ) - return; - - // add welcome email job - try { - const job = await bull.add('email', { - template: 'welcome', - message: { - to: user[config.userFields.fullEmail] - }, - locals: { - user: select(user.toObject(), User.options.toJSON.select) - } - }); - logger.info('added job', bull.getMeta({ job })); - user[config.userFields.welcomeEmailSentAt] = new Date(); - await user.save(); - } catch (err) { - logger.error(err); - } -}); - +// +// NOTE: you should not call this method directly +// instead you should use the helper located at +// `../helpers/send-verification-email.js` +// User.methods.sendVerificationEmail = async function(ctx) { if ( this[config.userFields.hasVerifiedEmail] && @@ -273,8 +257,15 @@ User.methods.sendVerificationEmail = async function(ctx) { .locale(this[config.lastLocaleField]) .humanize() ); - if (ctx) throw Boom.badRequest(message); - throw new Error(message); + if (ctx) { + const err = Boom.badRequest(message); + err.no_translate = true; + throw err; + } + + const err = new Error(message); + err.no_translate = true; + throw err; } if (this[config.userFields.verificationPinHasExpired]) { @@ -289,44 +280,19 @@ User.methods.sendVerificationEmail = async function(ctx) { this[config.userFields.verificationPinSentAt] = new Date(); await this.save(); - // attempt to send them an email - const job = await bull.add('email', { - template: 'verify', - message: { - to: this[config.userFields.fullEmail] - }, - locals: { - user: select(this.toObject(), User.options.toJSON.select), - expiresAt: this[config.userFields.verificationPinExpiresAt], - pin: this[config.userFields.verificationPin], - link: `${config.urls.web}${config.verifyRoute}?pin=${ - this[config.userFields.verificationPin] - }` - } - }); - - logger.info('added job', bull.getMeta({ job })); - return this; }; User.plugin(mongooseCommonPlugin, { object: 'user', - omitExtraFields: [ - config.userFields.apiToken, - config.userFields.resetTokenExpiresAt, - config.userFields.resetToken, - config.userFields.hasSetPassword, - config.userFields.hasVerifiedEmail, - config.userFields.verificationPinExpiresAt, - config.userFields.verificationPin, - config.userFields.verificationPinHasExpired, - config.userFields.welcomeEmailSentAt, - config.userFields.otpRecoveryKeys, - fields.otpToken - ] + omitCommonFields: false, + omitExtraFields, + mongooseHidden: { + virtuals: { + [config.userFields.verificationPinHasExpired]: 'hide' + } + } }); User.plugin(passportLocalMongoose, config.passportLocalMongoose); -User.plugin(storeIPAddress.plugin); module.exports = mongoose.model('User', User); diff --git a/template/app/views/500.pug b/template/app/views/500.pug index 30e465fc..c5b0cc89 100644 --- a/template/app/views/500.pug +++ b/template/app/views/500.pug @@ -4,4 +4,4 @@ extends layout block body .container.text-center.py-5 h1= t('Server Error') - p.lead.text-muted= t('A server error has unfortunately occurred. If this error persists, please contact us.') + p.lead.text-muted!= t('A server error has unfortunately occurred.') diff --git a/template/app/views/_register-or-login.pug b/template/app/views/_register-or-login.pug index 9d01b386..ab3deb61 100644 --- a/template/app/views/_register-or-login.pug +++ b/template/app/views/_register-or-login.pug @@ -32,8 +32,8 @@ mixin registerOrLogin(verb, isModal = false) span.btn-auth-text= t(`${humanize(verb)} with GitHub`) if boolean(process.env.AUTH_GOOGLE_ENABLED) || boolean(process.env.AUTH_GITHUB_ENABLED) .hr-text.d-flex.text-secondary.align-items-center= t('or') - - const action = verb === 'sign up' ? '/register' : '/login' - form.ajax-form(action=ctx.session.redirectTo ? l(action) : `${l(action)}?redirect_to=${l(config.passportCallbackOptions.successReturnToOrRedirect)}`, method="POST") + - const action = verb === 'sign up' ? '/register' : config.loginRoute + form.ajax-form(action=l(action), method='POST') input(type="hidden", name="_csrf", value=ctx.csrf) .form-group.floating-label input.form-control.form-control-lg(id=`input-email-${dashify(verb)}`, type="email", required, name="email", placeholder="name@example.com", autocomplete='email') @@ -45,15 +45,16 @@ mixin registerOrLogin(verb, isModal = false) .form-group small.form-text.text-right: a(href=l('/forgot-password')).text-secondary= t('Forget your password?') button.btn.btn-success.btn-lg.btn-block(type="submit")= t(titleize(verb)) - .alert.alert-light.border.mt-3.text-center(class=isModal ? 'mb-0' : '') - - const isRegisterOrLogin = ['/register', '/login'].includes(ctx.pathWithoutLocale) - if verb === 'sign up' - != t('Already have an account?') - = ' ' - a(href=l('/login'), data-dismiss-modal=isRegisterOrLogin ? false : 'true', data-toggle=isRegisterOrLogin ? '' : 'modal-anchor', data-target=isRegisterOrLogin ? '' : '#modal-sign-in').card-link= t('Sign in') - else - != t("Don't have an account?") - = ' ' - a(href=l('/register'), data-dismiss-modal=isRegisterOrLogin ? false : 'true', data-toggle=isRegisterOrLogin ? '' : 'modal-anchor', data-target=isRegisterOrLogin ? '' : '#modal-sign-up').card-link= t('Sign up') - if verb === 'sign up' - p.mt-3.mb-0.text-center: small.text-black-50!= t(`Read our Privacy Policy and Terms`) + .alert.alert-warning.mt-3.text-center(class=isModal ? 'mb-0' : '') + - const isRegisterOrLogin = ['/register', config.loginRoute].includes(ctx.pathWithoutLocale) + ul.list-inline.mb-0 + if verb === 'sign up' + li.list-inline-item!= t('Have an account?') + li.list-inline-item + a(href=l(config.loginRoute), data-dismiss-modal=isRegisterOrLogin ? false : 'true', data-toggle=isRegisterOrLogin ? '' : 'modal-anchor', data-target=isRegisterOrLogin ? '' : '#modal-sign-in').alert-link= t('Sign in') + else + li.list-inline-item!= t("Don't have an account?") + li.list-inline-item + a(href=l('/register'), data-dismiss-modal=isRegisterOrLogin ? false : 'true', data-toggle=isRegisterOrLogin ? '' : 'modal-anchor', data-target=isRegisterOrLogin ? '' : '#modal-sign-up').alert-link= t('Sign up') + if verb === 'sign up' + p.mt-3.mb-1.text-center: small.text-black-50!= t('Read our Privacy Policy and Terms', l('/privacy'), l('/terms')) diff --git a/template/app/views/admin/index.pug b/template/app/views/admin/index.pug index 76001669..c494b6db 100644 --- a/template/app/views/admin/index.pug +++ b/template/app/views/admin/index.pug @@ -3,7 +3,7 @@ extends ../layout block body .container-fluid.py-3 - .row.mt-1 + .row .col include ../_breadcrumbs p.lead diff --git a/template/app/views/forgot-password.pug b/template/app/views/forgot-password.pug index 1608daed..0a4e8b43 100644 --- a/template/app/views/forgot-password.pug +++ b/template/app/views/forgot-password.pug @@ -3,20 +3,18 @@ extends layout block body .container.py-3 + .text-center: h1.my-3.py-3= t('Forgot Password') .row - .col-xs-12.col-sm-12.col-md-6.offset-md-3.col-lg-6.offset-lg-3 - .card - .card-body - .text-center - h1.card-title.h4= t('Forgot Password') - p= t('Enter your email to reset your password.') - form.ajax-form(action=ctx.path, method="POST", autocomplete="off") - input(type="hidden", name="_csrf", value=ctx.csrf) - .form-group.floating-label - input#input-email.form-control.form-control-lg(type="email", autocomplete="off", name="email", placeholder=t('name@example.com')) - label(for="input-email")= t('Email address') - button.btn.btn-primary.btn-block.btn-lg(type="submit")= t('Send Password Reset Link') - .card-footer.text-center - = t('Remember your password?') - = ' ' - a.card-link(href=l('/login'))= t('Log in now') + .col-sm-12.col-md-8.offset-md-2.col-lg-6.offset-lg-3 + .alert.alert-primary.text-center.mb-4= t('Enter your email address to continue.') + form.ajax-form(action=ctx.path, method="POST") + input(type="hidden", name="_csrf", value=ctx.csrf) + .form-group.floating-label + input#input-email.form-control.form-control-lg(type="email", autofocus, autocomplete="email", name="email", placeholder='name@example.com') + label(for="input-email")= t('Email address') + button.btn.btn-success.btn-block.btn-lg(type="submit")= t('Continue') + .alert.alert-warning.mt-3.text-center + ul.list-inline.mb-0 + li.list-inline-item= t('Remember your password?') + li.list-inline-item + a.alert-link(href=l(config.loginRoute))= t('Log in') diff --git a/template/app/views/layout.pug b/template/app/views/layout.pug index ac48a5c7..dd7f639c 100644 --- a/template/app/views/layout.pug +++ b/template/app/views/layout.pug @@ -16,18 +16,15 @@ html(lang=locale).h-100 link(rel="alternate", href=`${config.urls.web}/${language.locale}${ctx.pathWithoutLocale}`, hreflang=language.locale) //- generated with https://realfavicongenerator.net - link(rel="apple-touch-icon", sizes="152x152", href=manifest('img/apple-touch-icon.png')) - link(rel="icon", type="image/png", href=manifest('img/favicon-32x32.png'), sizes="32x32") - link(rel="icon", type="image/png", href=manifest('img/favicon-16x16.png'), sizes="16x16") - link(rel="manifest", href="/manifest.json") - - //- add mask-icon - //- - //- link(rel="mask-icon", href=manifest('img/safari-pinned-tab.svg'), color=config.appColor) + link(rel="apple-touch-icon", sizes="152x152", href=manifest('img/apple-touch-icon.png'), integrity=manifest('img/apple-touch-icon.png', 'integrity'), crossorigin='anonymous') + link(rel="icon", type="image/png", href=manifest('img/favicon-32x32.png'), sizes="32x32", integrity=manifest('img/favicon-32x32.png', 'integrity'), crossorigin='anonymous') + link(rel="icon", type="image/png", href=manifest('img/favicon-16x16.png'), sizes="16x16", integrity=manifest('img/favicon-16x16.png', 'integrity'), crossorigin='anonymous') + link(rel="manifest", href=manifest('site.webmanifest'), integrity=manifest('site.webmanifest', 'integrity'), crossorigin='anonymous') + link(rel="mask-icon", href=manifest('img/safari-pinned-tab.svg'), integrity=manifest('img/safari-pinned-tab.svg', 'integrity'), color=config.appColor, crossorigin='anonymous') meta(name="apple-mobile-web-app-title", content=config.appName) meta(name="application-name", content=config.appName) meta(name="msapplication-TileColor", content=config.appColor) - meta(name="theme-color", content=config.appColor) + meta(name="theme-color", content="#ffffff") //- csrf token meta(name="csrf-token", content=ctx.csrf) @@ -36,7 +33,7 @@ html(lang=locale).h-100 //- add opengraph tags to your structured data pages block opengraph - link(rel='image_src', type='image/png', href=manifest('img/social.png')) + link(rel='image_src', type='image/png', href=manifest('img/social.png'), integrity=manifest('img/social.png', 'integrity'), crossorigin='anonymous') meta(property='og:title', content=meta.title) meta(property='og:url', content=`${config.urls.web}${ctx.pathWithoutLocale}`) meta(property='og:description', content=meta.description) @@ -49,29 +46,26 @@ html(lang=locale).h-100 //- css file block stylesheets - if config.env === 'production' - link(rel="stylesheet", href=manifest('css/app.css') integrity=manifest('css/app.css', 'integrity'), crossorigin="anonymous") - else - link(rel="stylesheet", href=manifest('css/app.css')) - - body(role='document', class=['/register', '/login', config.verifyRoute].includes(ctx.pathWithoutLocale) ? 'pt-0' : '').d-flex.flex-column.h-100 - - //- spinner - block spinner - include spinner/spinner - - //- navigation - block navigation - include _nav - - //- body - main(role='main').flex-shrink-0 - block body - - //- footer - block footer - include _footer - + link(rel="stylesheet", href=manifest('css/app.css'), integrity=manifest('css/app.css', 'integrity'), crossorigin='anonymous') + + //- preload and prefetch content + //- + //- + block preload + each asset in [ 'fonts/fa-brands-400.woff', 'fonts/fa-solid-900.woff' ] + //- integrity attribute not currently supported + //- + link(rel='preload', href=manifest(asset), as='font', crossorigin='anonymous') + + block prefetch + each asset in ['img/github-logo.svg', 'img/google-logo.svg'] + link(rel='preload', href=manifest(asset), as='image', crossorigin='anonymous') + each asset in [ 'fonts/fa-brands-400.ttf', 'fonts/fa-solid-900.ttf' ] + //- integrity attribute not currently supported + //- + link(rel='prefetch', href=manifest(asset), as='font', crossorigin='anonymous') + + //- scripts block scripts //- flash messaging (with koa-better-flash and sweetalert2) script. @@ -122,11 +116,24 @@ html(lang=locale).h-100 id: "#{ctx.sessionId}" }; - //- factor bundle (common shared assets across all files) - script(src=manifest('js/factor-bundle.js') integrity=manifest('js/factor-bundle.js', 'integrity') crossorigin="anonymous") + //- build + if !isBot(ctx.get('User-Agent')) + script(defer, src=manifest('js/build.js'), integrity=manifest('js/build.js', 'integrity'), crossorigin='anonymous') - //- uncaught (handles errors, similar to TraceKit but with CabinJS + StackTrace.JS) - script(src=manifest('js/uncaught.js') integrity=manifest('js/uncaught.js', 'integrity') crossorigin="anonymous") + body(role='document').d-flex.flex-column.min-h-100 + + //- spinner + block spinner + include spinner/spinner - //- scripts - script(src=manifest('js/core.js') integrity=manifest('js/core.js', 'integrity') crossorigin="anonymous") + //- navigation + block navigation + include _nav + + //- body + main(role='main').flex-grow-1.d-flex.flex-column.flex-grow-1 + block body + + //- footer + block footer + include _footer diff --git a/template/app/views/my-account/security.pug b/template/app/views/my-account/security.pug index 040cf6c0..48ea0179 100644 --- a/template/app/views/my-account/security.pug +++ b/template/app/views/my-account/security.pug @@ -2,24 +2,23 @@ extends ../layout block body - #modal-disable-otp(tabindex='-1', role='dialog').modal.fade + #modal-disable-otp.modal.fade(tabindex='-1', role='dialog', aria-labelledby='modal-disable-otp-title', aria-hidden='true') .modal-dialog(role='document') .modal-content .modal-header.d-block.text-center - h6.modal-title.d-inline-block.ml-4= t('Disable OTP') + h4.modal-title.d-inline-block.ml-4#modal-disable-otp-title= t('Disable OTP') button(type='button', data-dismiss='modal', aria-label='Close').close span(aria-hidden='true') × .modal-body.text-center - = t('You are about to disable two-factor authentication on your account. Please confirm your password to continue.') - .row - form(action=l('/otp/disable'), method='POST').col-md-12 - input(type="hidden", name="_csrf", value=ctx.csrf) + form(action=l(`${config.otpRoutePrefix}/disable`), method='POST').ajax-form.confirm-prompt.mb-0 + input(type="hidden", name="_csrf", value=ctx.csrf) + if user[config.userFields.hasSetPassword] .form-group.floating-label - input#input-password.form-control.mt-3(type="password", autocomplete="off", name="password" required) + input#input-password.form-control.form-control-lg(type="password", autocomplete="off", name="password" required) label(for="input-password")= t('Confirm Password') - button.btn.btn-danger.btn-md.btn-block.mt-2(type="submit")= t('Disable OTP') + button.btn.btn-danger.btn-lg.btn-block(type="submit")= t('Disable OTP') .container-fluid.py-3 - .row.mt-1 + .row .col include ../_breadcrumbs if boolean(process.env.AUTH_OTP_ENABLED) @@ -34,16 +33,18 @@ block body button(type='submit').btn.btn-secondary.btn-lg= t('Download recovery keys') button(data-toggle='modal', data-target='#modal-disable-otp', type='button').btn.btn-danger.btn-lg.mt-3= t('Disable OTP') else - h5= t('OTP') - p= t('OTP or one-time password allows you to add Two-Factor Authentication to your account using a device or authenticator app.') - a.btn.btn-primary.btn-lg(href=l('/otp/setup'), role="button", data-toggle='modal-anchor', data-target='#modal-sign-up')= t('Enable OTP') - .card.card-bg-light - h4.card-header= t('API Credentials') + h5= t('Configure One-time Password') + p= t('One-time passwords ("OTP") allow you to add a layer of Two-Factor Authentication to your account using a device or authenticator app. If you lose access to your device or authenticator app, then you can use a recovery key provided to you during configuration.') + a.btn.btn-primary.btn-lg(href=l(`${config.otpRoutePrefix}/setup`), role="button", data-toggle='modal-anchor', data-target='#modal-sign-up')= t('Enable OTP') + .card-footer.text-right + a(href='https://en.wikipedia.org/wiki/One-time_password', rel='nofollow', target='_blank').btn.btn-dark= t('Learn more') + .card.mb-3 + h4.card-header= t('Developer Access') .card-body .form-group.row label.control-label.col-md-4.col-form-label.text-md-right= t('API token') .col-md-8 - .input-group.input-group-lg + .input-group input(type='text', readonly, value=user[config.userFields.apiToken]).form-control#api-token .input-group-append button(type='button', data-toggle="clipboard", data-clipboard-target="#api-token").btn.btn-primary diff --git a/template/app/views/otp/enable.pug b/template/app/views/otp/enable.pug index 376aae18..062027bc 100644 --- a/template/app/views/otp/enable.pug +++ b/template/app/views/otp/enable.pug @@ -6,11 +6,10 @@ block body .modal-dialog.modal-lg(role='document') .modal-content .modal-header - h1.h4.modal-title= t('Authenticator Apps') + h1.h4.modal-title= t('Recommended Authenticator Apps') button(type='button', data-dismiss='modal', aria-label='Close').close span(aria-hidden='true') × .modal-body - .alert.alert-info= t('Our recommended apps are listed below. If you have feedback on this list, then please let us know.') table.table thead tr diff --git a/template/app/views/otp/keys.pug b/template/app/views/otp/keys.pug index cc6f3113..ca59f708 100644 --- a/template/app/views/otp/keys.pug +++ b/template/app/views/otp/keys.pug @@ -4,15 +4,11 @@ extends ../layout block body .container.py-3 .row - .col-xs-12.col-sm-12.col-md-6.offset-md-3.col-lg-6.offset-lg-3 - .card - .card-body - .text-center - h1.card-title.h4= t('OTP Recovery') - p= t('Please enter an OTP recovery key to login.') - form(action=`${ctx.locale}/otp/keys`, method="POST", autocomplete="off").ajax-form - input(type="hidden", name="_csrf", value=ctx.csrf) - .form-group.floating-label - input#input-text.form-control.form-control-lg(type="text", autocomplete="off", name="recovery_passcode", placeholder=t('')) - label(for="recovery_passcode")= t('Recovery Passcode') - button.btn.btn-primary.btn-block.btn-lg(type="submit")= t('Submit Passcode') + .col-xs-12.col-sm-12.col-md-6.offset-md-3.col-lg-6.offset-lg-3.text-center + h1.my-3.py-3= t('Recovery Key') + form(action=ctx.path, method="POST", autocomplete="off").ajax-form + input(type="hidden", name="_csrf", value=ctx.csrf) + .form-group.floating-label + input#input-text.form-control.form-control-lg(type="text", autofocus, required, autocomplete="off", name="recovery_key", placeholder=' ') + label(for="recovery_key")= t('Recovery Key') + button.btn.btn-primary.btn-block.btn-lg(type="submit")= t('Continue') diff --git a/template/app/views/otp/login.pug b/template/app/views/otp/login.pug index c64a3d81..0b9276f2 100644 --- a/template/app/views/otp/login.pug +++ b/template/app/views/otp/login.pug @@ -3,20 +3,20 @@ extends ../layout block body #modal-recovery.modal.fade(tabindex='-1', role='dialog', aria-labelledby='modal-domain-title', aria-hidden='true') - .modal-dialog(role='document') + .modal-dialog.modal-lg(role='document') .modal-content .modal-header.text-center.d-block h4.modal-title.d-inline-block.ml-4#modal-recovery-title= t('Account Recovery') button(type='button', data-dismiss='modal', aria-label='Close').close span(aria-hidden='true') × .modal-body - form.ajax-form(action=l('/otp/recovery'), method="POST") + form.ajax-form(action=l(`${config.otpRoutePrefix}/recovery`), method="POST").confirm-prompt input(type="hidden", name="_csrf", value=ctx.csrf) - p= t("If you can't access a trusted device or recovery keys you can request a reset of your security settings. For security reasons this can take 3-5 business days. Here is an overview of the steps involved:") + p= t("If you can't access your authenticator app or lose your recovery keys, then you can submit a request for your account to be unlocked.") ol - li= t('Verify access to your email address with a verification code.') - li= t('Wait for an admin to follow-up with additional information.') - li= t('Two-Factor Authentication will be removed from your account.') + li= t('Verify access to your email address with a code emailed to you.') + li= t('Wait 3-5 business days for an administrative follow-up email.') + li= t('Access to your account will be unlocked for you.') button.btn.btn-primary.btn-block.btn-lg(type="submit")= t('Continue') .container.py-3 h1.my-3.py-3.text-center= t('Two-Factor Check') @@ -25,18 +25,19 @@ block body form(action=ctx.path, method="POST", autocomplete="off").ajax-form input(type="hidden", name="_csrf", value=ctx.csrf) .form-group.floating-label - input#input-text.form-control.form-control-lg(type="text", autocomplete="off", name="passcode", placeholder=' ') + input#input-text.form-control.form-control-lg(type="text", autofocus, autocomplete="off", name="passcode", placeholder=' ') label(for="input-passcode")= t('Passcode') .form-group.form-check input.form-check-input(type='checkbox', name='otp_remember_me', value='true', checked=ctx.session.otp_remember_me)#otp-remember-me label.form-check-label(for='otp-remember-me')= t("Don't ask me again in this browser") button.btn.btn-primary.btn-block.btn-lg(type="submit")= t('Continue') - .alert.alert-light.border.mt-3.text-center - = t('Having trouble?') - = ' ' - a(href=l('/otp/keys'))= t('Use a recovery key') - p.mb-0.text-center - small.text-muted - = t('Lose your recovery keys?') - = ' ' - a(href='#', data-toggle='modal-anchor', data-target='#modal-recovery').text-danger= t('Request account recovery') + .alert.alert-warning.mt-3.text-center + ul.list-inline.mb-0 + li.list-inline-item= t('Having trouble?') + li.list-inline-item + a(href=l(`${config.otpRoutePrefix}/keys`)).alert-link= t('Use a recovery key') + ul.list-inline.text-center.mb-0 + li.list-inline-item + small.text-muted= t('Lose your recovery keys?') + li.list-inline-item + small: a(href='#', data-toggle='modal-anchor', data-target='#modal-recovery').text-danger= t('Request account recovery') diff --git a/template/app/views/reset-password.pug b/template/app/views/reset-password.pug index e9b87c86..7de6bdf4 100644 --- a/template/app/views/reset-password.pug +++ b/template/app/views/reset-password.pug @@ -3,22 +3,20 @@ extends layout block body .container.py-3 + .text-center: h1.my-3.py-3= t('Reset Password') .row - .col-xs-12.col-sm-12.col-md-6.offset-md-3.col-lg-6.offset-lg-3 - .card - .card-body - .text-center - h1.card-title.h4= t('Reset Password') - p= t('Please confirm your email and enter a new password.') - form.ajax-form.confirm-prompt(action=ctx.path, method="POST", autocomplete="off") - .form-group.floating-label - input#input-email.form-control.form-control-lg(type="email", autocomplete="off", name="email", placeholder=t('name@example.com')) - label(for="input-email")= t('Email address') - .form-group.floating-label - input#input-password.form-control.form-control-lg(type="password", autocomplete="off", name="password", placeholder=" ") - label(for="input-password")= t('Password') - button.btn.btn-primary.btn-block.btn-lg(type="submit")= t('Set New Password') - .card-footer.text-center - = t('Having trouble?') - = ' ' - a.card-link(href=l('/forgot-password'))= t('Start over') + .col-sm-12.col-md-8.offset-md-2.col-lg-6.offset-lg-3 + .alert.alert-primary.text-center.mb-4= t('Confirm your email address and set a new password.') + form.ajax-form.confirm-prompt(action=ctx.path, method="POST") + .form-group.floating-label + input#input-email.form-control.form-control-lg(type="email", autofocus, autocomplete="email", name="email", placeholder='name@example.com') + label(for="input-email")= t('Email address') + .form-group.floating-label + input#input-password.form-control.form-control-lg(type="password", autocomplete="new-password", name="password", placeholder=" ") + label(for="input-password")= t('New password') + button.btn.btn-success.btn-block.btn-lg(type="submit")= t('Continue') + .alert.alert-warning.mt-3.text-center + ul.list-inline.mb-0 + li.list-inline-item= t('Having trouble?') + li.list-inline-item + a.alert-link(href=l('/forgot-password'))= t('Start over') diff --git a/template/app/views/verify.pug b/template/app/views/verify.pug index 4c69bc8a..7afcc3ed 100644 --- a/template/app/views/verify.pug +++ b/template/app/views/verify.pug @@ -6,14 +6,14 @@ block body .text-center: h1.my-3.py-3= t('Verify email') .row .col-sm-12.col-md-8.offset-md-2.col-lg-6.offset-lg-3 - p.text-center= t('Enter the verification pin sent to your email address.') - form.ajax-form(action=redirectTo ? `${ctx.path}?redirect_to=${redirectTo}` : ctx.path, method="POST", autocomplete="off") + .alert.alert-primary.text-center.mb-4!= t('Enter the verification code emailed to: %s', user.email) + form.ajax-form(action=redirectTo ? `${ctx.path}?redirect_to=${redirectTo}` : ctx.path, method="POST") input(type="hidden", name="_csrf", value=ctx.csrf) .form-group.floating-label - input#input-pin.form-control.form-control-lg(type="text", title=t(`Please enter a ${config.verificationPin.length} digit verification pin.`), inputmode='numeric', pattern=`[0-9]{${config.verificationPin.length}}`, minlength=config.verificationPin.length, maxlength=config.verificationPin.length, autocomplete="off", name="pin", placeholder=' ') - label(for="input-pin")= t('Verification pin') + input#input-pin.form-control.form-control-lg(type="text", autofocus, title=striptags(t('Please enter a %d digit verification code.', config.verificationPin.length)), inputmode='numeric', pattern=`[0-9]{${config.verificationPin.length}}`, minlength=config.verificationPin.length, maxlength=config.verificationPin.length, autocomplete="off", name="pin", placeholder=' ') + label(for="input-pin")= t('Verification code') button.btn.btn-success.btn-block.btn-lg(type="submit")= t('Continue') - .alert.alert-light.border.mt-3.text-center - = t("Didn't receive the email?") + .alert.alert-warning.mt-3.text-center + = t("Didn't receive it?") = ' ' - a.card-link(href=redirectTo ? `${ctx.path}?resend=true&redirect_to=${redirectTo}` : `${ctx.path}?resend=true`)= t('Resend now') + a.alert-link(href=redirectTo ? `${ctx.path}?resend=true&redirect_to=${redirectTo}` : `${ctx.path}?resend=true`)= t('Resend now') diff --git a/template/assets/css/_btn-auth.scss b/template/assets/css/_btn-auth.scss index cfa64a5e..838d35ff 100644 --- a/template/assets/css/_btn-auth.scss +++ b/template/assets/css/_btn-auth.scss @@ -30,7 +30,7 @@ $roboto: 'Roboto-Medium', $font-family-sans-serif; box-shadow: 0 0 3px 3px rgba(66, 133, 244, 0.3); } .btn-auth-icon { - background-image: url('/img/google-logo.svg'); + background-image: url('../img/google-logo.svg'); } } @@ -39,7 +39,7 @@ $roboto: 'Roboto-Medium', $font-family-sans-serif; box-shadow: 0 0 3px 3px rgba(0, 0, 0, 0.3); } .btn-auth-icon { - background-image: url('/img/github-logo.svg'); + background-image: url('../img/github-logo.svg'); } } diff --git a/template/assets/css/_custom.scss b/template/assets/css/_custom.scss index 4fce536f..28d87e4c 100644 --- a/template/assets/css/_custom.scss +++ b/template/assets/css/_custom.scss @@ -1,6 +1,15 @@ -// put your custom styles here -.text-monospace { - font-family: $font-family-monospace; +// https://github.com/twbs/bootstrap/issues/24374 +.min-vh-80 { + min-height: 80vh !important; +} +.min-h-100 { + min-height: 100%; +} + +body { + padding-top: 77px; + text-rendering: optimizeLegibility; + font-smoothing: antialiased; } .text-decoration-underline { diff --git a/template/assets/css/_markdown.scss b/template/assets/css/_markdown.scss index 7c47833f..dc77a84a 100644 --- a/template/assets/css/_markdown.scss +++ b/template/assets/css/_markdown.scss @@ -15,12 +15,19 @@ } code { color: #24292e; + font-size: 100%; + } + pre > code { + display: block; } font-family: $font-family-sans-serif; code, kbd, pre, .commit-tease-sha, .blob-num, .blob-code-inner, { font-family: $font-family-monospace; } - code, pre, .highlight pre { + .highlight pre, pre { + padding: 1rem; + } + pre, .highlight pre { font-size: 100%; } } diff --git a/template/assets/css/_responsive-rounded.scss b/template/assets/css/_responsive-rounded.scss new file mode 100644 index 00000000..2c2db2a1 --- /dev/null +++ b/template/assets/css/_responsive-rounded.scss @@ -0,0 +1,52 @@ +// +.rounded-top-0 { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; +} + +.rounded-left-0 { + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} + +.rounded-right-0 { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +.rounded-bottom-0 { + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +// +// TODO: refactor this so !important is preserved +// NOTE: currently the below syntax is invalid SCSS as you cannot +// append `!important` to a mixin invocation +// +// @each $breakpoint in map-keys($grid-breakpoints) { +// @include media-breakpoint-up($breakpoint) { +// $infix: breakpoint-infix($breakpoint, $grid-breakpoints) !important; +// .rounded#{$infix}-top { @include border-top-radius($border-radius) !important; } +// .rounded#{$infix}-right { @include border-right-radius($border-radius) !important } +// .rounded#{$infix}-bottom { @include border-bottom-radius($border-radius) !important; } +// .rounded#{$infix}-left { @include border-left-radius($border-radius) !important; } +// .rounded#{$infix}-circle { border-radius: 50% !important; } +// .rounded#{$infix}-0 { border-radius: 0 !important; } +// +// .rounded#{$infix}-top-0 { @include border-top-radius(0) !important; } +// .rounded#{$infix}-right-0 { @include border-right-radius(0) !important; } +// .rounded#{$infix}-left-0 { @include border-left-radius(0) !important; } +// .rounded#{$infix}-bottom-0 { @include border-bottom-radius(0) !important; } +// +// .rounded#{$infix}-x { +// @include border-left-radius($border-radius) !important; +// @include border-right-radius($border-radius) !important; +// } +// +// .rounded#{$infix}-y { +// @include border-top-radius($border-radius) !important; +// @include border-bottom-radius($border-radius) !important; +// } +// } +// } diff --git a/template/assets/css/_variables.scss b/template/assets/css/_variables.scss index fcea39e7..3a037528 100644 --- a/template/assets/css/_variables.scss +++ b/template/assets/css/_variables.scss @@ -1,14 +1,14 @@ -// TODO: eventually host ourselves -$fa-font-path: "//cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/webfonts" !default; +$fa-font-path: "../fonts" !default; +$fa-font-display: "swap" !default; -// custom fonts using google webfont loader -// with fonts defined in `assets/js/core.js` -$font-family-sans-serif: 'Source Sans Pro', '-apple-system', BlinkMacSystemFont, - 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !default; +$font-family-sans-serif: '-apple-system', BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !default; -$font-family-serif: Georgia, 'Times New Roman', Times, serif !default; -$font-family-monospace: 'Source Code Pro', Menlo, Monaco, Consolas, - 'Liberation Mono', 'Courier New', monospace !default; +$font-family-monospace: 'Inconsolata', Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace !default; $font-family-base: $font-family-sans-serif !default; -$headings-font-family: 'Bitter', $font-family-sans-serif; + +$headings-font-family: 'Poppins', $font-family-sans-serif; + +$yiq-contrasted-threshold: 200 !default; + +$enable-responsive-font-sizes: true !default; diff --git a/template/assets/css/app.scss b/template/assets/css/app.scss index f332ff33..4ad16e6c 100644 --- a/template/assets/css/app.scss +++ b/template/assets/css/app.scss @@ -14,10 +14,22 @@ $question: theme-color('light'); // sweetalert2 @import 'node_modules/sweetalert2/src/sweetalert2'; +// highlight.js +@import 'node_modules/highlight.js/scss/default'; +@import 'node_modules/highlight.js/scss/github'; + // font awesome @import 'node_modules/@fortawesome/fontawesome-free/scss/fontawesome'; -@import 'node_modules/@fortawesome/fontawesome-free/scss/brands'; -@import 'node_modules/@fortawesome/fontawesome-free/scss/solid'; +// @import 'node_modules/@fortawesome/fontawesome-free/scss/brands'; +.fab { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; +} +// @import 'node_modules/@fortawesome/fontawesome-free/scss/solid'; +.fa, .fas { + font-family: 'Font Awesome 5 Free'; + font-weight: 900; +} @import 'node_modules/@fortawesome/fontawesome-free/scss/v4-shims'; // spinkit loading spinner @@ -38,7 +50,7 @@ $question: theme-color('light'); @import 'node_modules/@ladjs/assets/scss/image-helpers'; // bootstrap floating labels -@import 'node_modules/@tkrotoff/bootstrap-floating-label/src/bootstrap4-floating-label'; +@import 'node_modules/@tkrotoff/bootstrap-floating-label/src/bootstrap-floating-label'; // markdown @import '_markdown'; @@ -58,5 +70,8 @@ $question: theme-color('light'); // responsive backgrounds @import '_responsive-backgrounds'; +// responsive rounded +@import '_responsive-rounded'; + // custom app styling @import '_custom'; diff --git a/template/assets/js/core.js b/template/assets/js/core.js index d829cfc4..992b5a91 100644 --- a/template/assets/js/core.js +++ b/template/assets/js/core.js @@ -1,6 +1,7 @@ -const History = require('html5-history-api'); const $ = require('jquery'); const Popper = require('popper.js'); +const Clipboard = require('clipboard'); +const { randomstring } = require('@sidoshi/random-string'); // load jQuery and Bootstrap // @@ -14,13 +15,14 @@ window.Popper = Popper; // eslint-disable-next-line import/no-unassigned-import require('bootstrap'); +const $body = $('body'); + const { ajaxForm, changeHashOnScroll, clipboard, confirmPrompt, customFileInput, - facebookHashFix, flash, returnTo, resizeNavbarPadding, @@ -35,35 +37,10 @@ resizeNavbarPadding($); // import waypoints (see below example for how to use + `yarn add waypoints`) // require('waypoints/lib/jquery.waypoints.js'); -// import pointer events polyfill for ie -// eslint-disable-next-line import/no-unassigned-import -require('jquery.pointer-events-polyfill/dist/jquery.pointer-events-polyfill.min.js'); - -// import jquery lazy -// eslint-disable-next-line import/no-unassigned-import -require('jquery-lazy'); - -// import dense for images -// eslint-disable-next-line import/no-unassigned-import -require('dense/src/dense.js'); - -// import jquery-placeholder for IE placeholder support -// eslint-disable-next-line import/no-unassigned-import -require('jquery-placeholder'); - // highlight.js // const hljs = require('highlight.js'); // hljs.initHighlightingOnLoad(); -// import history fallback support for IE -window.History = History; - -// Add pointer events polyfill -window.pointerEventsPolyfill(); - -// Fix Facebook's appended hash bug -facebookHashFix(); - // Allow ?return_to=/some/path returnTo(); @@ -80,68 +57,58 @@ $('.navbar-collapse').on('hidden.bs.collapse shown.bs.collapse', () => { resizeNavbarPadding($); }); -$(() => { - // Handle modals on anchor tags with data-target specified (preserve href) - $('a[data-toggle="modal-anchor"]').on('click.modalAnchor', modalAnchor); - - // Lazy load images using jquery.lazy - $('img.lazy').lazy({ retinaAttribute: 'data-2x' }); - - // Dense for all other non lazy images - $('img:not(".lazy")').dense({ glue: '@' }); - - // Support placeholders in older browsers using jquery-placeholder - $('input, textarea').placeholder(); - - // Adjust the hash of the page as you scroll down - // (e.g. if you scroll past a section "Section A" to "Section B" - // then the URL bar will update to #section-b - $(window).on('scroll.changeHashOnScroll', changeHashOnScroll); - - // Handle hash change when user clicks on links - $('body').on('click.handleHashChange', "a[href^='#']", handleHashChange); - - // Automatically show tooltips and popovers - $('[data-toggle="tooltip"]').tooltip(); - $('[data-toggle="popover"]').popover(); - - // Handle custom file inputs - // - // Example usage: - // - // - $('body').on( - 'change.customFileInput', - 'input[type="file"][data-toggle="custom-file"]', - customFileInput - ); - - // Handle clipboard copy event - clipboard(); - - // Bind confirm prompt event for clicks and form submissions - $('body').on( - 'submit.confirmPrompt', - 'form.confirm-prompt, form[data-toggle="confirm-prompt"]', - confirmPrompt - ); - $('body').on( - 'click.confirmPrompt', - 'button.confirm-prompt, input.confirm-prompt', - confirmPrompt - ); - - // Bind ajax form submission and handle Stripe tokens in forms - $('body').on('submit.ajaxForm', 'form.ajax-form', ajaxForm); - - // Example for how to detect waypoint scrolling: - // - // Detect when we scroll to the #the-web-server selector - // so that we can hide the "Learn More" banner on bottom - /* +// Handle modals on anchor tags with data-target specified (preserve href) +$('a[data-toggle="modal-anchor"]').on('click.modalAnchor', modalAnchor); + +// Adjust the hash of the page as you scroll down +// (e.g. if you scroll past a section "Section A" to "Section B" +// then the URL bar will update to #section-b +$(window).on('scroll.changeHashOnScroll', changeHashOnScroll); + +// Handle hash change when user clicks on links +$body.on('click.handleHashChange', "a[href^='#']", handleHashChange); + +// Automatically show tooltips and popovers +$('[data-toggle="tooltip"]').tooltip(); +$('[data-toggle="popover"]').popover(); + +// Handle custom file inputs +// +// Example usage: +// +// +$body.on( + 'change.customFileInput', + 'input[type="file"][data-toggle="custom-file"]', + customFileInput +); + +// Handle clipboard copy event +clipboard(); + +// Bind confirm prompt event for clicks and form submissions +$body.on( + 'submit.confirmPrompt', + 'form.confirm-prompt, form[data-toggle="confirm-prompt"]', + confirmPrompt +); +$body.on( + 'click.confirmPrompt', + 'button.confirm-prompt, input.confirm-prompt', + confirmPrompt +); + +// Bind ajax form submission and handle Stripe tokens in forms +$body.on('submit.ajaxForm', 'form.ajax-form', ajaxForm); + +// Example for how to detect waypoint scrolling: +// +// Detect when we scroll to the #the-web-server selector +// so that we can hide the "Learn More" banner on bottom +/* if ($('#learn-more').length > 0 && $('#the-web-server').length > 0) { const waypoint = new window.Waypoint({ element: $('#the-web-server').get(0), @@ -155,4 +122,80 @@ $(() => { waypoint.context.refresh(); } */ + +// all blocks should have a toggle tooltip and clipboard +function errorHandler(ev) { + ev.clearSelection(); + $(ev.trigger) + .tooltip('dispose') + .tooltip({ + title: 'Please manually copy to clipboard', + html: true, + placement: 'bottom' + }) + .tooltip('show'); + $(ev.trigger).on('hidden.bs.tooltip', () => $(ev.trigger).tooltip('dispose')); +} + +function successHandler(ev) { + ev.clearSelection(); + let $container = $(ev.trigger).parents('pre:first'); + if ($container.length === 0) $container = $(ev.trigger); + $container + .tooltip('dispose') + .tooltip({ + title: 'Copied!', + placement: 'bottom' + }) + .tooltip('show'); + $container.on('hidden.bs.tooltip', () => { + $container.tooltip('dispose'); + }); +} + +if (Clipboard.isSupported()) { + $body.on('mouseenter', 'code', function() { + let $container = $(this).parents('pre:first'); + if ($container.length === 0) $container = $(this); + $container + .css('cursor', 'pointer') + .tooltip({ + title: 'Click to copy', + placement: 'bottom', + trigger: 'manual' + }) + .tooltip('show'); + }); + $body.on('mouseleave', 'code', function() { + let $container = $(this).parents('pre:first'); + if ($container.length === 0) $container = $(this); + $container.tooltip('dispose').css('cursor', 'initial'); + }); + const clipboard = new Clipboard('code', { + text(trigger) { + return trigger.textContent; + }, + target(trigger) { + return trigger.tagName === 'CODE' ? trigger : trigger.closest('code'); + } + }); + clipboard.on('success', successHandler); + clipboard.on('error', errorHandler); +} + +// +// generate random alias +// +// +// +$body.on('click', '.generate-random-alias', function() { + const target = $(this).data('target'); + if (!target) return; + const $target = $(target); + if ($target.lengh === 0) return; + const string = randomstring({ + characters: 'abcdefghijklmnopqrstuvwxyz0123456789', + length: 10 + }); + $target.val(string); }); diff --git a/template/assets/js/uncaught.js b/template/assets/js/uncaught.js index 3e163cbb..1423c84d 100644 --- a/template/assets/js/uncaught.js +++ b/template/assets/js/uncaught.js @@ -9,7 +9,7 @@ const logger = require('./logger'); // // uncaught.start(); -uncaught.addListener(function(err, event) { +uncaught.addListener(async function(err, event) { if (!err) { if (typeof ErrorEvent === 'function' && event instanceof ErrorEvent) return logger.error(event.message, { event }); @@ -19,15 +19,14 @@ uncaught.addListener(function(err, event) { // this will transform the error's `stack` property // to be consistently similar to Gecko and V8 stackframes - StackTrace.fromError(err) - .then(stackframes => { - err.stack = prepareStackTrace(err, stackframes); - logger.error(err); - }) - .catch(err_ => { - logger.error(err); - logger.error(err_); - }); + try { + const stackframes = await StackTrace.fromError(err); + err.stack = prepareStackTrace(err, stackframes); + logger.error(err); + } catch (err_) { + logger.error(err); + logger.error(err_); + } }); module.exports = uncaught; diff --git a/template/assets/manifest.json b/template/assets/manifest.json deleted file mode 100644 index 0a514408..00000000 --- a/template/assets/manifest.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "<%= name %>", - "icons": [], - "theme_color": "#94CC27", - "background_color": "#ffffff", - "display": "standalone" -} diff --git a/template/assets/site.webmanifest b/template/assets/site.webmanifest new file mode 100644 index 00000000..e26de841 --- /dev/null +++ b/template/assets/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "<%= name %>", + "short_name": "<%= name %>", + "icons": [ + { + "src": "/img/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/img/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#94CC27", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/template/bull.js b/template/bull.js index e9afcfd9..8f3c4f72 100644 --- a/template/bull.js +++ b/template/bull.js @@ -1,3 +1,6 @@ +const cluster = require('cluster'); +const os = require('os'); + const Bull = require('@ladjs/bull'); const Graceful = require('@ladjs/graceful'); const pSeries = require('p-series'); @@ -6,6 +9,8 @@ const config = require('./config'); const queues = require('./queues'); const logger = require('./helpers/logger'); +const cpus = os.cpus().length; + const bull = new Bull({ logger, queues, @@ -22,22 +27,62 @@ if (!module.parent) { (async () => { try { - const translateMarkdown = bull.queues.get('translate-markdown'); - await pSeries([ - () => translateMarkdown.empty(), - () => translateMarkdown.add() - ]); - - const translatePhrases = bull.queues.get('translate-phrases'); - await pSeries([ - () => translatePhrases.empty(), - () => translatePhrases.add() - ]); + // + // + // + // NOTE: we only want to create recurring jobs and empty existing + // in master thread process, otherwise child workers would create collisions + // + // also we must wait to spawn child workers until empty() and add() is finished + // + if (cluster.isMaster) { + const welcomeEmail = bull.queues.get('welcome-email'); + const translateMarkdown = bull.queues.get('translate-markdown'); + const translatePhrases = bull.queues.get('translate-phrases'); - await Promise.all([bull.start(), graceful.listen()]); + await Promise.all([ + (async () => { + // + const failedEmailJobs = await bull.queues.get('email').getFailed(); + await Promise.all(failedEmailJobs.map(job => job.retry())); + })(), + pSeries([() => welcomeEmail.empty(), () => welcomeEmail.add()]), + pSeries([ + // clear any existing jobs + () => translateMarkdown.empty(), + // add the recurring job + () => translateMarkdown.add(), + // add an initial job when the process starts + () => translateMarkdown.add(null, { repeat: false }) + ]), + pSeries([ + // clear any existing jobs + () => translatePhrases.empty(), + // add the recurring job + () => translatePhrases.add(), + // add an initial job when the process starts + () => translatePhrases.add(null, { repeat: false }) + ]) + ]); + + cluster.on('online', worker => { + logger.info('cluster worker online', { worker }); + }); + cluster.on('exit', (worker, code) => { + logger.info('cluster worker exit', { worker, code }); + }); + + // spawn child workers + for (let i = 0; i < cpus - 1; i++) { + cluster.fork(); + } + } + + // start it up + await Promise.all([bull.start(), graceful.listen()]); if (process.send) process.send('ready'); - logger.info('Lad job scheduler started'); + logger.info('Lad bull queue started'); } catch (err) { logger.error(err); // eslint-disable-next-line unicorn/no-process-exit diff --git a/template/config/api.js b/template/config/api.js new file mode 100644 index 00000000..b93ccb3f --- /dev/null +++ b/template/config/api.js @@ -0,0 +1,13 @@ +const i18n = require('../helpers/i18n'); +const logger = require('../helpers/logger'); +const passport = require('../helpers/passport'); +const routes = require('../routes'); +const bull = require('../bull'); + +module.exports = { + routes: routes.api, + logger, + i18n, + passport, + bull +}; diff --git a/template/config/cookies.js b/template/config/cookies.js new file mode 100644 index 00000000..0f626264 --- /dev/null +++ b/template/config/cookies.js @@ -0,0 +1,15 @@ +module.exports = { + // + // + httpOnly: true, + path: '/', + overwrite: true, + signed: true, + maxAge: 24 * 60 * 60 * 1000, + secure: process.env.WEB_PROTOCOL === 'https', + // we use SameSite cookie support as an alternative to CSRF + // + // 'strict' is ideal, but would cause issues when redirecting out + // for oauth flows to github, google, etc. + sameSite: 'lax' +}; diff --git a/template/config/filters.js b/template/config/filters.js index b6997ac4..364b1e53 100644 --- a/template/config/filters.js +++ b/template/config/filters.js @@ -1,31 +1,24 @@ +const I18N = require('@ladjs/i18n'); const isSANB = require('is-string-and-not-blank'); -const markdownIt = require('markdown-it'); -const markdownItEmoji = require('markdown-it-emoji'); -const markdownItGitHubHeadings = require('markdown-it-github-headings'); -const markdownItHighlightJS = require('markdown-it-highlightjs'); -const markdownItTaskCheckbox = require('markdown-it-task-checkbox'); -const i18n = require('../helpers/i18n'); - -// -// -// -// -const markdown = markdownIt({ - html: true, - linkify: true -}); -markdown.use(markdownItHighlightJS); -markdown.use(markdownItTaskCheckbox); -markdown.use(markdownItEmoji); -markdown.use(markdownItGitHubHeadings, { - prefix: '' -}); +const i18nConfig = require('../config/i18n'); +const logger = require('../helpers/logger'); +const markdown = require('../helpers/markdown'); module.exports = { md: (string, options) => { if (!isSANB(options.locale)) return `
${markdown.render(string)}
`; + // + // NOTE: we want our own instance of i18n that does not auto reload files + // + const i18n = new I18N({ + ...i18nConfig, + autoReload: false, + updateFiles: false, + syncFiles: false, + logger + }); return `
${i18n.api.t({ phrase: markdown.render(string), locale: options.locale diff --git a/template/config/i18n.js b/template/config/i18n.js index dc7f0835..27e5f75d 100644 --- a/template/config/i18n.js +++ b/template/config/i18n.js @@ -1,5 +1,6 @@ const path = require('path'); +const locales = require('./locales'); const phrases = require('./phrases'); module.exports = { @@ -8,8 +9,9 @@ module.exports = { // but for complete configuration reference please see: // phrases, + defaultLocale: 'en', directory: path.join(__dirname, '..', 'locales'), ignoredRedirectGlobs: ['/auth/*', '/auth/**/*'], lastLocaleField: 'last_locale', - locales: ['en', 'es', 'zh'] + locales }; diff --git a/template/config/index.js b/template/config/index.js index 4a35d7ec..18a3b629 100644 --- a/template/config/index.js +++ b/template/config/index.js @@ -49,12 +49,14 @@ const config = { preservePseudos: false }, lastLocaleField: 'last_locale', - i18n + i18n: { + ...i18n, + autoReload: false, + updateFiles: false, + syncFiles: false + } }, logger: loggerConfig, - livereload: { - port: env.LIVERELOAD_PORT - }, appName: env.APP_NAME, appColor: env.APP_COLOR, twitter: env.TWITTER, @@ -110,6 +112,10 @@ const config = { welcomeEmailSentAt: 'welcome_email_sent_at' }, + // dynamic otp routes + otpRoutePrefix: '/otp', + otpRouteLoginPath: '/login', + // dynamic otp routes loginOtpRoute: '/otp/login', @@ -204,6 +210,9 @@ const config = { lastLocaleField: 'last_locale' }; +// set dynamic login otp route +config.loginOtpRoute = `${config.otpRoutePrefix}${config.otpRouteLoginPath}`; + // set build dir based off build base dir name config.buildDir = path.join(__dirname, '..', config.buildBase); diff --git a/template/config/koa-cash.js b/template/config/koa-cash.js new file mode 100644 index 00000000..03e06796 --- /dev/null +++ b/template/config/koa-cash.js @@ -0,0 +1,33 @@ +const ms = require('ms'); +const safeStringify = require('fast-safe-stringify'); + +module.exports = client => ({ + maxAge: ms('1y') / 1000, + async get(key) { + const [buffer, data] = await Promise.all([ + client.getBuffer(`buffer:${key}`), + client.get(key) + ]); + if (buffer) data.body = buffer; + return data; + }, + async set(key, value, maxAge) { + // + // we must detect if the `value.body` is a buffer + // and if so, we need to store it in redis as a buffer + // and fetch it as a buffer using `getBuffer` as well + // + if (Buffer.isBuffer(value.body)) { + const { body, ...data } = value; + await client.mset( + new Map([ + [`buffer:${key}`, body, ...(maxAge > 0 ? ['EX', maxAge] : [])], + [key, safeStringify(data), ...(maxAge > 0 ? ['EX', maxAge] : [])] + ]) + ); + } else { + if (maxAge <= 0) return client.set(key, safeStringify(value)); + client.set(key, Buffer.from(safeStringify(value)), 'EX', maxAge); + } + } +}); diff --git a/template/config/locales.js b/template/config/locales.js new file mode 100644 index 00000000..67fd2e60 --- /dev/null +++ b/template/config/locales.js @@ -0,0 +1,27 @@ +module.exports = [ + 'ar', + 'cs', + 'da', + 'de', + 'en', + 'es', + 'fi', + 'fr', + 'he', + 'hu', + 'id', + 'it', + 'ja', + 'ko', + 'nl', + 'no', + 'pl', + 'pt', + 'ru', + 'sv', + 'th', + 'tr', + 'uk', + 'vi', + 'zh' +]; diff --git a/template/config/logger.js b/template/config/logger.js index 288ae90d..d9ca75f6 100644 --- a/template/config/logger.js +++ b/template/config/logger.js @@ -14,6 +14,17 @@ module.exports = { ? pino({ customLevels: { log: 30 + }, + hooks: { + // + logMethod(inputArgs, method) { + return method.call(this, { + // + // message: inputArgs[0], + msg: inputArgs[0], + meta: inputArgs[1] + }); + } } }) : new Signale() diff --git a/template/config/meta.js b/template/config/meta.js index 7f8e38e9..8adf5ae3 100644 --- a/template/config/meta.js +++ b/template/config/meta.js @@ -22,7 +22,7 @@ module.exports = function(config) { // so instead we need to use `|` which is the html entity // which gets decoded to a `|` in the helper.meta function const lad = `| ${config.appName}`; - return { + const meta = { // note that we don't do `Home ${lad}` because if we forget to define // meta for a specific route it'd be confusing to see Home // in the title bar in the user's browser @@ -67,4 +67,14 @@ module.exports = function(config) { ], '/500': [`Server error ${lad}`, 'A server error has unfortunately occurred'] }; + meta[config.loginRoute] = [`Sign in ${lad}`, 'Sign in to your account']; + meta[config.verifyRoute] = [ + `Verify email ${lad}`, + `Verify your ${config.appName} email` + ]; + meta[config.otpRoutePrefix] = [ + `Two Factor Auth ${lad}`, + 'Authenticate yourself with optional OTP to log in' + ]; + return meta; }; diff --git a/template/config/phrases.js b/template/config/phrases.js index 9dfac257..689720dd 100644 --- a/template/config/phrases.js +++ b/template/config/phrases.js @@ -23,7 +23,8 @@ module.exports = { INVALID_TOKEN: 'Invalid CSRF token.', INVALID_VERIFICATION_PIN: 'The verification pin you entered was invalid.', EMAIL_VERIFICATION_REQUIRED: 'Please verify your email address to continue.', - EMAIL_VERIFICATION_INTERVAL: 'Please wait for %s and try again.', + EMAIL_VERIFICATION_INTERVAL: + 'Please wait for %s and try again.', EMAIL_VERIFICATION_SUCCESS: 'Your email address has been successfully verified.', EMAIL_ALREADY_VERIFIED: 'Your email address is already verified.', diff --git a/template/config/utilities.js b/template/config/utilities.js index 8efc65b0..b8bddae3 100644 --- a/template/config/utilities.js +++ b/template/config/utilities.js @@ -1,13 +1,16 @@ const _ = require('lodash'); -const accounting = require('accounting'); const ajc = require('array-join-conjunction'); const dashify = require('dashify'); const fa = require('font-awesome-assets'); const hljs = require('highlight.js'); const humanize = require('humanize-string'); +const isBot = require('isbot'); const isSANB = require('is-string-and-not-blank'); const moment = require('moment'); +const numeral = require('numeral'); const pluralize = require('pluralize'); +const reservedEmailAddressesList = require('reserved-email-addresses-list'); +const striptags = require('striptags'); const titleize = require('titleize'); const toEmoji = require('gemoji/name-to-emoji'); const validator = require('validator'); @@ -19,19 +22,22 @@ const json = (string, replacer = null, space = 2) => const emoji = string => (toEmoji[string] ? toEmoji[string] : ''); module.exports = { - hljs, _, + ajc, + boolean, + dashify, + emoji, + fa, + hljs, + humanize, + isBot, isSANB, + json, moment, - accounting, - fa, + numeral, pluralize, - json, - emoji, - boolean, + reservedEmailAddressesList, + striptags, titleize, - dashify, - humanize, - validator, - ajc + validator }; diff --git a/template/config/web.js b/template/config/web.js new file mode 100644 index 00000000..e1c269f7 --- /dev/null +++ b/template/config/web.js @@ -0,0 +1,35 @@ +const config = require('.'); +const cookieOptions = require('./cookies'); +const env = require('./env'); +const i18n = require('../helpers/i18n'); +const logger = require('../helpers/logger'); +const passport = require('../helpers/passport'); +const routes = require('../routes'); +const bull = require('../bull'); +const koaCashConfig = require('./koa-cash'); + +module.exports = client => ({ + routes: routes.web, + logger, + i18n, + cookies: cookieOptions, + meta: config.meta, + views: config.views, + passport, + koaCash: env.CACHE_RESPONSES ? koaCashConfig(client) : false, + cacheResponses: env.CACHE_RESPONSES + ? { + routes: [ + '/css/(.*)', + '/img/(.*)', + '/js/(.*)', + '/fonts/(.*)', + '/browserconfig(.*)', + '/robots(.*)', + '/site(.*)', + '/favicon(.*)' + ] + } + : false, + bull +}); diff --git a/template/ecosystem.json b/template/ecosystem.json index 9ba58dc9..2689d257 100644 --- a/template/ecosystem.json +++ b/template/ecosystem.json @@ -3,7 +3,7 @@ { "name": "web", "script": "web.js", - "exec_mode": "cluster_mode", + "exec_mode": "cluster", "wait_ready": true, "instances": "max", "env_production": { @@ -13,7 +13,7 @@ { "name": "api", "script": "api.js", - "exec_mode": "cluster_mode", + "exec_mode": "cluster", "wait_ready": true, "instances": "max", "env_production": { @@ -23,9 +23,9 @@ { "name": "bull", "script": "bull.js", - "exec_mode": "cluster_mode", + "exec_mode": "fork", "wait_ready": true, - "instances": "max", + "instances": "1", "env_production": { "NODE_ENV": "production" } @@ -33,7 +33,7 @@ { "name": "proxy", "script": "proxy.js", - "exec_mode": "cluster_mode", + "exec_mode": "cluster", "wait_ready": true, "instances": "max", "env_production": { diff --git a/template/emails/welcome/guide.md b/template/emails/welcome/guide.md new file mode 100644 index 00000000..d337c046 --- /dev/null +++ b/template/emails/welcome/guide.md @@ -0,0 +1,104 @@ +# Quick Start + +We strictly support Mac and Ubuntu-based operating systems (Windows _might_ work). + +## Requirements + +Please ensure your operating system has the following software installed: + +* [Git][] - see [GitHub's tutorial][github-git] for installation + +* [Node.js][node] (v10+) - use [nvm][] to install it on any OS + +* [MongoDB][] (v3.x+): + + * Mac (via [brew][]): `brew install mongodb && brew services start mongo` + * Ubuntu: + + ```sh + sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6 + echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list + sudo apt-get update + sudo apt-get -y install mongodb-org + ``` + +* [Redis][] (v4.x+): + + * Mac (via [brew][]): `brew install redis && brew services start redis` + * Ubuntu: + + ```sh + sudo add-apt-repository -y ppa:chris-lea/redis-server + sudo apt-get update + sudo apt-get -y install redis-server + ``` + +## Install + +[npm][]: + +```sh +npm install -g lad +``` + +[yarn][]: + +```sh +yarn global add lad +``` + +## Usage + +### Create a project + +```sh +lad new-project +cd new-project +``` + +### Development + +To begin, try typing "npm start" (or "yarn start") on command line. This will display to you all the scripts you can run. + +The "start" script (among many others) uses [nps][] and [nps-utils][] under the hood. This helps to keep scripts very developer-friendly, and rids the need to write in JSON syntax. + +This script accepts a "task" argument, whereas a task of "all" will spawn, watch, and re-compile all of the microservices. + +Just open for testing! + +[npm][]: + +```sh +npm start all +``` + +[yarn][]: + +```sh +yarn start all +``` + + +## + +[github-git]: https://help.github.com/articles/set-up-git/ + +[git]: https://git-scm.com/ + +[node]: https://nodejs.org + +[nvm]: https://github.com/creationix/nvm + +[mongodb]: https://www.mongodb.com/ + +[redis]: https://redis.io/ + +[yarn]: https://yarnpkg.com/ + +[npm]: https://www.npmjs.com/ + +[brew]: https://brew.sh/ + +[nps]: https://github.com/kentcdodds/nps + +[nps-utils]: https://github.com/kentcdodds/nps-utils diff --git a/template/gulpfile.js b/template/gulpfile.js index 4d8d423f..1586bc91 100644 --- a/template/gulpfile.js +++ b/template/gulpfile.js @@ -3,19 +3,19 @@ const fs = require('fs'); const Graceful = require('@ladjs/graceful'); const Mandarin = require('mandarin'); -const babel = require('babelify'); +const RevAll = require('gulp-rev-all'); +const babel = require('gulp-babel'); const browserify = require('browserify'); -const collapser = require('bundle-collapser/plugin'); +const concat = require('gulp-concat'); const cssnano = require('cssnano'); const del = require('del'); const envify = require('gulp-envify'); const fontMagician = require('postcss-font-magician'); const fontSmoothing = require('postcss-font-smoothing'); +const getStream = require('get-stream'); const globby = require('globby'); -const gulpEslint = require('gulp-eslint'); const gulpRemark = require('gulp-remark'); const gulpXo = require('gulp-xo'); -const gulpif = require('gulp-if'); const imagemin = require('gulp-imagemin'); const lr = require('gulp-livereload'); const makeDir = require('make-dir'); @@ -32,6 +32,7 @@ const scssParser = require('postcss-scss'); const sourcemaps = require('gulp-sourcemaps'); const stylelint = require('stylelint'); const terser = require('gulp-terser'); +const through2 = require('through2'); const unassert = require('gulp-unassert'); const { lastRun, watch, series, parallel, src, dest } = require('gulp'); @@ -58,19 +59,19 @@ const staticAssets = [ '!assets/img/**/*', '!assets/js/**/*' ]; -const manifestOptions = { - merge: true, - base: config.buildBase -}; function pug() { - return src('app/views/**/*.pug', { since: lastRun(pug) }) - .pipe(pugLinter({ reporter: 'default', failAfterError: true })) - .pipe(gulpif(DEV, lr(config.livereload))); + let stream = src('app/views/**/*.pug', { since: lastRun(pug) }).pipe( + pugLinter({ reporter: 'default', failAfterError: true }) + ); + + if (DEV) stream = stream.pipe(lr(config.livereload)); + + return stream; } function img() { - return src('assets/img/**/*', { + let stream = src('assets/img/**/*', { base: 'assets', since: lastRun(img) }) @@ -81,11 +82,16 @@ function img() { use: [pngquant()] }) ) - .pipe(dest(config.buildBase)) - .pipe(gulpif(DEV, lr(config.livereload))) - .pipe(gulpif(PROD, rev.manifest(config.manifest, manifestOptions))) - .pipe(gulpif(PROD, revSri({ base: config.buildBase }))) - .pipe(gulpif(PROD, dest(config.buildBase))); + .pipe(dest(config.buildBase)); + + if (DEV) stream = stream.pipe(lr(config.livereload)); + return stream; +} + +function fonts() { + return src(['node_modules/@fortawesome/fontawesome-free/webfonts/**/*']).pipe( + dest(path.join(config.buildBase, 'fonts')) + ); } function scss() { @@ -99,7 +105,7 @@ function scss() { } function css() { - return src('assets/css/**/*.scss', { + let stream = src('assets/css/**/*.scss', { base: 'assets' }) .pipe(sourcemaps.init()) @@ -107,21 +113,26 @@ function css() { .pipe( postcss([ fontMagician({ - hosted: [path.join(__dirname, config.buildBase, 'fonts'), '/fonts'] + foundries: ['custom', 'hosted'], + // note if you modify this then you will have to + // also modify the font awesome fonts in css folder + // + formats: 'woff ttf', + hosted: [path.join(__dirname, config.buildBase, 'fonts'), '../fonts'], + display: 'swap' }), postcssPresetEnv({ browsers: 'extends @ladjs/browserslist-config' }), fontSmoothing(), ...(PROD ? [cssnano({ autoprefixer: false })] : []), reporter() ]) - ) - .pipe(gulpif(PROD, rev())) - .pipe(sourcemaps.write('./')) - .pipe(dest(config.buildBase)) - .pipe(gulpif(DEV, lr(config.livereload))) - .pipe(gulpif(PROD, rev.manifest(config.manifest, manifestOptions))) - .pipe(gulpif(PROD, revSri({ base: config.buildBase }))) - .pipe(gulpif(PROD, dest(config.buildBase))); + ); + + stream = stream.pipe(sourcemaps.write('./')).pipe(dest(config.buildBase)); + + if (DEV) stream = stream.pipe(lr(config.livereload)); + + return stream; } function xo() { @@ -131,53 +142,87 @@ function xo() { .pipe(gulpXo.failAfterError()); } -function eslint() { - return src(`${config.buildBase}/**/*.js`, { since: lastRun(eslint) }) - .pipe( - gulpEslint({ - allowInlineConfig: false, - configFile: '.build.eslintrc' - }) - ) - .pipe(gulpEslint.format('pretty')) - .pipe(gulpEslint.failAfterError()); -} - +// TODO: in the future use merge-streams and return a stream w/o through2 async function bundle() { - // make build/js folder for compile task + const since = lastRun(bundle); + const polyfillPath = path.join(config.buildBase, 'js', 'polyfill.js'); + const factorBundlePath = path.join( + config.buildBase, + 'js', + 'factor-bundle.js' + ); + await makeDir(path.join(config.buildBase, 'js')); - const ws = fs.createWriteStream( - path.join(config.buildBase, 'js', 'factor-bundle.js') + + async function getFactorBundle() { + const paths = await globby('**/*.js', { cwd: 'assets/js' }); + const factorBundle = await new Promise((resolve, reject) => { + browserify({ + entries: paths.map(string => `assets/js/${string}`), + debug: true + }) + .plugin('bundle-collapser/plugin') + .plugin('factor-bundle', { + outputs: paths.map(string => + path.join(config.buildBase, 'js', string) + ) + }) + .bundle((err, data) => { + if (err) return reject(err); + resolve(data); + }); + }); + await fs.promises.writeFile(factorBundlePath, factorBundle); + } + + await Promise.all([ + fs.promises.copyFile( + path.join( + __dirname, + 'node_modules', + '@babel', + 'polyfill', + 'dist', + 'polyfill.js' + ), + polyfillPath + ), + getFactorBundle() + ]); + + // concatenate files + await getStream( + src([ + 'build/js/polyfill.js', + 'build/js/factor-bundle.js', + 'build/js/uncaught.js', + 'build/js/core.js' + ]) + .pipe(sourcemaps.init({ loadMaps: true })) + .pipe(concat('build.js')) + .pipe(sourcemaps.write('./')) + .pipe(dest(path.join(config.buildBase, 'js'))) + .pipe(through2.obj((chunk, enc, cb) => cb())) ); - const paths = await globby('**/*.js', { cwd: 'assets/js' }); - const b = browserify({ - entries: paths.map(string => `assets/js/${string}`), - debug: true - }); - return b - .transform(babel) - .plugin(collapser) - .plugin('factor-bundle', { - outputs: paths.map(string => path.join(config.buildBase, 'js', string)) - }) - .bundle() - .pipe(ws) - .on('finish', compile); -} -function compile() { - return src('build/js/**/*.js', { base: 'build', since: lastRun(compile) }) + let stream = src('build/js/**/*.js', { base: 'build', since }) .pipe(sourcemaps.init({ loadMaps: true })) - .pipe(envify(env)) .pipe(unassert()) - .pipe(gulpif(PROD, terser())) - .pipe(gulpif(PROD, rev())) - .pipe(sourcemaps.write('./')) - .pipe(dest(config.buildBase)) - .pipe(gulpif(DEV, lr(config.livereload))) - .pipe(gulpif(PROD, rev.manifest(config.manifest, manifestOptions))) - .pipe(gulpif(PROD, revSri({ base: config.buildBase }))) - .pipe(gulpif(PROD, dest(config.buildBase))); + .pipe(envify(env)) + .pipe(babel()); + + if (PROD) stream = stream.pipe(terser()); + + stream = stream.pipe(sourcemaps.write('./')).pipe(dest(config.buildBase)); + + if (DEV) stream = stream.pipe(lr(config.livereload)); + + stream = stream.pipe(dest(config.buildBase)); + + // convert to conventional stream + stream = stream.pipe(through2.obj((chunk, enc, cb) => cb())); + + await getStream(stream); } function remark() { @@ -199,10 +244,6 @@ function static() { }).pipe(dest(config.buildBase)); } -function clean() { - return del([config.buildBase]); -} - async function markdown() { const mandarin = new Mandarin({ i18n, logger }); const graceful = new Graceful({ redisClients: [mandarin.redisClient] }); @@ -210,37 +251,91 @@ async function markdown() { await graceful.stopRedisClients(); } +async function sri() { + await getStream( + src('build/**/*.{css,js}') + .pipe(RevAll.revision()) + .pipe(dest(config.buildBase)) + .pipe(RevAll.manifestFile()) + .pipe(dest(config.buildBase)) + .pipe(revSri({ base: config.buildBase })) + .pipe(dest(config.buildBase)) + // convert to conventional stream + .pipe(through2.obj((chunk, enc, cb) => cb())) + ); + + // + // get all non css and non js files since rev-all ignores others + // and merge rev-manifest.json with fonts and other non rev-all assets + // + // + // + // + // note that we don't pipe fonts through gulp rev due to binary issues + // + await getStream( + src([ + 'build/**/*', + '!build/**/*.{css,js}', + '!build/fonts/**/*', + '!build/robots.txt', + '!build/browserconfig.xml' + ]) + .pipe(rev()) + .pipe(dest(config.buildBase)) + .pipe( + rev.manifest(config.manifest, { + merge: true, + base: config.buildBase + }) + ) + .pipe(revSri({ base: config.buildBase })) + .pipe(dest(config.buildBase)) + // convert to conventional stream + .pipe(through2.obj((chunk, enc, cb) => cb())) + ); +} + +function clean() { + return del([config.buildBase]); +} + const build = series( clean, parallel( ...(TEST ? [] : [xo, remark]), - parallel(img, static, markdown, series(scss, css), series(bundle, eslint)) + series( + parallel(img, static, markdown, series(fonts, scss, css), bundle), + sri + ) ) ); module.exports = { + clean, build, bundle, + sri, markdown, watch: () => { lr.listen(config.livereload); watch(['**/*.js', '!assets/js/**/*.js'], xo); watch(Mandarin.DEFAULT_PATTERNS, markdown); watch('assets/img/**/*', img); - watch('assets/css/**/*.scss', series(scss, css)); - watch('assets/js/**/*.js', series(xo, bundle, eslint)); + watch('assets/css/**/*.scss', series(fonts, scss, css)); + watch('assets/js/**/*.js', series(xo, bundle)); watch('app/views/**/*.pug', pug); watch(staticAssets, static); }, pug, img, xo, - eslint, static, remark, + fonts, scss, - css, - clean + css }; exports.default = build; diff --git a/template/helpers/i18n.js b/template/helpers/i18n.js index 70d4a1e9..e2886276 100644 --- a/template/helpers/i18n.js +++ b/template/helpers/i18n.js @@ -1,10 +1,12 @@ const I18N = require('@ladjs/i18n'); +const cookieOptions = require('../config/cookies'); const i18nConfig = require('../config/i18n'); const logger = require('./logger'); const i18n = new I18N({ ...i18nConfig, + cookieOptions, logger }); diff --git a/template/helpers/markdown.js b/template/helpers/markdown.js new file mode 100644 index 00000000..6cad4012 --- /dev/null +++ b/template/helpers/markdown.js @@ -0,0 +1,22 @@ +const markdownIt = require('markdown-it'); +const markdownItEmoji = require('markdown-it-emoji'); +const markdownItGitHubHeadings = require('markdown-it-github-headings'); +const markdownItHighlightJS = require('markdown-it-highlightjs'); +const markdownItTaskCheckbox = require('markdown-it-task-checkbox'); + +// +// +// +// +const markdown = markdownIt({ + html: true, + linkify: true +}); +markdown.use(markdownItHighlightJS); +markdown.use(markdownItTaskCheckbox); +markdown.use(markdownItEmoji); +markdown.use(markdownItGitHubHeadings, { + prefix: '' +}); + +module.exports = markdown; diff --git a/template/helpers/policies.js b/template/helpers/policies.js index 535b695f..86991468 100644 --- a/template/helpers/policies.js +++ b/template/helpers/policies.js @@ -5,17 +5,19 @@ const { verifyRoute, userFields, passport, - appName + appName, + loginRoute } = require('../config'); const { Users } = require('../app/models'); const policies = new Policies( { schemeName: appName, - userFields, - passport, + hasVerifiedEmail: userFields.hasVerifiedEmail, verifyRoute, - loginOtpRoute + loginRoute, + loginOtpRoute, + passport }, apiToken => { const query = {}; diff --git a/template/helpers/send-verification-email.js b/template/helpers/send-verification-email.js new file mode 100644 index 00000000..9e2752f9 --- /dev/null +++ b/template/helpers/send-verification-email.js @@ -0,0 +1,27 @@ +const config = require('../config'); + +async function sendVerificationEmail(ctx) { + ctx.state.user = await ctx.state.user.sendVerificationEmail(ctx); + + // attempt to send them an email + const job = await ctx.bull.add('email', { + template: 'verify', + message: { + to: ctx.state.user[config.userFields.fullEmail] + }, + locals: { + user: ctx.state.user.toObject(), + expiresAt: ctx.state.user[config.userFields.verificationPinExpiresAt], + pin: ctx.state.user[config.userFields.verificationPin], + link: `${config.urls.web}${config.verifyRoute}?pin=${ + ctx.state.user[config.userFields.verificationPin] + }` + } + }); + + ctx.logger.info('added job', ctx.bull.getMeta({ job })); + + return ctx.state.user; +} + +module.exports = sendVerificationEmail; diff --git a/template/helpers/to-object.js b/template/helpers/to-object.js new file mode 100644 index 00000000..346688f9 --- /dev/null +++ b/template/helpers/to-object.js @@ -0,0 +1,14 @@ +const ObjectID = require('bson-objectid'); +const _ = require('lodash'); + +function toObject(Model, doc) { + if (_.isUndefined(Model) || _.isUndefined(doc)) + throw new Error('Model and doc are required'); + return ObjectID.isValid(doc) + ? doc + : _.isFunction(doc.toObject) + ? doc.toObject() + : new Model(doc).toObject(); +} + +module.exports = toObject; diff --git a/template/package-scripts.js b/template/package-scripts.js index b132c3b2..a6465e03 100644 --- a/template/package-scripts.js +++ b/template/package-scripts.js @@ -13,8 +13,9 @@ module.exports = { watch: 'gulp watch', clean: 'gulp clean', build: 'gulp build', + publishAssets: 'gulp publish', - lint: series('gulp xo', 'gulp eslint', 'gulp remark', 'gulp pug'), + lint: series('gulp xo', 'gulp remark', 'gulp pug'), // pretest: concurrent.nps('lint', 'build', 'pretest-mongo', 'pretest-redis'), diff --git a/template/package.json b/template/package.json index d1b38bf8..d56dd432 100644 --- a/template/package.json +++ b/template/package.json @@ -30,118 +30,134 @@ "<%= author %> <<%= email %>> (<%= website %>)" ], "dependencies": { - "@fortawesome/fontawesome-free": "^5.13.0", + "@fortawesome/fontawesome-free": "^5.13.1", "@hapi/boom": "^9.1.0", - "@koa/router": "^8.0.8", - "@ladjs/api": "^3.0.0", + "@koa/router": "^9.0.1", + "@ladjs/api": "^3.0.1", "@ladjs/assets": "^0.0.23", "@ladjs/bull": "^1.0.8", "@ladjs/env": "^1.0.0", "@ladjs/graceful": "^1.0.0", "@ladjs/i18n": "^3.0.12", - "@ladjs/mongoose": "^2.0.1", + "@ladjs/mongoose": "^2.1.1", "@ladjs/mongoose-error-messages": "^1.0.0", "@ladjs/passport": "^2.0.0", "@ladjs/policies": "^3.1.0", "@ladjs/proxy": "^2.0.0", + "@ladjs/redis": "^1.0.4", + "@ladjs/shared-config": "^3.0.8", "@ladjs/store-ip-address": "^0.0.7", - "@ladjs/web": "^6.0.2", - "@primer/css": "^14.3.0", - "@tkrotoff/bootstrap-floating-label": "^0.5.1", + "@ladjs/web": "^6.0.3", + "@primer/css": "^14.4.0", + "@sidoshi/random-string": "^1.0.0", + "@tkrotoff/bootstrap-floating-label": "^0.7.0", "accounting": "^0.4.1", "array-join-conjunction": "^1.0.0", - "axe": "^5.0.1", + "axe": "^6.0.2", "basic-auth": "^2.0.1", "bitter-font": "^0.0.1", "boolean": "3.0.1", - "bootstrap": "4.4.1", - "cabin": "^6.1.1", + "bootstrap": "4.5.0", + "bson-objectid": "^1.3.1", + "cabin": "^8.0.2", "captain-hook": "^0.0.3", "clipboard": "^2.0.6", "consolidate": "^0.15.1", "crypto-random-string": "^3.2.0", "custom-fonts-in-emails": "^4.0.1", "dashify": "^2.0.0", + "dayjs": "^1.8.28", "del": "^5.1.0", "dense": "^0.0.1", "email-templates": "^7.0.5", + "fast-safe-stringify": "^2.0.7", "font-awesome-assets": "^0.0.8", - "frisbee": "^3.1.2", + "frisbee": "^3.1.3", "gemoji": "^5.0.1", + "get-stream": "^5.1.0", "github-markdown-css": "^4.0.0", - "highlight.js": "^10.0.2", + "highlight.js": "^10.1.1", "html5-history-api": "^4.2.10", "humanize-string": "^2.1.0", "ip": "^1.1.5", "is-string-and-not-blank": "^0.0.2", - "jquery": "3.4.1", + "isbot": "^3.0.3", + "jquery": "3.5.1", "jquery-lazy": "^1.7.10", "jquery-placeholder": "^2.3.1", "jquery.pointer-events-polyfill": "^0.2.4", - "koa-ctx-paginate": "^0.0.4", + "koa-ctx-paginate": "^0.0.5", "koa-views-render": "^0.0.1", "lodash": "^4.17.15", - "mandarin": "^2.0.5", + "mandarin": "^3.0.0", "manifest-rev": "^1.0.3", - "markdown-it": "^10.0.0", + "markdown-it": "^11.0.0", "markdown-it-emoji": "^1.4.0", "markdown-it-github-headings": "^2.0.0", "markdown-it-highlightjs": "^3.1.0", "markdown-it-task-checkbox": "^1.0.6", - "moment": "^2.25.3", - "mongoose": "5.6", - "mongoose-common-plugin": "1.0.0", + "moment": "^2.27.0", + "mongoose": "5.9", + "mongoose-common-plugin": "2.0.1", "mongoose-json-select": "^0.2.1", + "mongoose-omit-common-fields": "0.0.6", "mongoose-unique-validator": "^2.0.3", - "nodemailer": "^6.4.6", + "nodemailer": "^6.4.10", "nodemailer-base64-to-s3": "^3.0.2", + "numeral": "^2.0.6", "otplib": "^12.0.1", "p-series": "^2.1.0", "parse-logs": "^1.0.0", "passport-local-mongoose": "^6.0.1", "passport-otp-strategy": "^1.0.1", - "pino": "^6.2.1", + "pino": "^6.3.2", "pluralize": "^8.0.0", "popper.js": "^1.16.1", "prepare-stack-trace": "^0.0.4", - "pug": "^2.0.4", + "pug": "^3.0.0", "qrcode": "^1.4.4", "qs": "^6.9.4", - "sanitize-html": "^1.23.0", + "reserved-email-addresses-list": "0.0.8", + "sanitize-html": "^1.27.0", "signale": "^1.4.0", "speakingurl": "^14.0.1", "stacktrace-js": "^2.0.2", + "striptags": "^3.1.1", "sweetalert2": "8.x", + "through2": "^3.0.1", "titleize": "^2.1.0", "uncaught": "^0.0.5", - "validator": "^13.0.0", + "validator": "^13.1.1", "zxcvbn": "^4.4.2" }, "devDependencies": { - "@babel/cli": "^7.8.4", - "@babel/core": "^7.9.6", - "@babel/preset-env": "^7.9.6", + "@babel/cli": "^7.10.3", + "@babel/core": "^7.10.3", + "@babel/polyfill": "^7.10.1", + "@babel/preset-env": "^7.10.3", "@commitlint/cli": "^8.3.5", "@commitlint/config-conventional": "^8.3.4", "@ladjs/browserslist-config": "^0.0.1", "@lwc/eslint-plugin-lwc": "^0.10.0", - "ava": "^3.8.2", + "ava": "^3.9.0", "babel-eslint": "^10.1.0", "babelify": "^10.0.0", "browserify": "^16.5.1", "bundle-collapser": "^1.4.0", - "codecov": "^3.6.5", + "codecov": "^3.7.0", "cssnano": "^4.1.10", "eslint": "6.x", "eslint-config-xo-lass": "^1.0.3", - "eslint-formatter-pretty": "^3.0.1", - "eslint-plugin-compat": "^3.5.1", - "eslint-plugin-no-smart-quotes": "^1.0.2", + "eslint-formatter-pretty": "^4.0.0", + "eslint-plugin-compat": "^3.7.0", + "eslint-plugin-no-smart-quotes": "^1.1.0", "factor-bundle": "^2.5.0", "fixpack": "^3.0.6", - "globby": "^11.0.0", + "globby": "^11.0.1", "gulp": "^4.0.2", - "gulp-cli": "^2.2.0", + "gulp-babel": "^8.0.0", + "gulp-cli": "^2.3.0", + "gulp-concat": "^2.6.1", "gulp-envify": "^1.0.0", "gulp-eslint": "^6.0.0", "gulp-if": "^3.0.0", @@ -151,36 +167,37 @@ "gulp-pug-linter": "^1.3.0", "gulp-remark": "^8.0.0", "gulp-rev": "^9.0.0", - "gulp-rev-sri": "0.0.3", + "gulp-rev-all": "^2.0.3", + "gulp-rev-sri": "0.0.4", "gulp-sass": "^4.1.0", "gulp-sourcemaps": "^2.6.5", "gulp-terser": "^1.2.0", - "gulp-unassert": "^1.1.0", - "gulp-xo": "^0.24.0", + "gulp-unassert": "^2.0.0", + "gulp-xo": "^0.25.0", "husky": "^4.2.5", - "imagemin-pngquant": "^8.0.0", - "lint-staged": "10.2.2", + "imagemin-pngquant": "^9.0.0", + "lint-staged": "10.2.11", "make-dir": "^3.1.0", "ms": "^2.1.2", "node-sass": "^4.14.1", - "nodemon": "^2.0.3", + "nodemon": "^2.0.4", "npm-run-all": "^4.1.5", "nps": "^5.9.12", "nps-utils": "^1.7.0", - "nyc": "^15.0.1", - "postcss": "^7.0.29", + "nyc": "^15.1.0", + "postcss": "^7.0.32", "postcss-font-magician": "^2.3.1", "postcss-font-smoothing": "^0.1.0", "postcss-preset-env": "^6.7.0", "postcss-reporter": "^6.0.1", - "postcss-scss": "^2.0.0", + "postcss-scss": "^2.1.1", "pug-lint": "^2.6.0", "rc": "^1.2.8", "remark-cli": "^8.0.0", - "remark-preset-github": "^1.0.0", - "stylelint": "^13.3.3", + "remark-preset-github": "^2.0.0", + "stylelint": "^13.6.1", "stylelint-config-recommended-scss": "^4.2.0", - "stylelint-scss": "^3.17.2", + "stylelint-scss": "^3.18.0", "tinyify": "https://github.com/niftylettuce/tinyify", "xo": "0.25" }, @@ -256,7 +273,7 @@ ], "rules": { "compat/compat": "error", - "@lwc/lwc/no-async-await": "error", + "@lwc/lwc/no-async-await": "off", "promise/prefer-await-to-then": "off", "no-smart-quotes/no-smart-quotes": "error" } diff --git a/template/proxy.js b/template/proxy.js index d9ea7522..e202c62a 100644 --- a/template/proxy.js +++ b/template/proxy.js @@ -2,7 +2,7 @@ const Graceful = require('@ladjs/graceful'); const ProxyServer = require('@ladjs/proxy'); const ip = require('ip'); -const { logger } = require('./helpers'); +const logger = require('./helpers/logger'); const proxy = new ProxyServer({ logger diff --git a/template/queues/email.js b/template/queues/email.js index 5a513e97..057a0abf 100644 --- a/template/queues/email.js +++ b/template/queues/email.js @@ -1,7 +1,8 @@ const Email = require('email-templates'); const _ = require('lodash'); -const { getEmailLocals, logger } = require('../helpers'); +const getEmailLocals = require('../helpers/get-email-locals'); +const logger = require('../helpers/logger'); const config = require('../config'); const email = new Email(config.email); diff --git a/template/queues/index.js b/template/queues/index.js index 4be9c7fa..7432ab6d 100644 --- a/template/queues/index.js +++ b/template/queues/index.js @@ -15,6 +15,23 @@ const queues = [ } ] }, + { + name: 'welcome-email', + options: { + attempts: 1, + defaultJobOptions: { + repeat: { + every: ms('1m') + } + } + }, + processors: [ + { + processor: path.join(__dirname, 'welcome-email.js'), + concurrency: 1 + } + ] + }, { name: 'translate-phrases', options: { diff --git a/template/queues/translate-markdown.js b/template/queues/translate-markdown.js index 23fcd315..95fbc481 100644 --- a/template/queues/translate-markdown.js +++ b/template/queues/translate-markdown.js @@ -1,6 +1,19 @@ const Mandarin = require('mandarin'); +const I18N = require('@ladjs/i18n'); -const { i18n, logger } = require('../helpers'); +const i18nConfig = require('../config/i18n'); +const logger = require('../helpers/logger'); + +// +// NOTE: we want our own instance of i18n that does not auto reload files +// +const i18n = new I18N({ + ...i18nConfig, + autoReload: false, + updateFiles: false, + syncFiles: false, + logger +}); const mandarin = new Mandarin({ i18n, logger }); diff --git a/template/queues/translate-phrases.js b/template/queues/translate-phrases.js index 8f180cee..07c59e19 100644 --- a/template/queues/translate-phrases.js +++ b/template/queues/translate-phrases.js @@ -1,6 +1,19 @@ const Mandarin = require('mandarin'); +const I18N = require('@ladjs/i18n'); -const { i18n, logger } = require('../helpers'); +const i18nConfig = require('../config/i18n'); +const logger = require('../helpers/logger'); + +// +// NOTE: we want our own instance of i18n that does not auto reload files +// +const i18n = new I18N({ + ...i18nConfig, + autoReload: false, + updateFiles: false, + syncFiles: false, + logger +}); const mandarin = new Mandarin({ i18n, logger }); diff --git a/template/queues/welcome-email.js b/template/queues/welcome-email.js new file mode 100644 index 00000000..19c8a237 --- /dev/null +++ b/template/queues/welcome-email.js @@ -0,0 +1,62 @@ +const Graceful = require('@ladjs/graceful'); +const Mongoose = require('@ladjs/mongoose'); +const dayjs = require('dayjs'); +const sharedConfig = require('@ladjs/shared-config'); + +const config = require('../config'); +const logger = require('../helpers/logger'); + +const bull = require('../bull'); + +const Users = require('../app/models/user'); + +const bullSharedConfig = sharedConfig('BULL'); + +const mongoose = new Mongoose({ ...bullSharedConfig.mongoose, logger }); + +const graceful = new Graceful({ + mongooses: [mongoose], + bulls: [bull], + logger +}); + +module.exports = async job => { + try { + logger.info('welcome email', { job }); + await Promise.all([mongoose.connect(), graceful.listen()]); + const obj = { + created_at: { + $lte: dayjs() + .subtract(24, 'hours') + .toDate() + } + }; + obj[config.userFields.welcomeEmailSentAt] = { $exists: false }; + obj[config.userFields.hasVerifiedEmail] = true; + const users = await Users.find(obj); + await Promise.all( + users.map(async user => { + // add welcome email job + try { + const job = await bull.add('email', { + template: 'welcome', + message: { + to: user[config.userFields.fullEmail] + }, + locals: { + user: user.toObject() + } + }); + logger.info('added job', bull.getMeta({ job })); + user[config.userFields.welcomeEmailSentAt] = new Date(); + await user.save(); + } catch (err) { + logger.error(err); + } + }) + ); + } catch (err) { + logger.error(err); + throw err; + } +}; diff --git a/template/routes/web/auth.js b/template/routes/web/auth.js index 80cd312c..c22539d7 100644 --- a/template/routes/web/auth.js +++ b/template/routes/web/auth.js @@ -3,7 +3,6 @@ const Router = require('@koa/router'); const { boolean } = require('boolean'); const passport = require('../../helpers/passport'); -const policies = require('../../helpers/policies'); const config = require('../../config'); const web = require('../../app/controllers/web'); @@ -12,40 +11,35 @@ const router = new Router({ prefix: '/auth' }); router .param('provider', (provider, ctx, next) => { if (!boolean(process.env[`AUTH_${provider.toUpperCase()}_ENABLED`])) { - return ctx.throw(Boom.badRequest(ctx.translate('INVALID_PROVIDER'))); + return ctx.throw(Boom.badRequest(ctx.translateError('INVALID_PROVIDER'))); } return next(); }) .get( '/:provider', - policies.ensureLoggedOut, web.auth.catchError, - (ctx, next) => + web.auth.parseReturnOrRedirectTo, + (ctx, next) => { passport.authenticate( ctx.params.provider, config.passport[ctx.params.provider] - )(ctx, next) - ) - .get( - '/:provider/ok', - policies.ensureLoggedOut, - web.auth.catchError, - (ctx, next) => { - const redirect = ctx.session.returnTo - ? ctx.session.returnTo - : `/${ctx.locale}${config.passportCallbackOptions.successReturnToOrRedirect}`; - return passport.authenticate(ctx.params.provider, { - ...config.passportCallbackOptions, - successReturnToOrRedirect: redirect - })(ctx, next); + )(ctx, next); } - ); + ) + .get('/:provider/ok', web.auth.catchError, (ctx, next) => { + const redirect = ctx.session.returnTo + ? ctx.session.returnTo + : ctx.state.l(config.passportCallbackOptions.successReturnToOrRedirect); + return passport.authenticate(ctx.params.provider, { + ...config.passportCallbackOptions, + successReturnToOrRedirect: redirect + })(ctx, next); + }); if (boolean(process.env.AUTH_GOOGLE_ENABLED)) { router.get( '/google/consent', - policies.ensureLoggedOut, web.auth.catchError, passport.authenticate('google', { accessType: 'offline', diff --git a/template/routes/web/index.js b/template/routes/web/index.js index acff4782..682d9382 100644 --- a/template/routes/web/index.js +++ b/template/routes/web/index.js @@ -13,6 +13,9 @@ const otp = require('./otp'); const router = new Router(); +// report URI support (not locale specific) +router.post('/report', web.report); + const localeRouter = new Router({ prefix: '/:locale' }); localeRouter diff --git a/template/routes/web/otp.js b/template/routes/web/otp.js index f1fef3fe..f6368feb 100644 --- a/template/routes/web/otp.js +++ b/template/routes/web/otp.js @@ -3,13 +3,14 @@ const render = require('koa-views-render'); const policies = require('../../helpers/policies'); const web = require('../../app/controllers/web'); +const config = require('../../config'); -const router = new Router({ prefix: '/otp' }); +const router = new Router({ prefix: config.otpRoutePrefix }); router.use(policies.ensureLoggedIn); router - .get('/login', render('otp/login')) - .post('/login', web.auth.loginOtp) + .get(config.otpRouteLoginPath, render('otp/login')) + .post(config.otpRouteLoginPath, web.auth.loginOtp) .get('/setup', render('otp/setup')) .post('/setup', web.otp.setup) .post('/disable', web.otp.disable) diff --git a/template/web.js b/template/web.js index 50d2d937..a7666a1c 100644 --- a/template/web.js +++ b/template/web.js @@ -1,33 +1,25 @@ const Graceful = require('@ladjs/graceful'); const Mongoose = require('@ladjs/mongoose'); +const Redis = require('@ladjs/redis'); const Web = require('@ladjs/web'); -const _ = require('lodash'); const ip = require('ip'); +const sharedConfig = require('@ladjs/shared-config'); const config = require('./config'); -const routes = require('./routes'); -const i18n = require('./helpers/i18n'); const logger = require('./helpers/logger'); -const passport = require('./helpers/passport'); +const webConfig = require('./config/web'); -const web = new Web({ - routes: routes.web, - logger, - i18n, - meta: config.meta, - views: config.views, - passport -}); +const webSharedConfig = sharedConfig('WEB'); +const client = new Redis(webSharedConfig.redis); +const web = new Web(webConfig(client)); if (!module.parent) { - const mongoose = new Mongoose( - _.merge({ logger }, web.config.mongoose, config.mongoose) - ); + const mongoose = new Mongoose({ ...web.config.mongoose, logger }); const graceful = new Graceful({ mongooses: [mongoose], servers: [web], - redisClients: [web.client], + redisClients: [web.client, client], logger }); diff --git a/template/yarn.lock b/template/yarn.lock index c55454bd..b1182f52 100644 --- a/template/yarn.lock +++ b/template/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@babel/cli@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.8.4.tgz#505fb053721a98777b2b175323ea4f090b7d3c1c" - integrity sha512-XXLgAm6LBbaNxaGhMAznXXaxtCWfuv6PIDJ9Alsy9JYTOh+j2jJz+L/162kkfU1j/pTSxK1xGmlwI4pdIMkoag== +"@babel/cli@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.10.3.tgz#4ea83bd997d2a41c78d07263ada3ec466fb3764b" + integrity sha512-lWB3yH5/fWY8pi2Kj5/fA+17guJ9feSBw5DNjTju3/nRi9sXnl1JPh7aKQOSvdNbiDbkzzoGYtsr46M8dGmXDQ== dependencies: commander "^4.0.1" convert-source-map "^1.1.0" @@ -25,16 +25,23 @@ dependencies: "@babel/highlight" "^7.8.3" -"@babel/compat-data@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.6.tgz#3f604c40e420131affe6f2c8052e9a275ae2049b" - integrity sha512-5QPTrNen2bm7RBc7dsOmcA5hbrS4O2Vhmk5XOL4zWW/zD/hV0iinpefDlkm+tBBy8kDtFaaeEvmAqt+nURAV2g== +"@babel/code-frame@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.3.tgz#324bcfd8d35cd3d47dae18cde63d752086435e9a" + integrity sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg== + dependencies: + "@babel/highlight" "^7.10.3" + +"@babel/compat-data@^7.10.1", "@babel/compat-data@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.3.tgz#9af3e033f36e8e2d6e47570db91e64a846f5d382" + integrity sha512-BDIfJ9uNZuI0LajPfoYV28lX8kyCPMHY6uY4WH1lJdcicmAfxCK5ASzaeV0D/wsUaRH/cLk+amuxtC37sZ8TUg== dependencies: - browserslist "^4.11.1" + browserslist "^4.12.0" invariant "^2.2.4" semver "^5.5.0" -"@babel/core@>=7.9.0", "@babel/core@^7.9.6": +"@babel/core@>=7.9.0": version "7.9.6" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.6.tgz#d9aa1f580abf3b2286ef40b6904d390904c63376" integrity sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg== @@ -56,6 +63,28 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.3.tgz#73b0e8ddeec1e3fdd7a2de587a60e17c440ec77e" + integrity sha512-5YqWxYE3pyhIi84L84YcwjeEgS+fa7ZjK6IBVGTjDVfm64njkR2lfDhVR5OudLk8x2GK59YoSyVv+L/03k1q9w== + dependencies: + "@babel/code-frame" "^7.10.3" + "@babel/generator" "^7.10.3" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helpers" "^7.10.1" + "@babel/parser" "^7.10.3" + "@babel/template" "^7.10.3" + "@babel/traverse" "^7.10.3" + "@babel/types" "^7.10.3" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/core@^7.7.5": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" @@ -78,6 +107,16 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/generator@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.3.tgz#32b9a0d963a71d7a54f5f6c15659c3dbc2a523a5" + integrity sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA== + dependencies: + "@babel/types" "^7.10.3" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + "@babel/generator@^7.9.0": version "7.9.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce" @@ -98,6 +137,13 @@ lodash "^4.17.13" source-map "^0.5.0" +"@babel/helper-annotate-as-pure@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz#f6d08acc6f70bbd59b436262553fb2e259a1a268" + integrity sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw== + dependencies: + "@babel/types" "^7.10.1" + "@babel/helper-annotate-as-pure@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" @@ -105,25 +151,46 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" - integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.1": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.3.tgz#4e9012d6701bef0030348d7f9c808209bd3e8687" + integrity sha512-lo4XXRnBlU6eRM92FkiZxpo1xFLmv3VsPFk61zJKMm7XYJfwqXHsYJTY6agoc4a3L8QPw1HqWehO18coZgbT6A== dependencies: - "@babel/helper-explode-assignable-expression" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-explode-assignable-expression" "^7.10.3" + "@babel/types" "^7.10.3" -"@babel/helper-compilation-targets@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.9.6.tgz#1e05b7ccc9d38d2f8b40b458b380a04dcfadd38a" - integrity sha512-x2Nvu0igO0ejXzx09B/1fGBxY9NXQlBW2kZsSxCJft+KHN8t9XWzIvFxtPHnBOAXpVsdxZKZFbRUC8TsNKajMw== +"@babel/helper-compilation-targets@^7.10.2": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz#a17d9723b6e2c750299d2a14d4637c76936d8285" + integrity sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA== dependencies: - "@babel/compat-data" "^7.9.6" - browserslist "^4.11.1" + "@babel/compat-data" "^7.10.1" + browserslist "^4.12.0" invariant "^2.2.4" levenary "^1.1.1" semver "^5.5.0" +"@babel/helper-create-class-features-plugin@^7.10.1": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.3.tgz#2783daa6866822e3d5ed119163b50f0fc3ae4b35" + integrity sha512-iRT9VwqtdFmv7UheJWthGc/h2s7MqoweBF9RUj77NFZsg9VfISvBTum3k6coAhJ8RWv2tj3yUjA03HxPd0vfpQ== + dependencies: + "@babel/helper-function-name" "^7.10.3" + "@babel/helper-member-expression-to-functions" "^7.10.3" + "@babel/helper-optimise-call-expression" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + +"@babel/helper-create-regexp-features-plugin@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz#1b8feeab1594cbcfbf3ab5a3bbcabac0468efdbd" + integrity sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-regex" "^7.10.1" + regexpu-core "^4.7.0" + "@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": version "7.8.8" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" @@ -133,22 +200,31 @@ "@babel/helper-regex" "^7.8.3" regexpu-core "^4.7.0" -"@babel/helper-define-map@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" - integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== +"@babel/helper-define-map@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.3.tgz#d27120a5e57c84727b30944549b2dfeca62401a8" + integrity sha512-bxRzDi4Sin/k0drWCczppOhov1sBSdBvXJObM1NLHQzjhXhwRtn7aRWGvLJWCYbuu2qUk3EKs6Ci9C9ps8XokQ== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-function-name" "^7.10.3" + "@babel/types" "^7.10.3" lodash "^4.17.13" -"@babel/helper-explode-assignable-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" - integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== +"@babel/helper-explode-assignable-expression@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.3.tgz#9dc14f0cfa2833ea830a9c8a1c742b6e7461b05e" + integrity sha512-0nKcR64XrOC3lsl+uhD15cwxPvaB6QKUDlD84OT9C3myRbhJqTMYir69/RWItUvHpharv0eJ/wk7fl34ONSwZw== dependencies: - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/traverse" "^7.10.3" + "@babel/types" "^7.10.3" + +"@babel/helper-function-name@^7.10.1", "@babel/helper-function-name@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz#79316cd75a9fa25ba9787ff54544307ed444f197" + integrity sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw== + dependencies: + "@babel/helper-get-function-arity" "^7.10.3" + "@babel/template" "^7.10.3" + "@babel/types" "^7.10.3" "@babel/helper-function-name@^7.8.3": version "7.8.3" @@ -168,6 +244,13 @@ "@babel/template" "^7.8.3" "@babel/types" "^7.9.5" +"@babel/helper-get-function-arity@^7.10.1", "@babel/helper-get-function-arity@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz#3a28f7b28ccc7719eacd9223b659fdf162e4c45e" + integrity sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg== + dependencies: + "@babel/types" "^7.10.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" @@ -175,12 +258,19 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-hoist-variables@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" - integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== +"@babel/helper-hoist-variables@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.3.tgz#d554f52baf1657ffbd7e5137311abc993bb3f068" + integrity sha512-9JyafKoBt5h20Yv1+BXQMdcXXavozI1vt401KBiRc2qzUepbVnd7ogVNymY1xkQN9fekGwfxtotH2Yf5xsGzgg== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.10.3" + +"@babel/helper-member-expression-to-functions@^7.10.1", "@babel/helper-member-expression-to-functions@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.3.tgz#bc3663ac81ac57c39148fef4c69bf48a77ba8dd6" + integrity sha512-q7+37c4EPLSjNb2NmWOjNwj0+BOyYlssuQ58kHEWk1Z78K5i8vTUsteq78HMieRPQSl/NtpQyJfdjt3qZ5V2vw== + dependencies: + "@babel/types" "^7.10.3" "@babel/helper-member-expression-to-functions@^7.8.3": version "7.8.3" @@ -189,6 +279,13 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-module-imports@^7.10.1", "@babel/helper-module-imports@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.3.tgz#766fa1d57608e53e5676f23ae498ec7a95e1b11a" + integrity sha512-Jtqw5M9pahLSUWA+76nhK9OG8nwYXzhQzVIGFoNaHnXF/r4l7kz4Fl0UAW7B6mqC5myoJiBP5/YQlXQTMfHI9w== + dependencies: + "@babel/types" "^7.10.3" + "@babel/helper-module-imports@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" @@ -196,6 +293,19 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-module-transforms@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622" + integrity sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg== + dependencies: + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-simple-access" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" + lodash "^4.17.13" + "@babel/helper-module-transforms@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" @@ -209,6 +319,13 @@ "@babel/types" "^7.9.0" lodash "^4.17.13" +"@babel/helper-optimise-call-expression@^7.10.1", "@babel/helper-optimise-call-expression@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.3.tgz#f53c4b6783093195b0f69330439908841660c530" + integrity sha512-kT2R3VBH/cnSz+yChKpaKRJQJWxdGoc6SjioRId2wkeV3bK0wLLioFpJROrX0U4xr/NmxSSAWT/9Ih5snwIIzg== + dependencies: + "@babel/types" "^7.10.3" + "@babel/helper-optimise-call-expression@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" @@ -221,6 +338,18 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== +"@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz#aac45cccf8bc1873b99a85f34bceef3beb5d3244" + integrity sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g== + +"@babel/helper-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.1.tgz#021cf1a7ba99822f993222a001cc3fec83255b96" + integrity sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g== + dependencies: + lodash "^4.17.13" + "@babel/helper-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" @@ -228,18 +357,28 @@ dependencies: lodash "^4.17.13" -"@babel/helper-remap-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" - integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== +"@babel/helper-remap-async-to-generator@^7.10.1", "@babel/helper-remap-async-to-generator@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.3.tgz#18564f8a6748be466970195b876e8bba3bccf442" + integrity sha512-sLB7666ARbJUGDO60ZormmhQOyqMX/shKBXZ7fy937s+3ID8gSrneMvKSSb+8xIM5V7Vn6uNVtOY1vIm26XLtA== dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-wrap-function" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-wrap-function" "^7.10.1" + "@babel/template" "^7.10.3" + "@babel/traverse" "^7.10.3" + "@babel/types" "^7.10.3" -"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": +"@babel/helper-replace-supers@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz#ec6859d20c5d8087f6a2dc4e014db7228975f13d" + integrity sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.1" + "@babel/helper-optimise-call-expression" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-replace-supers@^7.8.6": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== @@ -249,6 +388,14 @@ "@babel/traverse" "^7.8.6" "@babel/types" "^7.8.6" +"@babel/helper-simple-access@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz#08fb7e22ace9eb8326f7e3920a1c2052f13d851e" + integrity sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw== + dependencies: + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" + "@babel/helper-simple-access@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" @@ -257,6 +404,13 @@ "@babel/template" "^7.8.3" "@babel/types" "^7.8.3" +"@babel/helper-split-export-declaration@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz#c6f4be1cbc15e3a868e4c64a17d5d31d754da35f" + integrity sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g== + dependencies: + "@babel/types" "^7.10.1" + "@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" @@ -264,6 +418,11 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-validator-identifier@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz#60d9847f98c4cea1b279e005fdb7c28be5412d15" + integrity sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw== + "@babel/helper-validator-identifier@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" @@ -274,15 +433,24 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== -"@babel/helper-wrap-function@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" - integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== +"@babel/helper-wrap-function@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz#956d1310d6696257a7afd47e4c42dfda5dfcedc9" + integrity sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/helper-function-name" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helpers@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973" + integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw== + dependencies: + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" "@babel/helpers@^7.9.0": version "7.9.2" @@ -302,6 +470,15 @@ "@babel/traverse" "^7.9.6" "@babel/types" "^7.9.6" +"@babel/highlight@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.3.tgz#c633bb34adf07c5c13156692f5922c81ec53f28d" + integrity sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw== + dependencies: + "@babel/helper-validator-identifier" "^7.10.3" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/highlight@^7.8.3": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" @@ -311,6 +488,11 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/parser@^7.10.3", "@babel/parser@^7.6.0": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.3.tgz#7e71d892b0d6e7d04a1af4c3c79d72c1f10f5315" + integrity sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA== + "@babel/parser@^7.7.0", "@babel/parser@^7.7.5", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": version "7.9.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" @@ -321,73 +503,97 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7" integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q== -"@babel/plugin-proposal-async-generator-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" - integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== +"@babel/plugin-proposal-async-generator-functions@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.3.tgz#5a02453d46e5362e2073c7278beab2e53ad7d939" + integrity sha512-WUUWM7YTOudF4jZBAJIW9D7aViYC/Fn0Pln4RIHlQALyno3sXSjqmTA4Zy1TKC2D49RCR8Y/Pn4OIUtEypK3CA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/helper-remap-async-to-generator" "^7.10.3" "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" - integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== +"@babel/plugin-proposal-class-properties@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz#046bc7f6550bb08d9bd1d4f060f5f5a4f1087e01" + integrity sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-proposal-dynamic-import@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz#e36979dc1dc3b73f6d6816fc4951da2363488ef0" + integrity sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/plugin-proposal-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" - integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== +"@babel/plugin-proposal-json-strings@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz#b1e691ee24c651b5a5e32213222b2379734aff09" + integrity sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" - integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz#02dca21673842ff2fe763ac253777f235e9bbf78" + integrity sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" - integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== +"@babel/plugin-proposal-numeric-separator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz#a9a38bc34f78bdfd981e791c27c6fdcec478c123" + integrity sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-numeric-separator" "^7.10.1" -"@babel/plugin-proposal-object-rest-spread@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz#7a093586fcb18b08266eb1a7177da671ac575b63" - integrity sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A== +"@babel/plugin-proposal-object-rest-spread@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.3.tgz#b8d0d22f70afa34ad84b7a200ff772f9b9fce474" + integrity sha512-ZZh5leCIlH9lni5bU/wB/UcjtcVLgR8gc+FAgW2OOY+m9h1II3ItTO1/cewNUcsIDZSYcSaz/rYVls+Fb0ExVQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.3" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.9.5" + "@babel/plugin-transform-parameters" "^7.10.1" -"@babel/plugin-proposal-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" - integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== +"@babel/plugin-proposal-optional-catch-binding@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz#c9f86d99305f9fa531b568ff5ab8c964b8b223d2" + integrity sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" - integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== +"@babel/plugin-proposal-optional-chaining@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.3.tgz#9a726f94622b653c0a3a7a59cdce94730f526f7c" + integrity sha512-yyG3n9dJ1vZ6v5sfmIlMMZ8azQoqx/5/nZTSWX1td6L1H1bsjzA8TInDChpafCZiJkeOFzp/PtrfigAQXxI1Ng== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.3" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": +"@babel/plugin-proposal-private-methods@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz#ed85e8058ab0fe309c3f448e5e1b73ca89cdb598" + integrity sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-proposal-unicode-property-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz#dc04feb25e2dd70c12b05d680190e138fa2c0c6f" + integrity sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.8.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== @@ -402,6 +608,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-class-properties@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz#d5bc0645913df5b17ad7eda0fa2308330bde34c5" + integrity sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" @@ -423,12 +636,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" - integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== +"@babel/plugin-syntax-numeric-separator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz#25761ee7410bc8cf97327ba741ee94e4a61b7d99" + integrity sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-object-rest-spread@^7.8.0": version "7.8.3" @@ -451,73 +664,81 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" - integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== +"@babel/plugin-syntax-top-level-await@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz#8b8733f8c57397b3eaa47ddba8841586dcaef362" + integrity sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-arrow-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" - integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== +"@babel/plugin-transform-arrow-functions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz#cb5ee3a36f0863c06ead0b409b4cc43a889b295b" + integrity sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-async-to-generator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" - integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== +"@babel/plugin-transform-async-to-generator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz#e5153eb1a3e028f79194ed8a7a4bf55f862b2062" + integrity sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-remap-async-to-generator" "^7.10.1" -"@babel/plugin-transform-block-scoped-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" - integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== +"@babel/plugin-transform-block-scoped-functions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz#146856e756d54b20fff14b819456b3e01820b85d" + integrity sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-block-scoping@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" - integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== +"@babel/plugin-transform-block-scoping@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz#47092d89ca345811451cd0dc5d91605982705d5e" + integrity sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c" - integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.9.5" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" +"@babel/plugin-transform-classes@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.3.tgz#8d9a656bc3d01f3ff69e1fccb354b0f9d72ac544" + integrity sha512-irEX0ChJLaZVC7FvvRoSIxJlmk0IczFLcwaRXUArBKYHCHbOhe57aG8q3uw/fJsoSXvZhjRX960hyeAGlVBXZw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-define-map" "^7.10.3" + "@babel/helper-function-name" "^7.10.3" + "@babel/helper-optimise-call-expression" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" - integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== +"@babel/plugin-transform-computed-properties@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.3.tgz#d3aa6eef67cb967150f76faff20f0abbf553757b" + integrity sha512-GWzhaBOsdbjVFav96drOz7FzrcEW6AP5nax0gLIpstiFaI3LOb2tAg06TimaWU6YKOfUACK3FVrxPJ4GSc5TgA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.3" -"@babel/plugin-transform-destructuring@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50" - integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q== +"@babel/plugin-transform-destructuring@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz#abd58e51337815ca3a22a336b85f62b998e71907" + integrity sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": +"@babel/plugin-transform-dotall-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz#920b9fec2d78bb57ebb64a644d5c2ba67cc104ee" + integrity sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-dotall-regex@^7.4.4": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== @@ -525,244 +746,255 @@ "@babel/helper-create-regexp-features-plugin" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-duplicate-keys@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" - integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== +"@babel/plugin-transform-duplicate-keys@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz#c900a793beb096bc9d4d0a9d0cde19518ffc83b9" + integrity sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-exponentiation-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" - integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== +"@babel/plugin-transform-exponentiation-operator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz#279c3116756a60dd6e6f5e488ba7957db9c59eb3" + integrity sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-for-of@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" - integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== +"@babel/plugin-transform-for-of@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz#ff01119784eb0ee32258e8646157ba2501fcfda5" + integrity sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" - integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== +"@babel/plugin-transform-function-name@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz#4ed46fd6e1d8fde2a2ec7b03c66d853d2c92427d" + integrity sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw== dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-function-name" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" - integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== +"@babel/plugin-transform-literals@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz#5794f8da82846b22e4e6631ea1658bce708eb46a" + integrity sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-member-expression-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" - integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== +"@babel/plugin-transform-member-expression-literals@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz#90347cba31bca6f394b3f7bd95d2bbfd9fce2f39" + integrity sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-modules-amd@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz#8539ec42c153d12ea3836e0e3ac30d5aae7b258e" - integrity sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw== +"@babel/plugin-transform-modules-amd@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz#65950e8e05797ebd2fe532b96e19fc5482a1d52a" + integrity sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz#64b7474a4279ee588cacd1906695ca721687c277" - integrity sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ== +"@babel/plugin-transform-modules-commonjs@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz#d5ff4b4413ed97ffded99961056e1fb980fb9301" + integrity sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-simple-access" "^7.10.1" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz#207f1461c78a231d5337a92140e52422510d81a4" - integrity sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg== +"@babel/plugin-transform-modules-systemjs@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.3.tgz#004ae727b122b7b146b150d50cba5ffbff4ac56b" + integrity sha512-GWXWQMmE1GH4ALc7YXW56BTh/AlzvDWhUNn9ArFF0+Cz5G8esYlVbXfdyHa1xaD1j+GnBoCeoQNlwtZTVdiG/A== dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-hoist-variables" "^7.10.3" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" - integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== +"@babel/plugin-transform-modules-umd@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz#ea080911ffc6eb21840a5197a39ede4ee67b1595" + integrity sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA== dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" - integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.3.tgz#a4f8444d1c5a46f35834a410285f2c901c007ca6" + integrity sha512-I3EH+RMFyVi8Iy/LekQm948Z4Lz4yKT7rK+vuCAeRm0kTa6Z5W7xuhRxDNJv0FPya/her6AUgrDITb70YHtTvA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.8.3" -"@babel/plugin-transform-new-target@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" - integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== +"@babel/plugin-transform-new-target@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz#6ee41a5e648da7632e22b6fb54012e87f612f324" + integrity sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-object-super@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" - integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== +"@babel/plugin-transform-object-super@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz#2e3016b0adbf262983bf0d5121d676a5ed9c4fde" + integrity sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" -"@babel/plugin-transform-parameters@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795" - integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA== +"@babel/plugin-transform-parameters@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz#b25938a3c5fae0354144a720b07b32766f683ddd" + integrity sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg== dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-get-function-arity" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-property-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" - integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== +"@babel/plugin-transform-property-literals@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz#cffc7315219230ed81dc53e4625bf86815b6050d" + integrity sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA== dependencies: - "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-regenerator@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" - integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== +"@babel/plugin-transform-regenerator@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.3.tgz#6ec680f140a5ceefd291c221cb7131f6d7e8cb6d" + integrity sha512-H5kNeW0u8mbk0qa1jVIVTeJJL6/TJ81ltD4oyPx0P499DhMJrTmmIFCmJ3QloGpQG8K9symccB7S7SJpCKLwtw== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" - integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-shorthand-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" - integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" - integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-sticky-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" - integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-regex" "^7.8.3" - -"@babel/plugin-transform-template-literals@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" - integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-typeof-symbol@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" - integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-unicode-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" - integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/preset-env@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.6.tgz#df063b276c6455ec6fcfc6e53aacc38da9b0aea6" - integrity sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ== - dependencies: - "@babel/compat-data" "^7.9.6" - "@babel/helper-compilation-targets" "^7.9.6" - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-proposal-async-generator-functions" "^7.8.3" - "@babel/plugin-proposal-dynamic-import" "^7.8.3" - "@babel/plugin-proposal-json-strings" "^7.8.3" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-numeric-separator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.9.6" - "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining" "^7.9.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" +"@babel/plugin-transform-reserved-words@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz#0fc1027312b4d1c3276a57890c8ae3bcc0b64a86" + integrity sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-shorthand-properties@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz#e8b54f238a1ccbae482c4dce946180ae7b3143f3" + integrity sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-spread@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz#0c6d618a0c4461a274418460a28c9ccf5239a7c8" + integrity sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-sticky-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz#90fc89b7526228bed9842cff3588270a7a393b00" + integrity sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-regex" "^7.10.1" + +"@babel/plugin-transform-template-literals@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.3.tgz#69d39b3d44b31e7b4864173322565894ce939b25" + integrity sha512-yaBn9OpxQra/bk0/CaA4wr41O0/Whkg6nqjqApcinxM7pro51ojhX6fv1pimAnVjVfDy14K0ULoRL70CA9jWWA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" + +"@babel/plugin-transform-typeof-symbol@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz#60c0239b69965d166b80a84de7315c1bc7e0bb0e" + integrity sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-unicode-escapes@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz#add0f8483dab60570d9e03cecef6c023aa8c9940" + integrity sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-unicode-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz#6b58f2aea7b68df37ac5025d9c88752443a6b43f" + integrity sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/preset-env@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.3.tgz#3e58c9861bbd93b6a679987c7e4bd365c56c80c9" + integrity sha512-jHaSUgiewTmly88bJtMHbOd1bJf2ocYxb5BWKSDQIP5tmgFuS/n0gl+nhSrYDhT33m0vPxp+rP8oYYgPgMNQlg== + dependencies: + "@babel/compat-data" "^7.10.3" + "@babel/helper-compilation-targets" "^7.10.2" + "@babel/helper-module-imports" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/plugin-proposal-async-generator-functions" "^7.10.3" + "@babel/plugin-proposal-class-properties" "^7.10.1" + "@babel/plugin-proposal-dynamic-import" "^7.10.1" + "@babel/plugin-proposal-json-strings" "^7.10.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.1" + "@babel/plugin-proposal-numeric-separator" "^7.10.1" + "@babel/plugin-proposal-object-rest-spread" "^7.10.3" + "@babel/plugin-proposal-optional-catch-binding" "^7.10.1" + "@babel/plugin-proposal-optional-chaining" "^7.10.3" + "@babel/plugin-proposal-private-methods" "^7.10.1" + "@babel/plugin-proposal-unicode-property-regex" "^7.10.1" "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.10.1" "@babel/plugin-syntax-dynamic-import" "^7.8.0" "@babel/plugin-syntax-json-strings" "^7.8.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-numeric-separator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.1" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - "@babel/plugin-transform-arrow-functions" "^7.8.3" - "@babel/plugin-transform-async-to-generator" "^7.8.3" - "@babel/plugin-transform-block-scoped-functions" "^7.8.3" - "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.9.5" - "@babel/plugin-transform-computed-properties" "^7.8.3" - "@babel/plugin-transform-destructuring" "^7.9.5" - "@babel/plugin-transform-dotall-regex" "^7.8.3" - "@babel/plugin-transform-duplicate-keys" "^7.8.3" - "@babel/plugin-transform-exponentiation-operator" "^7.8.3" - "@babel/plugin-transform-for-of" "^7.9.0" - "@babel/plugin-transform-function-name" "^7.8.3" - "@babel/plugin-transform-literals" "^7.8.3" - "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.9.6" - "@babel/plugin-transform-modules-commonjs" "^7.9.6" - "@babel/plugin-transform-modules-systemjs" "^7.9.6" - "@babel/plugin-transform-modules-umd" "^7.9.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" - "@babel/plugin-transform-new-target" "^7.8.3" - "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.9.5" - "@babel/plugin-transform-property-literals" "^7.8.3" - "@babel/plugin-transform-regenerator" "^7.8.7" - "@babel/plugin-transform-reserved-words" "^7.8.3" - "@babel/plugin-transform-shorthand-properties" "^7.8.3" - "@babel/plugin-transform-spread" "^7.8.3" - "@babel/plugin-transform-sticky-regex" "^7.8.3" - "@babel/plugin-transform-template-literals" "^7.8.3" - "@babel/plugin-transform-typeof-symbol" "^7.8.4" - "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.10.1" + "@babel/plugin-transform-arrow-functions" "^7.10.1" + "@babel/plugin-transform-async-to-generator" "^7.10.1" + "@babel/plugin-transform-block-scoped-functions" "^7.10.1" + "@babel/plugin-transform-block-scoping" "^7.10.1" + "@babel/plugin-transform-classes" "^7.10.3" + "@babel/plugin-transform-computed-properties" "^7.10.3" + "@babel/plugin-transform-destructuring" "^7.10.1" + "@babel/plugin-transform-dotall-regex" "^7.10.1" + "@babel/plugin-transform-duplicate-keys" "^7.10.1" + "@babel/plugin-transform-exponentiation-operator" "^7.10.1" + "@babel/plugin-transform-for-of" "^7.10.1" + "@babel/plugin-transform-function-name" "^7.10.1" + "@babel/plugin-transform-literals" "^7.10.1" + "@babel/plugin-transform-member-expression-literals" "^7.10.1" + "@babel/plugin-transform-modules-amd" "^7.10.1" + "@babel/plugin-transform-modules-commonjs" "^7.10.1" + "@babel/plugin-transform-modules-systemjs" "^7.10.3" + "@babel/plugin-transform-modules-umd" "^7.10.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.3" + "@babel/plugin-transform-new-target" "^7.10.1" + "@babel/plugin-transform-object-super" "^7.10.1" + "@babel/plugin-transform-parameters" "^7.10.1" + "@babel/plugin-transform-property-literals" "^7.10.1" + "@babel/plugin-transform-regenerator" "^7.10.3" + "@babel/plugin-transform-reserved-words" "^7.10.1" + "@babel/plugin-transform-shorthand-properties" "^7.10.1" + "@babel/plugin-transform-spread" "^7.10.1" + "@babel/plugin-transform-sticky-regex" "^7.10.1" + "@babel/plugin-transform-template-literals" "^7.10.3" + "@babel/plugin-transform-typeof-symbol" "^7.10.1" + "@babel/plugin-transform-unicode-escapes" "^7.10.1" + "@babel/plugin-transform-unicode-regex" "^7.10.1" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.9.6" - browserslist "^4.11.1" + "@babel/types" "^7.10.3" + browserslist "^4.12.0" core-js-compat "^3.6.2" invariant "^2.2.2" levenary "^1.1.1" @@ -779,13 +1011,29 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@^7.6.3", "@babel/runtime@^7.7.4", "@babel/runtime@^7.7.7", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.10.2": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.3.tgz#670d002655a7c366540c67f6fd3342cd09500364" + integrity sha512-RzGO0RLSdokm9Ipe/YD+7ww8X2Ro79qiXZF3HU9ljrM+qnJmH1Vqth+hbiQZy761LnMJTMitHDuKVYTk3k4dLw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.6.3", "@babel/runtime@^7.7.4", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": version "7.9.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== dependencies: regenerator-runtime "^0.13.4" +"@babel/template@^7.10.1", "@babel/template@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.3.tgz#4d13bc8e30bf95b0ce9d175d30306f42a2c9a7b8" + integrity sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA== + dependencies: + "@babel/code-frame" "^7.10.3" + "@babel/parser" "^7.10.3" + "@babel/types" "^7.10.3" + "@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" @@ -795,7 +1043,22 @@ "@babel/parser" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/traverse@^7.7.0", "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": +"@babel/traverse@^7.10.1", "@babel/traverse@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.3.tgz#0b01731794aa7b77b214bcd96661f18281155d7e" + integrity sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug== + dependencies: + "@babel/code-frame" "^7.10.3" + "@babel/generator" "^7.10.3" + "@babel/helper-function-name" "^7.10.3" + "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/parser" "^7.10.3" + "@babel/types" "^7.10.3" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/traverse@^7.7.0", "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== @@ -825,6 +1088,15 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/types@^7.10.1", "@babel/types@^7.10.3", "@babel/types@^7.6.1": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.3.tgz#6535e3b79fea86a6b09e012ea8528f935099de8e" + integrity sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.3" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" @@ -990,10 +1262,10 @@ resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== -"@fortawesome/fontawesome-free@^5.13.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.13.0.tgz#fcb113d1aca4b471b709e8c9c168674fbd6e06d9" - integrity sha512-xKOeQEl5O47GPZYIMToj6uuA2syyFlq9EMSl2ui0uytjY9xbe8XS0pexNWmxrdcCyNGyDmLyYw5FtKsalBUeOg== +"@fortawesome/fontawesome-free@^5.13.1": + version "5.13.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.13.1.tgz#c53b4066edae16cd1fd669f687baf031b45fb9d6" + integrity sha512-D819f34FLHeBN/4xvw0HR0u7U2G7RqjPSggXqf7LktsxWQ48VAfGwvMrhcVuaZV2fF069c/619RdgCCms0DHhw== "@google-cloud/common@^2.0.0": version "2.4.0" @@ -1116,18 +1388,6 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@koa/router@^8.0.8": - version "8.0.8" - resolved "https://registry.yarnpkg.com/@koa/router/-/router-8.0.8.tgz#95f32d11373d03d89dcb63fabe9ac6f471095236" - integrity sha512-FnT93N4NUehnXr+juupDmG2yfi0JnWdCmNEuIXpCG4TtG+9xvtrLambBH3RclycopVUOEYAim2lydiNBI7IRVg== - dependencies: - debug "^4.1.1" - http-errors "^1.7.3" - koa-compose "^4.1.0" - methods "^1.1.2" - path-to-regexp "1.x" - urijs "^1.19.2" - "@koa/router@^9.0.1": version "9.0.1" resolved "https://registry.yarnpkg.com/@koa/router/-/router-9.0.1.tgz#4090a14223ea7e78aa13b632761209cba69acd95" @@ -1139,10 +1399,10 @@ methods "^1.1.2" path-to-regexp "^6.1.0" -"@ladjs/api@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@ladjs/api/-/api-3.0.0.tgz#d47e1a7f4a67d3a948cf1466d360d4f9cdf9ee02" - integrity sha512-gI6nIH3ajo0Jpffh6C/Uy5HDFP0I+hH689u342QH8dEFjizimv8NWa10K4Cda7qyRmhghuvIBWVI3XqaV6DLVQ== +"@ladjs/api@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@ladjs/api/-/api-3.0.1.tgz#26f8ee3749bf512c21c032607e68f606ed6725b9" + integrity sha512-VIV3gAuYI3r0GuDe4u1ur8oTiz2TAOLx607oYGsB+yq+lDpTUTbcqR5pxN7jxPCroyIZTuoC5QluaCpPd0dffw== dependencies: "@koa/router" "^9.0.1" "@ladjs/i18n" "^3.0.12" @@ -1150,7 +1410,7 @@ "@ladjs/shared-config" "^3.0.8" "@ladjs/store-ip-address" "^0.0.7" boolean "3.0.1" - cabin "^8.0.0" + cabin "^8.0.2" express-request-id "^1.4.1" kcors "^2.2.2" koa "^2.12.1" @@ -1277,11 +1537,12 @@ resolved "https://registry.yarnpkg.com/@ladjs/mongoose-error-messages/-/mongoose-error-messages-1.0.0.tgz#1f830e4e85cd960d961156b5ca4569ccd6e62a31" integrity sha512-khokBW3n28aS1Y918r6FGZL3gl34hYkeCapt318z/JHUXN/s1BIIKAafEPXh9u/WRD/O1Z9bbeXi39bqTXxVkQ== -"@ladjs/mongoose@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@ladjs/mongoose/-/mongoose-2.0.1.tgz#8f1c5424bb8f08dfa2affbd0c34f0b60c77b16cc" - integrity sha512-0jAFg7U5Cn7Ug/oYbxRU94HwqGuw8HNO7j4iWbJc6a1qibngXcrGPAI5O0ZcIDZ0YCWs2bkCBDClMo8NzpwfOw== +"@ladjs/mongoose@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@ladjs/mongoose/-/mongoose-2.1.1.tgz#600edc99fd7ae95c22fec55081f9d0323228bd2b" + integrity sha512-dtIMpoBqDORJhGADvgj22VkmAb0E2qEcNEG7cKOHL1ylf9iUCWflgkmGTvjTD3aVnNjPi6m2CLcArKeOZR703g== dependencies: + boolean "^3.0.1" debug "^4.1.1" delay "^4.3.0" lodash "^4.17.15" @@ -1317,13 +1578,6 @@ router "^1.3.3" url-parse "^1.4.7" -"@ladjs/redis@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@ladjs/redis/-/redis-1.0.3.tgz#4232bfea8af56c07a7b43e651c1f0762e888e917" - integrity sha512-oO/vSfhkMkxwtnx4oXZtE8zIhOz2sAC+AdoAsPtRBedO5qvUqARIffUcu5TMtK4ubI2Dq3wm+TA0cDN1euzY1g== - dependencies: - ioredis "^4.14.0" - "@ladjs/redis@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@ladjs/redis/-/redis-1.0.4.tgz#b225d508943d6a5b65e757e1fe4c19adda41f6c3" @@ -1331,15 +1585,7 @@ dependencies: ioredis "^4.17.1" -"@ladjs/shared-config@^2.0.7": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@ladjs/shared-config/-/shared-config-2.0.7.tgz#6e7ab4d820a8fb3eb0c12a41d12c4ad30d5fa247" - integrity sha512-ZiuB2IrBTpKHEhk7kN06iesWDjtsIUy/0WHf/0DEK9r7Cf/F6xe2PEOly9qmMxleGDsqIJnBDOKf6urWkz48qA== - dependencies: - boolean "^3.0.1" - is-string-and-not-blank "^0.0.2" - -"@ladjs/shared-config@^3.0.8": +"@ladjs/shared-config@^3.0.2", "@ladjs/shared-config@^3.0.8": version "3.0.8" resolved "https://registry.yarnpkg.com/@ladjs/shared-config/-/shared-config-3.0.8.tgz#b367748364727eb0e40a42e2673e880746a93634" integrity sha512-W5XIf7GmALfxTJ5W4IPbVxIZr4xuSP6QAWL81Ac07MyKYx0HHE75pZOtFMH/hvKRr3qehT4NYqK037vyx/9H4w== @@ -1362,10 +1608,10 @@ debug "^4.1.1" validator "^12.1.0" -"@ladjs/web@^6.0.2": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@ladjs/web/-/web-6.0.2.tgz#bca92ccb9f4e4956e7b1070334973bda26b32e21" - integrity sha512-s5mCxfH+3OeFrk7j46A7FouGG/7syvfXbf3pB76G2DfLRz0468CZXDpCzPeGbMwED508bFg+QWgAcdlElpIilA== +"@ladjs/web@^6.0.3": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@ladjs/web/-/web-6.0.3.tgz#dc907be1196339fcda7de15409abe787ddaf379f" + integrity sha512-xE06xsZTDxhInAAdf07yzMf9VFep5Z70f6c3Y1UF4/a53kKfs0iwcuFToIhVZSLNgub8Z33/229yA76x/UGDww== dependencies: "@hapi/boom" "^9.1.0" "@koa/router" "^9.0.1" @@ -1377,7 +1623,7 @@ "@ladjs/state-helper" "^0.0.2" "@ladjs/store-ip-address" "^0.0.7" boolean "3.0.1" - cabin "^8.0.0" + cabin "^8.0.2" crypto-random-string "^3.2.0" express-request-id "^1.4.1" is-string-and-not-blank "^0.0.2" @@ -1500,10 +1746,10 @@ "@otplib/plugin-crypto" "^12.0.1" "@otplib/plugin-thirty-two" "^12.0.1" -"@primer/css@^14.3.0": - version "14.3.0" - resolved "https://registry.yarnpkg.com/@primer/css/-/css-14.3.0.tgz#66d3e25a6c750e65d06234d1cf4e16a32567c611" - integrity sha512-n5/skNhsbCc+wStmH2nSFHWS8I1XFVtdSabG7IuCYbGELuxduw3x5kl9uYQwG558E5/4wQZ/WbAeACuTTjcWFA== +"@primer/css@^14.4.0": + version "14.4.0" + resolved "https://registry.yarnpkg.com/@primer/css/-/css-14.4.0.tgz#7a131411dd38890e9019f804a3cd0663b17575fc" + integrity sha512-o9DwcAH43jZNDC/rPLjsYTU/I1LsHIgIQlSO3X8vZV2u65LmWeA5jHI2cSadZYN3N0Gm0Soh0zVYuhh7kMskXA== dependencies: "@primer/octicons" "^9.1.1" @@ -1567,13 +1813,6 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= -"@samverschueren/stream-to-observable@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" - integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg== - dependencies: - any-observable "^0.3.0" - "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -1616,10 +1855,10 @@ dependencies: defer-to-connect "^1.0.1" -"@tkrotoff/bootstrap-floating-label@^0.5.1": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@tkrotoff/bootstrap-floating-label/-/bootstrap-floating-label-0.5.1.tgz#f6d330f8639fd0600c8e89f726456512212a7a89" - integrity sha512-4EEl09YmTF1JNDgiwwtV4tBCjtZqCBcEyUxIQfioH1sneaWa6u3/QXLpVrqkIhMVz4bzfY9MI9tUdYlnXTA07Q== +"@tkrotoff/bootstrap-floating-label@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@tkrotoff/bootstrap-floating-label/-/bootstrap-floating-label-0.7.0.tgz#727c5654a954131fd688ee6590449cde3e9013b4" + integrity sha512-YLw6MBreep7dWkKi8oc6fUD+aNfuZHxoyfVx43qAdWR89FyE9BK2AF04blbynJSnCfTRHkGfs9FnDZ291Zi50A== "@tootallnate/once@1": version "1.0.0" @@ -1643,6 +1882,11 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + "@types/events@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" @@ -1664,6 +1908,16 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/json-schema@^7.0.3": + version "7.0.5" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" + integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + "@types/long@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" @@ -1729,6 +1983,50 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== +"@typescript-eslint/eslint-plugin@^3.1.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.3.0.tgz#89518e5c5209a349bde161c3489b0ec187ae5d37" + integrity sha512-Ybx/wU75Tazz6nU2d7nN6ll0B98odoiYLXwcuwS5WSttGzK46t0n7TPRQ4ozwcTv82UY6TQoIvI+sJfTzqK9dQ== + dependencies: + "@typescript-eslint/experimental-utils" "3.3.0" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.3.0.tgz#d72a946e056a83d4edf97f3411cceb639b0b8c87" + integrity sha512-d4pGIAbu/tYsrPrdHCQ5xfadJGvlkUxbeBB56nO/VGmEDi/sKmfa5fGty5t5veL1OyJBrUmSiRn1R1qfVDydrg== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "3.3.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^3.1.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.3.0.tgz#fcae40012ded822aa8b2739a1a03a4e3c5bbb7bb" + integrity sha512-a7S0Sqn/+RpOOWTcaLw6RD4obsharzxmgMfdK24l364VxuBODXjuJM7ImCkSXEN7oz52aiZbXSbc76+2EsE91w== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "3.3.0" + "@typescript-eslint/typescript-estree" "3.3.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.3.0.tgz#841ffed25c29b0049ebffb4c2071268a34558a2a" + integrity sha512-3SqxylENltEvJsjjMSDCUx/edZNSC7wAqifUU1Ywp//0OWEZwMZJfecJud9XxJ/40rAKEbJMKBOQzeOjrLJFzQ== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + JSONStream@^1.0.3, JSONStream@^1.0.4, JSONStream@^1.3.2: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -1809,7 +2107,7 @@ acorn-walk@^7.0.0, acorn-walk@^7.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== -acorn@5.X, acorn@^5.0.0, acorn@^5.0.3, acorn@^5.1.0: +acorn@5.X, acorn@^5.0.3, acorn@^5.1.0: version "5.7.4" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== @@ -1829,6 +2127,11 @@ acorn@^7.0.0, acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== +acorn@^7.2.0, acorn@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" + integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== + agent-base@5: version "5.1.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" @@ -1974,11 +2277,6 @@ ansi-wrap@0.1.0, ansi-wrap@^0.1.0: resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= -any-observable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" - integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== - any-promise@^1.0.0, any-promise@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -2110,6 +2408,11 @@ array-find-index@^1.0.1: resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= +array-find@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-find/-/array-find-1.0.0.tgz#6c8e286d11ed768327f8e62ecee87353ca3e78b8" + integrity sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg= + array-flatten@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-3.0.0.tgz#6428ca2ee52c7b823192ec600fa3ed2f157cd541" @@ -2125,7 +2428,7 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= -array-includes@^3.0.3: +array-includes@^3.0.3, array-includes@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== @@ -2195,7 +2498,7 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.flat@^1.2.1: +array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== @@ -2239,12 +2542,17 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" +assert-never@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe" + integrity sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw== + 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.4.0: +assert@^1.1.1, assert@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== @@ -2257,10 +2565,10 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -ast-metadata-inferer@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ast-metadata-inferer/-/ast-metadata-inferer-0.1.1.tgz#66e24fae9d30ca961fac4880b7fc466f09b25165" - integrity sha512-hc9w8Qrgg9Lf9iFcZVhNjUnhrd2BBpTlyCnegPVvCe6O0yMrF57a6Cmh7k+xUsfUOMh9wajOL5AsGOBNEyTCcw== +ast-metadata-inferer@^0.2.0-0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ast-metadata-inferer/-/ast-metadata-inferer-0.2.0.tgz#a470e5d1d7402b18c6f7a1f3d6900723cfa07392" + integrity sha512-6yPph2NeCHNxoI/ZmjklYaLOSZDAx+0L0+wsXnF56FxmjxvUlYZSWcj1KXtXO8IufruQTzVFOjg1+IzdDazSPg== astral-regex@^1.0.0: version "1.0.0" @@ -2299,13 +2607,6 @@ async-settle@^1.0.0: dependencies: async-done "^1.2.2" -async@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" - integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== - dependencies: - lodash "^4.17.11" - async@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" @@ -2321,6 +2622,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -2368,32 +2674,32 @@ autoprefixer@^9.6.1: postcss "^7.0.27" postcss-value-parser "^4.0.3" -autoprefixer@^9.7.6: - version "9.7.6" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.6.tgz#63ac5bbc0ce7934e6997207d5bb00d68fa8293a4" - integrity sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ== +autoprefixer@^9.8.0: + version "9.8.1" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.1.tgz#09ebdf209ddeb6900b310c71219f367138950ddd" + integrity sha512-zDw9+mkCdWZHloBIGrOgMq1tTUed4qy6ZgNAe2Ze2xERZA7CyTgW5Bw3XZbwSeJe8lfDHZIkw8Hwd/6hI3p0NQ== dependencies: - browserslist "^4.11.1" - caniuse-lite "^1.0.30001039" - chalk "^2.4.2" + browserslist "^4.12.0" + caniuse-lite "^1.0.30001084" + kleur "^4.0.1" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.27" - postcss-value-parser "^4.0.3" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" -ava@^3.8.2: - version "3.8.2" - resolved "https://registry.yarnpkg.com/ava/-/ava-3.8.2.tgz#877c9eb861763a185bbabd54f359e1fbe57d1754" - integrity sha512-sph3oUsVTGsq4qbgeWys03QKCmXjkZUO3oPnFWXEW6g1SReCY9vuONGghMgw1G6VOzkg1k+niqJsOzwfO8h9Ng== +ava@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-3.9.0.tgz#ac91eac980555fcc6c1b91872ac6923ff4c0ffae" + integrity sha512-EnK5I/AX1U5nF4X1YG3QQYg2+jWnpvMW3z2y096DBvbwITkq9rB7Gu1j5clWcuizAJUlYbvcX6YfP+zkRFgC8Q== dependencies: "@concordance/react" "^2.0.0" - acorn "^7.1.1" + acorn "^7.3.1" acorn-walk "^7.1.1" ansi-styles "^4.2.1" arrgv "^1.0.2" arrify "^2.0.1" callsites "^3.1.0" - chalk "^4.0.0" + chalk "^4.1.0" chokidar "^3.4.0" chunkd "^2.0.1" ci-info "^2.0.0" @@ -2403,16 +2709,16 @@ ava@^3.8.2: cli-truncate "^2.1.0" code-excerpt "^2.1.1" common-path-prefix "^3.0.0" - concordance "^4.0.0" + concordance "^5.0.0" convert-source-map "^1.7.0" currently-unhandled "^0.4.1" debug "^4.1.1" del "^5.1.0" - emittery "^0.6.0" + emittery "^0.7.0" equal-length "^1.0.0" figures "^3.2.0" - globby "^11.0.0" - ignore-by-default "^1.0.0" + globby "^11.0.1" + ignore-by-default "^2.0.0" import-local "^3.0.2" indent-string "^4.0.0" is-error "^2.2.2" @@ -2467,27 +2773,10 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== -axe@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/axe/-/axe-5.0.1.tgz#f11eb69430c165f7b5610696291632c28b579ced" - integrity sha512-66C9B7GuxcLC2cXjkOe/8cpud1f+6vDUoBss7hfOoTNtUCxWnB/vFzTmOC4b85HD1OYTBMYol7+E+hKDQYDoyA== - dependencies: - "@ladjs/format-util" "^1.0.4" - boolean "^3.0.1" - console-polyfill "^0.3.0" - cuid "^2.1.8" - fast-safe-stringify "^2.0.7" - format-specifiers "^1.0.0" - iserror "^0.0.2" - omit.js "^1.0.2" - parse-app-info "^2.0.5" - parse-err "^0.0.12" - superagent "^5.2.2" - -axe@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/axe/-/axe-6.0.0.tgz#475f8578d15c54759ac38db6fa58e657a1b8f319" - integrity sha512-bjGG9+m3L8QRwVL/OWf/+znxtJ2Nlc289HBOlrsDS5dNuMMv+6vxPQJnmR2Odi+rm2Z4ag/3NQovf0DwK2UzRw== +axe@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/axe/-/axe-6.0.2.tgz#8e9d70d803b622605ce7f129a45b32eeceec62e1" + integrity sha512-+gLBm24zEsXz7vWcFpXPDeVo49tgcazOYIhkyOMHNetj1otFZhlorH5Fq0UtGoBBmZyr8PNkrvD62mjlACX6tQ== dependencies: "@ladjs/format-util" "^1.0.4" boolean "^3.0.1" @@ -2497,7 +2786,7 @@ axe@^6.0.0: format-specifiers "^1.0.0" iserror "^0.0.2" omit.js "^1.0.2" - parse-app-info "^3.0.1" + parse-app-info "^3.0.3" parse-err "^0.0.12" superagent "^5.2.2" @@ -2552,6 +2841,13 @@ babel-types@^6.26.0: lodash "^4.17.4" to-fast-properties "^1.0.3" +babel-walk@3.0.0-canary-5: + version "3.0.0-canary-5" + resolved "https://registry.yarnpkg.com/babel-walk/-/babel-walk-3.0.0-canary-5.tgz#f66ecd7298357aee44955f235a6ef54219104b11" + integrity sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw== + dependencies: + "@babel/types" "^7.9.6" + babelify@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/babelify/-/babelify-10.0.0.tgz#fe73b1a22583f06680d8d072e25a1e0d1d1d7fb5" @@ -2712,6 +3008,14 @@ bl@^1.0.0: readable-stream "^2.3.5" safe-buffer "^5.1.1" +bl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.0.tgz#e1a574cdf528e4053019bb800b041c0ac88da493" + integrity sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" @@ -2766,10 +3070,10 @@ bootstrap-fonts-complete@^1.0.0: dependencies: postcss "^4.1.16" -bootstrap@4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.4.1.tgz#8582960eea0c5cd2bede84d8b0baf3789c3e8b01" - integrity sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA== +bootstrap@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.0.tgz#97d9dbcb5a8972f8722c9962483543b907d9b9ec" + integrity sha512-Z93QoXvodoVslA+PWNdk23Hze4RBYIkpb5h8I2HY2Tu2h7A0LpAgLcyrhrSUyo2/Oxm2l1fRZPs1e5hnxnliXA== bowser@2.9.0: version "2.9.0" @@ -2974,7 +3278,7 @@ browserify-sign@^4.0.0: inherits "^2.0.1" parse-asn1 "^5.0.0" -browserify-zlib@~0.2.0: +browserify-zlib@^0.2.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== @@ -3035,7 +3339,7 @@ browserify@^16.5.1: vm-browserify "^1.0.0" xtend "^4.0.0" -browserslist@^4.0.0, browserslist@^4.11.0, browserslist@^4.6.4, browserslist@^4.8.2, browserslist@^4.8.3: +browserslist@^4.0.0, browserslist@^4.11.0, browserslist@^4.6.4, browserslist@^4.8.3: version "4.11.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.1.tgz#92f855ee88d6e050e7e7311d987992014f1a1f1b" integrity sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g== @@ -3045,7 +3349,7 @@ browserslist@^4.0.0, browserslist@^4.11.0, browserslist@^4.6.4, browserslist@^4. node-releases "^1.1.53" pkg-up "^2.0.0" -browserslist@^4.11.1: +browserslist@^4.12.0: version "4.12.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d" integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg== @@ -3065,7 +3369,7 @@ bson-objectid@^1.3.1: resolved "https://registry.yarnpkg.com/bson-objectid/-/bson-objectid-1.3.1.tgz#11e4ce4c3419161fd388113781bb62c1dfbce34b" integrity sha512-eQBNQXsisEAXlwiSy8zRNZdW2xDBJaEVkTPbodYR9hGxxtE548Qq7ilYOd8WAQ86xF7NRUdiWSQ1pa/TkKiE2A== -bson@^1.1.1, bson@~1.1.1: +bson@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.4.tgz#f76870d799f15b854dffb7ee32f0a874797f7e89" integrity sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q== @@ -3127,6 +3431,15 @@ buffer@4.9.1: ieee754 "^1.1.4" isarray "^1.0.0" +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" + buffer@^5.2.1, buffer@^5.4.3: version "5.5.0" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.5.0.tgz#9c3caa3d623c33dd1c7ef584b89b88bf9c9bc1ce" @@ -3143,12 +3456,12 @@ buffer@~5.2.1: base64-js "^1.0.2" ieee754 "^1.1.4" -bufferstreams@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-2.0.1.tgz#441b267c2fc3fee02bb1d929289da113903bd5ef" - integrity sha512-ZswyIoBfFb3cVDsnZLLj2IDJ/0ppYdil/v2EGlZXvoefO689FokEmFEldhN5dV7R2QBxFneqTJOMIpfqhj+n0g== +bufferstreams@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-3.0.0.tgz#d2cb186cffeb527668341891e523c19539bc4a14" + integrity sha512-Qg0ggJUWJq90vtg4lDsGN9CDWvzBMQxhiEkSOD/sJfYt6BLect3eV1/S6K7SCSKJ34n60rf6U5eUPmQENVE4UA== dependencies: - readable-stream "^2.3.6" + readable-stream "^3.4.0" builtin-status-codes@^3.0.0: version "3.0.0" @@ -3193,27 +3506,13 @@ bytes@3.1.0, bytes@^3.0.0, bytes@^3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== -cabin@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/cabin/-/cabin-6.1.1.tgz#cf1473deb49a2da4e221faab1ae69933562de7c4" - integrity sha512-4W8EorCfP9Ftn1iKWghQsj4YCmlkJ9AqC9eM7Q6uBR0IZa44usb7aHCaHsUh0qq1h1J3P445YE9oRUa1wwi8hw== - dependencies: - ansi-colors "^4.1.1" - axe "^5.0.1" - clf-date "^0.1.0" - iserror "^0.0.2" - ms "^2.1.2" - on-finished "^2.3.0" - parse-err "^0.0.12" - parse-request "^2.0.6" - -cabin@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/cabin/-/cabin-8.0.0.tgz#b6bb0b03fadeeff0cc47ca65e6b3f61d1de0ac57" - integrity sha512-LDQDeo/ejTxR8gZcQEcMOZUkf8rJZUwdhDzj8vNwRARAlHsFXZ9YI0loUlewdy6MAB+WN5c0wV4ZKLjpc6eJkw== +cabin@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/cabin/-/cabin-8.0.2.tgz#bb3a9182eebf7a5f776564ff6319d8eb8fe6d273" + integrity sha512-UfFFQVW3NcWveTcwcmRaoENZjytPJohFA2/SVJpeFVbczO97q6heKyJMFrOKF9JFHjCfI86/51nrcdXGtxcW9Q== dependencies: ansi-colors "^4.1.1" - axe "^6.0.0" + axe "^6.0.2" clf-date "^0.2.0" iserror "^0.0.2" ms "^2.1.2" @@ -3394,21 +3693,26 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-db@^1.0.30001017: - version "1.0.30001038" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001038.tgz#439606cdafff1e10e0a795a7ff72fe26965fe8ba" - integrity sha512-yeQ2l99M9upOgMIRfZEdes6HuPbQiRZIMBumUwdXeEQz+faSXUZtZ8xeyEdU+TlJckH09M5NtM038sjKsRa2ow== +caniuse-db@^1.0.30001059: + version "1.0.30001084" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001084.tgz#f011ad731a4e7f469a12531984db2de2dcb307f0" + integrity sha512-oxprDntKFaMkhNV0vfFtaKtGDAJda8rdCsWC//6WTXsJgb44NxTImwkYym1uFiKkawI0SsC/y3Lj8gxJjH3w3A== caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001036, caniuse-lite@^1.0.30001038: version "1.0.30001038" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz#44da3cbca2ab6cb6aa83d1be5d324e17f141caff" integrity sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ== -caniuse-lite@^1.0.30001039, caniuse-lite@^1.0.30001043: +caniuse-lite@^1.0.30001043: version "1.0.30001055" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001055.tgz#7b52c3537f7a8c0408aca867e83d2b04268b54cd" integrity sha512-MbwsBmKrBSKIWldfdIagO5OJWZclpJtS4h0Jrk/4HFrXJxTdVdH23Fd+xCiHriVGvYcWyW8mR/CPsYajlH8Iuw== +caniuse-lite@^1.0.30001084: + version "1.0.30001084" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001084.tgz#00e471931eaefbeef54f46aa2203914d3c165669" + integrity sha512-ftdc5oGmhEbLUuMZ/Qp3mOpzfZLCxPYKcvGv6v2dJJ+8EdqcvZRbAGOiLmkM/PV1QGta/uwBs8/nCl6sokDW6w== + capitalize@^2.0.0, capitalize@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/capitalize/-/capitalize-2.0.3.tgz#ccfeb1046d2a054eb30f34af907a70c3e90f3b73" @@ -3485,6 +3789,14 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + character-entities-html4@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125" @@ -3500,7 +3812,7 @@ character-entities@^1.0.0: resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== -character-parser@^2.1.1: +character-parser@^2.1.1, character-parser@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" integrity sha1-x84o821LzZdE5f/CxfzeHHMmH8A= @@ -3657,11 +3969,6 @@ clean-yaml-object@^0.1.0: resolved "https://registry.yarnpkg.com/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz#63fb110dc2ce1a84dc21f6d9334876d010ae8b68" integrity sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g= -clf-date@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/clf-date/-/clf-date-0.1.0.tgz#443c8ffb04efdf131ab20a8e61fe314570ce749d" - integrity sha512-CeuGmzCyLl/mYcLrBJO7B+NF3LieKWYSdnVPAfgqeEz8NfOnA4B/+0My5ZYEhsI2hlIMiGYvu7QhvVL+LaA8/w== - clf-date@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/clf-date/-/clf-date-0.2.0.tgz#e552b4a69bde5bc44dae5fc1e668442e49b1af87" @@ -3684,7 +3991,7 @@ cli-spinners@^2.2.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.2.0.tgz#e8b988d9206c692302d8ee834e7a85c0144d8f77" integrity sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ== -cli-truncate@^2.1.0: +cli-truncate@2.1.0, cli-truncate@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== @@ -3848,10 +4155,10 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -codecov@^3.6.5: - version "3.6.5" - resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.6.5.tgz#d73ce62e8a021f5249f54b073e6f2d6a513f172a" - integrity sha512-v48WuDMUug6JXwmmfsMzhCHRnhUf8O3duqXvltaYJKrO1OekZWpB/eH6iIoaxMl8Qli0+u3OxptdsBOYiD7VAQ== +codecov@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.7.0.tgz#4a09939cde24447a43f36d068e8b4e0188dc3f27" + integrity sha512-uIixKofG099NbUDyzRk1HdGtaG8O+PBUAg3wfmjwXw2+ek+PZp+puRvbTohqrVfuudaezivJHFgTtSC3M8MXww== dependencies: argv "0.0.2" ignore-walk "3.0.3" @@ -3968,7 +4275,7 @@ commander@^4.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -commander@^5.0.0: +commander@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== @@ -4061,21 +4368,18 @@ concat-stream@^2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" -concordance@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/concordance/-/concordance-4.0.0.tgz#5932fdee397d129bdbc3a1885fbe69839b1b7e15" - integrity sha512-l0RFuB8RLfCS0Pt2Id39/oCPykE01pyxgAFypWTlaGRgvLkZrtczZ8atEHpTeEIW+zYWXTBuA9cCSeEOScxReQ== +concordance@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.0.tgz#6d4552f76c78301dd65e748c26af2cf131f9dd49" + integrity sha512-stOCz9ffg0+rytwTaL2njUOIyMfANwfwmqc9Dr4vTUS/x/KkVFlWx9Zlzu6tHYtjKxxaCF/cEAZgPDac+n35sg== dependencies: - date-time "^2.1.0" - esutils "^2.0.2" - fast-diff "^1.1.2" + date-time "^3.1.0" + esutils "^2.0.3" + fast-diff "^1.2.0" js-string-escape "^1.0.1" - lodash.clonedeep "^4.5.0" - lodash.flattendeep "^4.4.0" - lodash.islength "^4.0.1" - lodash.merge "^4.6.1" - md5-hex "^2.0.0" - semver "^5.5.1" + lodash "^4.17.15" + md5-hex "^3.0.1" + semver "^7.3.2" well-known-symbols "^2.0.0" concurrently@^3.4.0: @@ -4176,7 +4480,15 @@ constantinople@^3.0.1, constantinople@^3.1.2: babel-types "^6.26.0" babylon "^6.18.0" -constants-browserify@~1.0.0: +constantinople@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-4.0.1.tgz#0def113fa0e4dc8de83331a5cf79c8b325213151" + integrity sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw== + dependencies: + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.1" + +constants-browserify@^1.0.0, 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= @@ -4268,11 +4580,6 @@ convert-vinyl-to-vfile@^2.0.0: vfile "^2.0.0" vinyl "^2.0.0" -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== - cookie@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" @@ -4330,6 +4637,11 @@ core-js@^2.4.0, core-js@^2.5.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== +core-js@^3.6.5: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== + 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" @@ -4504,7 +4816,16 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1: shebang-command "^2.0.0" which "^2.0.1" -crypto-browserify@^3.0.0: +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@^3.0.0, 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== @@ -4823,10 +5144,10 @@ date-fns@^1.23.0: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== -date-time@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2" - integrity sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g== +date-time@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/date-time/-/date-time-3.1.0.tgz#0d1e934d170579f481ed8df1e2b8ff70ee845e1e" + integrity sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg== dependencies: time-zone "^1.0.0" @@ -4994,7 +5315,7 @@ deep-extend@^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: +deep-is@^0.1.3, 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= @@ -5110,7 +5431,7 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -denque@^1.1.0: +denque@^1.1.0, denque@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf" integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ== @@ -5267,7 +5588,7 @@ dom-serializer@~0.1.0, dom-serializer@~0.1.1: domelementtype "^1.3.0" entities "^1.1.1" -domain-browser@^1.2.0: +domain-browser@^1.1.1, domain-browser@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== @@ -5369,7 +5690,7 @@ dotenv@^8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== -dotgitconfig@^1.0.1, dotgitconfig@^1.1.0: +dotgitconfig@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/dotgitconfig/-/dotgitconfig-1.1.1.tgz#0e854a409f005c48bf820825e94f05215db41ed0" integrity sha512-gkaAQMmhlE7N6NYtvckQ32f/xTX6Hv7RTtF9qKCYJEQgL/d6zJZk/D0eLFuuGPRCbpRj2PR/HcBLxtIh3MSB6Q== @@ -5503,11 +5824,6 @@ electron-to-chromium@^1.3.413: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.432.tgz#3bf7b191978ff2e8bc3caf811bb52b1e9f9eab25" integrity sha512-/GdNhXyLP5Yl2322CUX/+Xi8NhdHBqL6lD9VJVKjH6CjoPGakvwZ5CpKgj/oOlbzuWWjOvMjDw1bBuAIRCNTlw== -elegant-spinner@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-2.0.0.tgz#f236378985ecd16da75488d166be4b688fd5af94" - integrity sha512-5YRYHhvhYzV/FC4AiMdeSIg3jAYGq9xFvbhZMpPlJoBsfYgrw2DSCYeXfat6tYBu45PWiyRr3+flaCPPmviPaA== - elliptic@^6.0.0: version "6.5.2" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" @@ -5538,10 +5854,10 @@ email-templates@^7.0.5: pify "^5.0.0" preview-email "^2.0.1" -emittery@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.6.0.tgz#e85312468d77c3ed9a6adf43bb57d34849e0c95a" - integrity sha512-6EMRGr9KzYWp8DzHFZsKVZBsMO6QhAeHMeHND8rhyBNCHKMLpgW9tZv40bwN3rAIKRS5CxcK8oLRKUJSB9h7yQ== +emittery@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.0.tgz#0f0789ea90e03f3de7865feb806e4f0916d16c93" + integrity sha512-/kshvS+tZaggOPQDLGzXopumRRIzxciGILDlYTGIU+PmqbSfhn4wDVphFPry4H+2TNl2QxLduexPhxcWLULA5A== "emoji-regex@>=6.0.0 <=6.1.1": version "6.1.1" @@ -5587,7 +5903,16 @@ enhance-visitors@^1.0.0: dependencies: lodash "^4.13.1" -enquirer@^2.3.4: +enhanced-resolve@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" + integrity sha1-TW5omzcl+GCQknzMhs2fFjW4ni4= + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.2.0" + tapable "^0.1.8" + +enquirer@^2.3.5: version "2.3.5" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.5.tgz#3ab2b838df0a9d8ab9e7dff235b0e8712ef92381" integrity sha512-BNT1C08P9XD0vNg3J475yIUG+mVdp9T6towYFHUv897X0KoHBjB1shyrNmhmtHWKP17iSWgo7Gqh7BBuzLZMSA== @@ -5812,14 +6137,7 @@ eslint-ast-utils@^1.1.0: lodash.get "^4.4.2" lodash.zip "^4.2.0" -eslint-config-prettier@^6.10.0: - version "6.10.1" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.10.1.tgz#129ef9ec575d5ddc0e269667bf09defcd898642a" - integrity sha512-svTy6zh1ecQojvpbJSgH3aei/Rt7C6i090l5f2WQ4aB05lYHeZIR1qL4wZyyILTbtmnbHP5Yn8MrsOJMGa8RkQ== - dependencies: - get-stdin "^6.0.0" - -eslint-config-prettier@^6.3.0: +eslint-config-prettier@^6.11.0, eslint-config-prettier@^6.3.0: version "6.11.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== @@ -5831,15 +6149,20 @@ eslint-config-xo-lass@^1.0.3: resolved "https://registry.yarnpkg.com/eslint-config-xo-lass/-/eslint-config-xo-lass-1.0.3.tgz#2259fed4d18ef18ec00560360358aba538fb5ac6" integrity sha512-hnry5qIMaVXAIt0QJwoTcRbny8E9x7K1GKW790ZLnAOWS42PK5BL5POpIG/NuumjwL/J5ThVgZpeVn8tFevhzw== +eslint-config-xo-typescript@^0.31.0: + version "0.31.0" + resolved "https://registry.yarnpkg.com/eslint-config-xo-typescript/-/eslint-config-xo-typescript-0.31.0.tgz#384b57f30732a5f2d374b5a6c466eee3b6b8db50" + integrity sha512-zxfUdKscsdrZTI5Uz9ZqAAR+W6fuH+DiQnTRRJAwLZaKJemT3hzH0DtIxNhB9t5fxKMwZYNYw2lvW4aWrSMbag== + eslint-config-xo@^0.27.1: version "0.27.2" resolved "https://registry.yarnpkg.com/eslint-config-xo/-/eslint-config-xo-0.27.2.tgz#71aff3d5b5554e9e5b5e1853e21da7799bb53f1f" integrity sha512-qEuZP0zNQkWpOdNZvWnfY2GNp1AZ33uXgeOXl4DN5YVLHFvekHbeSM2FFZ8A489fp1rCCColVRlJsYMf28o4DA== -eslint-config-xo@^0.29.0: - version "0.29.1" - resolved "https://registry.yarnpkg.com/eslint-config-xo/-/eslint-config-xo-0.29.1.tgz#876e29b2f4711f2fd365885b09b9536b6ef328dc" - integrity sha512-RDjeKh8CV0/EH4utW/6uOkwJJOOU+rX3uE5eUBOamcLNe4lNjyo8kSt3B6DzAm1L/1tWGikI7LFNVY9gG7PDQw== +eslint-config-xo@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/eslint-config-xo/-/eslint-config-xo-0.30.0.tgz#a5d731e8e8ac9b65a0581dcc46be0bd84d837e32" + integrity sha512-0C+Hl1Mfrbh+LMc2A2v2BabI+n0MoVHYyGJOJoWped/Tfh/OoyZ7gLyed5vLqVR4czjR8Zi7DGW2S1nTGKUY4w== dependencies: confusing-browser-globals "1.0.9" @@ -5869,6 +6192,19 @@ eslint-formatter-pretty@^3.0.1: string-width "^4.2.0" supports-hyperlinks "^2.0.0" +eslint-formatter-pretty@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-formatter-pretty/-/eslint-formatter-pretty-4.0.0.tgz#dc15f3bf4fb51b7ba5fbedb77f57ba8841140ce2" + integrity sha512-QgdeZxQwWcN0TcXXNZJiS6BizhAANFhCzkE7Yl9HKB7WjElzwED6+FbbZB2gji8ofgJTGPqKm6VRCNT3OGCeEw== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + eslint-rule-docs "^1.1.5" + log-symbols "^4.0.0" + plur "^4.0.0" + string-width "^4.2.0" + supports-hyperlinks "^2.0.0" + eslint-import-resolver-node@^0.3.2: version "0.3.3" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404" @@ -5877,7 +6213,31 @@ eslint-import-resolver-node@^0.3.2: debug "^2.6.9" resolve "^1.13.1" -eslint-module-utils@^2.4.1: +eslint-import-resolver-node@^0.3.3: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-import-resolver-webpack@^0.12.1: + version "0.12.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.12.2.tgz#769e86cd0c752a1536c19855ebd90aa14ce384ee" + integrity sha512-7Jnm4YAoNNkvqPaZkKdIHsKGmv8/uNnYC5QsXkiSodvX4XEEfH2AKOna98FK52fCDXm3q4HzuX+7pRMKkJ64EQ== + dependencies: + array-find "^1.0.0" + debug "^2.6.9" + enhanced-resolve "^0.9.1" + find-root "^1.1.0" + has "^1.0.3" + interpret "^1.2.0" + lodash "^4.17.15" + node-libs-browser "^1.0.0 || ^2.0.0" + resolve "^1.13.1" + semver "^5.7.1" + +eslint-module-utils@^2.4.1, eslint-module-utils@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== @@ -5885,16 +6245,17 @@ eslint-module-utils@^2.4.1: debug "^2.6.9" pkg-dir "^2.0.0" -eslint-plugin-ava@^10.0.1: - version "10.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ava/-/eslint-plugin-ava-10.2.0.tgz#02c5d91458ddca3b8a116826a803b09fada462f6" - integrity sha512-1EP9Mn/pau+ZxwRPDspiioRD6GHCSz7RywTmqW01JTxXvX0vKEV0odfWe+QL+jXfmqd83SHHvDJfOvYcyzoxYA== +eslint-plugin-ava@^10.3.0: + version "10.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-ava/-/eslint-plugin-ava-10.3.1.tgz#5415b910a0d5ddaf0e52c9322385977cf78ac466" + integrity sha512-7akA13Nxaub7QGKaXvywVXlbr5fTdbziRhbVYCoQlsVHh10bDcqv4JRaScKaX1cCJF8w7U1Q6S2gQUSfV9Jneg== dependencies: deep-strict-equal "^0.2.0" enhance-visitors "^1.0.0" - espree "^6.1.2" + espree "^7.1.0" espurify "^2.0.1" import-modules "^2.0.0" + micro-spelling-correcter "^1.1.1" pkg-dir "^4.2.0" resolve-from "^5.0.0" @@ -5911,18 +6272,18 @@ eslint-plugin-ava@^9.0.0: pkg-dir "^4.2.0" resolve-from "^5.0.0" -eslint-plugin-compat@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-3.5.1.tgz#09f9c05dcfa9b5cd69345d7ab333749813ed8b14" - integrity sha512-dhfW12vZxxKLEVhrPoblmEopgwpYU2Sd4GdXj5OSfbQ+as9+1aY+S5pqnJYJvXXNWFFJ6aspLkCyk4NMQ/pgtA== +eslint-plugin-compat@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-3.7.0.tgz#03f1ebb350a3c7eb93b6f461e200048e6008594b" + integrity sha512-A3uzSYqUjNj6rMyaBuU3l8wSCadZjeZRZ7WF3eU9vUT0JItiqRysjmYELkHHCpH8l7wRprUu4MZPr37lFCw7iA== dependencies: - "@babel/runtime" "^7.7.7" - ast-metadata-inferer "^0.1.1" - browserslist "^4.8.2" - caniuse-db "^1.0.30001017" + ast-metadata-inferer "^0.2.0-0" + browserslist "^4.12.0" + caniuse-db "^1.0.30001059" + core-js "^3.6.5" lodash.memoize "4.1.2" - mdn-browser-compat-data "^1.0.3" - semver "^6.3.0" + mdn-browser-compat-data "^1.0.21" + semver "7.3.2" eslint-plugin-es@^2.0.0: version "2.0.0" @@ -5940,7 +6301,7 @@ eslint-plugin-es@^3.0.0: eslint-utils "^2.0.0" regexpp "^3.0.0" -eslint-plugin-eslint-comments@^3.0.1, eslint-plugin-eslint-comments@^3.1.2: +eslint-plugin-eslint-comments@^3.0.1: version "3.1.2" resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.1.2.tgz#4ef6c488dbe06aa1627fea107b3e5d059fc8a395" integrity sha512-QexaqrNeteFfRTad96W+Vi4Zj1KFbkHHNMMaHZEYcovKav6gdomyGzaxSDSL3GoIyUOo078wRAdYlu1caiauIQ== @@ -5948,7 +6309,15 @@ eslint-plugin-eslint-comments@^3.0.1, eslint-plugin-eslint-comments@^3.1.2: escape-string-regexp "^1.0.5" ignore "^5.0.5" -eslint-plugin-import@^2.18.2, eslint-plugin-import@^2.20.1: +eslint-plugin-eslint-comments@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" + integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== + dependencies: + escape-string-regexp "^1.0.5" + ignore "^5.0.5" + +eslint-plugin-import@^2.18.2: version "2.20.2" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz#91fc3807ce08be4837141272c8b99073906e588d" integrity sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg== @@ -5966,14 +6335,34 @@ eslint-plugin-import@^2.18.2, eslint-plugin-import@^2.20.1: read-pkg-up "^2.0.0" resolve "^1.12.0" -eslint-plugin-no-smart-quotes@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-no-smart-quotes/-/eslint-plugin-no-smart-quotes-1.0.2.tgz#9c639c9fcd597fed7d9a6d36fdbca78b2e5fd01b" - integrity sha512-4l7Ms4AjZRaLLHCbH6H5lyXCU4Oc3425fQid8enVhWsgf1fze2No10x6zs/+C0rv0c/BzbqtLNgq1GF/FCogwg== +eslint-plugin-import@^2.20.2: + version "2.21.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.21.2.tgz#8fef77475cc5510801bedc95f84b932f7f334a7c" + integrity sha512-FEmxeGI6yaz+SnEB6YgNHlQK1Bs2DKLM+YF+vuTk5H8J9CLbJLtlPvRFgZZ2+sXiKAlN5dpdlrWOjK8ZoZJpQA== + dependencies: + array-includes "^3.1.1" + array.prototype.flat "^1.2.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.3" + eslint-module-utils "^2.6.0" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.1" + read-pkg-up "^2.0.0" + resolve "^1.17.0" + tsconfig-paths "^3.9.0" + +eslint-plugin-no-smart-quotes@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-no-smart-quotes/-/eslint-plugin-no-smart-quotes-1.1.0.tgz#1dc29af7e24ab53bc8804077606edf253e946ee4" + integrity sha512-apBsCms+rnrTK3GaZXjfUGwc1r++B7wz17VAzmljcAOtCL9hEdgsoP/cIe3F83g0hA6GWAF8fi9Mlm4GwsY8uQ== dependencies: requireindex "^1.2.0" + string.prototype.matchall "^4.0.2" -eslint-plugin-no-use-extend-native@^0.4.0, eslint-plugin-no-use-extend-native@^0.4.1: +eslint-plugin-no-use-extend-native@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/eslint-plugin-no-use-extend-native/-/eslint-plugin-no-use-extend-native-0.4.1.tgz#b2a631219b6a2e91b4370ef6559a754356560a40" integrity sha512-tDkHM0kvxU0M2TpLRKGfFrpWXctFdTDY7VkiDTLYDaX90hMSJKkr/FiWThEXvKV0Dvffut2Z0B9Y7+h/k6suiA== @@ -5983,6 +6372,16 @@ eslint-plugin-no-use-extend-native@^0.4.0, eslint-plugin-no-use-extend-native@^0 is-obj-prop "^1.0.0" is-proto-prop "^2.0.0" +eslint-plugin-no-use-extend-native@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-no-use-extend-native/-/eslint-plugin-no-use-extend-native-0.5.0.tgz#d6855e3a823a819b467cf7df56adca57de741bf9" + integrity sha512-dBNjs8hor8rJgeXLH4HTut5eD3RGWf9JUsadIfuL7UosVQ/dnvOKwxEcRrXrFxrMZ8llUVWT+hOimxJABsAUzQ== + dependencies: + is-get-set-prop "^1.0.0" + is-js-type "^2.0.0" + is-obj-prop "^1.0.0" + is-proto-prop "^2.0.0" + eslint-plugin-node@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz#fd1adbc7a300cf7eb6ac55cf4b0b6fc6e577f5a6" @@ -5995,7 +6394,7 @@ eslint-plugin-node@^10.0.0: resolve "^1.10.1" semver "^6.1.0" -eslint-plugin-node@^11.0.0: +eslint-plugin-node@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== @@ -6014,10 +6413,10 @@ eslint-plugin-prettier@^3.1.1: dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-prettier@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz#432e5a667666ab84ce72f945c72f77d996a5c9ba" - integrity sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA== +eslint-plugin-prettier@^3.1.3: + version "3.1.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz#168ab43154e2ea57db992a2cd097c828171f75c2" + integrity sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg== dependencies: prettier-linter-helpers "^1.0.0" @@ -6048,27 +6447,24 @@ eslint-plugin-unicorn@^12.0.0: safe-regex "^2.0.2" semver "^6.3.0" -eslint-plugin-unicorn@^16.1.1: - version "16.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-16.1.1.tgz#012c598d71914ef30f5d386dd85110e59f2ef999" - integrity sha512-IMxCsntb0T8s660Irc40gtzXtxuXHcOn36G9G8OYKfiseBD/kNrA1cNJhsJ0xQteDASGrFwqdzBsYEkUvczhOA== +eslint-plugin-unicorn@^20.1.0: + version "20.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-20.1.0.tgz#a43f60ffc98406d72ec2a5fcc6dad24ba0192bc9" + integrity sha512-XQxLBJT/gnwyRR6cfYsIK1AdekQchAt5tmcsnldevGjgR2xoZsRUa5/i6e0seNHy2RoT57CkTnbVHwHF8No8LA== dependencies: ci-info "^2.0.0" clean-regexp "^1.0.0" eslint-ast-utils "^1.1.0" - eslint-template-visitor "^1.1.0" + eslint-template-visitor "^2.0.0" + eslint-utils "^2.0.0" import-modules "^2.0.0" - lodash.camelcase "^4.3.0" - lodash.defaultsdeep "^4.6.1" - lodash.kebabcase "^4.1.1" - lodash.snakecase "^4.1.1" - lodash.upperfirst "^4.3.1" + lodash "^4.17.15" + pluralize "^8.0.0" read-pkg-up "^7.0.1" - regexp-tree "^0.1.17" - regexpp "^3.0.0" + regexp-tree "^0.1.21" reserved-words "^0.1.2" safe-regex "^2.1.1" - semver "^7.1.2" + semver "^7.3.2" eslint-rule-docs@^1.1.5: version "1.1.184" @@ -6083,7 +6479,15 @@ eslint-scope@^5.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-template-visitor@^1.0.0, eslint-template-visitor@^1.1.0: +eslint-scope@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" + integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-template-visitor@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-template-visitor/-/eslint-template-visitor-1.1.0.tgz#f090d124d1a52e05552149fc50468ed59608b166" integrity sha512-Lmy6QVlmFiIGl5fPi+8ACnov3sare+0Ouf7deJAGGhmUfeWJ5fVarELUxZRpsZ9sHejiJUq8626d0dn9uvcZTw== @@ -6092,6 +6496,15 @@ eslint-template-visitor@^1.0.0, eslint-template-visitor@^1.1.0: espree "^6.1.1" multimap "^1.0.2" +eslint-template-visitor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-template-visitor/-/eslint-template-visitor-2.0.0.tgz#7cb6471ed29a53ab28a1dcbfca38355251c2be06" + integrity sha512-WijrLXWk/TiiG9FBTeEeb2pj/nD8H4eKIYx1DhTv/c7QoFmelE5P+3gzKUcXWZz88AI2+Wjse9DTV8lXrhcUsw== + dependencies: + eslint-visitor-keys "^1.1.0" + espree "^7.0.0" + multimap "^1.1.0" + eslint-utils@^1.4.2, eslint-utils@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" @@ -6111,7 +6524,12 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^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.x, eslint@^6.0.0, eslint@^6.4.0, eslint@^6.8.0: +eslint-visitor-keys@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint@6.x, eslint@^6.0.0, eslint@^6.4.0: version "6.8.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== @@ -6154,6 +6572,48 @@ eslint@6.x, eslint@^6.0.0, eslint@^6.4.0, eslint@^6.8.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" +eslint@^7.1.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.3.0.tgz#f9f1fc3dc1227985d0db88769f2bbac7b4b875d7" + integrity sha512-dJMVXwfU5PT1cj2Nv2VPPrKahKTGdX+5Dh0Q3YuKt+Y2UhdL2YbzsVaBMyG9HC0tBismlv/r1+eZqs6SMIV38Q== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.0" + eslint-utils "^2.0.0" + eslint-visitor-keys "^1.2.0" + espree "^7.1.0" + esquery "^1.2.0" + 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" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.14" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + espree@^6.0.0, espree@^6.1.1, espree@^6.1.2: version "6.2.1" resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" @@ -6163,6 +6623,15 @@ espree@^6.0.0, espree@^6.1.1, espree@^6.1.2: acorn-jsx "^5.2.0" eslint-visitor-keys "^1.1.0" +espree@^7.0.0, espree@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.1.0.tgz#a9c7f18a752056735bf1ba14cb1b70adc3a5ce1c" + integrity sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw== + dependencies: + acorn "^7.2.0" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.2.0" + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -6185,6 +6654,13 @@ esquery@^1.0.1: dependencies: estraverse "^5.0.0" +esquery@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== + dependencies: + estraverse "^5.1.0" + esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" @@ -6202,6 +6678,11 @@ estraverse@^5.0.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22" integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A== +estraverse@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" + integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== + estraverse@~1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.3.2.tgz#37c2b893ef13d723f276d878d60d8535152a6c42" @@ -6229,7 +6710,7 @@ estree-is-require@^1.0.0: dependencies: estree-is-identifier "^1.0.0" -esutils@^2.0.2: +esutils@^2.0.2, esutils@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== @@ -6275,6 +6756,11 @@ events@^2.0.0: resolved "https://registry.yarnpkg.com/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5" integrity sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg== +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" @@ -6294,19 +6780,6 @@ exec-buffer@^3.0.0: rimraf "^2.5.4" tempfile "^2.0.0" -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" - execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -6361,6 +6834,21 @@ execa@^4.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.2.tgz#ad87fb7b2d9d564f70d2b62d511bee41d5cbb240" + integrity sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + execall@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" @@ -6542,7 +7030,7 @@ fast-deep-equal@^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-diff@^1.1.2: +fast-diff@^1.1.2, fast-diff@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== @@ -6752,7 +7240,7 @@ finalhandler@^1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -find-cache-dir@^3.0.0, find-cache-dir@^3.2.0: +find-cache-dir@^3.0.0, find-cache-dir@^3.2.0, find-cache-dir@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== @@ -6766,6 +7254,11 @@ find-line-column@^0.5.2: resolved "https://registry.yarnpkg.com/find-line-column/-/find-line-column-0.5.2.tgz#db00238ff868551a182e74a103416d295a98c8ca" integrity sha1-2wAjj/hoVRoYLnShA0FtKVqYyMo= +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -7005,6 +7498,22 @@ frisbee@^3.1.2: url-join "^4.0.1" url-parse "^1.4.7" +frisbee@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/frisbee/-/frisbee-3.1.3.tgz#c882b751d910a56fe4595c03efb467d4eff5287e" + integrity sha512-OgkcCpKlX9vkebSoHCSV5KrmVAHm4WBEuy21/5HMNI5w8MVJyMI8EKjIjHRv0BHZEkkze78R8JfeRrw4YZ+iQg== + dependencies: + "@babel/runtime" "^7.10.2" + abortcontroller-polyfill "^1.4.0" + boolean "^3.0.1" + caseless "^0.12.0" + common-tags "^1.8.0" + cross-fetch "^3.0.4" + debug "^4.1.1" + qs "6.9.4" + url-join "^4.0.1" + url-parse "^1.4.7" + from2-string@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/from2-string/-/from2-string-1.1.0.tgz#18282b27d08a267cb3030cd2b8b4b0f212af752a" @@ -7044,6 +7553,16 @@ fs-extra@^1.0.0: jsonfile "^2.1.0" klaw "^1.0.0" +fs-extra@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" + integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + fs-mkdirp-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" @@ -7177,6 +7696,11 @@ get-own-enumerable-property-symbols@^3.0.0: resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + get-paths@0.0.7, get-paths@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/get-paths/-/get-paths-0.0.7.tgz#15331086752077cf130166ccd233a1cdbeefcf38" @@ -7221,6 +7745,11 @@ get-stdin@^6.0.0: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + get-stream@3.0.0, get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -7452,6 +7981,18 @@ globby@^11.0.0: merge2 "^1.3.0" slash "^3.0.0" +globby@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + 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@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-4.1.0.tgz#080f54549ec1b82a6c60e631fc82e1211dbe95f8" @@ -7628,6 +8169,11 @@ graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, g resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +graceful-fs@^4.2.0: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" @@ -7667,6 +8213,30 @@ gulp-cli@^2.2.0: v8flags "^3.0.1" yargs "^7.1.0" +gulp-cli@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.3.0.tgz#ec0d380e29e52aa45e47977f0d32e18fd161122f" + integrity sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A== + dependencies: + ansi-colors "^1.0.1" + archy "^1.0.0" + array-sort "^1.0.0" + color-support "^1.1.3" + concat-stream "^1.6.0" + copy-props "^2.0.1" + fancy-log "^1.3.2" + gulplog "^1.0.0" + interpret "^1.4.0" + isobject "^3.0.1" + liftoff "^3.1.0" + matchdep "^2.0.0" + mute-stdout "^1.0.0" + pretty-hrtime "^1.0.0" + replace-homedir "^1.0.0" + semver-greatest-satisfied-range "^1.1.0" + v8flags "^3.2.0" + yargs "^7.1.0" + gulp-envify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gulp-envify/-/gulp-envify-1.0.0.tgz#380b1f4de69c18030e9e5ab931d50b9098407d47" @@ -7823,19 +8393,18 @@ gulp-terser@^1.2.0: through2 "^3.0.1" vinyl-sourcemaps-apply "^0.2.1" -gulp-unassert@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/gulp-unassert/-/gulp-unassert-1.1.0.tgz#9f602a0a1fe05b9d16f9d97501caa28181aff75c" - integrity sha512-WHj9ocsV7NYX1k8sXTjNWKMVmbDxT7TNSz6tihfm+ZaGvjbWm1qJ3l7u/wGsIL2Kfn2GLbC7xk0pGkj1HpPIew== +gulp-unassert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/gulp-unassert/-/gulp-unassert-2.0.0.tgz#34a0e56c3ca1bafa8bc2b05e978f23056d09db7d" + integrity sha512-EdOa4TmK5r7uUywwKi7cvTjev/LDVF2zAres5xoSpBO+Kl/lpO+P5mGSV6eY3X30NT8qa3PlRdUKtRaJARbscg== dependencies: - acorn "^5.0.0" - buffer-from "^1.0.0" - bufferstreams "^2.0.0" + acorn "^7.0.0" + bufferstreams "^3.0.0" convert-source-map "^1.1.2" escodegen "^1.10.0" - multi-stage-sourcemap "^0.2.1" + multi-stage-sourcemap "^0.3.1" plugin-error "^1.0.0" - through2 "^2.0.0" + through2 "^3.0.0" unassert "^1.3.1" vinyl-sourcemaps-apply "^0.2.0" @@ -7863,16 +8432,16 @@ gulp-util@^3.0.6: through2 "^2.0.0" vinyl "^0.5.0" -gulp-xo@^0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/gulp-xo/-/gulp-xo-0.24.0.tgz#8be2fb6c4c0b72900165ea73e208fcf44484972c" - integrity sha512-HBCuFIz4+onNbxXTy4XYRPtHzI2k0y2Q2gg13FIPWFuo5zBCDScDITW4FMSXiHZOUL7iZM4DHEDlUaNYqS3PCg== +gulp-xo@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/gulp-xo/-/gulp-xo-0.25.0.tgz#fad1f9f820f8773311c5acfe86928bd973790e02" + integrity sha512-oCsUw7TrO8BLsSBPPCKhzfsLnb5qKiY/U1d7tCsvAQ5JN3I6swLoOxZEk6Sr381LG5pJlZF+i6AjsA1mfZzbjw== dependencies: eslint-formatter-pretty "^3.0.1" gulp-eslint "^6.0.0" plugin-error "^1.0.1" through2 "^3.0.0" - xo "^0.26.1" + xo "^0.32.0" gulp@^4.0.2: version "4.0.2" @@ -8096,10 +8665,10 @@ hide-powered-by@1.1.0: resolved "https://registry.yarnpkg.com/hide-powered-by/-/hide-powered-by-1.1.0.tgz#be3ea9cab4bdb16f8744be873755ca663383fa7a" integrity sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg== -highlight.js@^10.0.2: - version "10.0.2" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.0.2.tgz#d2c732544f8f68bceaf0cefb4b0575bce8eddbee" - integrity sha512-2gMT2MHU6/2OjAlnaOE2LFdr9dwviDN3Q2lSw7Ois3/5uTtahbgYTkr4EPoY828ps+2eQWiixPTF8+phU6Ofkg== +highlight.js@^10.1.1: + version "10.1.1" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.1.1.tgz#691a2148a8d922bf12e52a294566a0d993b94c57" + integrity sha512-b4L09127uVa+9vkMgPpdUQP78ickGbHEQTWeBrQFTJZ4/n2aihWOGS0ZoUqAwjVmfjhq/C76HRzkqwZhK4sBbg== highlight.js@^9.18.1: version "9.18.1" @@ -8379,11 +8948,16 @@ ienoopen@1.1.0: resolved "https://registry.yarnpkg.com/ienoopen/-/ienoopen-1.1.0.tgz#411e5d530c982287dbdc3bb31e7a9c9e32630974" integrity sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ== -ignore-by-default@^1.0.0, ignore-by-default@^1.0.1: +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-by-default@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-2.0.0.tgz#537092018540640459569fe7c8c7a408af581146" + integrity sha512-+mQSgMRiFD3L3AOxLYOCxjIq4OnAmo5CIuC+lj5ehCJcPtV++QacEV7FdpzvYxH6DaOySWzQU6RR0lPLy37ckA== + ignore-walk@3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" @@ -8401,6 +8975,11 @@ ignore@^5.0.0, ignore@^5.0.5, ignore@^5.1.1, ignore@^5.1.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== +ignore@^5.1.8: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + image-size@^0.7.3: version "0.7.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.7.5.tgz#269f357cf5797cb44683dfa99790e54c705ead04" @@ -8433,16 +9012,16 @@ imagemin-optipng@^7.0.0: is-png "^2.0.0" optipng-bin "^6.0.0" -imagemin-pngquant@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/imagemin-pngquant/-/imagemin-pngquant-8.0.0.tgz#bf7a41d850c6998f2475c54058ab1db9c516385d" - integrity sha512-PVq0diOxO+Zyq/zlMCz2Pfu6mVLHgiT1GpW702OwVlnej+NhS6ZQegYi3OFEDW8d7GxouyR5e8R+t53SMciOeg== +imagemin-pngquant@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/imagemin-pngquant/-/imagemin-pngquant-9.0.0.tgz#f22ba4276cde1799fb15dd475e33984f8607e871" + integrity sha512-9cqnTEaJwAHWUi+8EMTB3NUouWToCWxtL+QnoYr8bfVwuKilHvRVWKsa9lt+0c3aWaGxCAkHs++j8qINvSqomA== dependencies: - execa "^1.0.0" + execa "^4.0.0" is-png "^2.0.0" is-stream "^2.0.0" - ow "^0.13.2" - pngquant-bin "^5.0.0" + ow "^0.17.0" + pngquant-bin "^6.0.0" imagemin-svgo@^7.0.0: version "7.1.0" @@ -8654,11 +9233,25 @@ insert-module-globals@^7.0.0: undeclared-identifiers "^1.1.2" xtend "^4.0.0" +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + interpret@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== +interpret@^1.2.0, interpret@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + into-stream@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" @@ -8679,7 +9272,7 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= -ioredis@^4.14.0, ioredis@^4.14.1: +ioredis@^4.14.1: version "4.16.1" resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.16.1.tgz#377c21d2a4fa8cc31fe9028c666f8dd16a6255bf" integrity sha512-g76Mm9dE7BLuewncu1MimGZw5gDDjDwjoRony/VoSxSJEKAhuYncDEwYKYjtHi2NWsTNIB6XXRjE64uVa/wpKQ== @@ -8907,6 +9500,14 @@ is-expression@^3.0.0: acorn "~4.0.2" object-assign "^4.0.1" +is-expression@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-4.0.0.tgz#c33155962abf21d0afd2552514d67d2ec16fd2ab" + integrity sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A== + dependencies: + acorn "^7.1.1" + object-assign "^4.1.1" + 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" @@ -9111,7 +9712,7 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" -is-path-inside@^3.0.1: +is-path-inside@^3.0.1, is-path-inside@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== @@ -9482,7 +10083,12 @@ jquery.pointer-events-polyfill@^0.2.4: resolved "https://registry.yarnpkg.com/jquery.pointer-events-polyfill/-/jquery.pointer-events-polyfill-0.2.4.tgz#cb289398a5fb376d74e95cd343699d35c6172b3b" integrity sha1-yyiTmKX7N2106VzTQ2mdNcYXKzs= -jquery@3.4.1, jquery@>=1.7.2: +jquery@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" + integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== + +jquery@>=1.7.2: version "3.4.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== @@ -9513,7 +10119,7 @@ js-string-escape@^1.0.1: resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= -js-stringify@^1.0.1: +js-stringify@^1.0.1, js-stringify@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds= @@ -9600,6 +10206,13 @@ json-stringify-safe@5, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +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.0.0, json5@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" @@ -9607,6 +10220,13 @@ json5@^2.0.0, json5@^2.1.2: dependencies: minimist "^1.2.5" +json5@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -9614,6 +10234,15 @@ jsonfile@^2.1.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" + integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== + dependencies: + universalify "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -9754,10 +10383,15 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" -known-css-properties@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.18.0.tgz#d6e00b56ee1d5b0d171fd86df1583cfb012c521f" - integrity sha512-69AgJ1rQa7VvUsd2kpvVq+VeObDuo3zrj0CzM5Slmf6yduQFAI2kXPDQJR2IE/u6MSAUOJrwSzjg5vlz8qcMiw== +kleur@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.0.1.tgz#3d4948534b666e2578f93b6fafb62108e64f05ef" + integrity sha512-Qs6SqCLm63rd0kNVh+wO4XsWLU6kgfwwaPYsLiClWf0Tewkzsa6MvB21bespb8cz+ANS+2t3So1ge3gintzhlw== + +known-css-properties@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.19.0.tgz#5d92b7fa16c72d971bda9b7fe295bdf61836ee5b" + integrity sha512-eYboRV94Vco725nKMlpkn3nV2+96p9c3gKXRsYqAJSswSENvBhN7n5L+uDhY58xQa0UukWsDMTGELzmD8Q+wTA== koa-404-handler@^0.0.2: version "0.0.2" @@ -9869,10 +10503,10 @@ koa-csrf@^3.0.8: dependencies: csrf "^3.1.0" -koa-ctx-paginate@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/koa-ctx-paginate/-/koa-ctx-paginate-0.0.4.tgz#5b8bcbc96e4a6c566da2c8a053f1ef2c41b605fa" - integrity sha512-URGBWs3Mpw+/HF7d89CSJxpNtz2waiINor680pOZ+iB2N0QSF3t7TGmxaxS2T5MwssaAlf7YnC2Hch0ATQFTzA== +koa-ctx-paginate@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/koa-ctx-paginate/-/koa-ctx-paginate-0.0.5.tgz#26cbe3f1482f7b040306962705d4f0e622536b04" + integrity sha512-Tq/yiGQUUME2Uhl5D4rw0Dl1ytkc8QMPvHtu/jjJDwBXi2lJoSh0epYpcNgpmmRpsxH3yI2XmINyofoF/PHX5w== dependencies: lodash.assign "^4.2.0" lodash.clone "^4.5.0" @@ -10049,13 +10683,6 @@ labeled-stream-splicer@^2.0.0: inherits "^2.0.1" stream-splicer "^2.0.0" -last-commit-log@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/last-commit-log/-/last-commit-log-2.1.0.tgz#111db97c56d50bae620c6287a6a0350a8e13a8df" - integrity sha512-vvZNAaiPSQ/PtyfDP2UrIRwKx0xttliGSwEfd/4tU1B/2iD/g4e3nWbttYb6YLarpULpM6s5OW5JWl97ogB6jA== - dependencies: - dotgitconfig "^1.0.1" - last-commit-log@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/last-commit-log/-/last-commit-log-3.0.4.tgz#8b3f363bcf25292fc386d292e330d23f4daece37" @@ -10129,6 +10756,14 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + libbase64@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/libbase64/-/libbase64-1.2.1.tgz#fb93bf4cb6d730f29b92155b6408d1bd2176a8c8" @@ -10184,26 +10819,35 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -linkify-it@2.2.0, linkify-it@^2.0.0: +linkify-it@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== dependencies: uc.micro "^1.0.1" -lint-staged@10.2.2: - version "10.2.2" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.2.2.tgz#901403c120eb5d9443a0358b55038b04c8a7db9b" - integrity sha512-78kNqNdDeKrnqWsexAmkOU3Z5wi+1CsQmUmfCuYgMTE8E4rAIX8RHW7xgxwAZ+LAayb7Cca4uYX4P3LlevzjVg== +linkify-it@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.2.tgz#f55eeb8bc1d3ae754049e124ab3bb56d97797fb8" + integrity sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ== + dependencies: + uc.micro "^1.0.1" + +lint-staged@10.2.11: + version "10.2.11" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.2.11.tgz#713c80877f2dc8b609b05bc59020234e766c9720" + integrity sha512-LRRrSogzbixYaZItE2APaS4l2eJMjjf5MbclRZpLJtcQJShcvUzKXsNeZgsLIZ0H0+fg2tL4B59fU9wHIHtFIA== dependencies: chalk "^4.0.0" - commander "^5.0.0" + cli-truncate "2.1.0" + commander "^5.1.0" cosmiconfig "^6.0.0" debug "^4.1.1" dedent "^0.7.0" - execa "^4.0.0" - listr2 "1.3.8" - log-symbols "^3.0.0" + enquirer "^2.3.5" + execa "^4.0.1" + listr2 "^2.1.0" + log-symbols "^4.0.0" micromatch "^4.0.2" normalize-path "^3.0.0" please-upgrade-node "^3.2.0" @@ -10222,25 +10866,19 @@ lipo@^1.0.1: lodash "^4.17.15" universalify "^0.1.2" -listr2@1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-1.3.8.tgz#30924d79de1e936d8c40af54b6465cb814a9c828" - integrity sha512-iRDRVTgSDz44tBeBBg/35TQz4W+EZBWsDUq7hPpqeUHm7yLPNll0rkwW3lIX9cPAK7l+x95mGWLpxjqxftNfZA== +listr2@^2.1.0: + version "2.1.8" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-2.1.8.tgz#8af7ebc70cdbe866ddbb6c80909142bd45758f1f" + integrity sha512-Op+hheiChfAphkJ5qUxZtHgyjlX9iNnAeFS/S134xw7mVSg0YVrQo1IY4/K+ElY6XgOPg2Ij4z07urUXR+YEew== dependencies: - "@samverschueren/stream-to-observable" "^0.3.0" - chalk "^3.0.0" - cli-cursor "^3.1.0" + chalk "^4.0.0" cli-truncate "^2.1.0" - elegant-spinner "^2.0.0" - enquirer "^2.3.4" figures "^3.2.0" indent-string "^4.0.0" log-update "^4.0.0" p-map "^4.0.0" - pad "^3.2.0" - rxjs "^6.3.3" + rxjs "^6.5.5" through "^2.3.8" - uuid "^7.0.2" livereload-js@^2.3.0: version "2.4.0" @@ -10472,11 +11110,6 @@ lodash.isequal@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= -lodash.islength@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.islength/-/lodash.islength-4.0.1.tgz#4e9868d452575d750affd358c979543dc20ed577" - integrity sha1-Tpho1FJXXXUK/9NYyXlUPcIO1Xc= - lodash.isobject@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" @@ -10521,7 +11154,7 @@ lodash.memoize@~3.0.3: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8= -lodash.merge@^4.4.0, lodash.merge@^4.6.1: +lodash.merge@^4.4.0: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== @@ -10648,6 +11281,13 @@ log-symbols@^3.0.0: dependencies: chalk "^2.4.2" +log-symbols@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + log-update@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" @@ -10838,16 +11478,16 @@ manage-path@^2.0.0: resolved "https://registry.yarnpkg.com/manage-path/-/manage-path-2.0.0.tgz#f4cf8457b926eeee2a83b173501414bc76eb9597" integrity sha1-9M+EV7km7u4qg7FzUBQUvHbrlZc= -mandarin@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/mandarin/-/mandarin-2.0.5.tgz#bd2479be8076ab0fda238a56b54e4eeee3be1a04" - integrity sha512-qp9EtBsQJ7GLiCTtvmQ8a7c2Be3sPY+5o660DNoqzSE2uU6XR6YwPjLykhokn3Wa61mKlzRIM9Sz/iD0V8AP2Q== +mandarin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mandarin/-/mandarin-3.0.0.tgz#aae530bf8a469c70b87f7bf9d60b32550ccd174d" + integrity sha512-NFdl5iGKv49gGap07gl8FQvqJ0OwvJ+jXHowLKfbt/tK9RcPeSYipBOGj+GYan489zZE5FNcTAEeLspSdvUNwA== dependencies: "@cospired/i18n-iso-languages" "^2.1.1" "@google-cloud/translate" "^5.3.0" - "@ladjs/redis" "^1.0.3" - "@ladjs/shared-config" "^2.0.7" - format-specifiers "^1.0.0" + "@ladjs/redis" "^1.0.4" + "@ladjs/shared-config" "^3.0.2" + debug "^4.1.1" globby "^11.0.0" lodash "^4.17.15" modify-filename "^1.1.0" @@ -10855,7 +11495,7 @@ mandarin@^2.0.5: pify "^5.0.0" remark "^12.0.0" remark-emoji "^2.1.0" - remark-preset-github "^1.0.0" + remark-preset-github "^1.0.1" remark-textr "^4.0.0" rev-hash "^3.0.0" universalify "^1.0.0" @@ -10940,14 +11580,14 @@ markdown-it-task-checkbox@^1.0.6: resolved "https://registry.yarnpkg.com/markdown-it-task-checkbox/-/markdown-it-task-checkbox-1.0.6.tgz#9ebd7b6382e99162264605bc580f2ac118be4242" integrity sha512-7pxkHuvqTOu3iwVGmDPeYjQg+AIS9VQxzyLP9JCg9lBjgPAJXGEkChK6A2iFuj3tS0GV3HG2u5AMNhcQqwxpJw== -markdown-it@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-10.0.0.tgz#abfc64f141b1722d663402044e43927f1f50a8dc" - integrity sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg== +markdown-it@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-11.0.0.tgz#dbfc30363e43d756ebc52c38586b91b90046b876" + integrity sha512-+CvOnmbSubmQFSA9dKz1BRiaSMV7rhexl3sngKqFyXSagoA3fBdJQ8oZWtRy2knXdpDXaBw44euz37DeJQ9asg== dependencies: argparse "^1.0.7" entities "~2.0.0" - linkify-it "^2.0.0" + linkify-it "^3.0.1" mdurl "^1.0.1" uc.micro "^1.0.5" @@ -10990,13 +11630,6 @@ mathml-tag-names@^2.1.3: resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== -md5-hex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-2.0.0.tgz#d0588e9f1c74954492ecd24ac0ac6ce997d92e33" - integrity sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM= - dependencies: - md5-o-matic "^0.1.1" - md5-hex@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-3.0.1.tgz#be3741b510591434b2784d79e556eefc2c9a8e5c" @@ -11004,11 +11637,6 @@ md5-hex@^3.0.1: dependencies: blueimp-md5 "^2.10.0" -md5-o-matic@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" - integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= - md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -11070,10 +11698,10 @@ mdast-util-toc@^5.0.0: unist-util-is "^4.0.0" unist-util-visit "^2.0.0" -mdn-browser-compat-data@^1.0.3: - version "1.0.16" - resolved "https://registry.yarnpkg.com/mdn-browser-compat-data/-/mdn-browser-compat-data-1.0.16.tgz#64f79c50d730108390205ed16e781e702ee1e16d" - integrity sha512-g3bkROyUKH5avfQ2Ou2ejtyfGNe7++Axv89+czZuS5EetQsvM1Cw8P/zDoq3SpE72tIrhhVJ74901q15J2Hm4A== +mdn-browser-compat-data@^1.0.21: + version "1.0.26" + resolved "https://registry.yarnpkg.com/mdn-browser-compat-data/-/mdn-browser-compat-data-1.0.26.tgz#2a0bd34358d6b4e687da6b8c01e439576503db6c" + integrity sha512-fULnPQLDsAH/ert7ZtKCDCPyD3gXCh+M0Qapab15VfDGUrqr3Q25HgIchiS6J/giqrfxPbYfCSnVY9Lp2FRPZQ== dependencies: extend "3.0.2" @@ -11119,6 +11747,11 @@ memoizee@0.4.X: next-tick "1" timers-ext "^0.1.5" +memory-fs@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" + integrity sha1-8rslNovBIeORwlIN6Slpyu4KApA= + memory-pager@^1.0.2: version "1.5.0" resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" @@ -11165,12 +11798,14 @@ meow@^3.3.0, meow@^3.6.0, meow@^3.7.0: redent "^1.0.0" trim-newlines "^1.0.0" -meow@^6.1.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" - integrity sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg== +meow@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-7.0.1.tgz#1ed4a0a50b3844b451369c48362eb0515f04c1dc" + integrity sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw== dependencies: "@types/minimist" "^1.2.0" + arrify "^2.0.1" + camelcase "^6.0.0" camelcase-keys "^6.2.2" decamelize-keys "^1.1.0" hard-rejection "^2.1.0" @@ -11223,6 +11858,11 @@ methods@*, methods@^1.1.2, methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +micro-spelling-correcter@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/micro-spelling-correcter/-/micro-spelling-correcter-1.1.1.tgz#805a06a26ccfcad8f3e5c6a1ac5ff29d4530166e" + integrity sha512-lkJ3Rj/mtjlRcHk6YyCbvZhyWTOzdBvTHsxMmZSk5jxN1YyVSQ+JETAom55mdzfcyDrY/49Z7UCW760BK30crg== + 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" @@ -11423,37 +12063,44 @@ moment@^2.25.3: resolved "https://registry.yarnpkg.com/moment/-/moment-2.25.3.tgz#252ff41319cf41e47761a1a88cab30edfe9808c0" integrity sha512-PuYv0PHxZvzc15Sp8ybUCoQ+xpyPWvjOuK72a5ovzp2LI32rJXOiIfyoFoYvG3s6EwwrdkMyWuRiEHSZRLJNdg== -mongodb-core@3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-3.2.7.tgz#a8ef1fe764a192c979252dacbc600dc88d77e28f" - integrity sha512-WypKdLxFNPOH/Jy6i9z47IjG2wIldA54iDZBmHMINcgKOUcWJh8og+Wix76oGd7EyYkHJKssQ2FAOw5Su/n4XQ== +moment@^2.27.0: + version "2.27.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d" + integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ== + +mongodb@3.5.9: + version "3.5.9" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.5.9.tgz#799b72be8110b7e71a882bb7ce0d84d05429f772" + integrity sha512-vXHBY1CsGYcEPoVWhwgxIBeWqP3dSu9RuRDsoLRPTITrcrgm1f0Ubu1xqF9ozMwv53agmEiZm0YGo+7WL3Nbug== dependencies: - bson "^1.1.1" + bl "^2.2.0" + bson "^1.1.4" + denque "^1.4.1" require_optional "^1.0.1" safe-buffer "^5.1.2" optionalDependencies: saslprep "^1.0.0" -mongodb@3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.2.7.tgz#8ba149e4be708257cad0dea72aebb2bbb311a7ac" - integrity sha512-2YdWrdf1PJgxcCrT1tWoL6nHuk6hCxhddAAaEh8QJL231ci4+P9FLyqopbTm2Z2sAU6mhCri+wd9r1hOcHdoMw== - dependencies: - mongodb-core "3.2.7" - safe-buffer "^5.1.2" - -mongoose-common-plugin@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mongoose-common-plugin/-/mongoose-common-plugin-1.0.0.tgz#7ccdbeecd6bf1b4d4da01542e77d88b8311a9165" - integrity sha512-JVQyzE1u8u7c0LJHYE36DoaN3t5Ww8qyYqMt+C7QQd9sO2xnUmfz2R45RtfM/o7vBw+jvlHpNFZBbCZfJDrWKQ== +mongoose-common-plugin@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mongoose-common-plugin/-/mongoose-common-plugin-2.0.1.tgz#4986c328da32e20d1a3753c383f2c4c95d76b0c0" + integrity sha512-PnK/5ed7SBcPUw+1EAxFQFcjH0qNHGXTZ03OlRgwwKVFLYlcjQX8rcYsRLO0b6gWco7nVlzIxwnmE7yriTIZFg== dependencies: "@ladjs/mongoose-error-messages" "^1.0.0" - mongoose-json-select "^0.2.1" - mongoose-omit-common-fields "^0.0.4" + boolean "^3.0.1" + mongoose-hidden "^1.9.0" + mongoose-omit-common-fields "^0.0.5" mongoose-unique-validator "^2.0.3" mongoose-validation-error-transform "^0.0.5" speakingurl "^14.0.1" +mongoose-hidden@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/mongoose-hidden/-/mongoose-hidden-1.9.0.tgz#6cc7c0ce6e8134885f73ea7874061e88880f8d50" + integrity sha512-NnQiMmAhlUPyumo8L1kUFzf5l8W/XtYrHr8ACrOVZnx6JIk3yCsvMZfuXLcTNs68wGaB2yPXG8Szhh15j20Q2g== + dependencies: + mpath "^0.7.0" + mongoose-json-select@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/mongoose-json-select/-/mongoose-json-select-0.2.1.tgz#6c267e133dd00eca237eeec9a07030b3a7583a09" @@ -11466,12 +12113,12 @@ mongoose-legacy-pluralize@1.0.2: resolved "https://registry.yarnpkg.com/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4" integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ== -mongoose-omit-common-fields@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/mongoose-omit-common-fields/-/mongoose-omit-common-fields-0.0.4.tgz#2c68840d483c32aa21b9e388522d5ab7d473cde6" - integrity sha512-QaAGppyR57GDM3iqHJytMDI8TjebcVGKZ7QzBWsLhcuJZwqQN6RDRdCkhJAXNRcBgSFpHbcyuF2nj/HfB8y15g== +mongoose-omit-common-fields@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mongoose-omit-common-fields/-/mongoose-omit-common-fields-0.0.5.tgz#8dad83ed4454b0365780b3ea00616daca8f718fe" + integrity sha512-01nJjyJZ/acK+awpRjYeeMFl7F4ehdcH7iP76d46V9cRCREphbwETclwNfJupXn8R+ALGovJQObHIlOYedrgxA== dependencies: - camelcase "^4.1.0" + camelcase "^6.0.0" mongoose-unique-validator@^2.0.3: version "2.0.3" @@ -11490,19 +12137,17 @@ mongoose-validation-error-transform@^0.0.5: humanize-string "^2.1.0" lodash "^4.17.15" -mongoose@5.6: - version "5.6.13" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.6.13.tgz#de562ba1699b1eb7012fb1692c5d5a99aed7bea8" - integrity sha512-MGV2qSED8JFFwRXtR8ETxLRSaF15u5rAJQ0ejmp7/Z0gy6wFit32pKBQKvuEuYRoNYQmSsctUDngFnOByNPH4g== +mongoose@5.9: + version "5.9.19" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.9.19.tgz#fadedce84e3f49b7ea335b73d2a60d2df97d69e1" + integrity sha512-wJ5FR2ykvyd17MRHA6sku/N1CMaC/kf4CnN357htD48RpzJhW60YDkxPSPLbkLg8Woa+i7jYi0glhzC0EcBcRQ== dependencies: - async "2.6.2" - bson "~1.1.1" + bson "^1.1.4" kareem "2.3.1" - mongodb "3.2.7" - mongodb-core "3.2.7" + mongodb "3.5.9" mongoose-legacy-pluralize "1.0.2" - mpath "0.6.0" - mquery "3.2.1" + mpath "0.7.0" + mquery "3.2.2" ms "2.1.2" regexp-clone "1.0.0" safe-buffer "5.1.2" @@ -11518,15 +12163,15 @@ mozjpeg@^6.0.0: bin-wrapper "^4.0.0" logalot "^2.1.0" -mpath@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.6.0.tgz#aa922029fca4f0f641f360e74c5c1b6a4c47078e" - integrity sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw== +mpath@0.7.0, mpath@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.7.0.tgz#20e8102e276b71709d6e07e9f8d4d0f641afbfb8" + integrity sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg== -mquery@3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/mquery/-/mquery-3.2.1.tgz#8b059a49cdae0a8a9e804284ef64c2f58d3ac05d" - integrity sha512-kY/K8QToZWTTocm0U+r8rqcJCp5PRl6e8tPmoDs5OeSO3DInZE2rAL6AYH+V406JTo8305LdASOQcxRDqHojyw== +mquery@3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/mquery/-/mquery-3.2.2.tgz#e1383a3951852ce23e37f619a9b350f1fb3664e7" + integrity sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q== dependencies: bluebird "3.5.1" debug "3.1.0" @@ -11551,7 +12196,14 @@ multi-stage-sourcemap@^0.2.1: dependencies: source-map "^0.1.34" -multimap@^1.0.2: +multi-stage-sourcemap@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/multi-stage-sourcemap/-/multi-stage-sourcemap-0.3.1.tgz#35bb1e0655cb022516e9f92d738c07a2aacfeec0" + integrity sha512-UiTLYjqeIoVnJHyWGskwMKIhtZKK9uXUjSTWuwatarrc0d2H/6MAVFdwvEA/aKOHamIn7z4tfvxjz+FYucFpNQ== + dependencies: + source-map "^0.1.34" + +multimap@^1.0.2, multimap@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multimap/-/multimap-1.1.0.tgz#5263febc085a1791c33b59bb3afc6a76a2a10ca8" integrity sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw== @@ -11757,6 +12409,35 @@ node-gyp@^3.8.0: tar "^2.0.0" which "1" +"node-libs-browser@^1.0.0 || ^2.0.0": + 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-preload@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" @@ -11838,10 +12519,15 @@ nodemailer@^6.3.1, nodemailer@^6.4.6: resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.4.6.tgz#d37f504f6560b36616f646a606894fe18819107f" integrity sha512-/kJ+FYVEm2HuUlw87hjSqTss+GU35D4giOpdSfGp7DO+5h6RlJj7R94YaYHOkoxu1CSaM0d3WRBtCzwXrY6MKA== -nodemon@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.3.tgz#e9c64df8740ceaef1cb00e1f3da57c0a93ef3714" - integrity sha512-lLQLPS90Lqwc99IHe0U94rDgvjo+G9I4uEIxRG3evSLROcqQ9hwc0AxlSHKS4T1JW/IMj/7N5mthiN58NL/5kw== +nodemailer@^6.4.10: + version "6.4.10" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.4.10.tgz#f4c8dc7991c57f41fd081bef224ef01f7065143d" + integrity sha512-j+pS9CURhPgk6r0ENr7dji+As2xZiHSvZeVnzKniLOw1eRAyM/7flP0u65tCnsapV8JFu+t0l/5VeHsCZEeh9g== + +nodemon@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.4.tgz#55b09319eb488d6394aa9818148c0c2d1c04c416" + integrity sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ== dependencies: chokidar "^3.2.2" debug "^3.2.6" @@ -12047,10 +12733,10 @@ number-to-words@^1.2.3: resolved "https://registry.yarnpkg.com/number-to-words/-/number-to-words-1.2.4.tgz#e0f124de9628f8d86c4eeb89bac6c07699264501" integrity sha512-/fYevVkXRcyBiZDg6yzZbm0RuaD6i0qRfn8yr+6D0KgBMOndFPxuW10qCHpzs50nN8qKuv78k8MuotZhcVX6Pw== -nyc@^15.0.1: - version "15.0.1" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.0.1.tgz#bd4d5c2b17f2ec04370365a5ca1fc0ed26f9f93d" - integrity sha512-n0MBXYBYRqa67IVt62qW1r/d9UH/Qtr7SF1w/nQLJ9KxvWF6b2xCHImRAixHN9tnMMYHC2P14uo6KddNGwMgGg== +nyc@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" + integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== dependencies: "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" @@ -12060,6 +12746,7 @@ nyc@^15.0.1: find-cache-dir "^3.2.0" find-up "^4.1.0" foreground-child "^2.0.0" + get-package-type "^0.1.0" glob "^7.1.6" istanbul-lib-coverage "^3.0.0" istanbul-lib-hook "^3.0.0" @@ -12186,7 +12873,7 @@ object.reduce@^1.0.0: for-own "^1.0.0" make-iterator "^1.0.0" -object.values@^1.1.0: +object.values@^1.1.0, object.values@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== @@ -12294,6 +12981,18 @@ optionator@^0.8.1, optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + optipng-bin@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-6.0.0.tgz#376120fa79d5e71eee2f524176efdd3a5eabd316" @@ -12324,7 +13023,7 @@ ordered-read-streams@^1.0.0: dependencies: readable-stream "^2.0.1" -os-browserify@~0.3.0: +os-browserify@^0.3.0, 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= @@ -12392,12 +13091,12 @@ outpipe@^1.1.0: dependencies: shell-quote "^1.4.2" -ow@^0.13.2: - version "0.13.2" - resolved "https://registry.yarnpkg.com/ow/-/ow-0.13.2.tgz#375e76d3d3f928a8dfcf0cd0b9c921cb62e469a0" - integrity sha512-9wvr+q+ZTDRvXDjL6eDOdFe5WUl/wa5sntf9kAolxqSpkBqaIObwLgFCGXSJASFw+YciXnOVtDWpxXa9cqV94A== +ow@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/ow/-/ow-0.17.0.tgz#4f938999fed6264c9048cd6254356e0f1e7f688c" + integrity sha512-i3keDzDQP5lWIe4oODyDFey1qVrq2hXKTuTH2VpqwpYtzPiKZt2ziRI4NBQmgW40AnV5Euz17OyWweCb+bNEQA== dependencies: - type-fest "^0.5.1" + type-fest "^0.11.0" p-cancelable@^0.3.0: version "0.3.0" @@ -12578,13 +13277,6 @@ package-json@^6.3.0: registry-url "^5.0.0" semver "^6.2.0" -pad@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/pad/-/pad-3.2.0.tgz#be7a1d1cb6757049b4ad5b70e71977158fea95d1" - integrity sha512-2u0TrjcGbOjBTJpyewEl4hBO3OeX5wWue7eIFPzQTg6wFSvoaHcBTTUY5m+n0hd04gmTCPuY0kCpVIVuw5etwg== - dependencies: - wcwidth "^1.0.1" - pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" @@ -12604,24 +13296,16 @@ parents@^1.0.0, parents@^1.0.1: dependencies: path-platform "~0.11.15" -parse-app-info@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/parse-app-info/-/parse-app-info-2.0.5.tgz#642d3532e06121bbef27ba278ff3a44fbd470785" - integrity sha512-WFk+Wdnp9J/stFYb0xgBKLX/38PMlyOndOpwGqoHPYpzYRuTJoh7N1BzRkt4xtcIY9wTTJvx8VmPBkR1UUHttg== - dependencies: - debug "^4.1.1" - last-commit-log "^2.1.0" - read-pkg-up "^7.0.0" - -parse-app-info@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/parse-app-info/-/parse-app-info-3.0.1.tgz#65185d82fe7cd1bb3e83a3754a4cf1a67d2e48d4" - integrity sha512-WxDmCSfUvqOs8LwmH77jOvUz6k+NFM+YjIvYG8CUomwxsWymUTIK5RgxgNNpD0YkU+EkZWcA+VWawG4ZefJvBQ== +parse-app-info@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/parse-app-info/-/parse-app-info-3.0.3.tgz#de5b77e59af3b8065c65abdebd9b89d16eb1d12b" + integrity sha512-YsHpEJBJh1e3IO5maUG82nx0cAjk+vAvInYeOdVObQFrDkmtnPggfkZy4BGAsv6aKq4iZ9Ao9G3SF5ixOYS2Gg== dependencies: debug "^4.1.1" last-commit-log "^3.0.4" lodash "^4.17.15" read-pkg-up "^7.0.1" + semver "^7.3.2" parse-asn1@^5.0.0: version "5.1.5" @@ -12742,29 +13426,6 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= -parse-request@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/parse-request/-/parse-request-2.0.6.tgz#4918649d94fb26cb0c9c714bee9db09bd65a0a70" - integrity sha512-Fx0sKz3LlJOPMIHvrTkqe4n4aSDTnVEwe1lAIK+ouPv+S8Ldtod1NP7LxYjQFzw7btWO3rF+P7kYHCZusYD1zw== - dependencies: - browser-process-hrtime "^1.0.0" - bson-objectid "^1.3.0" - convert-hrtime "^3.0.0" - cookie "^0.4.0" - credit-card-type "^8.3.0" - debug "^4.1.1" - fast-safe-stringify "^2.0.7" - http-headers "^3.0.2" - is-array-buffer "^1.0.1" - is-buffer "^2.0.4" - is-stream "^2.0.0" - is-uuid "^1.0.2" - ms "^2.1.2" - no-case "2.3.2" - rfdc "^1.1.4" - sensitive-fields "^0.0.7" - url-parse "^1.4.7" - parse-request@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/parse-request/-/parse-request-3.0.0.tgz#5998d7f4e24ceffd55e2946bd25820a17172c8cf" @@ -12918,7 +13579,7 @@ passport@^0.4.0: passport-strategy "1.x.x" pause "0.0.1" -path-browserify@~0.0.0: +path-browserify@0.0.1, path-browserify@~0.0.0: 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== @@ -12992,13 +13653,6 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= -path-to-regexp@1.x: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - path-to-regexp@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.1.0.tgz#0b18f88b7a0ce0bfae6a25990c909ab86f512427" @@ -13127,10 +13781,10 @@ pino-std-serializers@^2.4.2: resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-2.4.2.tgz#cb5e3e58c358b26f88969d7e619ae54bdfcc1ae1" integrity sha512-WaL504dO8eGs+vrK+j4BuQQq6GLKeCCcHaMB2ItygzVURcL1CycwNEUHTD/lHFHs/NL5qAz2UKrjYWXKSf4aMQ== -pino@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/pino/-/pino-6.2.1.tgz#d2b86306b3998e8f6bb33bdf23910d418ed696cf" - integrity sha512-5F5A+G25Ex2rMOBEe3XYGyLSF4dikQZsFvPojwsqnDBX+rfg7+kw9s5i7pHuVAJImekjwb+MR9jQyHWPLENlvQ== +pino@^6.3.2: + version "6.3.2" + resolved "https://registry.yarnpkg.com/pino/-/pino-6.3.2.tgz#55f73aa61584774ca5984068ffb78e8d519ce19e" + integrity sha512-EiP3L1hoFw19KPocWimjnfXeysld0ne89ZRQ+bf8nAeA2TyuLoggNlibAi+Kla67GvQBopLdIZOsh1z/Lruo5Q== dependencies: fast-redact "^2.0.0" fast-safe-stringify "^2.0.7" @@ -13227,14 +13881,14 @@ pngjs@^3.3.0: resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== -pngquant-bin@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-5.0.2.tgz#6f34f3e89c9722a72bbc509062b40f1b17cda460" - integrity sha512-OLdT+4JZx5BqE1CFJkrvomYV0aSsv6x2Bba+aWaVc0PMfWlE+ZByNKYAdKeIqsM4uvW1HOSEHnf8KcOnykPNxA== +pngquant-bin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-6.0.0.tgz#aff0d7e61095feb96ced379ad8c7294ad3dd1712" + integrity sha512-oXWAS9MQ9iiDAJRdAZ9KO1mC5UwhzKkJsmetiu0iqIjJuW7JsuLhmc4JdRm7uJkIWRzIAou/Vq2VcjfJwz30Ow== dependencies: bin-build "^3.0.0" bin-wrapper "^4.0.1" - execa "^0.10.0" + execa "^4.0.0" logalot "^2.0.0" popper.js@^1.16.1: @@ -13798,12 +14452,12 @@ postcss-sass@^0.4.4: gonzales-pe "^4.3.0" postcss "^7.0.21" -postcss-scss@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.0.0.tgz#248b0a28af77ea7b32b1011aba0f738bda27dea1" - integrity sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug== +postcss-scss@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383" + integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA== dependencies: - postcss "^7.0.0" + postcss "^7.0.6" postcss-selector-matches@^4.0.0: version "4.0.0" @@ -13914,10 +14568,10 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.1 source-map "^0.6.1" supports-color "^6.1.0" -postcss@^7.0.29: - version "7.0.30" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.30.tgz#cc9378beffe46a02cbc4506a0477d05fcea9a8e2" - integrity sha512-nu/0m+NtIzoubO+xdAlwZl/u5S5vi/y6BCsoL8D+8IxsD3XvBS8X4YEADNIVXKVuQvduiucnRv+vPIqj56EGMQ== +postcss@^7.0.32: + version "7.0.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" + integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -13931,6 +14585,11 @@ prefix-matches@^1.0.1: is-object "^1.0.1" starts-with "^1.0.2" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -13958,6 +14617,11 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" +prettier@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.4.tgz#2d1bae173e355996ee355ec9830a7a1ee05457ef" + integrity sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w== + prettier@^1.15.2: version "1.19.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" @@ -14021,7 +14685,7 @@ process-on-spawn@^1.0.0: dependencies: fromentries "^1.2.0" -process@~0.11.0: +process@^0.11.10, process@~0.11.0: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= @@ -14131,6 +14795,15 @@ pug-attrs@^2.0.3, pug-attrs@^2.0.4: js-stringify "^1.0.1" pug-runtime "^2.0.5" +pug-attrs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-3.0.0.tgz#b10451e0348165e31fad1cc23ebddd9dc7347c41" + integrity sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA== + dependencies: + constantinople "^4.0.1" + js-stringify "^1.0.2" + pug-runtime "^3.0.0" + pug-code-gen@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.2.tgz#ad0967162aea077dcf787838d94ed14acb0217c2" @@ -14145,11 +14818,30 @@ pug-code-gen@^2.0.2: void-elements "^2.0.1" with "^5.0.0" +pug-code-gen@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-3.0.1.tgz#ff3b337b100c494ea63ef766091d27f7d73acb7e" + integrity sha512-xJIGvmXTQlkJllq6hqxxjRWcay2F9CU69TuAuiVZgHK0afOhG5txrQOcZyaPHBvSWCU/QQOqEp5XCH94rRZpBQ== + dependencies: + constantinople "^4.0.1" + doctypes "^1.1.0" + js-stringify "^1.0.2" + pug-attrs "^3.0.0" + pug-error "^2.0.0" + pug-runtime "^3.0.0" + void-elements "^3.1.0" + with "^7.0.0" + pug-error@^1.3.2, pug-error@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.3.tgz#f342fb008752d58034c185de03602dd9ffe15fa6" integrity sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ== +pug-error@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-2.0.0.tgz#5c62173cb09c34de2a2ce04f17b8adfec74d8ca5" + integrity sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ== + pug-filters@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.1.tgz#ab2cc82db9eeccf578bda89130e252a0db026aa7" @@ -14163,6 +14855,17 @@ pug-filters@^3.1.1: resolve "^1.1.6" uglify-js "^2.6.1" +pug-filters@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-4.0.0.tgz#d3e49af5ba8472e9b7a66d980e707ce9d2cc9b5e" + integrity sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A== + dependencies: + constantinople "^4.0.1" + jstransformer "1.0.0" + pug-error "^2.0.0" + pug-walk "^2.0.0" + resolve "^1.15.1" + pug-lexer@^4.0.0, pug-lexer@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.1.0.tgz#531cde48c7c0b1fcbbc2b85485c8665e31489cfd" @@ -14172,6 +14875,15 @@ pug-lexer@^4.0.0, pug-lexer@^4.1.0: is-expression "^3.0.0" pug-error "^1.3.3" +pug-lexer@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-5.0.0.tgz#0b779e7d8cbf0f103803675be96351942fd9a727" + integrity sha512-52xMk8nNpuyQ/M2wjZBN5gXQLIylaGkAoTk5Y1pBhVqaopaoj8Z0iVzpbFZAqitL4RHNVDZRnJDsqEYe99Ti0A== + dependencies: + character-parser "^2.2.0" + is-expression "^4.0.0" + pug-error "^2.0.0" + pug-linker@^3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.6.tgz#f5bf218b0efd65ce6670f7afc51658d0f82989fb" @@ -14180,6 +14892,14 @@ pug-linker@^3.0.6: pug-error "^1.3.3" pug-walk "^1.1.8" +pug-linker@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-4.0.0.tgz#12cbc0594fc5a3e06b9fc59e6f93c146962a7708" + integrity sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw== + dependencies: + pug-error "^2.0.0" + pug-walk "^2.0.0" + pug-lint@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/pug-lint/-/pug-lint-2.6.0.tgz#3964f11bbe6d5a5cb1cf5a20206d7b2fa79907d1" @@ -14207,6 +14927,14 @@ pug-load@^2.0.12: object-assign "^4.1.0" pug-walk "^1.1.8" +pug-load@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-3.0.0.tgz#9fd9cda52202b08adb11d25681fb9f34bd41b662" + integrity sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ== + dependencies: + object-assign "^4.1.1" + pug-walk "^2.0.0" + pug-parser@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.1.tgz#03e7ada48b6840bd3822f867d7d90f842d0ffdc9" @@ -14215,11 +14943,24 @@ pug-parser@^5.0.1: pug-error "^1.3.3" token-stream "0.0.1" +pug-parser@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-6.0.0.tgz#a8fdc035863a95b2c1dc5ebf4ecf80b4e76a1260" + integrity sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw== + dependencies: + pug-error "^2.0.0" + token-stream "1.0.0" + pug-runtime@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.5.tgz#6da7976c36bf22f68e733c359240d8ae7a32953a" integrity sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw== +pug-runtime@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-3.0.0.tgz#d523025fdc0a1efe70929d1fd3a2d24121ffffb6" + integrity sha512-GoEPcmQNnaTsePEdVA05bDpY+Op5VLHKayg08AQiqJBWU/yIaywEYv7TetC5dEQS3fzBBoyb2InDcZEg3mPTIA== + pug-strip-comments@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz#cc1b6de1f6e8f5931cf02ec66cdffd3f50eaf8a8" @@ -14227,11 +14968,23 @@ pug-strip-comments@^1.0.4: dependencies: pug-error "^1.3.3" +pug-strip-comments@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz#f94b07fd6b495523330f490a7f554b4ff876303e" + integrity sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ== + dependencies: + pug-error "^2.0.0" + pug-walk@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.8.tgz#b408f67f27912f8c21da2f45b7230c4bd2a5ea7a" integrity sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA== +pug-walk@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-2.0.0.tgz#417aabc29232bb4499b5b5069a2b2d2a24d5f5fe" + integrity sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ== + pug@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.4.tgz#ee7682ec0a60494b38d48a88f05f3b0ac931377d" @@ -14246,6 +14999,20 @@ pug@^2.0.4: pug-runtime "^2.0.5" pug-strip-comments "^1.0.4" +pug@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.0.tgz#101eecd7a236cd9906e420e17799d4d57f2b7d93" + integrity sha512-inmsJyFBSHZaiGLaguoFgJGViX0If6AcfcElimvwj9perqjDpUpw79UIEDZbWFmoGVidh08aoE+e8tVkjVJPCw== + dependencies: + pug-code-gen "^3.0.0" + pug-filters "^4.0.0" + pug-lexer "^5.0.0" + pug-linker "^4.0.0" + pug-load "^3.0.0" + pug-parser "^6.0.0" + pug-runtime "^3.0.0" + pug-strip-comments "^2.0.0" + pump@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" @@ -14276,7 +15043,7 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@^1.3.2: +punycode@^1.2.4, punycode@^1.3.2: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= @@ -14316,16 +15083,16 @@ qs@6.9.1: resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9" integrity sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA== +qs@6.9.4, qs@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" + integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== + qs@^6.4.0, qs@^6.5.2, qs@^6.9.1: version "6.9.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== -qs@^6.9.4: - version "6.9.4" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" - integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== - qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -14340,7 +15107,7 @@ query-string@^5.0.1: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -querystring-es3@~0.2.0: +querystring-es3@^0.2.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= @@ -14690,12 +15457,12 @@ regexp-clone@1.0.0, regexp-clone@^1.0.0: resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-1.0.0.tgz#222db967623277056260b992626354a04ce9bf63" integrity sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw== -regexp-tree@^0.1.17, regexp-tree@~0.1.1: +regexp-tree@^0.1.21, regexp-tree@~0.1.1: version "0.1.21" resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.21.tgz#55e2246b7f7d36f1b461490942fa780299c400d7" integrity sha512-kUUXjX4AnqnR8KRTCrayAo9PzYMRKmVoGgaz2tBuz0MF3g1ZbGebmtW0yFHfFK9CmBjQKeYIgoL22pFLBJY7sw== -regexp.prototype.flags@^1.2.0: +regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== @@ -14713,6 +15480,11 @@ regexpp@^3.0.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== +regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + regexpu-core@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" @@ -14774,16 +15546,15 @@ remark-comment-config@^5.1.1: dependencies: mdast-comment-marker "^1.0.1" -remark-contributors@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/remark-contributors/-/remark-contributors-5.0.0.tgz#e36db150281f1b0e917a5d13dde87e42ffdaf68c" - integrity sha512-yU6/hvUwZ9hVcQQ8T7Quh8916IhKsFyO1t5HdZ3JIGvpqxwjoGuNjOruXirXBOqHD2j57dXrXzFxcS1wpO5BEQ== +remark-contributors@4.x: + version "4.0.1" + resolved "https://registry.yarnpkg.com/remark-contributors/-/remark-contributors-4.0.1.tgz#f28269adb91f7ca6c95bb14ce1e08a9822ac9dad" + integrity sha512-5G76tKfpRl/TrOljvD1KZvA53S+jm0DeL2HDwFgdkxTexUdv8A0EG2JQNxGWXEVmOhch3yJ4tF2QlsiRf8SXWg== dependencies: is-url "^1.2.2" mdast-util-heading-range "^2.1.2" parse-author "^2.0.0" - unist-builder "^2.0.0" - vfile-find-up "^5.0.0" + unist-builder "^1.0.3" remark-emoji@^2.1.0: version "2.1.0" @@ -15331,13 +16102,13 @@ remark-parse@^8.0.0: vfile-location "^3.0.0" xtend "^4.0.1" -remark-preset-github@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/remark-preset-github/-/remark-preset-github-1.0.0.tgz#a1709411045ba247a196c70cbb9e14003330ec7c" - integrity sha512-xPupJHBJTqu23VJ9VpEhxHqAppe7qSaD3BzR5M+JUgyeC7xnlCCXO/+mhejWWZ/BpkC2uCXFerG7BkwSnG+jcA== +remark-preset-github@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/remark-preset-github/-/remark-preset-github-1.0.1.tgz#b3d3822d764e3bf126230d791387bb15a57a3151" + integrity sha512-cIGl/8Kl56I6qEgaiNsF0mzjYI0EL8dM4XdB8RBqOl6+JOaM1NJxKw18QPdSRgnOJlplPmpmW9II0gpa9t/8ew== dependencies: remark-comment-config "^5.1.1" - remark-contributors "^5.0.0" + remark-contributors "4.x" remark-github "^9.0.0" remark-heading-gap "^3.1.2" remark-license niftylettuce/remark-license @@ -15682,6 +16453,13 @@ resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1 dependencies: path-parse "^1.0.6" +resolve@^1.15.1, resolve@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + response-time@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/response-time/-/response-time-2.3.2.tgz#ffa71bab952d62f7c1d49b7434355fbc68dffc5a" @@ -15923,7 +16701,7 @@ rx@2.3.24: resolved "https://registry.yarnpkg.com/rx/-/rx-2.3.24.tgz#14f950a4217d7e35daa71bbcbe58eff68ea4b2b7" integrity sha1-FPlQpCF9fjXapxu8vljv9o6ksrc= -rxjs@^6.3.3, rxjs@^6.5.3: +rxjs@^6.5.3, rxjs@^6.5.5: version "6.5.5" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== @@ -15980,18 +16758,14 @@ sanitize-html@^1.20.1: srcset "^2.0.1" xtend "^4.0.1" -sanitize-html@^1.23.0: - version "1.23.0" - resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.23.0.tgz#e7a5ce7427cd2844dae5b9961cd372e349f91fb5" - integrity sha512-7MgUrbZpaig6zHwuHjpNqhkiuutFPWWoFY/RmdtEnvrFKMLafzSHfFyOozVpKWytkZIUhbYu3VQ/93OmYdo3ag== +sanitize-html@^1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.27.0.tgz#42104a2d59f1a48b616b5165ad5349824861e580" + integrity sha512-U1btucGeYVpg0GoK43jPpe/bDCV4cBOGuxzv5NBd0bOjyZdMKY0n98S/vNlO1wVwre0VCj8H3hbzE7gD2+RjKA== dependencies: chalk "^2.4.1" htmlparser2 "^4.1.0" - lodash.clonedeep "^4.5.0" - lodash.escaperegexp "^4.1.2" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.mergewith "^4.6.2" + lodash "^4.17.15" postcss "^7.0.27" srcset "^2.0.1" xtend "^4.0.1" @@ -16109,7 +16883,7 @@ semver-truncate@^1.1.2: dependencies: semver "^5.3.0" -"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.5.1, semver@^5.6.0, semver@^5.7.1: +"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== @@ -16124,7 +16898,12 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^7.1.1, semver@^7.1.2, semver@^7.1.3: +semver@7.3.2, semver@^7.2.1, semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + +semver@^7.1.1: version "7.1.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6" integrity sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA== @@ -16134,11 +16913,6 @@ semver@~5.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= -sensitive-fields@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/sensitive-fields/-/sensitive-fields-0.0.7.tgz#4fee8f9d3361c85b8c274eca769fbe93b06e259f" - integrity sha512-iwo05WQQ4FX5jts0V5X2yNdQa8IgFJ5hDiQn7QdlLdlNlt/t2jvcJ5XnnTJUqYUgiNkIu/rMLpNOIfu29fWQeA== - sensitive-fields@^0.0.9: version "0.0.9" resolved "https://registry.yarnpkg.com/sensitive-fields/-/sensitive-fields-0.0.9.tgz#bfbdbb00bdccfd645d529fdc22dd80e57c9427e4" @@ -16164,6 +16938,11 @@ set-value@^2.0.0, set-value@^2.0.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= + setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -16231,6 +17010,14 @@ shell-quote@^1.4.2, shell-quote@^1.6.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== +side-channel@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" + integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== + dependencies: + es-abstract "^1.17.0-next.1" + object-inspect "^1.7.0" + sift@7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/sift/-/sift-7.0.1.tgz#47d62c50b159d316f1372f8b53f9c10cd21a4b08" @@ -16668,7 +17455,7 @@ stdout-stream@^1.4.0: dependencies: readable-stream "^2.0.1" -stream-browserify@^2.0.0: +stream-browserify@^2.0.0, 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== @@ -16711,6 +17498,17 @@ stream-exhaust@^1.0.1: resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d" integrity sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw== +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-http@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.0.tgz#22fb33fe9b4056b4eccf58bd8f400c4b993ffe57" @@ -16809,6 +17607,18 @@ string.prototype.codepointat@^0.2.1: resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz#004ad44c8afc727527b108cd462b4d971cd469bc" integrity sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg== +string.prototype.matchall@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" + integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + has-symbols "^1.0.1" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.2" + string.prototype.padend@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz#dc08f57a8010dc5c153550318f67e13adbb72ac3" @@ -16856,7 +17666,7 @@ string_decoder@0.10, string_decoder@~0.10.x: resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= -string_decoder@^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== @@ -17001,6 +17811,11 @@ strip-json-comments@^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@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" + integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== + strip-outer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" @@ -17039,10 +17854,10 @@ stylelint-config-recommended@^3.0.0: resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz#e0e547434016c5539fe2650afd58049a2fd1d657" integrity sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ== -stylelint-scss@^3.17.2: - version "3.17.2" - resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-3.17.2.tgz#4d849a153f9241834396f5880db2c3c964def4e3" - integrity sha512-e0dmxqsofy/HZj4urcGSJw4S6yHDJxiQdT20/1ciCsd5lomisa7YM4+Qtt1EG4hsqEG1dbEeF855tec1UyqcSA== +stylelint-scss@^3.18.0: + version "3.18.0" + resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-3.18.0.tgz#8f06371c223909bf3f62e839548af1badeed31e9" + integrity sha512-LD7+hv/6/ApNGt7+nR/50ft7cezKP2HM5rI8avIdGaUWre3xlHfV4jKO/DRZhscfuN+Ewy9FMhcTq0CcS0C/SA== dependencies: lodash "^4.17.15" postcss-media-query-parser "^0.2.3" @@ -17050,37 +17865,37 @@ stylelint-scss@^3.17.2: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -stylelint@^13.3.3: - version "13.3.3" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.3.3.tgz#e267a628ebfc1adad6f5a1fe818724c34171402b" - integrity sha512-j8Oio2T1YNiJc6iXDaPYd74Jg4zOa1bByNm/g9/Nvnq4tDPsIjMi46jhRZyPPktGPwjJ5FwcmCqIRlH6PVP8mA== +stylelint@^13.6.1: + version "13.6.1" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.6.1.tgz#cc1d76338116d55e8ff2be94c4a4386c1239b878" + integrity sha512-XyvKyNE7eyrqkuZ85Citd/Uv3ljGiuYHC6UiztTR6sWS9rza8j3UeQv/eGcQS9NZz/imiC4GKdk1EVL3wst5vw== dependencies: "@stylelint/postcss-css-in-js" "^0.37.1" "@stylelint/postcss-markdown" "^0.36.1" - autoprefixer "^9.7.6" + autoprefixer "^9.8.0" balanced-match "^1.0.0" - chalk "^4.0.0" + chalk "^4.1.0" cosmiconfig "^6.0.0" debug "^4.1.1" execall "^2.0.0" file-entry-cache "^5.0.1" - get-stdin "^7.0.0" + get-stdin "^8.0.0" global-modules "^2.0.0" - globby "^11.0.0" + globby "^11.0.1" globjoin "^0.1.4" html-tags "^3.1.0" - ignore "^5.1.4" + ignore "^5.1.8" import-lazy "^4.0.0" imurmurhash "^0.1.4" - known-css-properties "^0.18.0" + known-css-properties "^0.19.0" leven "^3.1.0" lodash "^4.17.15" - log-symbols "^3.0.0" + log-symbols "^4.0.0" mathml-tag-names "^2.1.3" - meow "^6.1.0" + meow "^7.0.1" micromatch "^4.0.2" normalize-selector "^0.2.0" - postcss "^7.0.27" + postcss "^7.0.32" postcss-html "^0.36.0" postcss-less "^3.1.4" postcss-media-query-parser "^0.2.3" @@ -17088,10 +17903,10 @@ stylelint@^13.3.3: postcss-resolve-nested-selector "^0.1.1" postcss-safe-parser "^4.0.2" postcss-sass "^0.4.4" - postcss-scss "^2.0.0" + postcss-scss "^2.1.1" postcss-selector-parser "^6.0.2" postcss-syntax "^0.36.2" - postcss-value-parser "^4.0.3" + postcss-value-parser "^4.1.0" resolve-from "^5.0.0" slash "^3.0.0" specificity "^0.4.1" @@ -17101,7 +17916,7 @@ stylelint@^13.3.3: sugarss "^2.0.0" svg-tags "^1.0.0" table "^5.4.6" - v8-compile-cache "^2.1.0" + v8-compile-cache "^2.1.1" write-file-atomic "^3.0.3" subarg@^1.0.0: @@ -17271,6 +18086,11 @@ table@^5.2.3, table@^5.4.6: slice-ansi "^2.1.0" string-width "^3.0.0" +tapable@^0.1.8: + version "0.1.10" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" + integrity sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q= + tar-stream@^1.5.2: version "1.6.2" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" @@ -17528,6 +18348,13 @@ timers-browserify@^1.0.1: dependencies: process "~0.11.0" +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" + timers-ext@^0.1.5: version "0.1.7" resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" @@ -17592,7 +18419,7 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -to-absolute-glob@^2.0.0: +to-absolute-glob@^2.0.0, to-absolute-glob@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs= @@ -17600,6 +18427,11 @@ to-absolute-glob@^2.0.0: is-absolute "^1.0.0" is-negated-glob "^1.0.0" +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-buffer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" @@ -17677,6 +18509,11 @@ token-stream@0.0.1: resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a" integrity sha1-zu78cXp2xDFvEm0LnbqlXX598Bo= +token-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4" + integrity sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ= + touch@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" @@ -17759,6 +18596,21 @@ trough@^1.0.0: dependencies: glob "^7.1.2" +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + tslib@^1.9.0: version "1.11.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" @@ -17769,6 +18621,18 @@ tsscmp@1.0.6, tsscmp@^1.0.6: resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + +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= + tty-browserify@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" @@ -17786,6 +18650,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -17818,11 +18689,6 @@ type-fest@^0.4.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== -type-fest@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" - integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== - type-fest@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" @@ -17863,6 +18729,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript@^3.3.1: + version "3.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" + integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== + typpy@2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/typpy/-/typpy-2.3.11.tgz#21a0d22c96fb646306e08b6c669ad43608e1b3b9" @@ -18157,10 +19028,12 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" -unist-builder@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" - integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== +unist-builder@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-1.0.4.tgz#e1808aed30bd72adc3607f25afecebef4dd59e17" + integrity sha512-v6xbUPP7ILrT15fHGrNyHc1Xda8H3xVhP7/HAIotHOhVPjH5dCXA097C3Rry1Q2O+HbOLCao4hfPB+EYEjHgVg== + dependencies: + object-assign "^4.1.0" unist-util-find-after@^2.0.0: version "2.0.4" @@ -18342,11 +19215,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urijs@^1.19.2: - version "1.19.2" - resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.2.tgz#f9be09f00c4c5134b7cb3cf475c1dd394526265a" - integrity sha512-s/UIq9ap4JPZ7H1EB5ULo/aOUbWqfDi7FKzMC2Nz+0Si8GiT1rIEaprt8hy3Vy2Ex2aJPpOQv4P4DuOZ+K1c6w== - urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -18392,7 +19260,7 @@ url@0.10.3: punycode "1.3.2" querystring "0.2.0" -url@~0.11.0: +url@^0.11.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= @@ -18432,6 +19300,13 @@ util@0.10.3: 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" + util@~0.10.1: version "0.10.4" resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" @@ -18459,16 +19334,21 @@ uuid@^3.0.1, uuid@^3.3.2, uuid@^3.3.3, uuid@^3.4.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^7.0.0, uuid@^7.0.2: +uuid@^7.0.0: version "7.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== -v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.0: +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== +v8-compile-cache@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" + integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== + v8flags@^3.0.1: version "3.1.3" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8" @@ -18476,6 +19356,13 @@ v8flags@^3.0.1: dependencies: homedir-polyfill "^1.0.1" +v8flags@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656" + integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg== + dependencies: + homedir-polyfill "^1.0.1" + valid-data-url@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/valid-data-url/-/valid-data-url-2.0.0.tgz#2220fa9f8d4e761ebd3f3bb02770f1212b810537" @@ -18494,10 +19381,10 @@ validator@^12.1.0: resolved "https://registry.yarnpkg.com/validator/-/validator-12.2.0.tgz#660d47e96267033fd070096c3b1a6f2db4380a0a" integrity sha512-jJfE/DW6tIK1Ek8nCfNFqt8Wb3nzMoAbocBF6/Icgg1ZFSBpObdnwVY2jQj6qUqzhx5jc71fpvBWyLGO7Xl+nQ== -validator@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.0.0.tgz#0fb6c6bb5218ea23d368a8347e6d0f5a70e3bcab" - integrity sha512-anYx5fURbgF04lQV18nEQWZ/3wHGnxiKdG4aL8J+jEDsm98n/sU/bey+tYk6tnGJzm7ioh5FoqrAiQ6m03IgaA== +validator@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.1.1.tgz#f8811368473d2173a9d8611572b58c5783f223bf" + integrity sha512-8GfPiwzzRoWTg7OV1zva1KvrSemuMkv07MA9TTl91hfhe+wKrsrgVN4H2QSFd/U/FhiU3iWPYVgvbsOGwhyFWw== value-or-function@^3.0.0: version "3.0.0" @@ -18523,13 +19410,6 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vfile-find-up@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/vfile-find-up/-/vfile-find-up-5.0.1.tgz#2d3d855e99013b852c604b18a0e559acf6fd385e" - integrity sha512-YWx8fhWQNYpHxFkR5fDO4lCdvPcY4jfCG7qUMHVvSp14vRfkEYxFG/vUEV0eJuXoKFfiAmMkAS8dekOYnpAJ+A== - dependencies: - to-vfile "^6.0.0" - vfile-location@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.0.1.tgz#d78677c3546de0f7cd977544c367266764d31bb3" @@ -18668,7 +19548,7 @@ vinyl@^2.0.0, vinyl@^2.0.1, vinyl@^2.1.0, vinyl@^2.2.0: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" -vm-browserify@^1.0.0: +vm-browserify@^1.0.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== @@ -18678,6 +19558,11 @@ void-elements@^2.0.1: resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= +void-elements@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + integrity sha1-YU9/v42AHwu18GYfWy9XhXUOTwk= + walkdir@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.4.1.tgz#dc119f83f4421df52e3061e514228a2db20afa39" @@ -18792,7 +19677,17 @@ with@^5.0.0: acorn "^3.1.0" acorn-globals "^3.0.0" -word-wrap@~1.2.3: +with@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/with/-/with-7.0.2.tgz#ccee3ad542d25538a7a7a80aad212b9828495bac" + integrity sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w== + dependencies: + "@babel/parser" "^7.9.6" + "@babel/types" "^7.9.6" + assert-never "^1.2.1" + babel-walk "3.0.0-canary-5" + +word-wrap@^1.2.3, 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== @@ -18985,41 +19880,54 @@ xo@0.25: update-notifier "^3.0.1" xo-init "^0.7.0" -xo@^0.26.1: - version "0.26.1" - resolved "https://registry.yarnpkg.com/xo/-/xo-0.26.1.tgz#fdae82ab0ae99cbb777c974a363ccccf2bd08160" - integrity sha512-m2h2NrFoprrB8jsCvZFx5Wn3uLwd9k4mTo4bA+ZzXOv3fCOMMW8sA2C+qCCNTuEdRarYRtO068+cerM8ZnBiCQ== +xo@^0.32.0: + version "0.32.0" + resolved "https://registry.yarnpkg.com/xo/-/xo-0.32.0.tgz#f3eeaec5c0a8ac8003d5d872464d9091a6bf7b7a" + integrity sha512-PnrLzAb9vMKljc5y0tUM4MEZGtXJd8KkuYoszYQkzUyFk8ykDrrOPEDO7ZmpoGSEohNjRLusvgOUi1LJD/jQjA== dependencies: + "@typescript-eslint/eslint-plugin" "^3.1.0" + "@typescript-eslint/parser" "^3.1.0" arrify "^2.0.1" - debug "^4.1.0" - eslint "^6.8.0" - eslint-config-prettier "^6.10.0" - eslint-config-xo "^0.29.0" + cosmiconfig "^6.0.0" + debug "^4.1.1" + eslint "^7.1.0" + eslint-config-prettier "^6.11.0" + eslint-config-xo "^0.30.0" + eslint-config-xo-typescript "^0.31.0" eslint-formatter-pretty "^3.0.1" - eslint-plugin-ava "^10.0.1" - eslint-plugin-eslint-comments "^3.1.2" - eslint-plugin-import "^2.20.1" - eslint-plugin-no-use-extend-native "^0.4.1" - eslint-plugin-node "^11.0.0" - eslint-plugin-prettier "^3.1.2" + eslint-import-resolver-webpack "^0.12.1" + eslint-plugin-ava "^10.3.0" + eslint-plugin-eslint-comments "^3.2.0" + eslint-plugin-import "^2.20.2" + eslint-plugin-no-use-extend-native "^0.5.0" + eslint-plugin-node "^11.1.0" + eslint-plugin-prettier "^3.1.3" eslint-plugin-promise "^4.2.1" - eslint-plugin-unicorn "^16.1.1" - find-cache-dir "^3.0.0" - get-stdin "^7.0.0" + eslint-plugin-unicorn "^20.1.0" + find-cache-dir "^3.3.1" + find-up "^4.1.0" + fs-extra "^9.0.0" + get-stdin "^8.0.0" globby "^9.0.0" has-flag "^4.0.0" + imurmurhash "^0.1.4" + is-path-inside "^3.0.2" + json-stable-stringify-without-jsonify "^1.0.1" + json5 "^2.1.3" lodash "^4.17.15" meow "^5.0.0" - multimatch "^4.0.0" + micromatch "^4.0.2" open-editor "^2.0.1" + p-reduce "^2.1.0" path-exists "^4.0.0" - pkg-conf "^3.1.0" - prettier "^1.15.2" + prettier "2.0.4" resolve-cwd "^3.0.0" resolve-from "^5.0.0" - semver "^7.1.3" + semver "^7.3.2" slash "^3.0.0" - update-notifier "^4.0.0" + to-absolute-glob "^2.0.2" + typescript "^3.3.1" + update-notifier "^4.1.0" xregexp@4.0.0: version "4.0.0"