diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..cbdeb84 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "nodebb/lib" +} \ No newline at end of file diff --git a/README.md b/README.md index d28a64f..b706b93 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ Persona theme for NodeBB ==================== -Persona is the new default theme for NodeBB as of v0.7.1 +The Persona theme is the default theme for NodeBB for versions spanning v0.7.1 through to v2.x + +For the v3.x release line, Persona will be a supported theme bundled with NodeBB, but will not be active by default. ## Addons diff --git a/languages/en-GB/persona.json b/languages/en-GB/persona.json index 5ad6456..e7d1945 100644 --- a/languages/en-GB/persona.json +++ b/languages/en-GB/persona.json @@ -1,4 +1,10 @@ { - "mobile-menu-side": "Switch which side each mobile menu is on", - "post-quick-reply": "Post quick reply" + "settings.title": "Theme settings", + "settings.intro": "You can customise your theme settings here. Settings are stored on a per-device basis, so you are able to have different settings on different devices (phone, tablet, desktop, etc.)", + "settings.mobile-menu-side": "Switch which side each mobile menu is on", + "settings.autoHidingNavbar": "Automatically hide the navbar on scroll", + "settings.autoHidingNavbar-xs": "Very small screens (e.g. phones in portrait mode)", + "settings.autoHidingNavbar-sm": "Smaller screens (e.g. phones, some tablets)", + "settings.autoHidingNavbar-md": "Medium sized screens (e.g. tablets in landscape mode)", + "settings.autoHidingNavbar-lg": "Larger screens (e.g. desktop computers)" } \ No newline at end of file diff --git a/languages/hu/en-GB/persona.json b/languages/hu/persona.json similarity index 100% rename from languages/hu/en-GB/persona.json rename to languages/hu/persona.json diff --git a/less/account.less b/less/account.less index 23e27b4..eb9dfe6 100644 --- a/less/account.less +++ b/less/account.less @@ -32,7 +32,7 @@ margin-bottom: 1em; background-origin: content-box; width: 100%; - top: 50px; + top: calc(var(--panel-offset) - 20px); position: absolute; left: auto; right: 0px; @@ -45,7 +45,7 @@ border: 4px solid white; border-radius: 50%; - .fab.btn-morph { + .persona-fab.btn-morph { top: 93px; right: 4px; position: absolute; @@ -77,7 +77,7 @@ &:hover { .controls { - .opacity(0.8); + opacity: 0.8; } } @@ -85,7 +85,7 @@ text-align: center; height: 200px; line-height: 200px; - .opacity(0); + opacity: 0; .transition(opacity .15s linear); cursor: pointer; pointer-events: none; @@ -317,7 +317,7 @@ background-color: lighten(@brand-primary, 10%); } - .fab { + .persona-fab { color: white; font-size: 20px; } diff --git a/less/category.less b/less/category.less index 5e2403e..0e20db4 100644 --- a/less/category.less +++ b/less/category.less @@ -113,7 +113,7 @@ border: 1px solid @btn-success-border; color: @btn-success-color; } - } + } } .fa-stack { diff --git a/less/chats.less b/less/chats.less index 916beca..741483d 100644 --- a/less/chats.less +++ b/less/chats.less @@ -1,7 +1,5 @@ // Make chats page edge-to-edge .page-user-chats { - padding-top: 50px; - #content.container { width: auto; padding: 0; @@ -12,7 +10,6 @@ } #panel { - padding-top: 0px; padding-bottom: 0px; } @@ -25,31 +22,21 @@ .chats-full, .chat-modal { display: flex; flex-wrap: nowrap; + height: calc(100vh - var(--panel-offset)); [component="chat/nav-wrapper"] { flex: 1; flex-direction: column; - box-shadow: 0 3px 9px rgba(0,0,0,.5); - + padding: 0px 15px; .chats-list { flex: 1; overflow-y: auto; margin-bottom: 0; - height: ~"calc(100% - 3em)"; + height: ~"calc(100% - 5em)"; } .chat-search { - background-color: @panel-default-heading-bg; - border-bottom: 1px solid @gray-dark; - - input { - background-color: @gray-dark; - color: @gray-lighter; - border-radius: 0; - border: none; - height: ~"calc(3em - 2px)"; - } - + padding-bottom: 15px; ul { width: 100%; } @@ -59,7 +46,6 @@ padding: 0; overflow-x: hidden; overflow-y: auto; - border-top: 1px solid @gray-lighter; li { position: relative; @@ -71,8 +57,7 @@ border-left: 1px solid; border-right: 1px solid; border-bottom: 1px solid; - border-color: #eee; - background: #fff; + border-color: @gray-lighter; i { position: relative; @@ -93,7 +78,7 @@ [component="chat/main-wrapper"] { flex: 3; - + padding-bottom: 15px; .alert { margin: 1em; } @@ -111,9 +96,7 @@ [component="chat/header"] { padding: @panel-heading-padding; - background-color: @gray-dark; - border-bottom: none; - color: @gray-lighter; + border-bottom: 1px solid @modal-header-border-color; span { font-weight: 500; @@ -121,13 +104,11 @@ .close { margin-left: 0.5em; - color: @gray-lighter; } .members { a { font-weight: 600; - color: @gray-lighter; } } @@ -163,7 +144,7 @@ [component="chat/message/remaining"] { position: absolute; - right: 5.25em; + right: 10em; z-index: 2; bottom: 0; color: @gray-light; @@ -175,11 +156,6 @@ margin-top: 10px; } -.chat-list { - margin-top: -6px; - margin-left: -1px; -} - .chats-list { padding: 0; overflow-x: hidden; @@ -193,10 +169,10 @@ } > li { + display: flex; position: relative; clear: both; list-style-type: none; - padding: 0.5em; height: 80px; .pointer; @@ -214,36 +190,29 @@ &.unread { background: lighten(@brand-primary, 35%); border-bottom: 0; - } .teaser-content { - display: block; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; font-size: 13px; opacity: 0.8; } - .room-name { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - display: block; - [component="chat/title"] { + .notification-chat-content { + .room-name { + white-space: nowrap; overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - max-width: 350px; - display: inline-block; + text-overflow: ellipsis; + display: block; + [component="chat/title"] { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + max-width: 350px; + display: inline-block; + } } } - .teaser-content, .room-name { - padding-left: 80px; - } - &.bg-primary { background: @brand-primary; border-bottom: 0; @@ -263,7 +232,8 @@ .teaser-timestamp { font-size: 10px; - margin-top: 10px; + margin-top: .5rem; + margin-right: .5rem; } a { @@ -325,15 +295,12 @@ } .main-avatar { - position: absolute; - top: 0px; - left: 0px; - .avatar { height: 8rem; width: 8rem; font-size: 4rem; border-radius: 0; + background: @gray-lighter; } } @@ -613,6 +580,13 @@ [component="chat/nav-wrapper"][data-loaded="0"] + [component="chat/main-wrapper"] { display: none; } + + .chats-full, .chat-modal { + height: calc(100vh - var(--panel-offset)); + } + [component="chat/messages"] { + width: calc(100vw); + } } [data-action="pop-out"] { diff --git a/less/groups.less b/less/groups.less index e4e3e17..8e138f3 100644 --- a/less/groups.less +++ b/less/groups.less @@ -22,14 +22,14 @@ margin-bottom: 1em; background-origin: content-box; width: 100%; - top: 50px; + top: calc(var(--panel-offset) - 20px); position: absolute; left: auto; right: 0px; &:hover { .controls { - .opacity(0.8); + opacity: 0.8; } } @@ -37,7 +37,7 @@ text-align: center; min-height: 200px; line-height: 200px; - .opacity(0); + opacity: 0; .transition(opacity .15s linear); cursor: pointer; pointer-events: none; diff --git a/less/header.less b/less/header.less index 2a793fa..fe37399 100644 --- a/less/header.less +++ b/less/header.less @@ -1,36 +1,61 @@ .header, .slideout-menu { + .notifications.dropdown, .chats.dropdown { + .dropdown-menu { + padding: 0; + } + } + .notification-list { overflow-x: hidden; overflow-y: auto; max-height: 250px; padding: 0; - color: @gray-dark; - - li.no-notifs { - text-align: center; - } li { + display: flex; + gap: 1rem; width: 400px; text-align: left; list-style-type: none; - padding: 0.5em; - clear: both; + padding: .75em 0.5em; - &.loading-text { - text-align: center; + &:hover { + background-color: @dropdown-link-hover-bg; } - a { - white-space: normal; - margin: 0; - text-overflow: ellipsis; + &.loading-text, &.no-notifs { + justify-content: center; - .text { - margin-left: 40px; - margin-right: 60px; - display: block; - min-height: 32px; + a { + color: inherit; + } + } + + .notification-chat-content { + flex: 1; + + a { + white-space: normal; + margin: 0; + text-overflow: ellipsis; + + .text { + margin-left: 40px; + margin-right: 60px; + display: block; + min-height: 32px; + } + } + } + + .notification-chat-controls { + display: flex; + flex-direction: column; + align-items: center; + gap: .5rem; + + .relTime { + font-size: 10px; } } @@ -51,9 +76,13 @@ .pointer; } } - + &.unread { - .bg-variant(@state-warning-bg); + background-color: @state-warning-bg; + + &:hover { + background-color: darken(@state-warning-bg, 5%); + } .mark-read:after { font-weight: 900; @@ -68,22 +97,24 @@ > li { .pointer; width: 500px; - padding-bottom: 1rem; + padding: 0; margin: 0; + gap: 0; + overflow-y: hidden; + + .notification-chat-content { + padding: 0.5rem; + overflow: hidden; + text-overflow: ellipsis; + } .teaser-content { white-space: nowrap; max-height: 19px; - padding-left: 90px; - padding-right: 10px; - } - - &:hover { - background: @gray-lighter; } &:not(:last-child) { - border-bottom: 1px solid @gray-lighter; + border-bottom: 1px solid @dropdown-border; } &.no_active a { @@ -173,15 +204,20 @@ } .notif-dropdown-link { - // margin-top: 1em; border-top: 1px solid rgba(163, 163, 163, 0.5); - padding: 0 5px 0 5px; - + .btn-group-justified { + table-layout: auto; + } a { - display: block; text-align: center; - padding: 0.5em 0; + padding: 0.5em 0.5em; font-weight: 600; + color: @dropdown-link-color; + + &:hover { + color: @dropdown-link-hover-color; + background: @dropdown-link-hover-bg; + } } } @@ -407,24 +443,3 @@ html[data-dir="rtl"] { text-align: right; } } - -#mobile-menu:focus i.fa-bars { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; - - &::before { - font-family: "FontAwesome"; - content: "\f110"; - } -} - -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} \ No newline at end of file diff --git a/less/mixins.less b/less/mixins.less index 8baf69d..403e0aa 100644 --- a/less/mixins.less +++ b/less/mixins.less @@ -27,13 +27,6 @@ } } -.opacity(@opacity: 1) { - -moz-opacity: @opacity; - opacity: @opacity; - -ms-filter: ~`"progid:DXImageTransform.Microsoft.Alpha(opacity=(" + "@{opacity}" * 100 + "))"`; - filter: ~`"alpha(opacity = (" + "@{opacity}" * 100 + "))"`; -} - .border-radius (@radius: 5px) { -webkit-border-radius: @radius; -moz-border-radius: @radius; @@ -65,7 +58,7 @@ margin-left: -2.5rem; } - .avatar, .timeline-badge { + .icon .avatar, .timeline-badge { // Opaque ring position: relative; z-index: 1; @@ -107,6 +100,10 @@ &+.timeline-event:before { display: none; } + + .timeline-text.timeago { + display: none; + } } } @@ -152,6 +149,8 @@ display: flex; align-items: center; justify-content: center; + flex-shrink: 0; + width: 32px; height: 32px; padding: 0; diff --git a/less/mobile.less b/less/mobile.less index fb5bcf9..ef35ef7 100644 --- a/less/mobile.less +++ b/less/mobile.less @@ -34,15 +34,9 @@ } @media (max-width: @screen-md-max) { - body { - padding-top: 0; - padding-bottom: 0; - } - #panel { background-color: inherit; min-height: 100%; - padding-top: 80px; padding-bottom: 40px; } @@ -59,20 +53,59 @@ html[data-dir="rtl"] button& { margin-left: 0; } - + &#mobile-menu { + .unread-count::after { + left: 32px; + } + } .header & .notification-icon { left: auto; right: 7px; top: 10px; - + &[component="notifications/icon"] { + right: 41px; + } &.unread-count::after { position: static; } } } + .navbar-header .navbar-search { + input[name="term"] { + width: 150px; + } - #menu { - padding-top: 100px; + padding: 4px 0px 4px 0px; + } + #menu .menu-section { + padding-top: 20px; + } + #chats-menu { + .nav-pills { + [component="user/status"] { + position: absolute; + right: 24px; + } + + background-color: #101010; + height: 50px; + li { + margin: 0; + padding: 0; + width: 33%; + text-align: center; + height: 100%; + a { + height: 100%; + padding-top: 15px; + } + &.active { + a { + background-color: #1D1F20; + } + } + } + } } .slideout-menu { @@ -141,10 +174,18 @@ white-space: nowrap; text-overflow: ellipsis; } + .teaser-timestamp { + font-size: 10px; + margin-right: 0.5rem; + margin-top: 0.5rem; + } } } .menu-section { + .notification-list-mobile li .text { + display: block; + } .chat-list, .notification-list-mobile { .user-link { display: inline; @@ -152,6 +193,15 @@ .unread { background-color: inherit; } + + .notification-chat-content { + padding-top: 10px; + padding-right: 20px; + } + + .notification-chat-controls { + display: none; + } } .chat-list .unread .room-name::after, .notification-list-mobile .unread a::after { @@ -171,7 +221,6 @@ font-style: normal; &:after { - left: 5px; top: -1px; padding: 3px 7px; background: #333; @@ -190,10 +239,6 @@ margin: 0; } - .menu-section { - margin: 25px 0; - } - .menu-section-title { text-transform: uppercase; color: #85888d; @@ -206,7 +251,7 @@ .menu-section-list { padding: 0; - margin: 10px 0; + margin: 0; list-style: none; a, button { diff --git a/less/modules/fab.less b/less/modules/fab.less index 4afcdd1..59111d1 100644 --- a/less/modules/fab.less +++ b/less/modules/fab.less @@ -1,4 +1,4 @@ -.fab { +.persona-fab { box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.156863), 0px 2px 10px 0px rgba(0, 0, 0, 0.117647); background-color: @brand-primary; @@ -11,11 +11,11 @@ width: 55.5px; } -.btn-group.open .dropdown-toggle.fab { +.btn-group.open .dropdown-toggle.persona-fab { box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.156863), 0px 2px 10px 0px rgba(0, 0, 0, 0.117647); } -.fab.btn-morph { +.persona-fab.btn-morph { padding: 0; &.heart { diff --git a/less/modules/taskbar.less b/less/modules/taskbar.less index 6b20334..dcc83be 100644 --- a/less/modules/taskbar.less +++ b/less/modules/taskbar.less @@ -6,14 +6,8 @@ .taskbar { display: none; - z-index: @zindex-popover; - left: auto; - - // Bootswatch fix - &.navbar-fixed-bottom { - z-index: @zindex-popover; - left: auto; - } + left: 15px; + right: auto; margin-top: 0; .transition(.15s ease-in opacity); @@ -35,11 +29,14 @@ } .navbar-nav { + float: unset; + display: flex; + flex-direction: column; padding-right: 15px; padding-bottom: 15px; li { - float: left; + margin-top: 1rem; &.new a { -webkit-animation-name: bounceIn; @@ -162,7 +159,6 @@ &.taskbar-composer, &.taskbar-chat { a { text-align: center; - margin-left: 15px; i { font-size: 1.8rem; diff --git a/less/modules/usercard.less b/less/modules/usercard.less index da7b72b..f75a3be 100644 --- a/less/modules/usercard.less +++ b/less/modules/usercard.less @@ -57,7 +57,7 @@ } } - .fab.btn-morph { + .persona-fab.btn-morph { top: 75px; right: 15px; position: absolute; diff --git a/less/search.less b/less/search.less index 835c0b3..925af0d 100644 --- a/less/search.less +++ b/less/search.less @@ -64,7 +64,6 @@ font-weight: 400; line-height: 1.42857143; white-space: nowrap; - color: @gray-dark; } } .quick-search-title { @@ -74,10 +73,18 @@ .snippet { word-break: break-word; white-space: normal; + font-size: initial; } } } +@media (max-width: @screen-xs-max) { + .quick-search-container { + left: 0px; + right: 0px; + } +} + .quick-search-results, .search-results { .post-info { font-size: 12px; diff --git a/less/style.less b/less/style.less index 73930d1..65a84f5 100644 --- a/less/style.less +++ b/less/style.less @@ -4,20 +4,13 @@ html { } body { - @media (min-width: 979px) - { - padding-top: 70px; - } - - @media (max-width: 979px) - { - padding-top: 70px; - padding-bottom: 50px; - } - min-height: 100%; } +#panel { + padding-top: var(--panel-offset); +} + @media (max-width: @screen-xs-max) { .slideout-panel { min-height: 100vh; @@ -273,6 +266,10 @@ a.permalink { } } +.deco-none, .deco-none:link, .deco-none:hover { + color: inherit; + text-decoration: inherit; +} .disabled a { pointer-events: none; diff --git a/less/tags.less b/less/tags.less index 95a8622..164a71e 100644 --- a/less/tags.less +++ b/less/tags.less @@ -30,7 +30,8 @@ .tag { text-transform: uppercase; font-size: 10px; - background: lighten(@gray-lighter, 2.5%); + background: #e9ecef; + color: #7a8288; padding: 5px; white-space: nowrap; } diff --git a/less/topic.less b/less/topic.less index cbc2af0..873ee5e 100644 --- a/less/topic.less +++ b/less/topic.less @@ -41,7 +41,7 @@ } .topic-header { position: sticky; - top: @navbar-height; + top: calc(var(--panel-offset) - 20px); background-color: @body-bg; z-index: @zindex-navbar; margin-left: -15px; @@ -163,20 +163,18 @@ display: inline-block; padding: 1rem; - &:first-child { - padding-right: 0.5rem; - } - - &:last-child { - padding-left: 0.5rem; - } - &:focus { text-decoration: none; } } - [component="post/upvote"].upvoted, [component="post/downvote"].downvoted { + [component="post/upvote"].upvoted i::before { + content: @fa-var-chevron-circle-up; + color: @brand-primary; + } + + [component="post/downvote"].downvoted i::before { + content: @fa-var-chevron-circle-down; color: @brand-primary; } @@ -188,7 +186,6 @@ [component="post/parent"] { border: 0; font-size: 10px; - background-color: #f0f0f0; } .threaded-replies { @@ -374,6 +371,7 @@ } .quick-reply { + position: relative; .icon { position: relative; border-radius: 50%; @@ -421,7 +419,7 @@ .topic { &.deleted { - .opacity(0.3); + opacity: 0.3; .votes { display: none; @@ -446,7 +444,7 @@ &.deleted { > .content { - .opacity(0.3); + opacity: 0.3; } .votes { @@ -661,6 +659,16 @@ z-index: 1; } +.selection-tooltip-container { + position: absolute; + padding: 5px; + border: 1px solid @well-border; + background-color: @well-bg; + border-radius: 3px; + margin: 10px 0px 0px 0px; + z-index: 1; +} + @media screen and (min-width: @screen-sm-min) { .fork-thread-card { max-width: 33%; diff --git a/lib/controllers.js b/lib/controllers.js new file mode 100644 index 0000000..338bb7a --- /dev/null +++ b/lib/controllers.js @@ -0,0 +1,22 @@ +'use strict'; + +const accountHelpers = require.main.require('./src/controllers/accounts/helpers'); +const helpers = require.main.require('./src/controllers/helpers'); + +const Controllers = module.exports; + +Controllers.renderAdminPage = (req, res) => { + res.render('admin/plugins/persona', {}); +}; + +Controllers.renderThemeSettings = async (req, res, next) => { + const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); + if (!userData) { + return next(); + } + + userData.title = '[[persona:settings.title]]'; + userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: `/user/${userData.userslug}` }, { text: '[[persona:settings.title]]' }]); + + res.render('account/theme', userData); +}; diff --git a/library.js b/library.js index c5e7473..6b51e72 100644 --- a/library.js +++ b/library.js @@ -1,43 +1,67 @@ 'use strict'; -var meta = require.main.require('./src/meta'); -var user = require.main.require('./src/user'); +const meta = require.main.require('./src/meta'); +const user = require.main.require('./src/user'); +const translator = require.main.require('./src/translator'); -var library = {}; +const controllers = require('./lib/controllers'); -library.init = function(params, callback) { - var app = params.router; - var middleware = params.middleware; +const library = module.exports; - app.get('/admin/plugins/persona', middleware.admin.buildHeader, renderAdmin); - app.get('/api/admin/plugins/persona', renderAdmin); +library.init = async function (params) { + const { router, middleware } = params; + const routeHelpers = require.main.require('./src/routes/helpers'); + routeHelpers.setupAdminPageRoute(router, '/admin/plugins/persona', [], controllers.renderAdminPage); - callback(); + routeHelpers.setupPageRoute(router, '/user/:userslug/theme', [ + middleware.exposeUid, + middleware.ensureLoggedIn, + middleware.canViewUsers, + middleware.checkAccountPermissions, + ], controllers.renderThemeSettings); }; -library.addAdminNavigation = function(header, callback) { +library.addAdminNavigation = async function (header) { header.plugins.push({ route: '/plugins/persona', icon: 'fa-paint-brush', - name: 'Persona Theme' + name: 'Persona Theme', }); + return header; +}; - callback(null, header); +library.addProfileItem = async (data) => { + data.links.push({ + id: 'theme', + route: 'theme', + icon: 'fa-paint-brush', + name: await translator.translate('[[persona:settings.title]]'), + visibility: { + self: true, + other: false, + moderator: false, + globalMod: false, + admin: false, + }, + }); + + return data; }; -library.defineWidgetAreas = function(areas, callback) { +library.defineWidgetAreas = async function (areas) { const locations = ['header', 'sidebar', 'footer']; const templates = [ 'categories.tpl', 'category.tpl', 'topic.tpl', 'users.tpl', - 'unread.tpl', 'recent.tpl', 'popular.tpl', 'top.tpl', 'tags.tpl', 'tag.tpl' + 'unread.tpl', 'recent.tpl', 'popular.tpl', 'top.tpl', 'tags.tpl', 'tag.tpl', + 'login.tpl', 'register.tpl', ]; function capitalizeFirst(str) { - return str.charAt(0).toUpperCase() + str.slice(1) + return str.charAt(0).toUpperCase() + str.slice(1); } - templates.forEach(template => { - locations.forEach(location => { + templates.forEach((template) => { + locations.forEach((location) => { areas.push({ - name: capitalizeFirst(template.split('.')[0]) + ' ' + capitalizeFirst(location), + name: `${capitalizeFirst(template.split('.')[0])} ${capitalizeFirst(location)}`, template: template, location: location, }); @@ -46,16 +70,25 @@ library.defineWidgetAreas = function(areas, callback) { areas = areas.concat([ { - name: "Account Header", - template: "account/profile.tpl", - location: "header" + name: 'Main post header', + template: 'topic.tpl', + location: 'mainpost-header', + }, + { + name: 'Main post footer', + template: 'topic.tpl', + location: 'mainpost-footer', + }, + { + name: 'Account Header', + template: 'account/profile.tpl', + location: 'header', }, ]); - - callback(null, areas); + return areas; }; -library.getThemeConfig = async function(config) { +library.getThemeConfig = async function (config) { const settings = await meta.settings.get('persona'); config.hideSubCategories = settings.hideSubCategories === 'on'; config.hideCategoryLastPost = settings.hideCategoryLastPost === 'on'; @@ -63,23 +96,23 @@ library.getThemeConfig = async function(config) { return config; }; -function renderAdmin(req, res, next) { - res.render('admin/plugins/persona', {}); -} - library.addUserToTopic = async function (hookData) { - if (hookData.req.user) { - const userData = await user.getUserData(hookData.req.user.uid); - hookData.templateData.loggedInUser = userData; - } else { - hookData.templateData.loggedInUser = { - uid: 0, - username: '[[global:guest]]', - picture: user.getDefaultAvatar(), - 'icon:text': '?', - 'icon:bgColor': '#aaa', - }; + const settings = await meta.settings.get('persona'); + if (settings.enableQuickReply === 'on') { + if (hookData.req.user) { + const userData = await user.getUserData(hookData.req.user.uid); + hookData.templateData.loggedInUser = userData; + } else { + hookData.templateData.loggedInUser = { + uid: 0, + username: '[[global:guest]]', + picture: user.getDefaultAvatar(), + 'icon:text': '?', + 'icon:bgColor': '#aaa', + }; + } } + return hookData; }; diff --git a/package.json b/package.json index a5ce820..33d158d 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,17 @@ { "name": "nodebb-theme-persona", - "version": "11.2.2", + "version": "12.1.15", "nbbpm": { - "compatibility": "^1.18.0" + "compatibility": "^2.0.0" }, "description": "Persona theme for NodeBB", "main": "library.js", "repository": { "type": "git", - "url": "https://github.com/psychobunny/nodebb-theme-persona" + "url": "https://github.com/NodeBB/nodebb-theme-persona" + }, + "scripts": { + "lint": "eslint ." }, "keywords": [ "nodebb", @@ -20,26 +23,31 @@ "contributors": [ { "name": "Andrew Rodrigues", - "email": "andrew@designcreateplay.com", + "email": "andrew@nodebb.org", "url": "https://github.com/psychobunny" }, { "name": "Julian Lam", - "email": "julian@designcreateplay.com", + "email": "julian@nodebb.org", "url": "https://github.com/julianlam" }, { "name": "Barış Soner Uşaklı", - "email": "baris@designcreateplay.com", + "email": "baris@nodebb.org", "url": "https://github.com/barisusakli" } ], "license": "BSD-2-Clause", "bugs": { - "url": "https://github.com/psychobunny/nodebb-theme-persona/issues" + "url": "https://github.com/NodeBB/nodebb-theme-persona/issues" }, "dependencies": { "pulling": "^2.0.0", "striptags": "^3.2.0" + }, + "devDependencies": { + "eslint": "^7.32.0", + "eslint-config-nodebb": "^0.0.2", + "eslint-plugin-import": "^2.24.2" } } diff --git a/plugin.json b/plugin.json index 9a1a01b..4716e49 100644 --- a/plugin.json +++ b/plugin.json @@ -5,18 +5,17 @@ { "hook": "filter:config.get", "method": "getThemeConfig" }, { "hook": "static:app.load", "method": "init" }, { "hook": "filter:admin.header.build", "method": "addAdminNavigation" }, + { "hook": "filter:user.profileMenu", "method": "addProfileItem" }, { "hook": "filter:topic.build", "method": "addUserToTopic" } ], "scripts": [ - "public/persona.js", "public/modules/autohidingnavbar.js", - "public/modules/quickreply.js" + "public/persona.js" ], "modules": { - "pulling.js": "node_modules/pulling/build/pulling-drawer.js" + "../admin/plugins/persona.js": "public/admin.js", + "persona/quickreply.js": "public/modules/quickreply.js", + "../client/account/theme.js": "public/settings.js" }, - "acpScripts": [ - "public/admin.js" - ], "languages": "languages" } \ No newline at end of file diff --git a/public/.eslintrc b/public/.eslintrc new file mode 100644 index 0000000..bf4af75 --- /dev/null +++ b/public/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "nodebb/public" +} \ No newline at end of file diff --git a/public/admin.js b/public/admin.js index 53fd658..0a9aa8a 100644 --- a/public/admin.js +++ b/public/admin.js @@ -1,24 +1,15 @@ 'use strict'; -/* globals $, app */ - -define('admin/plugins/persona', ['settings'], function(Settings) { +define('admin/plugins/persona', ['settings'], function (Settings) { var ACP = {}; - ACP.init = function() { + ACP.init = function () { Settings.load('persona', $('.persona-settings')); - $('#save').on('click', function() { - Settings.save('persona', $('.persona-settings'), function() { - app.alert({ - type: 'success', - alert_id: 'persona-saved', - title: 'Settings Saved', - message: 'Persona settings saved' - }); - }); + $('#save').on('click', function () { + Settings.save('persona', $('.persona-settings')); }); }; return ACP; -}); \ No newline at end of file +}); diff --git a/public/modules/quickreply.js b/public/modules/quickreply.js index 185c999..998433d 100644 --- a/public/modules/quickreply.js +++ b/public/modules/quickreply.js @@ -1,14 +1,15 @@ -"use strict"; - -/*globals $, app, ajaxify, socket*/ +'use strict'; define('persona/quickreply', [ - 'components', 'composer/autocomplete', 'api' -], function(components, autocomplete, api) { + 'components', 'composer', 'composer/autocomplete', 'api', + 'alerts', 'uploadHelpers', 'mousetrap', +], function ( + components, composer, autocomplete, api, + alerts, uploadHelpers, mousetrap +) { var QuickReply = {}; - QuickReply.init = function() { - + QuickReply.init = function () { var element = components.get('topic/quickreply/text'); var data = { element: element, @@ -16,40 +17,85 @@ define('persona/quickreply', [ options: { style: { 'z-index': 100, - } + }, // listPosition: function(position) { // this.$el.css(this._applyPlacement(position)); // this.$el.css('position', 'absolute'); // return this; // } - } + }, }; $(window).trigger('composer:autocomplete:init', data); - autocomplete._active['persona_qr'] = autocomplete.setup(data); + autocomplete._active.persona_qr = autocomplete.setup(data); // data.element.textcomplete(data.strategies, data.options); // $('.textcomplete-wrapper').css('height', '100%').find('textarea').css('height', '100%'); - components.get('topic/quickreply/button').on('click', function(e) { + mousetrap.bind('ctrl+return', (e) => { + if (e.target === element.get(0)) { + components.get('topic/quickreply/button').get(0).click(); + } + }); + + uploadHelpers.init({ + dragDropAreaEl: $('[component="topic/quickreply/container"] .quickreply-message'), + pasteEl: element, + uploadFormEl: $('[component="topic/quickreply/upload"]'), + inputEl: element, + route: '/api/post/upload', + callback: function (uploads) { + let text = element.val(); + uploads.forEach((upload) => { + text = text + (text ? '\n' : '') + (upload.isImage ? '!' : '') + `[${upload.filename}](${upload.url})`; + }); + element.val(text); + }, + }); + + var ready = true; + components.get('topic/quickreply/button').on('click', function (e) { e.preventDefault(); + if (!ready) { + return; + } + var replyMsg = components.get('topic/quickreply/text').val(); var replyData = { tid: ajaxify.data.tid, handle: undefined, - content: replyMsg + content: replyMsg, }; + + ready = false; api.post(`/topics/${ajaxify.data.tid}`, replyData, function (err, data) { + ready = true; if (err) { - return app.alertError(err.message); + return alerts.error(err); } if (data && data.queued) { - app.alertSuccess(data.message); + alerts.alert({ + type: 'success', + title: '[[global:alert.success]]', + message: data.message, + timeout: 10000, + clickfn: function () { + ajaxify.go(`/post-queue/${data.id}`); + }, + }); } components.get('topic/quickreply/text').val(''); - autocomplete._active['persona_qr'].hide(); + autocomplete._active.persona_qr.hide(); }); }); + + components.get('topic/quickreply/expand').on('click', (e) => { + e.preventDefault(); + + const textEl = components.get('topic/quickreply/text'); + composer.newReply(ajaxify.data.tid, undefined, ajaxify.data.title, utils.escapeHTML(textEl.val())); + textEl.val(''); + }); }; return QuickReply; diff --git a/public/persona.js b/public/persona.js index 0e24b3a..94ccf2d 100644 --- a/public/persona.js +++ b/public/persona.js @@ -1,35 +1,36 @@ -"use strict"; - -/*globals ajaxify, config, utils, app, socket, window, document, $*/ +'use strict'; $(document).ready(function () { setupNProgress(); + setupTaskbar(); setupEditedByIcon(); + setupMobileMenu(); setupQuickReply(); configureNavbarHiding(); - fixHeaderPadding(); + updatePanelOffset(); $(window).on('resize', utils.debounce(configureNavbarHiding, 200)); - $(window).on('resize', fixHeaderPadding); - - $(window).on('action:app.loggedIn', function () { - setupMobileMenu(); - }); - - $(window).on('action:app.load', function () { - setupTaskbar(); - setupMobileMenu(); - }); - - function fixHeaderPadding() { - var env = utils.findBootstrapEnvironment(); - if(!$('#header-menu').hasClass('hidden')){ - if (env === 'sm' || env === 'xs' || env === 'md') { - $('#panel').css('padding-top', $('#header-menu').outerHeight(true)); - } else { - $('#panel').css('padding-top', $('#header-menu').outerHeight(true) - 70); - } + $(window).on('resize', updatePanelOffset); + + function updatePanelOffset() { + const headerEl = document.getElementById('header-menu'); + + if (!headerEl) { + console.warn('[persona/updatePanelOffset] Could not find #header-menu, panel offset unchanged.'); + return; } + + const headerRect = headerEl.getBoundingClientRect(); + const headerStyle = window.getComputedStyle(headerEl); + + let offset = + headerRect.y + headerRect.height + + (parseInt(headerStyle.marginTop, 10) || 0) + + (parseInt(headerStyle.marginBottom, 10) || 0); + + offset = Math.max(0, offset); + document.documentElement.style.setProperty('--panel-offset', `${offset}px`); + localStorage.setItem('panelOffset', offset); } var lastBSEnv = ''; @@ -37,42 +38,65 @@ $(document).ready(function () { if (!$.fn.autoHidingNavbar) { return; } - var env = utils.findBootstrapEnvironment(); - // if env didn't change don't destroy and recreate - if (env === lastBSEnv) { - return; - } - lastBSEnv = env; - var navbarEl = $(".navbar-fixed-top"); - navbarEl.autoHidingNavbar('destroy').removeData('plugin_autoHidingNavbar'); - navbarEl.css('top', ''); - - if (env === 'xs' || env === 'sm') { - navbarEl.autoHidingNavbar({ - showOnBottom: false, - }); - } - function fixTopCss(topValue) { - if (ajaxify.data.template.topic) { - $('.topic .topic-header').css({top: topValue }); - } else { - var topicListHeader = $('.topic-list-header'); - if (topicListHeader.length) { - topicListHeader.css({ top: topValue }); - } + require(['hooks', 'storage'], (hooks, Storage) => { + let preference = ['xs', 'sm']; + + try { + preference = JSON.parse(Storage.getItem('persona:navbar:autohide')) || preference; + } catch (e) { + console.warn('[persona/settings] Unable to parse value for navbar autohiding'); } - } + var env = utils.findBootstrapEnvironment(); + // if env didn't change don't destroy and recreate + if (env === lastBSEnv) { + return; + } + lastBSEnv = env; + var navbarEl = $('.navbar-fixed-top'); + navbarEl.autoHidingNavbar('destroy').removeData('plugin_autoHidingNavbar'); + navbarEl.css('top', ''); + + hooks + .on('filter:navigator.scroll', (data) => { + navbarEl.autoHidingNavbar('setDisableAutohide', true); + return data; + }) + .on('action:navigator.scrolled', () => { + navbarEl.autoHidingNavbar('setDisableAutohide', false); + }); - navbarEl.off('show.autoHidingNavbar') - .on('show.autoHidingNavbar', function() { - fixTopCss(''); - }); + hooks.fire('filter:persona.configureNavbarHiding', { + resizeEnvs: preference, + }).then(({ resizeEnvs }) => { + if (resizeEnvs.includes(env)) { + navbarEl.autoHidingNavbar({ + showOnBottom: false, + }); + } + + function fixTopCss(topValue) { + if (ajaxify.data.template.topic) { + $('.topic .topic-header').css({ top: topValue }); + } else { + var topicListHeader = $('.topic-list-header'); + if (topicListHeader.length) { + topicListHeader.css({ top: topValue }); + } + } + } + + navbarEl.off('show.autoHidingNavbar') + .on('show.autoHidingNavbar', function () { + fixTopCss(''); + }); - navbarEl.off('hide.autoHidingNavbar') - .on('hide.autoHidingNavbar', function() { - fixTopCss('0px'); + navbarEl.off('hide.autoHidingNavbar') + .on('hide.autoHidingNavbar', function () { + fixTopCss('0px'); + }); }); + }); } function setupNProgress() { @@ -155,7 +179,8 @@ $(document).ready(function () { function setupEditedByIcon() { function activateEditedTooltips() { $('[data-pid] [component="post/editor"]').each(function () { - var el = $(this), icon; + var el = $(this); + var icon; if (!el.attr('data-editor')) { return; @@ -184,14 +209,14 @@ $(document).ready(function () { return; } - require(['pulling', 'storage'], function (Pulling, Storage) { + require(['pulling/build/pulling-drawer', 'storage', 'alerts', 'search'], function (Pulling, Storage, alerts, search) { if (!Pulling) { return; } // initialization - var chatMenuVisible = !config.disableChat && app.user && parseInt(app.user.uid, 10); + var chatMenuVisible = app.user && parseInt(app.user.uid, 10); var swapped = !!Storage.getItem('persona:menus:legacy-layout'); var margin = window.innerWidth; @@ -244,8 +269,9 @@ $(document).ready(function () { $(window).on('resize action:ajaxify.start', function () { navSlideout.close(); - if (chatsSlideout) { chatsSlideout.close(); } - $('.account .cover').css('top', $('[component="navbar"]').height()); + if (chatsSlideout) { + chatsSlideout.close(); + } }); navSlideout @@ -272,14 +298,6 @@ $(document).ready(function () { navSlideout.enable().toggle(); }); - function loadNotifications() { - require(['notifications'], function (notifications) { - notifications.loadNotifications($('#menu [data-section="notifications"] ul')); - }); - } - - navSlideout.on('opened', loadNotifications); - if (chatMenuVisible) { navSlideout.on('beforeopen', function () { chatsSlideout.close(); @@ -289,22 +307,29 @@ $(document).ready(function () { }); } - $('#menu [data-section="navigation"] ul').html($('#main-nav').html() + ($('#search-menu').html() || '') + ($('#logged-out-menu').html() || '')); + $('#menu [data-section="navigation"] ul').html( + $('#main-nav').html() + + ($('#logged-out-menu').html() || '') + ); - $('#user-control-list').children().clone(true, true).appendTo($('#menu [data-section="profile"] ul')); + $('#user-control-list').children().clone(true, true).appendTo($('#chats-menu [data-section="profile"] ul')); socket.on('event:user_status_change', function (data) { if (parseInt(data.uid, 10) === app.user.uid) { - app.updateUserStatus($('#menu [component="user/status"]'), data.status); + app.updateUserStatus($('#chats-menu [component="user/status"]'), data.status); navSlideout.close(); } }); - // right slideout chats menu + // right slideout notifications & chats menu - function loadChats() { - require(['chat'], function (chat) { - chat.loadChatsDropdown($('#chats-menu .chat-list')); + function loadNotificationsAndChats() { + require(['notifications', 'chat'], function (notifications, chat) { + const notifList = $('#chats-menu [data-section="notifications"] ul'); + notifications.loadNotifications(notifList, function () { + notifList.find('.deco-none').removeClass('deco-none'); + chat.loadChatsDropdown($('#chats-menu .chat-list')); + }); }); } @@ -318,7 +343,7 @@ $(document).ready(function () { }); chatsSlideout - .on('opened', loadChats) + .on('opened', loadNotificationsAndChats) .on('beforeopen', function () { navSlideout.close().disable(); }) @@ -327,31 +352,35 @@ $(document).ready(function () { }); } - // add a checkbox in the user settings page - // so users can swap the sides the menus appear on - - function setupSetting() { - if (ajaxify.data.template['account/settings'] && !document.getElementById('persona:menus:legacy-layout')) { - require(['translator'], function (translator) { - translator.translate('[[persona:mobile-menu-side]]', function (translated) { - $('
') - .appendTo('#content .account > .row > div:first-child') - .find('input') - .prop('checked', Storage.getItem('persona:menus:legacy-layout', 'true')) - .change(function (e) { - if (e.target.checked) { - Storage.setItem('persona:menus:legacy-layout', 'true'); - } else { - Storage.removeItem('persona:menus:legacy-layout'); - } - }); - }); - }) + const searchInputEl = $('.navbar-header .navbar-search input[name="term"]'); + const searchButton = $('.navbar-header .navbar-search button[type="button"]'); + searchButton.off('click').on('click', function () { + if (!config.loggedIn && !app.user.privileges['search:content']) { + alerts.alert({ + message: '[[error:search-requires-login]]', + timeout: 3000, + }); + ajaxify.go('login'); + return false; } - } - $(window).on('action:ajaxify.end', setupSetting); - setupSetting(); + searchButton.addClass('hidden'); + searchInputEl.removeClass('hidden').focus(); + return false; + }); + searchInputEl.on('blur', function () { + searchInputEl.addClass('hidden'); + searchButton.removeClass('hidden'); + }); + search.enableQuickSearch({ + searchElements: { + inputEl: searchInputEl, + resultEl: $('.navbar-header .navbar-search .quick-search-container'), + }, + searchOptions: { + in: config.searchDefaultInQuick, + }, + }); }); } @@ -436,13 +465,13 @@ $(document).ready(function () { } function setupFavouriteMorph(parent, uid, username) { - require(['api'], function (api) { + require(['api', 'alerts'], function (api, alerts) { parent.find('.btn-morph').click(function (ev) { var type = $(this).hasClass('plus') ? 'follow' : 'unfollow'; var method = $(this).hasClass('plus') ? 'put' : 'del'; api[method]('/users/' + uid + '/follow').then(() => { - app.alertSuccess('[[global:alert.' + type + ', ' + username + ']]'); + alerts.success('[[global:alert.' + type + ', ' + username + ']]'); }); $(this).toggleClass('plus').toggleClass('heart'); @@ -452,9 +481,9 @@ $(document).ready(function () { $(this).prepend(''); } - var drop = $(this).find('b.drop').removeClass('animate'), - x = ev.pageX - drop.width() / 2 - $(this).offset().left, - y = ev.pageY - drop.height() / 2 - $(this).offset().top; + var drop = $(this).find('b.drop').removeClass('animate'); + var x = ev.pageX - (drop.width() / 2) - $(this).offset().left; + var y = ev.pageY - (drop.height() / 2) - $(this).offset().top; drop.css({ top: y + 'px', left: x + 'px' }).addClass('animate'); }); diff --git a/public/settings.js b/public/settings.js new file mode 100644 index 0000000..5e2359a --- /dev/null +++ b/public/settings.js @@ -0,0 +1,53 @@ +'use strict'; + +define('forum/account/theme', ['forum/account/header', 'storage', 'settings', 'alerts'], function (header, Storage, settings, alerts) { + const Theme = {}; + + Theme.init = () => { + header.init(); + Theme.setupForm(); + }; + + Theme.setupForm = () => { + const saveEl = document.getElementById('save'); + const formEl = document.getElementById('theme-settings'); + const [sidebarSwapped, autohideNavbarEnvs] = [ + !!Storage.getItem('persona:menus:legacy-layout'), + Storage.getItem('persona:navbar:autohide'), + ]; + + document.getElementById('persona:menus:legacy-layout').checked = sidebarSwapped; + try { + const parsed = JSON.parse(autohideNavbarEnvs) || ['xs', 'sm']; + parsed.forEach((env) => { + const optionEl = document.getElementById('persona:navbar:autohide').querySelector(`option[value="${env}"]`); + optionEl.selected = true; + }); + } catch (e) { + console.warn(e); + } + + if (saveEl) { + saveEl.addEventListener('click', () => { + const themeSettings = settings.helper.serializeForm($(formEl)); + Object.keys(themeSettings).forEach((key) => { + if (key === 'persona:menus:legacy-layout') { + if (themeSettings[key] === 'on') { + Storage.setItem('persona:menus:legacy-layout', 'true'); + } else { + Storage.removeItem('persona:menus:legacy-layout'); + } + + return; + } + + Storage.setItem(key, themeSettings[key]); + }); + + alerts.success('[[success:settings-saved]]'); + }); + } + }; + + return Theme; +}); diff --git a/templates/account/controversial.tpl b/templates/account/controversial.tpl new file mode 100644 index 0000000..21b7d5b --- /dev/null +++ b/templates/account/controversial.tpl @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/account/edit/email.tpl b/templates/account/edit/email.tpl deleted file mode 100644 index f423637..0000000 --- a/templates/account/edit/email.tpl +++ /dev/null @@ -1,30 +0,0 @@ -
- - -
-
- -
- -
-
- - - - -
- -
- disabled> -
-
- - - - -
-
- -
-
-
diff --git a/templates/account/info.tpl b/templates/account/info.tpl index c3fc74a..fa0efba 100644 --- a/templates/account/info.tpl +++ b/templates/account/info.tpl @@ -146,6 +146,49 @@ + +
+
+

+ [[user:info.mute-history]] + + {{{ if !muted }}} + {{{ if !isSelf }}} + + {{{ end }}} + {{{ else }}} + {{{ if !isSelf }}} + + {{{ end }}} + {{{ end }}} +

+
+
+ {{{ if history.mutes.length }}} + + {{{ else }}} +
[[user:info.no-mute-history]]
+ {{{ end }}} +
+
+
diff --git a/templates/account/settings.tpl b/templates/account/settings.tpl index db576ba..454b907 100644 --- a/templates/account/settings.tpl +++ b/templates/account/settings.tpl @@ -18,8 +18,8 @@

[[user:select-homepage]]

- - {{{each homePageRoutes}}} diff --git a/templates/account/theme.tpl b/templates/account/theme.tpl new file mode 100644 index 0000000..0205e42 --- /dev/null +++ b/templates/account/theme.tpl @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/templates/chat.tpl b/templates/chat.tpl index 3242481..607ea24 100644 --- a/templates/chat.tpl +++ b/templates/chat.tpl @@ -6,30 +6,7 @@ - +

{roomName}{usernames}

@@ -42,10 +19,15 @@
+ {maximumChatMessageLength} +
+ +
+
[[topic:composer.drag_and_drop_images]]
\ No newline at end of file diff --git a/templates/chats.tpl b/templates/chats.tpl index 01906cf..02f727f 100644 --- a/templates/chats.tpl +++ b/templates/chats.tpl @@ -1,7 +1,7 @@
\ No newline at end of file diff --git a/templates/flags/detail.tpl b/templates/flags/detail.tpl index abb800b..f29b1ef 100644 --- a/templates/flags/detail.tpl +++ b/templates/flags/detail.tpl @@ -60,10 +60,9 @@

[[flags:state]]

@@ -147,7 +146,14 @@
  • [[flags:start-new-chat]]
  • {{{ end }}} - {{{ if privileges.ban }}}
  • [[user:ban_account]]
  • {{{ end }}} + {{{ if privileges.ban }}} +
  • [[user:ban_account]]
  • +
  • [[user:unban_account]]
  • + {{{ end }}} + {{{ if privileges.mute}}} +
  • [[user:mute_account]]
  • +
  • [[user:unmute_account]]
  • + {{{ end }}} {{{ if privileges.admin:users }}}
  • [[user:delete_account_as_admin]]
  • [[user:delete_content]]
  • diff --git a/templates/footer.tpl b/templates/footer.tpl index 2948966..bd57096 100644 --- a/templates/footer.tpl +++ b/templates/footer.tpl @@ -1,14 +1,6 @@
    - -
    @@ -17,10 +9,6 @@
    -
    - -
    - diff --git a/templates/header.tpl b/templates/header.tpl index 7d5b7c3..76db54c 100644 --- a/templates/header.tpl +++ b/templates/header.tpl @@ -1,5 +1,5 @@ - + {browserTitle} {{{each metaTags}}}{function.buildMetaTag}{{{end}}} @@ -11,6 +11,7 @@ var app = { user: JSON.parse('{{userJSON}}') }; + document.documentElement.style.setProperty('--panel-offset', `${localStorage.getItem('panelOffset') || 0}px`); {{{if useCustomHTML}}} diff --git a/templates/login.tpl b/templates/login.tpl index 9b01316..1ba0a0a 100644 --- a/templates/login.tpl +++ b/templates/login.tpl @@ -1,75 +1,93 @@ - -
    - -
    - diff --git a/templates/partials/topic/post-menu-list.tpl b/templates/partials/topic/post-menu-list.tpl index e6e2b6a..3a7a552 100644 --- a/templates/partials/topic/post-menu-list.tpl +++ b/templates/partials/topic/post-menu-list.tpl @@ -72,7 +72,7 @@ - + {{{ if config.loggedIn }}}
  • @@ -83,7 +83,13 @@ {posts.bookmarks} 
  • - + {{{ end }}} + +
  • + + [[topic:copy-permalink]] + +
  • diff --git a/templates/partials/topic/post-menu.tpl b/templates/partials/topic/post-menu.tpl index 4f652d4..7b54cb3 100644 --- a/templates/partials/topic/post-menu.tpl +++ b/templates/partials/topic/post-menu.tpl @@ -1,4 +1,4 @@ - + diff --git a/templates/partials/topic/post.tpl b/templates/partials/topic/post.tpl index 2d744ff..e10d929 100644 --- a/templates/partials/topic/post.tpl +++ b/templates/partials/topic/post.tpl @@ -1,3 +1,11 @@ +{{{ if (!./index && widgets.mainpost-header.length) }}} +
    + {{{ each widgets.mainpost-header }}} + {widgets.mainpost-header.html} + {{{ end }}} +
    +{{{ end }}} +
    @@ -76,7 +84,8 @@ {{{ end }}} - + + [[topic:reply]] [[topic:quote]] @@ -102,4 +111,11 @@
    -
    \ No newline at end of file +
    +{{{ if (!./index && widgets.mainpost-footer.length) }}} +
    + {{{ each widgets.mainpost-footer }}} + {widgets.mainpost-footer.html} + {{{ end }}} +
    +{{{ end }}} \ No newline at end of file diff --git a/templates/partials/topic/quickreply.tpl b/templates/partials/topic/quickreply.tpl index 013b218..147e319 100644 --- a/templates/partials/topic/quickreply.tpl +++ b/templates/partials/topic/quickreply.tpl @@ -1,5 +1,5 @@ -
    +
    diff --git a/templates/partials/topic/reactions.tpl b/templates/partials/topic/reactions.tpl new file mode 100644 index 0000000..c8f127e --- /dev/null +++ b/templates/partials/topic/reactions.tpl @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/partials/topic/selection-tooltip.tpl b/templates/partials/topic/selection-tooltip.tpl new file mode 100644 index 0000000..56e9f55 --- /dev/null +++ b/templates/partials/topic/selection-tooltip.tpl @@ -0,0 +1,3 @@ +
    + +
    \ No newline at end of file diff --git a/templates/partials/topic/tags.tpl b/templates/partials/topic/tags.tpl index eb39bf8..7da55c2 100644 --- a/templates/partials/topic/tags.tpl +++ b/templates/partials/topic/tags.tpl @@ -1,5 +1,5 @@ {{{each tags}}} -
    - {tags.valueEscaped} + + {tags.valueEscaped} {{{end}}} \ No newline at end of file diff --git a/templates/partials/topics_list.tpl b/templates/partials/topics_list.tpl index 49d383f..62bd825 100644 --- a/templates/partials/topics_list.tpl +++ b/templates/partials/topics_list.tpl @@ -1,9 +1,11 @@
      - {{{each topics}}}
    • > + + + + -
      @@ -38,7 +40,7 @@ -
      + {topics.title}
      {topics.title}
      @@ -49,14 +51,14 @@
      - + {{{ if topics.tags.length }}} - + {{{ end }}} diff --git a/templates/partials/users_list.tpl b/templates/partials/users_list.tpl index b65d311..bdc0213 100644 --- a/templates/partials/users_list.tpl +++ b/templates/partials/users_list.tpl @@ -9,28 +9,34 @@
      + +
      + +
      + + -
      +
      -
      +
      {users.reputation}
      -
      +
      {users.postcount}
      -
      + diff --git a/templates/post-queue.tpl b/templates/post-queue.tpl index 947510f..21fe75d 100644 --- a/templates/post-queue.tpl +++ b/templates/post-queue.tpl @@ -1,20 +1,49 @@ + +{{{ if !singlePost }}} +
      +{{{ end }}} +
      - {{{ if !posts.length }}} -

      - [[post-queue:description, {config.relative_path}/admin/settings/post#post-queue]] -

      + {{{ if (!posts.length && isAdmin) }}} + {{{ if !singlePost }}} +
      +

      [[post-queue:no-queued-posts]]

      + {{{ if !enabled }}}

      [[post-queue:enabling-help, {config.relative_path}/admin/settings/post#post-queue]]

      {{{ end }}} +
      + {{{ else }}} +
      +

      [[post-queue:no-single-post]]

      +

      [[post-queue:back-to-list]]

      +
      + {{{ end }}} {{{ end }}} {{{ each posts }}}
      + {{{ if !singlePost }}} + + {{{ end }}} {{{ if posts.data.tid }}}[[post-queue:reply]]{{{ else }}}[[post-queue:topic]]{{{ end }}}
      @@ -62,9 +91,14 @@
      diff --git a/templates/register.tpl b/templates/register.tpl index b2af3ce..a04dce4 100644 --- a/templates/register.tpl +++ b/templates/register.tpl @@ -1,71 +1,87 @@ - +
      + {{{each widgets.header}}} + {{widgets.header.html}} + {{{end}}} +
      -
      -
      -
      - [[error:registration-error]] -

      {error}

      -
      -
      -
      - -
      - - - [[register:help.username_restrictions, {minimumUsernameLength}, {maximumUsernameLength}]] -
      +
      +
      +
      +
      + [[error:registration-error]] +

      {error}

      -
      - -
      - - - [[register:help.minimum_password_length, {minimumPasswordLength}]] - + +
      + +
      + + + [[register:help.username_restrictions, {minimumUsernameLength}, {maximumUsernameLength}]] +
      -
      -
      - -
      - - +
      + +
      + + + [[register:help.minimum_password_length, {minimumPasswordLength}]] + +
      +
      +
      + +
      + + +
      -
      - {{{each regFormEntry}}} -
      - -
      - {{regFormEntry.html}} + {{{each regFormEntry}}} +
      + +
      + {{regFormEntry.html}} +
      -
      - {{{end}}} + {{{end}}} -
      -
      - +
      +
      + +
      -
      - - - - + + + + +
      -
      - -
      -
      -

      [[register:alternative_registration]]

      -
        - {{{each authentication}}} -
      • - {{{end}}} -
      + {{{ if alternate_logins }}} +
      +
      +

      [[register:alternative_registration]]

      +
        + {{{each authentication}}} +
      • + {{{end}}} +
      +
      + {{{ end }}} +
      +
      + {{{each widgets.sidebar}}} + {{widgets.sidebar.html}} + {{{end}}}
      -
      +
      + {{{each widgets.footer}}} + {{widgets.footer.html}} + {{{end}}} +
      \ No newline at end of file diff --git a/templates/registerComplete.tpl b/templates/registerComplete.tpl index 6868fd2..cc7b2fc 100644 --- a/templates/registerComplete.tpl +++ b/templates/registerComplete.tpl @@ -36,12 +36,10 @@
      - +
      + + +
      - -
      -

      - -

      \ No newline at end of file diff --git a/templates/search.tpl b/templates/search.tpl index c3f72e0..c4aaeb5 100644 --- a/templates/search.tpl +++ b/templates/search.tpl @@ -168,55 +168,6 @@
      -
      - -
      [[search:results_matching, {matchCount}, {search_query}, {time}]]
      - - -
      [[search:no-matches]]
      - - - - {{{each posts}}} -
      -
      - {buildAvatar(posts.user, "sm", true)} - {posts.topic.title} -
      - -
      - {posts.content} -

      -
      - - - -
      -
      - {{{end}}} - - -
        - -
      - - - - - - - {{{ if categories.length }}} -
        - {{{each categories}}} - - {{{end}}} -
      - {{{ end }}} - - -
      +
      diff --git a/templates/topic.tpl b/templates/topic.tpl index ede10a8..a42dfa3 100644 --- a/templates/topic.tpl +++ b/templates/topic.tpl @@ -7,7 +7,7 @@

      - + @@ -15,7 +15,7 @@ {{{each icons}}}{@value}{{{end}}} - {title} + {title}

      @@ -36,7 +36,11 @@ {{{ if !feeds:disableRSS }}} {{{ if rssFeedUrl }}}{{{ end }}} {{{ end }}} + {{{ if browsingUsers }}} + + {{{ end }}}
      @@ -67,10 +71,17 @@
    • - {renderTopicEvents(@index)} + {renderTopicEvents(@index, config.topicPostSort)} {{{end}}}
    + {{{ if browsingUsers }}} +
    + +
    +
    + {{{ end }}} + diff --git a/templates/unsubscribe.tpl b/templates/unsubscribe.tpl index cf38cd5..9dd1278 100644 --- a/templates/unsubscribe.tpl +++ b/templates/unsubscribe.tpl @@ -1,6 +1,14 @@ +{{{ if !error }}}
    [[global:alert.success]]

    [[email:unsub.success, {payload.template}]]

    +{{{ else }}} +
    + [[email:unsub.failure.title]] +

    [[email:unsub.failure.message, {error}, {config.relative_path}/me/settings]]

    +{{{ end }}} +
    +

    [[notifications:back_to_home, {config.siteTitle}]]

    diff --git a/yarn.lock b/yarn.lock index 2690ee3..5ddfa42 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,12 +2,1231 @@ # yarn lockfile v1 +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + +"@babel/highlight@^7.10.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" + integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@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= + +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" + integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +array-includes@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" + integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + is-string "^1.0.7" + +array.prototype.flat@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" + integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +confusing-browser-globals@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" + integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== + +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" + +debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.1: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +es-abstract@^1.19.0, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-airbnb-base@14.2.1: + version "14.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" + integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.2" + +eslint-config-nodebb@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/eslint-config-nodebb/-/eslint-config-nodebb-0.0.2.tgz#6605ee7129db7a7b058320d5879591757128f4b3" + integrity sha512-FMg9ymyxdRaNIuKh8BH01Cqy5YnabqxnWxIF72IMY0ezOtNBrFdiBHRzsEBH/c0bRhgZGW4vVG7chDXPNsnYdw== + dependencies: + eslint-config-airbnb-base "14.2.1" + +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== + dependencies: + debug "^3.2.7" + resolve "^1.20.0" + +eslint-module-utils@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz#b435001c9f8dd4ab7f6d0efcae4b9696d4c24b7c" + integrity sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ== + dependencies: + debug "^3.2.7" + find-up "^2.1.0" + pkg-dir "^2.0.0" + +eslint-plugin-import@^2.24.2: + version "2.25.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz#a554b5f66e08fb4f6dc99221866e57cfff824766" + integrity sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg== + dependencies: + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.1" + has "^1.0.3" + is-core-module "^2.8.0" + is-glob "^4.0.3" + minimatch "^3.0.4" + object.values "^1.1.5" + resolve "^1.20.0" + tsconfig-paths "^3.11.0" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.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-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint@^7.32.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.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" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.1.2" + globals "^13.6.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.merge "^4.6.2" + 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 "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" + integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.6.0, globals@^13.9.0: + version "13.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e" + integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg== + dependencies: + type-fest "^0.20.2" + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-core-module@^2.2.0, is-core-module@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" + integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" + integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + dependencies: + call-bind "^1.0.0" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +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" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.1.tgz#d4bd7d7de54b9a75599f59a00bd698c1f1c6549b" + integrity sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA== + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.entries@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +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" + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +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== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + pulling@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pulling/-/pulling-2.0.0.tgz#5793d3b0ff8511a07465fd95a32498e4c2790c5f" integrity sha512-FTbrWBDFPZBP75bbeB3+5gXBFO3SCp+LKcUS7wE9Nn3x/RZoIjYzgH5RXT1vSBuyW+5sdguXqBsQjQeRYIKn1A== +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +regexpp@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +semver@^7.2.1: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + striptags@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.2.0.tgz#cc74a137db2de8b0b9a370006334161f7dd67052" integrity sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +table@^6.0.9: + version "6.7.5" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.5.tgz#f04478c351ef3d8c7904f0e8be90a1b62417d238" + integrity sha512-LFNeryOqiQHqCVKzhkymKwt6ozeRhlm8IL1mE8rNUurkir4heF6PzMyRgaTa4tlyPTGGgXuvVOF/OLWiH09Lqw== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +tsconfig-paths@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz#19769aca6ee8f6a1a341e38c8fa45dd9fb18899b" + integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +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-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +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== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==