From: Dessalines <dessalines@users.noreply.github.com>
Date: Fri, 28 Jul 2023 20:15:42 +0000 (-0400)
Subject: Upgrading deps, running prettier. (#1987)
X-Git-Url: http://these/git/%7B%60%24%7BghostArchiveUrl%7D/%7B%60/feeds/front/%24%7BUserService.Instance.auth%7D.xml?a=commitdiff_plain;h=9f2289d46600385354d3673b0ef2ba921a1fbe49;p=lemmy-ui.git

Upgrading deps, running prettier. (#1987)
---

diff --git a/package.json b/package.json
index 5c932a9..27b9cb4 100644
--- a/package.json
+++ b/package.json
@@ -35,16 +35,16 @@
   },
   "dependencies": {
     "@babel/plugin-proposal-decorators": "^7.21.0",
-    "@babel/plugin-transform-runtime": "^7.21.4",
-    "@babel/plugin-transform-typescript": "^7.21.3",
-    "@babel/preset-env": "7.21.5",
+    "@babel/plugin-transform-runtime": "^7.22.9",
+    "@babel/plugin-transform-typescript": "^7.22.9",
+    "@babel/preset-env": "7.22.9",
     "@babel/preset-typescript": "^7.21.5",
     "@babel/runtime": "^7.21.5",
     "@emoji-mart/data": "^1.1.0",
     "autosize": "^6.0.1",
     "babel-loader": "^9.1.2",
     "babel-plugin-inferno": "^6.6.0",
-    "bootstrap": "^5.2.3",
+    "bootstrap": "^5.3.1",
     "check-password-strength": "^2.0.7",
     "classnames": "^2.3.1",
     "clean-webpack-plugin": "^4.0.0",
@@ -58,7 +58,7 @@
     "express": "~4.18.2",
     "history": "^5.3.0",
     "html-to-text": "^9.0.5",
-    "i18next": "^23.2.8",
+    "i18next": "^23.3.0",
     "inferno": "^8.2.2",
     "inferno-create-element": "^8.2.2",
     "inferno-helmet": "^5.2.1",
@@ -81,20 +81,21 @@
     "register-service-worker": "^1.7.2",
     "run-node-webpack-plugin": "^1.3.0",
     "sanitize-html": "^2.11.0",
-    "sass": "^1.63.6",
+    "sass": "^1.64.1",
     "sass-loader": "^13.3.2",
     "serialize-javascript": "^6.0.1",
     "service-worker-webpack": "^1.0.0",
-    "sharp": "^0.32.1",
+    "sharp": "^0.32.4",
     "tippy.js": "^6.3.7",
     "toastify-js": "^1.12.0",
     "tributejs": "^5.1.3",
-    "webpack": "5.88.1",
+    "webpack": "5.88.2",
     "webpack-cli": "^5.1.4",
     "webpack-node-externals": "^3.0.0"
   },
   "devDependencies": {
-    "@babel/core": "^7.21.8",
+    "@babel/core": "^7.22.9",
+    "@babel/plugin-proposal-class-properties": "^7.18.6",
     "@types/autosize": "^4.0.0",
     "@types/bootstrap": "^5.2.6",
     "@types/cookie": "^0.5.1",
@@ -102,29 +103,29 @@
     "@types/html-to-text": "^9.0.0",
     "@types/lodash.isequal": "^4.5.6",
     "@types/markdown-it": "^12.2.3",
-    "@types/markdown-it-container": "^2.0.5",
-    "@types/node": "^20.4.0",
+    "@types/markdown-it-container": "^2.0.6",
+    "@types/node": "^20.4.5",
     "@types/path-browserify": "^1.0.0",
     "@types/sanitize-html": "^2.9.0",
     "@types/serialize-javascript": "^5.0.1",
-    "@types/toastify-js": "^1.11.1",
-    "@typescript-eslint/eslint-plugin": "^5.61.0",
-    "@typescript-eslint/parser": "^5.61.0",
-    "eslint": "^8.44.0",
+    "@types/toastify-js": "^1.12.0",
+    "@typescript-eslint/eslint-plugin": "^6.2.0",
+    "@typescript-eslint/parser": "^6.2.0",
+    "eslint": "^8.45.0",
     "eslint-plugin-inferno": "^7.32.2",
     "eslint-plugin-jsx-a11y": "^6.7.1",
-    "eslint-plugin-prettier": "^4.2.1",
+    "eslint-plugin-prettier": "^5.0.0",
     "husky": "^8.0.3",
     "import-sort-style-module": "^6.0.0",
     "lint-staged": "^13.2.3",
-    "prettier": "^2.8.8",
+    "prettier": "^3.0.0",
     "prettier-plugin-import-sort": "^0.0.7",
-    "prettier-plugin-organize-imports": "^3.2.2",
-    "prettier-plugin-packagejson": "^2.4.4",
+    "prettier-plugin-organize-imports": "^3.2.3",
+    "prettier-plugin-packagejson": "^2.4.5",
     "rimraf": "^5.0.0",
     "sortpack": "^2.3.4",
     "style-loader": "^3.3.2",
-    "terser": "^5.18.2",
+    "terser": "^5.19.2",
     "typescript": "^5.1.6",
     "typescript-language-server": "^3.3.2",
     "webpack-bundle-analyzer": "^4.9.0",
diff --git a/src/assets/css/themes/_variables.darkly-pureblack.scss b/src/assets/css/themes/_variables.darkly-pureblack.scss
index 9106b69..1028706 100644
--- a/src/assets/css/themes/_variables.darkly-pureblack.scss
+++ b/src/assets/css/themes/_variables.darkly-pureblack.scss
@@ -30,9 +30,18 @@ $mark-bg: $gray-900;
 $text-muted: $gray-600;
 $yiq-contrasted-threshold: 175;
 
-$font-family-sans-serif: "Lato", -apple-system, BlinkMacSystemFont, "Segoe UI",
-  Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji",
-  "Segoe UI Emoji", "Segoe UI Symbol";
+$font-family-sans-serif:
+  "Lato",
+  -apple-system,
+  BlinkMacSystemFont,
+  "Segoe UI",
+  Roboto,
+  "Helvetica Neue",
+  Arial,
+  sans-serif,
+  "Apple Color Emoji",
+  "Segoe UI Emoji",
+  "Segoe UI Symbol";
 $font-size-base: 0.9375rem;
 $h1-font-size: 3rem;
 $h2-font-size: 2.5rem;
diff --git a/src/assets/css/themes/_variables.darkly.scss b/src/assets/css/themes/_variables.darkly.scss
index 5e38439..1fec229 100644
--- a/src/assets/css/themes/_variables.darkly.scss
+++ b/src/assets/css/themes/_variables.darkly.scss
@@ -29,9 +29,18 @@ $mark-bg: #333;
 $text-muted: $gray-600;
 $yiq-contrasted-threshold: 175;
 
-$font-family-sans-serif: "Lato", -apple-system, BlinkMacSystemFont, "Segoe UI",
-  Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji",
-  "Segoe UI Emoji", "Segoe UI Symbol";
+$font-family-sans-serif:
+  "Lato",
+  -apple-system,
+  BlinkMacSystemFont,
+  "Segoe UI",
+  Roboto,
+  "Helvetica Neue",
+  Arial,
+  sans-serif,
+  "Apple Color Emoji",
+  "Segoe UI Emoji",
+  "Segoe UI Symbol";
 $h1-font-size: 3rem;
 $h2-font-size: 2.5rem;
 $h3-font-size: 2rem;
diff --git a/src/assets/css/themes/vaporwave-dark.scss b/src/assets/css/themes/vaporwave-dark.scss
index c18e8a0..cd947ad 100644
--- a/src/assets/css/themes/vaporwave-dark.scss
+++ b/src/assets/css/themes/vaporwave-dark.scss
@@ -23,8 +23,11 @@ option:disabled {
 }
 
 .form-control::placeholder {
-  text-shadow: 0.5px 0.5px 0 $secondary, 0.5px -0.5px 0 $secondary,
-    -0.5px 0.5px 0 $secondary, -0.5px -0.5px 0 $secondary;
+  text-shadow:
+    0.5px 0.5px 0 $secondary,
+    0.5px -0.5px 0 $secondary,
+    -0.5px 0.5px 0 $secondary,
+    -0.5px -0.5px 0 $secondary;
 }
 
 .input-group-text {
diff --git a/src/server/handlers/catch-all-handler.tsx b/src/server/handlers/catch-all-handler.tsx
index a40136b..6dd9323 100644
--- a/src/server/handlers/catch-all-handler.tsx
+++ b/src/server/handlers/catch-all-handler.tsx
@@ -35,7 +35,7 @@ export default async (req: Request, res: Response) => {
     const headers = setForwardedHeaders(req.headers);
 
     const client = wrapClient(
-      new LemmyHttp(getHttpBaseInternal(), { fetchFunction: fetch, headers })
+      new LemmyHttp(getHttpBaseInternal(), { fetchFunction: fetch, headers }),
     );
 
     const { path, url, query } = req;
@@ -50,7 +50,7 @@ export default async (req: Request, res: Response) => {
 
     if (try_site.state === "failed" && try_site.msg === "not_logged_in") {
       console.error(
-        "Incorrect JWT token, skipping auth so frontend can remove jwt cookie"
+        "Incorrect JWT token, skipping auth so frontend can remove jwt cookie",
       );
       getSiteForm.auth = undefined;
       auth = undefined;
@@ -90,7 +90,7 @@ export default async (req: Request, res: Response) => {
     }
 
     const error = Object.values(routeData).find(
-      res => res.state === "failed" && res.msg !== "couldnt_find_object" // TODO: find a better way of handling errors
+      res => res.state === "failed" && res.msg !== "couldnt_find_object", // TODO: find a better way of handling errors
     ) as FailedRequestState | undefined;
 
     // Redirect to the 404 if there's an API error
@@ -127,7 +127,7 @@ export default async (req: Request, res: Response) => {
     res.statusCode = 500;
 
     return res.send(
-      process.env.NODE_ENV === "development" ? err.message : "Server error"
+      process.env.NODE_ENV === "development" ? err.message : "Server error",
     );
   }
 };
diff --git a/src/server/handlers/manifest-handler.ts b/src/server/handlers/manifest-handler.ts
index c1756f7..2cbb64f 100644
--- a/src/server/handlers/manifest-handler.ts
+++ b/src/server/handlers/manifest-handler.ts
@@ -13,7 +13,7 @@ export default async (req: Request, res: Response) => {
   if (!manifest || manifest.start_url !== getHttpBaseExternal()) {
     const headers = setForwardedHeaders(req.headers);
     const client = wrapClient(
-      new LemmyHttp(getHttpBaseInternal(), { fetchFunction: fetch, headers })
+      new LemmyHttp(getHttpBaseInternal(), { fetchFunction: fetch, headers }),
     );
     const site = await client.getSite({});
 
diff --git a/src/server/handlers/security-handler.ts b/src/server/handlers/security-handler.ts
index 0aed0cd..af0ebc5 100644
--- a/src/server/handlers/security-handler.ts
+++ b/src/server/handlers/security-handler.ts
@@ -12,6 +12,6 @@ export default async ({ res }: { res: Response }) => {
       process.env.LEMMY_UI_LEMMY_EXTERNAL_HOST +
       `
   Expires: 2024-01-01T04:59:00.000Z
-  `
+  `,
   );
 };
diff --git a/src/server/handlers/service-worker-handler.ts b/src/server/handlers/service-worker-handler.ts
index 15c6b3f..d801e22 100644
--- a/src/server/handlers/service-worker-handler.ts
+++ b/src/server/handlers/service-worker-handler.ts
@@ -8,7 +8,7 @@ export default async ({ res }: { res: Response }) => {
       path.resolve(
         `./dist/service-worker${
           process.env.NODE_ENV === "development" ? "-development" : ""
-        }.js`
-      )
+        }.js`,
+      ),
     );
 };
diff --git a/src/server/index.tsx b/src/server/index.tsx
index 3b9352b..e0427fa 100644
--- a/src/server/index.tsx
+++ b/src/server/index.tsx
@@ -25,7 +25,7 @@ server.use(
   express.static(path.resolve("./dist"), {
     maxAge: 24 * 60 * 60 * 1000, // 1 day
     immutable: true,
-  })
+  }),
 );
 server.use(setCacheControl);
 
diff --git a/src/server/middleware.ts b/src/server/middleware.ts
index a75d49e..5e0c8b7 100644
--- a/src/server/middleware.ts
+++ b/src/server/middleware.ts
@@ -22,7 +22,7 @@ export function setDefaultCsp({
      form-action 'self';
      base-uri 'self';
      frame-src *;
-     media-src * data:`.replace(/\s+/g, " ")
+     media-src * data:`.replace(/\s+/g, " "),
   );
 
   next();
@@ -37,7 +37,7 @@ export function setDefaultCsp({
 export function setCacheControl(
   req: Request,
   res: Response,
-  next: NextFunction
+  next: NextFunction,
 ) {
   if (process.env.NODE_ENV !== "production") {
     return next();
diff --git a/src/server/utils/create-ssr-html.tsx b/src/server/utils/create-ssr-html.tsx
index 71fdb68..0958588 100644
--- a/src/server/utils/create-ssr-html.tsx
+++ b/src/server/utils/create-ssr-html.tsx
@@ -15,7 +15,7 @@ let appleTouchIcon: string | undefined = undefined;
 export async function createSsrHtml(
   root: string,
   isoData: IsoDataOptionalSite,
-  cspNonce: string
+  cspNonce: string,
 ) {
   const site = isoData.site_res;
 
@@ -26,13 +26,13 @@ export async function createSsrHtml(
   const customHtmlHeaderScriptTag = new RegExp("<script", "g");
   const customHtmlHeaderWithNonce = customHtmlHeader.replace(
     customHtmlHeaderScriptTag,
-    `<script nonce="${cspNonce}"`
+    `<script nonce="${cspNonce}"`,
   );
 
   if (!appleTouchIcon) {
     appleTouchIcon = site?.site_view.site.icon
       ? `data:image/png;base64,${await sharp(
-          await fetchIconPng(site.site_view.site.icon)
+          await fetchIconPng(site.site_view.site.icon),
         )
           .resize(180, 180)
           .extend({
@@ -57,7 +57,7 @@ export async function createSsrHtml(
               src="//cdn.jsdelivr.net/npm/eruda"
             ></script>
             <script nonce={cspNonce}>eruda.init();</script>
-          </>
+          </>,
         )
       : "";
 
diff --git a/src/server/utils/generate-manifest-json.ts b/src/server/utils/generate-manifest-json.ts
index 89e106e..3821b02 100644
--- a/src/server/utils/generate-manifest-json.ts
+++ b/src/server/utils/generate-manifest-json.ts
@@ -10,7 +10,7 @@ const defaultLogoPathDirectory = path.join(
   process.cwd(),
   "dist",
   "assets",
-  "icons"
+  "icons",
 );
 
 export default async function ({
@@ -34,7 +34,7 @@ export default async function ({
     icons: await Promise.all(
       iconSizes.map(async size => {
         let src = await readFile(
-          path.join(defaultLogoPathDirectory, `icon-${size}x${size}.png`)
+          path.join(defaultLogoPathDirectory, `icon-${size}x${size}.png`),
         ).then(buf => buf.toString("base64"));
 
         if (icon) {
@@ -51,7 +51,7 @@ export default async function ({
           src: `data:image/png;base64,${src}`,
           purpose: "any maskable",
         };
-      })
+      }),
     ),
     shortcuts: [
       {
@@ -82,7 +82,7 @@ export default async function ({
               description: "Create a community",
             },
           ]
-        : []
+        : [],
     ),
     related_applications: [
       {
diff --git a/src/shared/components/app/app.tsx b/src/shared/components/app/app.tsx
index 2000bec..fc6f0a8 100644
--- a/src/shared/components/app/app.tsx
+++ b/src/shared/components/app/app.tsx
@@ -86,7 +86,7 @@ export class App extends Component<AppProps, any> {
                         );
                       }}
                     />
-                  )
+                  ),
                 )}
                 <Route component={ErrorPage} />
               </Switch>
diff --git a/src/shared/components/app/navbar.tsx b/src/shared/components/app/navbar.tsx
index 10b465d..0e96d68 100644
--- a/src/shared/components/app/navbar.tsx
+++ b/src/shared/components/app/navbar.tsx
@@ -146,7 +146,7 @@ export class Navbar extends Component<NavbarProps, NavbarState> {
                       {
                         count: Number(this.unreadApplicationCount),
                         formattedCount: numToSI(this.unreadApplicationCount),
-                      }
+                      },
                     )}
                     onMouseUp={linkEvent(this, handleCollapseClick)}
                   >
@@ -323,9 +323,9 @@ export class Navbar extends Component<NavbarProps, NavbarState> {
                           {
                             count: Number(this.unreadApplicationCount),
                             formattedCount: numToSI(
-                              this.unreadApplicationCount
+                              this.unreadApplicationCount,
                             ),
-                          }
+                          },
                         )}
                         onMouseUp={linkEvent(this, handleCollapseClick)}
                       >
@@ -336,9 +336,9 @@ export class Navbar extends Component<NavbarProps, NavbarState> {
                             {
                               count: Number(this.unreadApplicationCount),
                               formattedCount: numToSI(
-                                this.unreadApplicationCount
+                                this.unreadApplicationCount,
                               ),
-                            }
+                            },
                           )}
                         </span>
                         {this.unreadApplicationCount > 0 && (
diff --git a/src/shared/components/comment/comment-form.tsx b/src/shared/components/comment/comment-form.tsx
index 294960a..8eb1061 100644
--- a/src/shared/components/comment/comment-form.tsx
+++ b/src/shared/components/comment/comment-form.tsx
@@ -43,7 +43,7 @@ export class CommentForm extends Component<CommentFormProps, any> {
     return (
       <div
         className={["comment-form", "mb-3", this.props.containerClass].join(
-          " "
+          " ",
         )}
       >
         {UserService.Instance.myUserInfo ? (
diff --git a/src/shared/components/comment/comment-node.tsx b/src/shared/components/comment/comment-node.tsx
index bbbd820..fefcc72 100644
--- a/src/shared/components/comment/comment-node.tsx
+++ b/src/shared/components/comment/comment-node.tsx
@@ -198,7 +198,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
   }
 
   componentWillReceiveProps(
-    nextProps: Readonly<{ children?: InfernoNode } & CommentNodeProps>
+    nextProps: Readonly<{ children?: InfernoNode } & CommentNodeProps>,
   ): void {
     if (!deepEqual(this.props, nextProps)) {
       this.setState({
@@ -250,27 +250,27 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
     const canMod_ = canMod(
       cv.creator.id,
       this.props.moderators,
-      this.props.admins
+      this.props.admins,
     );
     const canModOnSelf = canMod(
       cv.creator.id,
       this.props.moderators,
       this.props.admins,
       UserService.Instance.myUserInfo,
-      true
+      true,
     );
     const canAdmin_ = canAdmin(cv.creator.id, this.props.admins);
     const canAdminOnSelf = canAdmin(
       cv.creator.id,
       this.props.admins,
       UserService.Instance.myUserInfo,
-      true
+      true,
     );
     const isMod_ = isMod(cv.creator.id, this.props.moderators);
     const isAdmin_ = isAdmin(cv.creator.id, this.props.admins);
     const amCommunityCreator_ = amCommunityCreator(
       cv.creator.id,
-      this.props.moderators
+      this.props.moderators,
     );
 
     const moreRepliesBorderColor = this.props.node.depth
@@ -337,7 +337,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                 <span className="badge text-bg-light d-none d-sm-inline me-2">
                   {
                     this.props.allLanguages.find(
-                      lang => lang.id === cv.comment.language_id
+                      lang => lang.id === cv.comment.language_id,
                     )?.name
                   }
                 </span>
@@ -374,7 +374,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                 onReplyCancel={this.handleReplyCancel}
                 disabled={this.props.locked}
                 finished={this.props.finished.get(
-                  this.props.node.comment_view.comment.id
+                  this.props.node.comment_view.comment.id,
                 )}
                 focus
                 allLanguages={this.props.allLanguages}
@@ -472,13 +472,13 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                 className="btn btn-link btn-animate text-muted"
                                 onClick={linkEvent(
                                   this,
-                                  this.handleShowReportDialog
+                                  this.handleShowReportDialog,
                                 )}
                                 data-tippy-content={I18NextService.i18n.t(
-                                  "show_report_dialog"
+                                  "show_report_dialog",
                                 )}
                                 aria-label={I18NextService.i18n.t(
-                                  "show_report_dialog"
+                                  "show_report_dialog",
                                 )}
                               >
                                 <Icon icon="flag" />
@@ -487,10 +487,10 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                 className="btn btn-link btn-animate text-muted"
                                 onClick={linkEvent(
                                   this,
-                                  this.handleBlockPerson
+                                  this.handleBlockPerson,
                                 )}
                                 data-tippy-content={I18NextService.i18n.t(
-                                  "block_user"
+                                  "block_user",
                                 )}
                                 aria-label={I18NextService.i18n.t("block_user")}
                               >
@@ -531,7 +531,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                             className="btn btn-link btn-animate text-muted"
                             onClick={linkEvent(this, this.handleViewSource)}
                             data-tippy-content={I18NextService.i18n.t(
-                              "view_source"
+                              "view_source",
                             )}
                             aria-label={I18NextService.i18n.t("view_source")}
                           >
@@ -548,7 +548,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                 className="btn btn-link btn-animate text-muted"
                                 onClick={linkEvent(this, this.handleEditClick)}
                                 data-tippy-content={I18NextService.i18n.t(
-                                  "edit"
+                                  "edit",
                                 )}
                                 aria-label={I18NextService.i18n.t("edit")}
                               >
@@ -558,7 +558,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                 className="btn btn-link btn-animate text-muted"
                                 onClick={linkEvent(
                                   this,
-                                  this.handleDeleteComment
+                                  this.handleDeleteComment,
                                 )}
                                 data-tippy-content={
                                   !cv.comment.deleted
@@ -588,7 +588,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                   className="btn btn-link btn-animate text-muted"
                                   onClick={linkEvent(
                                     this,
-                                    this.handleDistinguishComment
+                                    this.handleDistinguishComment,
                                   )}
                                   data-tippy-content={
                                     !cv.comment.distinguished
@@ -619,7 +619,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                   className="btn btn-link btn-animate text-muted"
                                   onClick={linkEvent(
                                     this,
-                                    this.handleModRemoveShow
+                                    this.handleModRemoveShow,
                                   )}
                                   aria-label={I18NextService.i18n.t("remove")}
                                 >
@@ -630,7 +630,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                   className="btn btn-link btn-animate text-muted"
                                   onClick={linkEvent(
                                     this,
-                                    this.handleRemoveComment
+                                    this.handleRemoveComment,
                                   )}
                                   aria-label={I18NextService.i18n.t("restore")}
                                 >
@@ -652,14 +652,14 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                     className="btn btn-link btn-animate text-muted"
                                     onClick={linkEvent(
                                       this,
-                                      this.handleModBanFromCommunityShow
+                                      this.handleModBanFromCommunityShow,
                                     )}
                                     aria-label={I18NextService.i18n.t(
-                                      "ban_from_community"
+                                      "ban_from_community",
                                     )}
                                   >
                                     {I18NextService.i18n.t(
-                                      "ban_from_community"
+                                      "ban_from_community",
                                     )}
                                   </button>
                                 ) : (
@@ -667,7 +667,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                     className="btn btn-link btn-animate text-muted"
                                     onClick={linkEvent(
                                       this,
-                                      this.handleBanPersonFromCommunity
+                                      this.handleBanPersonFromCommunity,
                                     )}
                                     aria-label={I18NextService.i18n.t("unban")}
                                   >
@@ -684,13 +684,13 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                     className="btn btn-link btn-animate text-muted"
                                     onClick={linkEvent(
                                       this,
-                                      this.handleShowConfirmAppointAsMod
+                                      this.handleShowConfirmAppointAsMod,
                                     )}
                                     aria-label={
                                       isMod_
                                         ? I18NextService.i18n.t("remove_as_mod")
                                         : I18NextService.i18n.t(
-                                            "appoint_as_mod"
+                                            "appoint_as_mod",
                                           )
                                     }
                                   >
@@ -703,7 +703,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                     <button
                                       className="btn btn-link btn-animate text-muted"
                                       aria-label={I18NextService.i18n.t(
-                                        "are_you_sure"
+                                        "are_you_sure",
                                       )}
                                     >
                                       {I18NextService.i18n.t("are_you_sure")}
@@ -712,7 +712,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                       className="btn btn-link btn-animate text-muted"
                                       onClick={linkEvent(
                                         this,
-                                        this.handleAddModToCommunity
+                                        this.handleAddModToCommunity,
                                       )}
                                       aria-label={I18NextService.i18n.t("yes")}
                                     >
@@ -726,7 +726,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                       className="btn btn-link btn-animate text-muted"
                                       onClick={linkEvent(
                                         this,
-                                        this.handleCancelConfirmAppointAsMod
+                                        this.handleCancelConfirmAppointAsMod,
                                       )}
                                       aria-label={I18NextService.i18n.t("no")}
                                     >
@@ -745,10 +745,10 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                 className="btn btn-link btn-animate text-muted"
                                 onClick={linkEvent(
                                   this,
-                                  this.handleShowConfirmTransferCommunity
+                                  this.handleShowConfirmTransferCommunity,
                                 )}
                                 aria-label={I18NextService.i18n.t(
-                                  "transfer_community"
+                                  "transfer_community",
                                 )}
                               >
                                 {I18NextService.i18n.t("transfer_community")}
@@ -758,7 +758,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                 <button
                                   className="btn btn-link btn-animate text-muted"
                                   aria-label={I18NextService.i18n.t(
-                                    "are_you_sure"
+                                    "are_you_sure",
                                   )}
                                 >
                                   {I18NextService.i18n.t("are_you_sure")}
@@ -767,7 +767,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                   className="btn btn-link btn-animate text-muted"
                                   onClick={linkEvent(
                                     this,
-                                    this.handleTransferCommunity
+                                    this.handleTransferCommunity,
                                   )}
                                   aria-label={I18NextService.i18n.t("yes")}
                                 >
@@ -782,7 +782,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                   onClick={linkEvent(
                                     this,
                                     this
-                                      .handleCancelShowConfirmTransferCommunity
+                                      .handleCancelShowConfirmTransferCommunity,
                                   )}
                                   aria-label={I18NextService.i18n.t("no")}
                                 >
@@ -799,10 +799,10 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                     className="btn btn-link btn-animate text-muted"
                                     onClick={linkEvent(
                                       this,
-                                      this.handlePurgePersonShow
+                                      this.handlePurgePersonShow,
                                     )}
                                     aria-label={I18NextService.i18n.t(
-                                      "purge_user"
+                                      "purge_user",
                                     )}
                                   >
                                     {I18NextService.i18n.t("purge_user")}
@@ -811,10 +811,10 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                     className="btn btn-link btn-animate text-muted"
                                     onClick={linkEvent(
                                       this,
-                                      this.handlePurgeCommentShow
+                                      this.handlePurgeCommentShow,
                                     )}
                                     aria-label={I18NextService.i18n.t(
-                                      "purge_comment"
+                                      "purge_comment",
                                     )}
                                   >
                                     {I18NextService.i18n.t("purge_comment")}
@@ -825,10 +825,10 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                       className="btn btn-link btn-animate text-muted"
                                       onClick={linkEvent(
                                         this,
-                                        this.handleModBanShow
+                                        this.handleModBanShow,
                                       )}
                                       aria-label={I18NextService.i18n.t(
-                                        "ban_from_site"
+                                        "ban_from_site",
                                       )}
                                     >
                                       {I18NextService.i18n.t("ban_from_site")}
@@ -838,10 +838,10 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                       className="btn btn-link btn-animate text-muted"
                                       onClick={linkEvent(
                                         this,
-                                        this.handleBanPerson
+                                        this.handleBanPerson,
                                       )}
                                       aria-label={I18NextService.i18n.t(
-                                        "unban_from_site"
+                                        "unban_from_site",
                                       )}
                                     >
                                       {this.state.banLoading ? (
@@ -860,22 +860,22 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                     className="btn btn-link btn-animate text-muted"
                                     onClick={linkEvent(
                                       this,
-                                      this.handleShowConfirmAppointAsAdmin
+                                      this.handleShowConfirmAppointAsAdmin,
                                     )}
                                     aria-label={
                                       isAdmin_
                                         ? I18NextService.i18n.t(
-                                            "remove_as_admin"
+                                            "remove_as_admin",
                                           )
                                         : I18NextService.i18n.t(
-                                            "appoint_as_admin"
+                                            "appoint_as_admin",
                                           )
                                     }
                                   >
                                     {isAdmin_
                                       ? I18NextService.i18n.t("remove_as_admin")
                                       : I18NextService.i18n.t(
-                                          "appoint_as_admin"
+                                          "appoint_as_admin",
                                         )}
                                   </button>
                                 ) : (
@@ -887,7 +887,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                       className="btn btn-link btn-animate text-muted"
                                       onClick={linkEvent(
                                         this,
-                                        this.handleAddAdmin
+                                        this.handleAddAdmin,
                                       )}
                                       aria-label={I18NextService.i18n.t("yes")}
                                     >
@@ -901,7 +901,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                                       className="btn btn-link btn-animate text-muted"
                                       onClick={linkEvent(
                                         this,
-                                        this.handleCancelConfirmAppointAsAdmin
+                                        this.handleCancelConfirmAppointAsAdmin,
                                       )}
                                       aria-label={I18NextService.i18n.t("no")}
                                     >
@@ -939,7 +939,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
                   {I18NextService.i18n.t("x_more_replies", {
                     count: node.comment_view.counts.child_count,
                     formattedCount: numToSI(
-                      node.comment_view.counts.child_count
+                      node.comment_view.counts.child_count,
                     ),
                   })}{" "}
                   ➔
@@ -1114,7 +1114,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
             onReplyCancel={this.handleReplyCancel}
             disabled={this.props.locked}
             finished={this.props.finished.get(
-              this.props.node.comment_view.comment.id
+              this.props.node.comment_view.comment.id,
             )}
             focus
             allLanguages={this.props.allLanguages}
@@ -1299,13 +1299,13 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
   }
 
   isPersonMentionType(
-    item: CommentView | PersonMentionView | CommentReplyView
+    item: CommentView | PersonMentionView | CommentReplyView,
   ): item is PersonMentionView {
     return (item as PersonMentionView).person_mention?.id !== undefined;
   }
 
   isCommentReplyType(
-    item: CommentView | PersonMentionView | CommentReplyView
+    item: CommentView | PersonMentionView | CommentReplyView,
   ): item is CommentReplyView {
     return (item as CommentReplyView).comment_reply?.id !== undefined;
   }
diff --git a/src/shared/components/comment/comment-report.tsx b/src/shared/components/comment/comment-report.tsx
index 473481b..834f96a 100644
--- a/src/shared/components/comment/comment-report.tsx
+++ b/src/shared/components/comment/comment-report.tsx
@@ -33,7 +33,7 @@ export class CommentReport extends Component<
   }
 
   componentWillReceiveProps(
-    nextProps: Readonly<{ children?: InfernoNode } & CommentReportProps>
+    nextProps: Readonly<{ children?: InfernoNode } & CommentReportProps>,
   ): void {
     if (this.props !== nextProps) {
       this.setState({ loading: false });
@@ -44,7 +44,7 @@ export class CommentReport extends Component<
     const r = this.props.report;
     const comment = r.comment;
     const tippyContent = I18NextService.i18n.t(
-      r.comment_report.resolved ? "unresolve_report" : "resolve_report"
+      r.comment_report.resolved ? "unresolve_report" : "resolve_report",
     );
 
     // Set the original post data ( a troll could change it )
diff --git a/src/shared/components/common/badges.tsx b/src/shared/components/common/badges.tsx
index c1eeed4..e3b2172 100644
--- a/src/shared/components/common/badges.tsx
+++ b/src/shared/components/common/badges.tsx
@@ -13,13 +13,13 @@ interface BadgesProps {
 }
 
 const isCommunityAggregates = (
-  counts: CommunityAggregates | SiteAggregates
+  counts: CommunityAggregates | SiteAggregates,
 ): counts is CommunityAggregates => {
   return "subscribers" in counts;
 };
 
 const isSiteAggregates = (
-  counts: CommunityAggregates | SiteAggregates
+  counts: CommunityAggregates | SiteAggregates,
 ): counts is SiteAggregates => {
   return "communities" in counts;
 };
@@ -34,7 +34,7 @@ export const Badges = ({ counts, communityId }: BadgesProps) => {
           {
             count: Number(counts.users_active_day),
             formattedCount: numToSI(counts.users_active_day),
-          }
+          },
         )}
       >
         {I18NextService.i18n.t("number_of_users", {
@@ -50,7 +50,7 @@ export const Badges = ({ counts, communityId }: BadgesProps) => {
           {
             count: Number(counts.users_active_week),
             formattedCount: numToSI(counts.users_active_week),
-          }
+          },
         )}
       >
         {I18NextService.i18n.t("number_of_users", {
@@ -66,7 +66,7 @@ export const Badges = ({ counts, communityId }: BadgesProps) => {
           {
             count: Number(counts.users_active_month),
             formattedCount: numToSI(counts.users_active_month),
-          }
+          },
         )}
       >
         {I18NextService.i18n.t("number_of_users", {
@@ -82,7 +82,7 @@ export const Badges = ({ counts, communityId }: BadgesProps) => {
           {
             count: Number(counts.users_active_half_year),
             formattedCount: numToSI(counts.users_active_half_year),
-          }
+          },
         )}
       >
         {I18NextService.i18n.t("number_of_users", {
diff --git a/src/shared/components/common/emoji-mart.tsx b/src/shared/components/common/emoji-mart.tsx
index 6ee3aa8..0f6977b 100644
--- a/src/shared/components/common/emoji-mart.tsx
+++ b/src/shared/components/common/emoji-mart.tsx
@@ -15,7 +15,7 @@ export class EmojiMart extends Component<EmojiMartProps> {
     const div: any = document.getElementById("emoji-picker");
     if (div) {
       div.appendChild(
-        getEmojiMart(this.handleEmojiClick, this.props.pickerOptions)
+        getEmojiMart(this.handleEmojiClick, this.props.pickerOptions),
       );
     }
   }
diff --git a/src/shared/components/common/html-tags.tsx b/src/shared/components/common/html-tags.tsx
index 80649fa..cd24a66 100644
--- a/src/shared/components/common/html-tags.tsx
+++ b/src/shared/components/common/html-tags.tsx
@@ -50,10 +50,10 @@ export class HtmlTags extends Component<HtmlTagsProps, any> {
                 name={n}
                 content={htmlToText(md.renderInline(desc))}
               />
-            )
+            ),
         )}
         {["og:image", "twitter:image"].map(
-          p => image && <meta key={p} property={p} content={image} />
+          p => image && <meta key={p} property={p} content={image} />,
         )}
       </Helmet>
     );
diff --git a/src/shared/components/common/language-select.tsx b/src/shared/components/common/language-select.tsx
index c74f24c..fbc84d6 100644
--- a/src/shared/components/common/language-select.tsx
+++ b/src/shared/components/common/language-select.tsx
@@ -53,12 +53,12 @@ export class LanguageSelect extends Component<LanguageSelectProps, any> {
         <label
           className={classNames(
             "col-form-label",
-            `col-sm-${this.props.multiple ? 3 : 2}`
+            `col-sm-${this.props.multiple ? 3 : 2}`,
           )}
           htmlFor={this.id}
         >
           {I18NextService.i18n.t(
-            this.props.multiple ? "language_plural" : "language"
+            this.props.multiple ? "language_plural" : "language",
           )}
         </label>
         {this.props.multiple && this.props.showLanguageWarning && (
@@ -97,7 +97,7 @@ export class LanguageSelect extends Component<LanguageSelectProps, any> {
       this.props.siteLanguages,
       this.props.showAll,
       this.props.showSite,
-      UserService.Instance.myUserInfo
+      UserService.Instance.myUserInfo,
     );
 
     return (
diff --git a/src/shared/components/common/listing-type-select.tsx b/src/shared/components/common/listing-type-select.tsx
index 1d917dc..fc49818 100644
--- a/src/shared/components/common/listing-type-select.tsx
+++ b/src/shared/components/common/listing-type-select.tsx
@@ -30,7 +30,7 @@ export class ListingTypeSelect extends Component<
   }
 
   static getDerivedStateFromProps(
-    props: ListingTypeSelectProps
+    props: ListingTypeSelectProps,
   ): ListingTypeSelectState {
     return {
       type_: props.type_,
diff --git a/src/shared/components/common/markdown-textarea.tsx b/src/shared/components/common/markdown-textarea.tsx
index 1404bdb..4378408 100644
--- a/src/shared/components/common/markdown-textarea.tsx
+++ b/src/shared/components/common/markdown-textarea.tsx
@@ -201,7 +201,7 @@ export class MarkdownTextArea extends Component<
                 {this.getFormatButton("header", this.handleInsertHeader)}
                 {this.getFormatButton(
                   "strikethrough",
-                  this.handleInsertStrikethrough
+                  this.handleInsertStrikethrough,
                 )}
                 {this.getFormatButton("quote", this.handleInsertQuote)}
                 {this.getFormatButton("list", this.handleInsertList)}
@@ -209,7 +209,7 @@ export class MarkdownTextArea extends Component<
                 {this.getFormatButton("subscript", this.handleInsertSubscript)}
                 {this.getFormatButton(
                   "superscript",
-                  this.handleInsertSuperscript
+                  this.handleInsertSuperscript,
                 )}
                 {this.getFormatButton("spoiler", this.handleInsertSpoiler)}
                 <a
@@ -229,7 +229,7 @@ export class MarkdownTextArea extends Component<
                     "form-control border-0 rounded-top-0 rounded-bottom",
                     {
                       "d-none": this.state.previewMode,
-                    }
+                    },
                   )}
                   value={this.state.content}
                   onInput={linkEvent(this, this.handleContentChange)}
@@ -328,7 +328,7 @@ export class MarkdownTextArea extends Component<
 
   getFormatButton(
     type: NoOptionI18nKeys,
-    handleClick: (i: MarkdownTextArea, event: any) => void
+    handleClick: (i: MarkdownTextArea, event: any) => void,
   ) {
     let iconType: string;
 
@@ -396,7 +396,7 @@ export class MarkdownTextArea extends Component<
           count: Number(maxUploadImages),
           formattedCount: numToSI(maxUploadImages),
         }),
-        "danger"
+        "danger",
       );
     } else {
       i.setState({
@@ -424,7 +424,7 @@ export class MarkdownTextArea extends Component<
                 uploaded: (imageUploadStatus?.uploaded ?? 0) + 1,
               },
             }));
-          })
+          }),
         );
       } catch (e) {
         errorOccurred = true;
@@ -560,7 +560,7 @@ export class MarkdownTextArea extends Component<
       i.setState({
         content: `${content?.substring(
           0,
-          start
+          start,
         )}[${selectedText}]()${content?.substring(end)}`,
       });
       textarea.focus();
@@ -584,7 +584,7 @@ export class MarkdownTextArea extends Component<
   simpleSurroundBeforeAfter(
     beforeChars: string,
     afterChars: string,
-    emptyChars = "___"
+    emptyChars = "___",
   ) {
     const content = this.state.content ?? "";
     if (!this.state.content) {
@@ -599,7 +599,7 @@ export class MarkdownTextArea extends Component<
       this.setState({
         content: `${content?.substring(
           0,
-          start
+          start,
         )}${beforeChars}${selectedText}${afterChars}${content?.substring(end)}`,
       });
     } else {
@@ -614,12 +614,12 @@ export class MarkdownTextArea extends Component<
     if (start !== end) {
       textarea.setSelectionRange(
         start + beforeChars.length,
-        end + afterChars.length
+        end + afterChars.length,
       );
     } else {
       textarea.setSelectionRange(
         start + beforeChars.length,
-        end + emptyChars.length + afterChars.length
+        end + emptyChars.length + afterChars.length,
       );
     }
 
diff --git a/src/shared/components/common/moment-time.tsx b/src/shared/components/common/moment-time.tsx
index e658695..b60ac7a 100644
--- a/src/shared/components/common/moment-time.tsx
+++ b/src/shared/components/common/moment-time.tsx
@@ -25,11 +25,11 @@ export class MomentTime extends Component<MomentTimeProps, any> {
   createdAndModifiedTimes() {
     const updated = this.props.updated;
     let line = `${capitalizeFirstLetter(
-      I18NextService.i18n.t("created")
+      I18NextService.i18n.t("created"),
     )}: ${formatDate(this.props.published)}`;
     if (updated) {
       line += `\n\n\n${capitalizeFirstLetter(
-        I18NextService.i18n.t("modified")
+        I18NextService.i18n.t("modified"),
       )} ${formatDate(updated)}`;
     }
     return line;
diff --git a/src/shared/components/common/password-input.tsx b/src/shared/components/common/password-input.tsx
index 3949686..4298008 100644
--- a/src/shared/components/common/password-input.tsx
+++ b/src/shared/components/common/password-input.tsx
@@ -104,10 +104,10 @@ class PasswordInput extends Component<PasswordInputProps, PasswordInputState> {
                 id={id}
                 onClick={linkEvent(this, handleToggleShow)}
                 aria-label={I18NextService.i18n.t(
-                  `${show ? "show" : "hide"}_password`
+                  `${show ? "show" : "hide"}_password`,
                 )}
                 data-tippy-content={I18NextService.i18n.t(
-                  `${show ? "show" : "hide"}_password`
+                  `${show ? "show" : "hide"}_password`,
                 )}
               >
                 <Icon icon={`eye${show ? "-slash" : ""}`} inline />
@@ -116,7 +116,7 @@ class PasswordInput extends Component<PasswordInputProps, PasswordInputState> {
             {showStrength && value && (
               <div className={this.passwordColorClass}>
                 {I18NextService.i18n.t(
-                  this.passwordStrength as NoOptionI18nKeys
+                  this.passwordStrength as NoOptionI18nKeys,
                 )}
               </div>
             )}
diff --git a/src/shared/components/common/registration-application.tsx b/src/shared/components/common/registration-application.tsx
index 58ae57d..6afe8ca 100644
--- a/src/shared/components/common/registration-application.tsx
+++ b/src/shared/components/common/registration-application.tsx
@@ -42,7 +42,7 @@ export class RegistrationApplication extends Component<
   componentWillReceiveProps(
     nextProps: Readonly<
       { children?: InfernoNode } & RegistrationApplicationProps
-    >
+    >,
   ): void {
     if (this.props !== nextProps) {
       this.setState({
diff --git a/src/shared/components/common/searchable-select.tsx b/src/shared/components/common/searchable-select.tsx
index ef59a8c..f5ad392 100644
--- a/src/shared/components/common/searchable-select.tsx
+++ b/src/shared/components/common/searchable-select.tsx
@@ -83,7 +83,7 @@ export class SearchableSelect extends Component<
 
     if (props.value) {
       let selectedIndex = props.options.findIndex(
-        ({ value }) => value === props.value?.toString()
+        ({ value }) => value === props.value?.toString(),
       );
 
       if (selectedIndex < 0) {
@@ -140,7 +140,7 @@ export class SearchableSelect extends Component<
             (onSearch || searchText.length === 0
               ? options
               : options.filter(({ label }) =>
-                  label.toLowerCase().includes(searchText.toLowerCase())
+                  label.toLowerCase().includes(searchText.toLowerCase()),
                 )
             ).map((option, index) => (
               <button
diff --git a/src/shared/components/common/user-badges.tsx b/src/shared/components/common/user-badges.tsx
index ac84781..74990ca 100644
--- a/src/shared/components/common/user-badges.tsx
+++ b/src/shared/components/common/user-badges.tsx
@@ -45,7 +45,7 @@ export class UserBadges extends Component<UserBadgesProps> {
         <span
           className={classNames(
             "row d-inline-flex gx-1",
-            this.props.classNames
+            this.props.classNames,
           )}
         >
           {this.props.isBanned && (
diff --git a/src/shared/components/community/communities.tsx b/src/shared/components/community/communities.tsx
index 966b6c9..03254a1 100644
--- a/src/shared/components/community/communities.tsx
+++ b/src/shared/components/community/communities.tsx
@@ -181,7 +181,7 @@ export class Communities extends Component<any, CommunitiesState> {
                                   communityId: cv.community.id,
                                   follow: false,
                                 },
-                                this.handleFollow
+                                this.handleFollow,
                               )}
                             >
                               {I18NextService.i18n.t("unsubscribe")}
@@ -196,7 +196,7 @@ export class Communities extends Component<any, CommunitiesState> {
                                   communityId: cv.community.id,
                                   follow: true,
                                 },
-                                this.handleFollow
+                                this.handleFollow,
                               )}
                             >
                               {I18NextService.i18n.t("subscribe")}
@@ -209,7 +209,7 @@ export class Communities extends Component<any, CommunitiesState> {
                           )}
                         </td>
                       </tr>
-                    )
+                    ),
                   )}
                 </tbody>
               </table>
@@ -301,7 +301,7 @@ export class Communities extends Component<any, CommunitiesState> {
     event.preventDefault();
     const searchParamEncoded = encodeURIComponent(i.state.searchText);
     i.context.router.history.push(
-      `/search?q=${searchParamEncoded}&type=Communities`
+      `/search?q=${searchParamEncoded}&type=Communities`,
     );
   }
 
@@ -322,7 +322,7 @@ export class Communities extends Component<any, CommunitiesState> {
 
     return {
       listCommunitiesResponse: await client.listCommunities(
-        listCommunitiesForm
+        listCommunitiesForm,
       ),
     };
   }
@@ -374,7 +374,7 @@ export class Communities extends Component<any, CommunitiesState> {
       ) {
         s.listCommunitiesResponse.data.communities = editCommunity(
           res.data.community_view,
-          s.listCommunitiesResponse.data.communities
+          s.listCommunitiesResponse.data.communities,
         );
       }
       return s;
diff --git a/src/shared/components/community/community-form.tsx b/src/shared/components/community/community-form.tsx
index 6200c7f..e44675c 100644
--- a/src/shared/components/community/community-form.tsx
+++ b/src/shared/components/community/community-form.tsx
@@ -231,7 +231,7 @@ export class CommunityForm extends Component<
                 checked={this.state.form.posting_restricted_to_mods}
                 onChange={linkEvent(
                   this,
-                  this.handleCommunityPostingRestrictedToMods
+                  this.handleCommunityPostingRestrictedToMods,
                 )}
               />
             </div>
@@ -330,7 +330,7 @@ export class CommunityForm extends Component<
 
   handleCommunityPostingRestrictedToMods(i: CommunityForm, event: any) {
     i.setState(
-      s => ((s.form.posting_restricted_to_mods = event.target.checked), s)
+      s => ((s.form.posting_restricted_to_mods = event.target.checked), s),
     );
   }
 
diff --git a/src/shared/components/community/community.tsx b/src/shared/components/community/community.tsx
index 7df6985..3f7cdb5 100644
--- a/src/shared/components/community/community.tsx
+++ b/src/shared/components/community/community.tsx
@@ -570,7 +570,7 @@ export class Community extends Component<
     };
 
     this.props.history.push(
-      `/c/${this.props.match.params.name}${getQueryString(queryParams)}`
+      `/c/${this.props.match.params.name}${getQueryString(queryParams)}`,
     );
 
     await this.fetchData();
@@ -785,7 +785,7 @@ export class Community extends Component<
 
   async handleTransferCommunity(form: TransferCommunity) {
     const transferCommunityRes = await HttpService.client.transferCommunity(
-      form
+      form,
     );
     toast(I18NextService.i18n.t("transfer_community"));
     this.updateCommunityFull(transferCommunityRes);
@@ -819,14 +819,14 @@ export class Community extends Component<
           s.postsRes.data.posts
             .filter(c => c.creator.id === banRes.data.person_view.person.id)
             .forEach(
-              c => (c.creator_banned_from_community = banRes.data.banned)
+              c => (c.creator_banned_from_community = banRes.data.banned),
             );
         }
         if (s.commentsRes.state === "success") {
           s.commentsRes.data.comments
             .filter(c => c.creator.id === banRes.data.person_view.person.id)
             .forEach(
-              c => (c.creator_banned_from_community = banRes.data.banned)
+              c => (c.creator_banned_from_community = banRes.data.banned),
             );
         }
         return s;
@@ -886,7 +886,7 @@ export class Community extends Component<
       if (s.commentsRes.state === "success" && res.state === "success") {
         s.commentsRes.data.comments = editComment(
           res.data.comment_view,
-          s.commentsRes.data.comments
+          s.commentsRes.data.comments,
         );
         s.finished.set(res.data.comment_view.comment.id, true);
       }
@@ -902,7 +902,7 @@ export class Community extends Component<
         // Set finished for the parent
         s.finished.set(
           getCommentParentId(res.data.comment_view.comment) ?? 0,
-          true
+          true,
         );
       }
       return s;
@@ -914,7 +914,7 @@ export class Community extends Component<
       if (s.commentsRes.state === "success" && res.state === "success") {
         s.commentsRes.data.comments = editWith(
           res.data.comment_reply_view,
-          s.commentsRes.data.comments
+          s.commentsRes.data.comments,
         );
       }
       return s;
@@ -926,7 +926,7 @@ export class Community extends Component<
       if (s.postsRes.state === "success" && res.state === "success") {
         s.postsRes.data.posts = editPost(
           res.data.post_view,
-          s.postsRes.data.posts
+          s.postsRes.data.posts,
         );
       }
       return s;
diff --git a/src/shared/components/community/sidebar.tsx b/src/shared/components/community/sidebar.tsx
index ace58f9..a0ca2d0 100644
--- a/src/shared/components/community/sidebar.tsx
+++ b/src/shared/components/community/sidebar.tsx
@@ -79,7 +79,7 @@ export class Sidebar extends Component<SidebarProps, SidebarState> {
   }
 
   componentWillReceiveProps(
-    nextProps: Readonly<{ children?: InfernoNode } & SidebarProps>
+    nextProps: Readonly<{ children?: InfernoNode } & SidebarProps>,
   ): void {
     if (this.props.moderators !== nextProps.moderators) {
       this.setState({
@@ -292,7 +292,7 @@ export class Sidebar extends Component<SidebarProps, SidebarState> {
           onClick={linkEvent(this, this.handleBlockCommunity)}
         >
           {I18NextService.i18n.t(
-            blocked ? "unblock_community" : "block_community"
+            blocked ? "unblock_community" : "block_community",
           )}
         </button>
       )
@@ -332,7 +332,7 @@ export class Sidebar extends Component<SidebarProps, SidebarState> {
                       className="btn btn-link text-muted d-inline-block"
                       onClick={linkEvent(
                         this,
-                        this.handleShowConfirmLeaveModTeamClick
+                        this.handleShowConfirmLeaveModTeamClick,
                       )}
                     >
                       {I18NextService.i18n.t("leave_mod_team")}
@@ -356,7 +356,7 @@ export class Sidebar extends Component<SidebarProps, SidebarState> {
                         className="btn btn-link text-muted d-inline-block"
                         onClick={linkEvent(
                           this,
-                          this.handleCancelLeaveModTeamClick
+                          this.handleCancelLeaveModTeamClick,
                         )}
                       >
                         {I18NextService.i18n.t("no")}
diff --git a/src/shared/components/home/emojis-form.tsx b/src/shared/components/home/emojis-form.tsx
index 9e65adf..b24445d 100644
--- a/src/shared/components/home/emojis-form.tsx
+++ b/src/shared/components/home/emojis-form.tsx
@@ -118,8 +118,8 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
                   Number((this.state.page - 1) * this.itemsPerPage),
                   Number(
                     (this.state.page - 1) * this.itemsPerPage +
-                      this.itemsPerPage
-                  )
+                      this.itemsPerPage,
+                  ),
                 )
                 .map((cv, index) => (
                   <tr key={index} ref={e => (this.scrollRef[cv.shortcode] = e)}>
@@ -139,11 +139,11 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
                           className="btn btn-sm btn-secondary pointer"
                           htmlFor={`file-uploader-${index}`}
                           data-tippy-content={I18NextService.i18n.t(
-                            "upload_image"
+                            "upload_image",
                           )}
                         >
                           {capitalizeFirstLetter(
-                            I18NextService.i18n.t("upload")
+                            I18NextService.i18n.t("upload"),
                           )}
                           <input
                             name={`file-uploader-${index}`}
@@ -153,7 +153,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
                             className="d-none"
                             onChange={linkEvent(
                               { form: this, index: index },
-                              this.handleImageUpload
+                              this.handleImageUpload,
                             )}
                           />
                         </label>
@@ -168,7 +168,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
                         value={cv.shortcode}
                         onInput={linkEvent(
                           { form: this, index: index },
-                          this.handleEmojiShortCodeChange
+                          this.handleEmojiShortCodeChange,
                         )}
                       />
                     </td>
@@ -180,7 +180,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
                         value={cv.category}
                         onInput={linkEvent(
                           { form: this, index: index },
-                          this.handleEmojiCategoryChange
+                          this.handleEmojiCategoryChange,
                         )}
                       />
                     </td>
@@ -192,7 +192,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
                         value={cv.image_url}
                         onInput={linkEvent(
                           { form: this, index: index, overrideValue: null },
-                          this.handleEmojiImageUrlChange
+                          this.handleEmojiImageUrlChange,
                         )}
                       />
                     </td>
@@ -204,7 +204,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
                         value={cv.alt_text}
                         onInput={linkEvent(
                           { form: this, index: index },
-                          this.handleEmojiAltTextChange
+                          this.handleEmojiAltTextChange,
                         )}
                       />
                     </td>
@@ -216,7 +216,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
                         value={cv.keywords}
                         onInput={linkEvent(
                           { form: this, index: index },
-                          this.handleEmojiKeywordChange
+                          this.handleEmojiKeywordChange,
                         )}
                       />
                     </td>
@@ -231,7 +231,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
                             }
                             onClick={linkEvent(
                               { i: this, cv: cv },
-                              this.handleEditEmojiClick
+                              this.handleEditEmojiClick,
                             )}
                             data-tippy-content={I18NextService.i18n.t("save")}
                             aria-label={I18NextService.i18n.t("save")}
@@ -241,7 +241,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
                               <Spinner />
                             ) : (
                               capitalizeFirstLetter(
-                                I18NextService.i18n.t("save")
+                                I18NextService.i18n.t("save"),
                               )
                             )}
                           </button>
@@ -250,7 +250,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
                           className="btn btn-link btn-animate text-muted"
                           onClick={linkEvent(
                             { i: this, index: index, cv: cv },
-                            this.handleDeleteEmojiClick
+                            this.handleDeleteEmojiClick,
                           )}
                           data-tippy-content={I18NextService.i18n.t("delete")}
                           aria-label={I18NextService.i18n.t("delete")}
@@ -290,7 +290,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
       cv.shortcode.length > 0;
     const noDuplicateShortCodes =
       this.state.customEmojis.filter(
-        x => x.shortcode === cv.shortcode && x.id !== cv.id
+        x => x.shortcode === cv.shortcode && x.id !== cv.id,
       ).length === 0;
     return noEmptyFields && noDuplicateShortCodes && !cv.loading && cv.changed;
   }
@@ -308,7 +308,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
     const view = customEmojisLookup.get(e.id);
     if (view) {
       const page = this.state.customEmojis.find(
-        x => x.id === view.custom_emoji.id
+        x => x.id === view.custom_emoji.id,
       )?.page;
       if (page) {
         this.setState({ page: page });
@@ -319,7 +319,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
 
   handleEmojiCategoryChange(
     props: { form: EmojiForm; index: number },
-    event: any
+    event: any,
   ) {
     const custom_emojis = [...props.form.state.customEmojis];
     const pagedIndex =
@@ -335,7 +335,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
 
   handleEmojiShortCodeChange(
     props: { form: EmojiForm; index: number },
-    event: any
+    event: any,
   ) {
     const custom_emojis = [...props.form.state.customEmojis];
     const pagedIndex =
@@ -355,7 +355,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
       index,
       overrideValue,
     }: { form: EmojiForm; index: number; overrideValue: string | null },
-    event: any
+    event: any,
   ) {
     form.setState(prevState => {
       const custom_emojis = [...form.state.customEmojis];
@@ -376,7 +376,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
                 changed: true,
                 loading: false,
               }
-            : ce
+            : ce,
         ),
       };
     });
@@ -384,7 +384,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
 
   handleEmojiAltTextChange(
     props: { form: EmojiForm; index: number },
-    event: any
+    event: any,
   ) {
     const custom_emojis = [...props.form.state.customEmojis];
     const pagedIndex =
@@ -400,7 +400,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
 
   handleEmojiKeywordChange(
     props: { form: EmojiForm; index: number },
-    event: any
+    event: any,
   ) {
     const custom_emojis = [...props.form.state.customEmojis];
     const pagedIndex =
@@ -485,7 +485,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
 
   handleImageUpload(
     { form, index }: { form: EmojiForm; index: number },
-    event: any
+    event: any,
   ) {
     let file: any;
     if (event.target) {
@@ -498,7 +498,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
     form.setState(prevState => ({
       ...prevState,
       customEmojis: prevState.customEmojis.map((cv, i) =>
-        i === index ? { ...cv, loading: true } : cv
+        i === index ? { ...cv, loading: true } : cv,
       ),
     }));
 
@@ -510,7 +510,7 @@ export class EmojiForm extends Component<EmojiFormProps, EmojiFormState> {
           pictrsDeleteToast(file.name, res.data.delete_url as string);
           form.handleEmojiImageUrlChange(
             { form: form, index: index, overrideValue: res.data.url as string },
-            event
+            event,
           );
         } else if (res.data.msg === "too_large") {
           toast(I18NextService.i18n.t("upload_too_large"), "danger");
diff --git a/src/shared/components/home/home.tsx b/src/shared/components/home/home.tsx
index a7564d4..bdda543 100644
--- a/src/shared/components/home/home.tsx
+++ b/src/shared/components/home/home.tsx
@@ -285,9 +285,8 @@ export class Home extends Component<any, HomeState> {
       HomeCacheService.postsRes = postsRes;
     }
 
-    this.state.tagline = getRandomFromList(
-      this.state?.siteRes?.taglines ?? []
-    )?.content;
+    this.state.tagline = getRandomFromList(this.state?.siteRes?.taglines ?? [])
+      ?.content;
   }
 
   componentWillUnmount() {
@@ -298,7 +297,7 @@ export class Home extends Component<any, HomeState> {
     if (
       !this.state.isIsomorphic ||
       !Object.values(this.isoData.routeData).some(
-        res => res.state === "success" || res.state === "failed"
+        res => res.state === "success" || res.state === "failed",
       )
     ) {
       await Promise.all([this.fetchTrendingCommunities(), this.fetchData()]);
@@ -359,7 +358,7 @@ export class Home extends Component<any, HomeState> {
 
     return {
       trendingCommunitiesRes: await client.listCommunities(
-        trendingCommunitiesForm
+        trendingCommunitiesForm,
       ),
       commentsRes,
       postsRes,
@@ -777,7 +776,7 @@ export class Home extends Component<any, HomeState> {
         <div className="col-auto ps-0">
           {getRss(
             listingType ??
-              this.state.siteRes.site_view.local_site.default_post_listing_type
+              this.state.siteRes.site_view.local_site.default_post_listing_type,
           )}
         </div>
       </div>
@@ -1034,14 +1033,14 @@ export class Home extends Component<any, HomeState> {
           s.postsRes.data.posts
             .filter(c => c.creator.id === banRes.data.person_view.person.id)
             .forEach(
-              c => (c.creator_banned_from_community = banRes.data.banned)
+              c => (c.creator_banned_from_community = banRes.data.banned),
             );
         }
         if (s.commentsRes.state === "success") {
           s.commentsRes.data.comments
             .filter(c => c.creator.id === banRes.data.person_view.person.id)
             .forEach(
-              c => (c.creator_banned_from_community = banRes.data.banned)
+              c => (c.creator_banned_from_community = banRes.data.banned),
             );
         }
         return s;
@@ -1080,7 +1079,7 @@ export class Home extends Component<any, HomeState> {
       if (s.commentsRes.state === "success" && res.state === "success") {
         s.commentsRes.data.comments = editComment(
           res.data.comment_view,
-          s.commentsRes.data.comments
+          s.commentsRes.data.comments,
         );
         s.finished.set(res.data.comment_view.comment.id, true);
       }
@@ -1096,7 +1095,7 @@ export class Home extends Component<any, HomeState> {
         // Set finished for the parent
         s.finished.set(
           getCommentParentId(res.data.comment_view.comment) ?? 0,
-          true
+          true,
         );
       }
       return s;
@@ -1108,7 +1107,7 @@ export class Home extends Component<any, HomeState> {
       if (s.commentsRes.state === "success" && res.state === "success") {
         s.commentsRes.data.comments = editWith(
           res.data.comment_reply_view,
-          s.commentsRes.data.comments
+          s.commentsRes.data.comments,
         );
       }
       return s;
@@ -1120,7 +1119,7 @@ export class Home extends Component<any, HomeState> {
       if (s.postsRes.state === "success" && res.state === "success") {
         s.postsRes.data.posts = editPost(
           res.data.post_view,
-          s.postsRes.data.posts
+          s.postsRes.data.posts,
         );
       }
       return s;
diff --git a/src/shared/components/home/login-reset.tsx b/src/shared/components/home/login-reset.tsx
index aeca845..8f926f9 100644
--- a/src/shared/components/home/login-reset.tsx
+++ b/src/shared/components/home/login-reset.tsx
@@ -38,7 +38,7 @@ export class LoginReset extends Component<any, State> {
 
   get documentTitle(): string {
     return `${capitalizeFirstLetter(
-      I18NextService.i18n.t("forgot_password")
+      I18NextService.i18n.t("forgot_password"),
     )} - ${this.state.siteRes.site_view.site.name}`;
   }
 
diff --git a/src/shared/components/home/rate-limit-form.tsx b/src/shared/components/home/rate-limit-form.tsx
index 78229da..2ae6ba2 100644
--- a/src/shared/components/home/rate-limit-form.tsx
+++ b/src/shared/components/home/rate-limit-form.tsx
@@ -88,7 +88,7 @@ function RateLimits({
 
 function handleRateLimitChange(
   { rateLimitType, ctx }: { rateLimitType: string; ctx: RateLimitsForm },
-  event: any
+  event: any,
 ) {
   ctx.setState(prev => ({
     ...prev,
@@ -101,7 +101,7 @@ function handleRateLimitChange(
 
 function handlePerSecondChange(
   { rateLimitType, ctx }: { rateLimitType: string; ctx: RateLimitsForm },
-  event: any
+  event: any,
 ) {
   ctx.setState(prev => ({
     ...prev,
@@ -122,7 +122,7 @@ function submitRateLimitForm(i: RateLimitsForm, event: any) {
     },
     {
       auth,
-    }
+    },
   );
 
   i.props.onSaveSite(form);
@@ -159,11 +159,11 @@ export default class RateLimitsForm extends Component<
                 })}
                 handleRateLimit={linkEvent(
                   { rateLimitType, ctx: this },
-                  handleRateLimitChange
+                  handleRateLimitChange,
                 )}
                 handleRateLimitPerSecond={linkEvent(
                   { rateLimitType, ctx: this },
-                  handlePerSecondChange
+                  handlePerSecondChange,
                 )}
                 rateLimitValue={this.state.form[rateLimitType]}
                 rateLimitPerSecondValue={
diff --git a/src/shared/components/home/signup.tsx b/src/shared/components/home/signup.tsx
index b6f7233..fce37f9 100644
--- a/src/shared/components/home/signup.tsx
+++ b/src/shared/components/home/signup.tsx
@@ -85,7 +85,7 @@ export class Signup extends Component<any, State> {
 
   titleName(siteView: SiteView): string {
     return I18NextService.i18n.t(
-      siteView.local_site.private_instance ? "apply_to_join" : "sign_up"
+      siteView.local_site.private_instance ? "apply_to_join" : "sign_up",
     );
   }
 
@@ -213,7 +213,7 @@ export class Signup extends Component<any, State> {
                   <div
                     className="md-div"
                     dangerouslySetInnerHTML={mdToHtml(
-                      siteView.local_site.application_question
+                      siteView.local_site.application_question,
                     )}
                   />
                 )}
@@ -311,7 +311,7 @@ export class Signup extends Component<any, State> {
                 value={this.state.form.captcha_answer}
                 onInput={linkEvent(
                   this,
-                  this.handleRegisterCaptchaAnswerChange
+                  this.handleRegisterCaptchaAnswerChange,
                 )}
                 required
               />
diff --git a/src/shared/components/home/site-form.tsx b/src/shared/components/home/site-form.tsx
index da44718..da22071 100644
--- a/src/shared/components/home/site-form.tsx
+++ b/src/shared/components/home/site-form.tsx
@@ -319,7 +319,7 @@ export class SiteForm extends Component<SiteFormProps, SiteFormState> {
                 checked={this.state.siteForm.community_creation_admin_only}
                 onChange={linkEvent(
                   this,
-                  this.handleSiteCommunityCreationAdminOnly
+                  this.handleSiteCommunityCreationAdminOnly,
                 )}
               />
               <label
@@ -341,7 +341,7 @@ export class SiteForm extends Component<SiteFormProps, SiteFormState> {
                 checked={this.state.siteForm.require_email_verification}
                 onChange={linkEvent(
                   this,
-                  this.handleSiteRequireEmailVerification
+                  this.handleSiteRequireEmailVerification,
                 )}
               />
               <label
@@ -363,7 +363,7 @@ export class SiteForm extends Component<SiteFormProps, SiteFormState> {
                 checked={this.state.siteForm.application_email_admins}
                 onChange={linkEvent(
                   this,
-                  this.handleSiteApplicationEmailAdmins
+                  this.handleSiteApplicationEmailAdmins,
                 )}
               />
               <label
@@ -631,7 +631,7 @@ export class SiteForm extends Component<SiteFormProps, SiteFormState> {
   }
 
   componentDidUpdate(
-    prevProps: Readonly<{ children?: InfernoNode } & SiteFormProps>
+    prevProps: Readonly<{ children?: InfernoNode } & SiteFormProps>,
   ) {
     if (
       !(
@@ -694,7 +694,7 @@ export class SiteForm extends Component<SiteFormProps, SiteFormState> {
                   className="btn btn-sm bg-danger"
                   onClick={linkEvent(
                     { key, instance },
-                    this.handleRemoveInstance
+                    this.handleRemoveInstance,
                   )}
                 >
                   <Icon
@@ -722,7 +722,7 @@ export class SiteForm extends Component<SiteFormProps, SiteFormState> {
 
   handleInstanceEnterPress(
     key: InstanceKey,
-    event: InfernoKeyboardEvent<HTMLInputElement>
+    event: InfernoKeyboardEvent<HTMLInputElement>,
   ) {
     if (event.code.toLowerCase() === "enter") {
       event.preventDefault();
@@ -863,7 +863,7 @@ export class SiteForm extends Component<SiteFormProps, SiteFormState> {
   handleDeleteTaglineClick(
     i: SiteForm,
     index: number,
-    event: InfernoMouseEvent<HTMLButtonElement>
+    event: InfernoMouseEvent<HTMLButtonElement>,
   ) {
     event.preventDefault();
     const taglines = i.state.siteForm.taglines;
@@ -878,7 +878,7 @@ export class SiteForm extends Component<SiteFormProps, SiteFormState> {
 
   handleAddTaglineClick(
     i: SiteForm,
-    event: InfernoMouseEvent<HTMLButtonElement>
+    event: InfernoMouseEvent<HTMLButtonElement>,
   ) {
     event.preventDefault();
     if (!i.state.siteForm.taglines) {
@@ -969,7 +969,7 @@ export class SiteForm extends Component<SiteFormProps, SiteFormState> {
 
   handleSiteActorNameMaxLength(i: SiteForm, event: any) {
     i.setState(
-      s => ((s.siteForm.actor_name_max_length = Number(event.target.value)), s)
+      s => ((s.siteForm.actor_name_max_length = Number(event.target.value)), s),
     );
   }
 
diff --git a/src/shared/components/home/tagline-form.tsx b/src/shared/components/home/tagline-form.tsx
index 4059003..78e506b 100644
--- a/src/shared/components/home/tagline-form.tsx
+++ b/src/shared/components/home/tagline-form.tsx
@@ -66,7 +66,7 @@ export class TaglineForm extends Component<TaglineFormProps, TaglineFormState> {
                       className="btn btn-link btn-animate text-muted"
                       onClick={linkEvent(
                         { i: this, index: index },
-                        this.handleEditTaglineClick
+                        this.handleEditTaglineClick,
                       )}
                       data-tippy-content={I18NextService.i18n.t("edit")}
                       aria-label={I18NextService.i18n.t("edit")}
@@ -78,7 +78,7 @@ export class TaglineForm extends Component<TaglineFormProps, TaglineFormState> {
                       className="btn btn-link btn-animate text-muted"
                       onClick={linkEvent(
                         { i: this, index: index },
-                        this.handleDeleteTaglineClick
+                        this.handleDeleteTaglineClick,
                       )}
                       data-tippy-content={I18NextService.i18n.t("delete")}
                       aria-label={I18NextService.i18n.t("delete")}
@@ -157,7 +157,7 @@ export class TaglineForm extends Component<TaglineFormProps, TaglineFormState> {
 
   handleAddTaglineClick(
     i: TaglineForm,
-    event: InfernoMouseEvent<HTMLButtonElement>
+    event: InfernoMouseEvent<HTMLButtonElement>,
   ) {
     event.preventDefault();
     const newTaglines = [...i.state.taglines];
diff --git a/src/shared/components/modlog.tsx b/src/shared/components/modlog.tsx
index b91da87..31c2266 100644
--- a/src/shared/components/modlog.tsx
+++ b/src/shared/components/modlog.tsx
@@ -121,7 +121,7 @@ function getActionFromString(action?: string): ModlogActionType {
 const getModlogActionMapper =
   (
     actionType: ModlogActionType,
-    getAction: (view: View) => { id: number; when_: string }
+    getAction: (view: View) => { id: number; when_: string },
   ) =>
   (view: View & { moderator?: Person; admin?: Person }): ModlogType => {
     const { id, when_ } = getAction(view);
@@ -155,111 +155,111 @@ function buildCombined({
     .map(
       getModlogActionMapper(
         "ModRemovePost",
-        ({ mod_remove_post }: ModRemovePostView) => mod_remove_post
-      )
+        ({ mod_remove_post }: ModRemovePostView) => mod_remove_post,
+      ),
     )
     .concat(
       locked_posts.map(
         getModlogActionMapper(
           "ModLockPost",
-          ({ mod_lock_post }: ModLockPostView) => mod_lock_post
-        )
-      )
+          ({ mod_lock_post }: ModLockPostView) => mod_lock_post,
+        ),
+      ),
     )
     .concat(
       featured_posts.map(
         getModlogActionMapper(
           "ModFeaturePost",
-          ({ mod_feature_post }: ModFeaturePostView) => mod_feature_post
-        )
-      )
+          ({ mod_feature_post }: ModFeaturePostView) => mod_feature_post,
+        ),
+      ),
     )
     .concat(
       removed_comments.map(
         getModlogActionMapper(
           "ModRemoveComment",
-          ({ mod_remove_comment }: ModRemoveCommentView) => mod_remove_comment
-        )
-      )
+          ({ mod_remove_comment }: ModRemoveCommentView) => mod_remove_comment,
+        ),
+      ),
     )
     .concat(
       removed_communities.map(
         getModlogActionMapper(
           "ModRemoveCommunity",
           ({ mod_remove_community }: ModRemoveCommunityView) =>
-            mod_remove_community
-        )
-      )
+            mod_remove_community,
+        ),
+      ),
     )
     .concat(
       banned_from_community.map(
         getModlogActionMapper(
           "ModBanFromCommunity",
           ({ mod_ban_from_community }: ModBanFromCommunityView) =>
-            mod_ban_from_community
-        )
-      )
+            mod_ban_from_community,
+        ),
+      ),
     )
     .concat(
       added_to_community.map(
         getModlogActionMapper(
           "ModAddCommunity",
-          ({ mod_add_community }: ModAddCommunityView) => mod_add_community
-        )
-      )
+          ({ mod_add_community }: ModAddCommunityView) => mod_add_community,
+        ),
+      ),
     )
     .concat(
       transferred_to_community.map(
         getModlogActionMapper(
           "ModTransferCommunity",
           ({ mod_transfer_community }: ModTransferCommunityView) =>
-            mod_transfer_community
-        )
-      )
+            mod_transfer_community,
+        ),
+      ),
     )
     .concat(
       added.map(
-        getModlogActionMapper("ModAdd", ({ mod_add }: ModAddView) => mod_add)
-      )
+        getModlogActionMapper("ModAdd", ({ mod_add }: ModAddView) => mod_add),
+      ),
     )
     .concat(
       banned.map(
-        getModlogActionMapper("ModBan", ({ mod_ban }: ModBanView) => mod_ban)
-      )
+        getModlogActionMapper("ModBan", ({ mod_ban }: ModBanView) => mod_ban),
+      ),
     )
     .concat(
       admin_purged_persons.map(
         getModlogActionMapper(
           "AdminPurgePerson",
-          ({ admin_purge_person }: AdminPurgePersonView) => admin_purge_person
-        )
-      )
+          ({ admin_purge_person }: AdminPurgePersonView) => admin_purge_person,
+        ),
+      ),
     )
     .concat(
       admin_purged_communities.map(
         getModlogActionMapper(
           "AdminPurgeCommunity",
           ({ admin_purge_community }: AdminPurgeCommunityView) =>
-            admin_purge_community
-        )
-      )
+            admin_purge_community,
+        ),
+      ),
     )
     .concat(
       admin_purged_posts.map(
         getModlogActionMapper(
           "AdminPurgePost",
-          ({ admin_purge_post }: AdminPurgePostView) => admin_purge_post
-        )
-      )
+          ({ admin_purge_post }: AdminPurgePostView) => admin_purge_post,
+        ),
+      ),
     )
     .concat(
       admin_purged_comments.map(
         getModlogActionMapper(
           "AdminPurgeComment",
           ({ admin_purge_comment }: AdminPurgeCommentView) =>
-            admin_purge_comment
-        )
-      )
+            admin_purge_comment,
+        ),
+      ),
     );
 
   // Sort them by time
@@ -622,7 +622,7 @@ async function createNewOptions({
 
   if (id) {
     const selectedUser = oldOptions.find(
-      ({ value }) => value === id.toString()
+      ({ value }) => value === id.toString(),
     );
 
     if (selectedUser) {
@@ -634,7 +634,7 @@ async function createNewOptions({
     newOptions.push(
       ...(await fetchUsers(text))
         .slice(0, Number(fetchLimit))
-        .map<Choice>(personToChoice)
+        .map<Choice>(personToChoice),
     );
   }
 
@@ -658,7 +658,7 @@ export class Modlog extends Component<
 
   constructor(
     props: RouteComponentProps<{ communityId?: string }>,
-    context: any
+    context: any,
   ) {
     super(props, context);
     this.handlePageChange = this.handlePageChange.bind(this);
@@ -731,7 +731,7 @@ export class Modlog extends Component<
   modOrAdminText(person?: Person): string {
     return person &&
       this.isoData.site_res.admins.some(
-        ({ person: { id } }) => id === person.id
+        ({ person: { id } }) => id === person.id,
       )
       ? I18NextService.i18n.t("admin")
       : I18NextService.i18n.t("mod");
@@ -939,8 +939,8 @@ export class Modlog extends Component<
 
     this.props.history.push(
       `/modlog${communityId ? `/${communityId}` : ""}${getQueryString(
-        queryParams
-      )}`
+        queryParams,
+      )}`,
     );
 
     await this.refetch();
diff --git a/src/shared/components/person/inbox.tsx b/src/shared/components/person/inbox.tsx
index a76fdec..a2c0114 100644
--- a/src/shared/components/person/inbox.tsx
+++ b/src/shared/components/person/inbox.tsx
@@ -188,7 +188,7 @@ export class Inbox extends Component<any, InboxState> {
     const mui = UserService.Instance.myUserInfo;
     return mui
       ? `@${mui.local_user_view.person.name} ${I18NextService.i18n.t(
-          "inbox"
+          "inbox",
         )} - ${this.state.siteRes.site_view.site.name}`
       : "";
   }
@@ -246,7 +246,7 @@ export class Inbox extends Component<any, InboxState> {
                   <Spinner />
                 ) : (
                   capitalizeFirstLetter(
-                    I18NextService.i18n.t("mark_all_as_read")
+                    I18NextService.i18n.t("mark_all_as_read"),
                   )
                 )}
               </button>
@@ -455,12 +455,12 @@ export class Inbox extends Component<any, InboxState> {
     const messages: ReplyType[] =
       this.state.messagesRes.state === "success"
         ? this.state.messagesRes.data.private_messages.map(
-            this.messageToReplyType
+            this.messageToReplyType,
           )
         : [];
 
     return [...replies, ...mentions, ...messages].sort((a, b) =>
-      b.published.localeCompare(a.published)
+      b.published.localeCompare(a.published),
     );
   }
 
@@ -960,7 +960,7 @@ export class Inbox extends Component<any, InboxState> {
     this.setState(s => {
       if (s.messagesRes.state === "success" && res.state === "success") {
         s.messagesRes.data.private_messages.unshift(
-          res.data.private_message_view
+          res.data.private_message_view,
         );
       }
 
@@ -973,7 +973,7 @@ export class Inbox extends Component<any, InboxState> {
       if (s.messagesRes.state === "success" && res.state === "success") {
         s.messagesRes.data.private_messages = editPrivateMessage(
           res.data.private_message_view,
-          s.messagesRes.data.private_messages
+          s.messagesRes.data.private_messages,
         );
       }
       return s;
@@ -988,14 +988,14 @@ export class Inbox extends Component<any, InboxState> {
           s.repliesRes.data.replies
             .filter(c => c.creator.id === banRes.data.person_view.person.id)
             .forEach(
-              c => (c.creator_banned_from_community = banRes.data.banned)
+              c => (c.creator_banned_from_community = banRes.data.banned),
             );
         }
         if (s.mentionsRes.state === "success") {
           s.mentionsRes.data.mentions
             .filter(c => c.creator.id === banRes.data.person_view.person.id)
             .forEach(
-              c => (c.creator_banned_from_community = banRes.data.banned)
+              c => (c.creator_banned_from_community = banRes.data.banned),
             );
         }
         return s;
@@ -1030,7 +1030,7 @@ export class Inbox extends Component<any, InboxState> {
   }
 
   reportToast(
-    res: RequestState<PrivateMessageReportResponse | CommentReportResponse>
+    res: RequestState<PrivateMessageReportResponse | CommentReportResponse>,
   ) {
     if (res.state === "success") {
       toast(I18NextService.i18n.t("report_created"));
@@ -1044,19 +1044,19 @@ export class Inbox extends Component<any, InboxState> {
         if (s.repliesRes.state === "success") {
           s.repliesRes.data.replies = editWith(
             res.data.comment_view,
-            s.repliesRes.data.replies
+            s.repliesRes.data.replies,
           );
         }
         if (s.mentionsRes.state === "success") {
           s.mentionsRes.data.mentions = editWith(
             res.data.comment_view,
-            s.mentionsRes.data.mentions
+            s.mentionsRes.data.mentions,
           );
         }
         // Set finished for the parent
         s.finished.set(
           getCommentParentId(res.data.comment_view.comment) ?? 0,
-          true
+          true,
         );
         return s;
       });
@@ -1068,7 +1068,7 @@ export class Inbox extends Component<any, InboxState> {
       if (s.repliesRes.state === "success" && res.state === "success") {
         s.repliesRes.data.replies = editCommentReply(
           res.data.comment_reply_view,
-          s.repliesRes.data.replies
+          s.repliesRes.data.replies,
         );
       }
       return s;
@@ -1080,7 +1080,7 @@ export class Inbox extends Component<any, InboxState> {
       if (s.mentionsRes.state === "success" && res.state === "success") {
         s.mentionsRes.data.mentions = editMention(
           res.data.person_mention_view,
-          s.mentionsRes.data.mentions
+          s.mentionsRes.data.mentions,
         );
       }
       return s;
diff --git a/src/shared/components/person/person-listing.tsx b/src/shared/components/person/person-listing.tsx
index dfc5d66..287a16a 100644
--- a/src/shared/components/person/person-listing.tsx
+++ b/src/shared/components/person/person-listing.tsx
@@ -57,7 +57,7 @@ export class PersonListing extends Component<PersonListingProps, any> {
               {
                 "text-muted": this.props.muted,
                 "text-info": !this.props.muted,
-              }
+              },
             )}
             to={link}
           >
diff --git a/src/shared/components/person/profile.tsx b/src/shared/components/person/profile.tsx
index 9aaa3d3..a3a7f88 100644
--- a/src/shared/components/person/profile.tsx
+++ b/src/shared/components/person/profile.tsx
@@ -132,7 +132,7 @@ function getViewFromProps(view?: string): PersonDetailsView {
 
 const getCommunitiesListing = (
   translationKey: NoOptionI18nKeys,
-  communityViews?: { community: Community }[]
+  communityViews?: { community: Community }[],
 ) =>
   communityViews &&
   communityViews.length > 0 && (
@@ -266,7 +266,7 @@ export class Profile extends Component<
     if (mui && res.state === "success") {
       this.setState({
         personBlocked: mui.person_blocks.some(
-          ({ target: { id } }) => id === res.data.person_view.person.id
+          ({ target: { id } }) => id === res.data.person_view.person.id,
         ),
       });
     }
@@ -530,7 +530,7 @@ export class Profile extends Component<
                         }
                         onClick={linkEvent(
                           pv.person.id,
-                          this.handleUnblockPerson
+                          this.handleUnblockPerson,
                         )}
                       >
                         {I18NextService.i18n.t("unblock_user")}
@@ -542,7 +542,7 @@ export class Profile extends Component<
                         }
                         onClick={linkEvent(
                           pv.person.id,
-                          this.handleBlockPerson
+                          this.handleBlockPerson,
                         )}
                       >
                         {I18NextService.i18n.t("block_user")}
@@ -962,13 +962,13 @@ export class Profile extends Component<
           s.personRes.data.posts
             .filter(c => c.creator.id === banRes.data.person_view.person.id)
             .forEach(
-              c => (c.creator_banned_from_community = banRes.data.banned)
+              c => (c.creator_banned_from_community = banRes.data.banned),
             );
 
           s.personRes.data.comments
             .filter(c => c.creator.id === banRes.data.person_view.person.id)
             .forEach(
-              c => (c.creator_banned_from_community = banRes.data.banned)
+              c => (c.creator_banned_from_community = banRes.data.banned),
             );
         }
         return s;
@@ -1006,7 +1006,7 @@ export class Profile extends Component<
       if (s.personRes.state === "success" && res.state === "success") {
         s.personRes.data.comments = editComment(
           res.data.comment_view,
-          s.personRes.data.comments
+          s.personRes.data.comments,
         );
         s.finished.set(res.data.comment_view.comment.id, true);
       }
@@ -1021,7 +1021,7 @@ export class Profile extends Component<
         // Set finished for the parent
         s.finished.set(
           getCommentParentId(res.data.comment_view.comment) ?? 0,
-          true
+          true,
         );
       }
       return s;
@@ -1033,7 +1033,7 @@ export class Profile extends Component<
       if (s.personRes.state === "success" && res.state === "success") {
         s.personRes.data.comments = editWith(
           res.data.comment_reply_view,
-          s.personRes.data.comments
+          s.personRes.data.comments,
         );
       }
       return s;
@@ -1045,7 +1045,7 @@ export class Profile extends Component<
       if (s.personRes.state === "success" && res.state === "success") {
         s.personRes.data.posts = editPost(
           res.data.post_view,
-          s.personRes.data.posts
+          s.personRes.data.posts,
         );
       }
       return s;
diff --git a/src/shared/components/person/registration-applications.tsx b/src/shared/components/person/registration-applications.tsx
index fbf5f46..e9ec843 100644
--- a/src/shared/components/person/registration-applications.tsx
+++ b/src/shared/components/person/registration-applications.tsx
@@ -80,7 +80,7 @@ export class RegistrationApplications extends Component<
     const mui = UserService.Instance.myUserInfo;
     return mui
       ? `@${mui.local_user_view.person.name} ${I18NextService.i18n.t(
-          "registration_applications"
+          "registration_applications",
         )} - ${this.state.siteRes.site_view.site.name}`
       : "";
   }
@@ -236,13 +236,13 @@ export class RegistrationApplications extends Component<
 
   async handleApproveApplication(form: ApproveRegistrationApplication) {
     const approveRes = await HttpService.client.approveRegistrationApplication(
-      form
+      form,
     );
     this.setState(s => {
       if (s.appsRes.state === "success" && approveRes.state === "success") {
         s.appsRes.data.registration_applications = editRegistrationApplication(
           approveRes.data.registration_application,
-          s.appsRes.data.registration_applications
+          s.appsRes.data.registration_applications,
         );
       }
       return s;
diff --git a/src/shared/components/person/reports.tsx b/src/shared/components/person/reports.tsx
index ba488f6..dc09a95 100644
--- a/src/shared/components/person/reports.tsx
+++ b/src/shared/components/person/reports.tsx
@@ -140,7 +140,7 @@ export class Reports extends Component<any, ReportsState> {
     const mui = UserService.Instance.myUserInfo;
     return mui
       ? `@${mui.local_user_view.person.name} ${I18NextService.i18n.t(
-          "reports"
+          "reports",
         )} - ${this.state.siteRes.site_view.site.name}`
       : "";
   }
@@ -365,12 +365,12 @@ export class Reports extends Component<any, ReportsState> {
     const privateMessages =
       pmRes.state === "success"
         ? pmRes.data.private_message_reports.map(
-            this.privateMessageReportToItemType
+            this.privateMessageReportToItemType,
           )
         : [];
 
     return [...comments, ...posts, ...privateMessages].sort((a, b) =>
-      b.published.localeCompare(a.published)
+      b.published.localeCompare(a.published),
     );
   }
 
@@ -557,7 +557,7 @@ export class Reports extends Component<any, ReportsState> {
       };
 
       data.messageReportsRes = await client.listPrivateMessageReports(
-        privateMessageReportsForm
+        privateMessageReportsForm,
       );
     }
 
@@ -594,7 +594,7 @@ export class Reports extends Component<any, ReportsState> {
     if (amAdmin()) {
       this.setState({
         messageReportsRes: await HttpService.client.listPrivateMessageReports(
-          form
+          form,
         ),
       });
     }
@@ -620,7 +620,7 @@ export class Reports extends Component<any, ReportsState> {
       if (s.commentReportsRes.state === "success" && res.state === "success") {
         s.commentReportsRes.data.comment_reports = editCommentReport(
           res.data.comment_report_view,
-          s.commentReportsRes.data.comment_reports
+          s.commentReportsRes.data.comment_reports,
         );
       }
       return s;
@@ -632,7 +632,7 @@ export class Reports extends Component<any, ReportsState> {
       if (s.postReportsRes.state === "success" && res.state === "success") {
         s.postReportsRes.data.post_reports = editPostReport(
           res.data.post_report_view,
-          s.postReportsRes.data.post_reports
+          s.postReportsRes.data.post_reports,
         );
       }
       return s;
@@ -640,14 +640,14 @@ export class Reports extends Component<any, ReportsState> {
   }
 
   findAndUpdatePrivateMessageReport(
-    res: RequestState<PrivateMessageReportResponse>
+    res: RequestState<PrivateMessageReportResponse>,
   ) {
     this.setState(s => {
       if (s.messageReportsRes.state === "success" && res.state === "success") {
         s.messageReportsRes.data.private_message_reports =
           editPrivateMessageReport(
             res.data.private_message_report_view,
-            s.messageReportsRes.data.private_message_reports
+            s.messageReportsRes.data.private_message_reports,
           );
       }
       return s;
diff --git a/src/shared/components/person/settings.tsx b/src/shared/components/person/settings.tsx
index 4a6a21c..4b21d40 100644
--- a/src/shared/components/person/settings.tsx
+++ b/src/shared/components/person/settings.tsx
@@ -391,7 +391,7 @@ export class Settings extends Component<any, SettingsState> {
                   className="btn btn-sm"
                   onClick={linkEvent(
                     { ctx: this, recipientId: pb.target.id },
-                    this.handleUnblockPerson
+                    this.handleUnblockPerson,
                   )}
                   data-tippy-content={I18NextService.i18n.t("unblock_user")}
                 >
@@ -435,10 +435,10 @@ export class Settings extends Component<any, SettingsState> {
                   className="btn btn-sm"
                   onClick={linkEvent(
                     { ctx: this, communityId: cb.community.id },
-                    this.handleUnblockCommunity
+                    this.handleUnblockCommunity,
                   )}
                   data-tippy-content={I18NextService.i18n.t(
-                    "unblock_community"
+                    "unblock_community",
                   )}
                 >
                   <Icon icon="x" classes="icon-inline" />
@@ -767,7 +767,7 @@ export class Settings extends Component<any, SettingsState> {
                 }
                 onChange={linkEvent(
                   this,
-                  this.handleSendNotificationsToEmailChange
+                  this.handleSendNotificationsToEmailChange,
                 )}
               />
               <label
@@ -798,7 +798,7 @@ export class Settings extends Component<any, SettingsState> {
               className="btn d-block btn-danger"
               onClick={linkEvent(
                 this,
-                this.handleDeleteAccountShowConfirmToggle
+                this.handleDeleteAccountShowConfirmToggle,
               )}
             >
               {I18NextService.i18n.t("delete_account")}
@@ -817,7 +817,7 @@ export class Settings extends Component<any, SettingsState> {
                   value={this.state.deleteAccountForm.password}
                   onInput={linkEvent(
                     this,
-                    this.handleDeleteAccountPasswordChange
+                    this.handleDeleteAccountPasswordChange,
                   )}
                   className="my-2"
                 />
@@ -837,7 +837,7 @@ export class Settings extends Component<any, SettingsState> {
                   type="button"
                   onClick={linkEvent(
                     this,
-                    this.handleDeleteAccountShowConfirmToggle
+                    this.handleDeleteAccountShowConfirmToggle,
                   )}
                 >
                   {I18NextService.i18n.t("cancel")}
@@ -924,7 +924,7 @@ export class Settings extends Component<any, SettingsState> {
 
     if (text.length > 0) {
       searchCommunityOptions.push(
-        ...(await fetchCommunities(text)).map(communityToChoice)
+        ...(await fetchCommunities(text)).map(communityToChoice),
       );
     }
 
@@ -985,7 +985,7 @@ export class Settings extends Component<any, SettingsState> {
 
   handleShowNsfwChange(i: Settings, event: any) {
     i.setState(
-      s => ((s.saveUserSettingsForm.show_nsfw = event.target.checked), s)
+      s => ((s.saveUserSettingsForm.show_nsfw = event.target.checked), s),
     );
   }
 
@@ -995,13 +995,13 @@ export class Settings extends Component<any, SettingsState> {
       mui.local_user_view.local_user.show_avatars = event.target.checked;
     }
     i.setState(
-      s => ((s.saveUserSettingsForm.show_avatars = event.target.checked), s)
+      s => ((s.saveUserSettingsForm.show_avatars = event.target.checked), s),
     );
   }
 
   handleBotAccount(i: Settings, event: any) {
     i.setState(
-      s => ((s.saveUserSettingsForm.bot_account = event.target.checked), s)
+      s => ((s.saveUserSettingsForm.bot_account = event.target.checked), s),
     );
   }
 
@@ -1009,13 +1009,13 @@ export class Settings extends Component<any, SettingsState> {
     i.setState(
       s => (
         (s.saveUserSettingsForm.show_bot_accounts = event.target.checked), s
-      )
+      ),
     );
   }
 
   handleReadPosts(i: Settings, event: any) {
     i.setState(
-      s => ((s.saveUserSettingsForm.show_read_posts = event.target.checked), s)
+      s => ((s.saveUserSettingsForm.show_read_posts = event.target.checked), s),
     );
   }
 
@@ -1023,7 +1023,7 @@ export class Settings extends Component<any, SettingsState> {
     i.setState(
       s => (
         (s.saveUserSettingsForm.show_new_post_notifs = event.target.checked), s
-      )
+      ),
     );
   }
 
@@ -1033,7 +1033,7 @@ export class Settings extends Component<any, SettingsState> {
       mui.local_user_view.local_user.show_scores = event.target.checked;
     }
     i.setState(
-      s => ((s.saveUserSettingsForm.show_scores = event.target.checked), s)
+      s => ((s.saveUserSettingsForm.show_scores = event.target.checked), s),
     );
   }
 
@@ -1058,7 +1058,7 @@ export class Settings extends Component<any, SettingsState> {
         (s.saveUserSettingsForm.send_notifications_to_email =
           event.target.checked),
         s
-      )
+      ),
     );
   }
 
@@ -1070,17 +1070,19 @@ export class Settings extends Component<any, SettingsState> {
   handleInterfaceLangChange(i: Settings, event: any) {
     const newLang = event.target.value ?? "browser";
     I18NextService.i18n.changeLanguage(
-      newLang === "browser" ? navigator.languages : newLang
+      newLang === "browser" ? navigator.languages : newLang,
     );
 
     i.setState(
-      s => ((s.saveUserSettingsForm.interface_language = event.target.value), s)
+      s => (
+        (s.saveUserSettingsForm.interface_language = event.target.value), s
+      ),
     );
   }
 
   handleDiscussionLanguageChange(val: number[]) {
     this.setState(
-      s => ((s.saveUserSettingsForm.discussion_languages = val), s)
+      s => ((s.saveUserSettingsForm.discussion_languages = val), s),
     );
   }
 
@@ -1090,7 +1092,7 @@ export class Settings extends Component<any, SettingsState> {
 
   handleListingTypeChange(val: ListingType) {
     this.setState(
-      s => ((s.saveUserSettingsForm.default_listing_type = val), s)
+      s => ((s.saveUserSettingsForm.default_listing_type = val), s),
     );
   }
 
@@ -1120,13 +1122,13 @@ export class Settings extends Component<any, SettingsState> {
 
   handleDisplayNameChange(i: Settings, event: any) {
     i.setState(
-      s => ((s.saveUserSettingsForm.display_name = event.target.value), s)
+      s => ((s.saveUserSettingsForm.display_name = event.target.value), s),
     );
   }
 
   handleMatrixUserIdChange(i: Settings, event: any) {
     i.setState(
-      s => ((s.saveUserSettingsForm.matrix_user_id = event.target.value), s)
+      s => ((s.saveUserSettingsForm.matrix_user_id = event.target.value), s),
     );
   }
 
@@ -1140,7 +1142,7 @@ export class Settings extends Component<any, SettingsState> {
     const newPassVerify: string | undefined =
       event.target.value === "" ? undefined : event.target.value;
     i.setState(
-      s => ((s.changePasswordForm.new_password_verify = newPassVerify), s)
+      s => ((s.changePasswordForm.new_password_verify = newPassVerify), s),
     );
   }
 
diff --git a/src/shared/components/post/create-post.tsx b/src/shared/components/post/create-post.tsx
index 36bc99d..3c312c3 100644
--- a/src/shared/components/post/create-post.tsx
+++ b/src/shared/components/post/create-post.tsx
@@ -121,7 +121,7 @@ export class CreatePost extends Component<
       const { communityId } = getCreatePostQueryParams();
 
       const initialCommunitiesRes = await fetchCommunitiesForOptions(
-        HttpService.client
+        HttpService.client,
       );
 
       this.setState({
diff --git a/src/shared/components/post/post-form.tsx b/src/shared/components/post/post-form.tsx
index afa2fff..6431357 100644
--- a/src/shared/components/post/post-form.tsx
+++ b/src/shared/components/post/post-form.tsx
@@ -122,7 +122,7 @@ function copySuggestedTitle(d: { i: PostForm; suggestedTitle?: string }) {
   const sTitle = d.suggestedTitle;
   if (sTitle) {
     d.i.setState(
-      s => ((s.form.name = sTitle?.substring(0, MAX_POST_TITLE_LENGTH)), s)
+      s => ((s.form.name = sTitle?.substring(0, MAX_POST_TITLE_LENGTH)), s),
     );
     d.i.setState({ suggestedPostsRes: { state: "empty" } });
     setTimeout(() => {
@@ -271,9 +271,9 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
               ({ community: { id, title } }) => ({
                 label: title,
                 value: id.toString(),
-              })
+              }),
             ) ?? []
-          ).filter(option => option.value !== selectedCommunityChoice.value)
+          ).filter(option => option.value !== selectedCommunityChoice.value),
         ),
       };
     } else {
@@ -284,7 +284,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
             ({ community: { id, title } }) => ({
               label: title,
               value: id.toString(),
-            })
+            }),
           ) ?? [],
       };
     }
@@ -310,16 +310,16 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
   }
 
   componentWillReceiveProps(
-    nextProps: Readonly<{ children?: InfernoNode } & PostFormProps>
+    nextProps: Readonly<{ children?: InfernoNode } & PostFormProps>,
   ): void {
     if (this.props !== nextProps) {
       this.setState(
         s => (
           (s.form.community_id = getIdFromString(
-            nextProps.selectedCommunityChoice?.value
+            nextProps.selectedCommunityChoice?.value,
           )),
           s
-        )
+        ),
       );
     }
   }
@@ -367,7 +367,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
                 </a>
                 <a
                   href={`${ghostArchiveUrl}/search?term=${encodeURIComponent(
-                    url
+                    url,
                   )}`}
                   className="me-2 d-inline-block float-right text-muted small fw-bold"
                   rel={relTags}
@@ -376,7 +376,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
                 </a>
                 <a
                   href={`${archiveTodayUrl}/?run=1&url=${encodeURIComponent(
-                    url
+                    url,
                   )}`}
                   className="me-2 d-inline-block float-right text-muted small fw-bold"
                   rel={relTags}
@@ -590,7 +590,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
               className="mt-1 small border-0 bg-transparent p-0 d-block text-muted fw-bold pointer"
               onClick={linkEvent(
                 { i: this, suggestedTitle },
-                copySuggestedTitle
+                copySuggestedTitle,
               )}
             >
               {I18NextService.i18n.t("copy_suggested_title", { title: "" })}{" "}
diff --git a/src/shared/components/post/post-listing.tsx b/src/shared/components/post/post-listing.tsx
index d661443..c9a9985 100644
--- a/src/shared/components/post/post-listing.tsx
+++ b/src/shared/components/post/post-listing.tsx
@@ -419,7 +419,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
           <span className="mx-1 badge text-bg-light">
             {
               this.props.allLanguages.find(
-                lang => lang.id === post_view.post.language_id
+                lang => lang.id === post_view.post.language_id,
               )?.name
             }
           </span>
@@ -515,7 +515,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
             <small
               className="unselectable pointer ms-2 text-muted fst-italic"
               data-tippy-content={I18NextService.i18n.t(
-                "featured_in_community"
+                "featured_in_community",
               )}
               aria-label={I18NextService.i18n.t("featured_in_community")}
             >
@@ -1115,7 +1115,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
         className="btn btn-link btn-sm d-flex align-items-center rounded-0 dropdown-item"
         onClick={linkEvent(
           this,
-          !removed ? this.handleModRemoveShow : this.handleModRemoveSubmit
+          !removed ? this.handleModRemoveShow : this.handleModRemoveSubmit,
         )}
       >
         {/* TODO: Find an icon for this. */}
@@ -1188,7 +1188,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
               className="btn btn-link btn-animate text-muted py-0 d-inline-block"
               onClick={linkEvent(
                 this,
-                this.handleCancelShowConfirmTransferCommunity
+                this.handleCancelShowConfirmTransferCommunity,
               )}
               aria-label={I18NextService.i18n.t("no")}
             >
@@ -1772,7 +1772,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
       this.props.moderators,
       this.props.admins,
       undefined,
-      true
+      true,
     );
   }
 
@@ -1780,7 +1780,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
     return canMod(
       this.postView.creator.id,
       this.props.moderators,
-      this.props.admins
+      this.props.admins,
     );
   }
 
diff --git a/src/shared/components/post/post-report.tsx b/src/shared/components/post/post-report.tsx
index 8de646f..a860ae0 100644
--- a/src/shared/components/post/post-report.tsx
+++ b/src/shared/components/post/post-report.tsx
@@ -26,7 +26,7 @@ export class PostReport extends Component<PostReportProps, PostReportState> {
   }
 
   componentWillReceiveProps(
-    nextProps: Readonly<{ children?: InfernoNode } & PostReportProps>
+    nextProps: Readonly<{ children?: InfernoNode } & PostReportProps>,
   ): void {
     if (this.props !== nextProps) {
       this.setState({ loading: false });
@@ -38,7 +38,7 @@ export class PostReport extends Component<PostReportProps, PostReportState> {
     const resolver = r.resolver;
     const post = r.post;
     const tippyContent = I18NextService.i18n.t(
-      r.post_report.resolved ? "unresolve_report" : "resolve_report"
+      r.post_report.resolved ? "unresolve_report" : "resolve_report",
     );
 
     // Set the original post data ( a troll could change it )
diff --git a/src/shared/components/post/post.tsx b/src/shared/components/post/post.tsx
index b1b8e32..5819d25 100644
--- a/src/shared/components/post/post.tsx
+++ b/src/shared/components/post/post.tsx
@@ -290,7 +290,7 @@ export class Post extends Component<any, PostState> {
 
   get checkScrollIntoCommentsParam() {
     return Boolean(
-      new URLSearchParams(this.props.location.search).get("scrollToComments")
+      new URLSearchParams(this.props.location.search).get("scrollToComments"),
     );
   }
 
@@ -667,7 +667,7 @@ export class Post extends Component<any, PostState> {
     if (this.state.commentsRes.state === "success") {
       return buildCommentsTree(
         this.state.commentsRes.data.comments,
-        !!this.state.commentId
+        !!this.state.commentId,
       );
     } else {
       return [];
@@ -705,7 +705,7 @@ export class Post extends Component<any, PostState> {
   handleViewContext(i: Post) {
     if (i.state.commentsRes.state === "success") {
       const parentId = getCommentParentId(
-        i.state.commentsRes.data.comments.at(0)?.comment
+        i.state.commentsRes.data.comments.at(0)?.comment,
       );
       if (parentId) {
         i.context.router.history.push(`/comment/${parentId}`);
@@ -887,7 +887,7 @@ export class Post extends Component<any, PostState> {
 
   async handleTransferCommunity(form: TransferCommunity) {
     const transferCommunityRes = await HttpService.client.transferCommunity(
-      form
+      form,
     );
     this.updateCommunityFull(transferCommunityRes);
   }
@@ -943,7 +943,7 @@ export class Post extends Component<any, PostState> {
           s.commentsRes.data.comments
             .filter(c => c.creator.id === banRes.data.person_view.person.id)
             .forEach(
-              c => (c.creator_banned_from_community = banRes.data.banned)
+              c => (c.creator_banned_from_community = banRes.data.banned),
             );
         }
         return s;
@@ -1015,7 +1015,7 @@ export class Post extends Component<any, PostState> {
         // Set finished for the parent
         s.finished.set(
           getCommentParentId(res.data.comment_view.comment) ?? 0,
-          true
+          true,
         );
       }
       return s;
@@ -1027,7 +1027,7 @@ export class Post extends Component<any, PostState> {
       if (s.commentsRes.state === "success" && res.state === "success") {
         s.commentsRes.data.comments = editComment(
           res.data.comment_view,
-          s.commentsRes.data.comments
+          s.commentsRes.data.comments,
         );
         s.finished.set(res.data.comment_view.comment.id, true);
       }
@@ -1040,7 +1040,7 @@ export class Post extends Component<any, PostState> {
       if (s.commentsRes.state === "success" && res.state === "success") {
         s.commentsRes.data.comments = editWith(
           res.data.comment_reply_view,
-          s.commentsRes.data.comments
+          s.commentsRes.data.comments,
         );
       }
       return s;
diff --git a/src/shared/components/private_message/private-message-form.tsx b/src/shared/components/private_message/private-message-form.tsx
index 60d064f..ef53430 100644
--- a/src/shared/components/private_message/private-message-form.tsx
+++ b/src/shared/components/private_message/private-message-form.tsx
@@ -56,7 +56,7 @@ export class PrivateMessageForm extends Component<
   }
 
   componentWillReceiveProps(
-    nextProps: Readonly<{ children?: InfernoNode } & PrivateMessageFormProps>
+    nextProps: Readonly<{ children?: InfernoNode } & PrivateMessageFormProps>,
   ): void {
     if (this.props !== nextProps) {
       this.setState({ loading: false, content: undefined, previewMode: false });
diff --git a/src/shared/components/private_message/private-message-report.tsx b/src/shared/components/private_message/private-message-report.tsx
index de6ef77..1aa3d7c 100644
--- a/src/shared/components/private_message/private-message-report.tsx
+++ b/src/shared/components/private_message/private-message-report.tsx
@@ -29,7 +29,7 @@ export class PrivateMessageReport extends Component<Props, State> {
   }
 
   componentWillReceiveProps(
-    nextProps: Readonly<{ children?: InfernoNode } & Props>
+    nextProps: Readonly<{ children?: InfernoNode } & Props>,
   ): void {
     if (this.props !== nextProps) {
       this.setState({ loading: false });
@@ -40,7 +40,7 @@ export class PrivateMessageReport extends Component<Props, State> {
     const r = this.props.report;
     const pmr = r.private_message_report;
     const tippyContent = I18NextService.i18n.t(
-      r.private_message_report.resolved ? "unresolve_report" : "resolve_report"
+      r.private_message_report.resolved ? "unresolve_report" : "resolve_report",
     );
 
     return (
diff --git a/src/shared/components/private_message/private-message.tsx b/src/shared/components/private_message/private-message.tsx
index 099d875..c185c11 100644
--- a/src/shared/components/private_message/private-message.tsx
+++ b/src/shared/components/private_message/private-message.tsx
@@ -65,7 +65,7 @@ export class PrivateMessage extends Component<
   }
 
   componentWillReceiveProps(
-    nextProps: Readonly<{ children?: InfernoNode } & PrivateMessageProps>
+    nextProps: Readonly<{ children?: InfernoNode } & PrivateMessageProps>,
   ): void {
     if (this.props !== nextProps) {
       this.setState({
diff --git a/src/shared/components/search.tsx b/src/shared/components/search.tsx
index 2891870..3248db1 100644
--- a/src/shared/components/search.tsx
+++ b/src/shared/components/search.tsx
@@ -209,20 +209,20 @@ const communityListing = ({
   getListing(
     <CommunityLink community={community} />,
     subscribers,
-    "number_of_subscribers"
+    "number_of_subscribers",
   );
 
 const personListing = ({ person, counts: { comment_count } }: PersonView) =>
   getListing(
     <PersonListing person={person} showApubName />,
     comment_count,
-    "number_of_comments"
+    "number_of_comments",
   );
 
 function getListing(
   listing: JSX.ElementClass,
   count: number,
-  translationKey: "number_of_comments" | "number_of_subscribers"
+  translationKey: "number_of_comments" | "number_of_subscribers",
 ) {
   return (
     <>
@@ -386,7 +386,7 @@ export class Search extends Component<any, SearchState> {
       };
 
       listCommunitiesResponse = await client.listCommunities(
-        listCommunitiesForm
+        listCommunitiesForm,
       );
     }
 
@@ -431,7 +431,7 @@ export class Search extends Component<any, SearchState> {
             auth,
           };
           resolveObjectResponse = await HttpService.silent_client.resolveObject(
-            resolveObjectForm
+            resolveObjectForm,
           );
 
           // If we return this object with a state of failed, the catch-all-handler will redirect
@@ -564,7 +564,7 @@ export class Search extends Component<any, SearchState> {
               {searchTypes.map(option => (
                 <option value={option} key={option}>
                   {I18NextService.i18n.t(
-                    option.toString().toLowerCase() as NoOptionI18nKeys
+                    option.toString().toLowerCase() as NoOptionI18nKeys,
                   )}
                 </option>
               ))}
@@ -646,7 +646,7 @@ export class Search extends Component<any, SearchState> {
           ...(posts?.map(postViewToCombined) ?? []),
           ...(communities?.map(communityViewToCombined) ?? []),
           ...(users?.map(personViewSafeToCombined) ?? []),
-        ]
+        ],
       );
     }
 
@@ -663,8 +663,8 @@ export class Search extends Component<any, SearchState> {
             (b.data as PersonView).counts.comment_score) -
             ((a.data as CommentView | PostView).counts.score |
               (a.data as CommunityView).counts.subscribers |
-              (a.data as PersonView).counts.comment_score)
-        )
+              (a.data as PersonView).counts.comment_score),
+        ),
       );
     }
 
@@ -984,7 +984,7 @@ export class Search extends Component<any, SearchState> {
     this.setState({ searchCreatorLoading: true });
 
     const selectedChoice = creatorSearchOptions.find(
-      choice => getIdFromString(choice.value) === creatorId
+      choice => getIdFromString(choice.value) === creatorId,
     );
 
     if (selectedChoice) {
@@ -1011,7 +1011,7 @@ export class Search extends Component<any, SearchState> {
     const newOptions: Choice[] = [];
 
     const selectedChoice = communitySearchOptions.find(
-      choice => getIdFromString(choice.value) === communityId
+      choice => getIdFromString(choice.value) === communityId,
     );
 
     if (selectedChoice) {
diff --git a/src/shared/markdown.ts b/src/shared/markdown.ts
index 4762d4b..8927c32 100644
--- a/src/shared/markdown.ts
+++ b/src/shared/markdown.ts
@@ -191,7 +191,7 @@ export function setupMarkdown() {
     idx: number,
     options: MarkdownIt.Options,
     env: any,
-    self: Renderer
+    self: Renderer,
   ) {
     //Provide custom renderer for our emojis to allow us to add a css class and force size dimensions on them.
     const item = tokens[idx] as any;
@@ -215,7 +215,7 @@ export function setupMarkdown() {
 export function setupEmojiDataModel(custom_emoji_views: CustomEmojiView[]) {
   const groupedEmojis = groupBy(
     custom_emoji_views,
-    x => x.custom_emoji.category
+    x => x.custom_emoji.category,
   );
   for (const [category, emojis] of Object.entries(groupedEmojis)) {
     customEmojis.push({
@@ -230,7 +230,7 @@ export function setupEmojiDataModel(custom_emoji_views: CustomEmojiView[]) {
     });
   }
   customEmojisLookup = new Map(
-    custom_emoji_views.map(view => [view.custom_emoji.shortcode, view])
+    custom_emoji_views.map(view => [view.custom_emoji.shortcode, view]),
   );
 }
 
@@ -242,7 +242,7 @@ export function updateEmojiDataModel(custom_emoji_view: CustomEmojiView) {
     skins: [{ src: custom_emoji_view.custom_emoji.image_url }],
   };
   const categoryIndex = customEmojis.findIndex(
-    x => x.id === custom_emoji_view.custom_emoji.category
+    x => x.id === custom_emoji_view.custom_emoji.category,
   );
   if (categoryIndex === -1) {
     customEmojis.push({
@@ -252,7 +252,7 @@ export function updateEmojiDataModel(custom_emoji_view: CustomEmojiView) {
     });
   } else {
     const emojiIndex = customEmojis[categoryIndex].emojis.findIndex(
-      x => x.id === custom_emoji_view.custom_emoji.shortcode
+      x => x.id === custom_emoji_view.custom_emoji.shortcode,
     );
     if (emojiIndex === -1) {
       customEmojis[categoryIndex].emojis.push(emoji);
@@ -262,7 +262,7 @@ export function updateEmojiDataModel(custom_emoji_view: CustomEmojiView) {
   }
   customEmojisLookup.set(
     custom_emoji_view.custom_emoji.shortcode,
-    custom_emoji_view
+    custom_emoji_view,
   );
 }
 
@@ -276,10 +276,10 @@ export function removeFromEmojiDataModel(id: number) {
   }
   if (!view) return;
   const categoryIndex = customEmojis.findIndex(
-    x => x.id === view?.custom_emoji.category
+    x => x.id === view?.custom_emoji.category,
   );
   const emojiIndex = customEmojis[categoryIndex].emojis.findIndex(
-    x => x.id === view?.custom_emoji.shortcode
+    x => x.id === view?.custom_emoji.shortcode,
   );
   customEmojis[categoryIndex].emojis = customEmojis[
     categoryIndex
@@ -290,7 +290,7 @@ export function removeFromEmojiDataModel(id: number) {
 
 export function getEmojiMart(
   onEmojiSelect: (e: any) => void,
-  customPickerOptions: any = {}
+  customPickerOptions: any = {},
 ) {
   const pickerOptions = {
     ...customPickerOptions,
@@ -314,9 +314,8 @@ export function setupTribute() {
           return `${item.original.val} ${shortName}`;
         },
         selectTemplate: (item: any) => {
-          const customEmoji = customEmojisLookup.get(
-            item.original.key
-          )?.custom_emoji;
+          const customEmoji = customEmojisLookup.get(item.original.key)
+            ?.custom_emoji;
           if (customEmoji === undefined) return `${item.original.val}`;
           else
             return `![${customEmoji.alt_text}](${customEmoji.image_url} "${customEmoji.shortcode}")`;
@@ -329,7 +328,7 @@ export function setupTribute() {
             Array.from(customEmojisLookup.entries()).map(k => ({
               key: k[0],
               val: `<img class="icon icon-emoji" src="${k[1].custom_emoji.image_url}" title="${k[1].custom_emoji.shortcode}" alt="${k[1].custom_emoji.alt_text}" />`,
-            }))
+            })),
           ),
         allowSpaces: false,
         autocompleteMode: true,
diff --git a/src/shared/services/HttpService.ts b/src/shared/services/HttpService.ts
index 11ec292..8ba9ac6 100644
--- a/src/shared/services/HttpService.ts
+++ b/src/shared/services/HttpService.ts
@@ -49,7 +49,7 @@ class WrappedLemmyHttpClient {
     this.#client = client;
 
     for (const key of Object.getOwnPropertyNames(
-      Object.getPrototypeOf(this.#client)
+      Object.getPrototypeOf(this.#client),
     )) {
       if (key !== "constructor") {
         WrappedLemmyHttpClient.prototype[key] = async (...args) => {
@@ -80,7 +80,7 @@ export function wrapClient(client: LemmyHttp, silent = false) {
   // unfortunately, this verbose cast is necessary
   return new WrappedLemmyHttpClient(
     client,
-    silent
+    silent,
   ) as unknown as WrappedLemmyHttp;
 }
 
diff --git a/src/shared/toast.ts b/src/shared/toast.ts
index bd9b8a4..01ef774 100644
--- a/src/shared/toast.ts
+++ b/src/shared/toast.ts
@@ -28,7 +28,7 @@ export function pictrsDeleteToast(filename: string, deleteUrl: string) {
       "failed_to_delete_picture",
       {
         filename,
-      }
+      },
     );
 
     const backgroundColor = `var(--bs-light)`;
diff --git a/src/shared/utils/app/build-comments-tree.ts b/src/shared/utils/app/build-comments-tree.ts
index 8857fa4..2b47e39 100644
--- a/src/shared/utils/app/build-comments-tree.ts
+++ b/src/shared/utils/app/build-comments-tree.ts
@@ -4,7 +4,7 @@ import { CommentNodeI } from "../../interfaces";
 
 export default function buildCommentsTree(
   comments: CommentView[],
-  parentComment: boolean
+  parentComment: boolean,
 ): CommentNodeI[] {
   const map = new Map<number, CommentNodeI>();
   const depthOffset = !parentComment
diff --git a/src/shared/utils/app/comments-to-flat-nodes.ts b/src/shared/utils/app/comments-to-flat-nodes.ts
index bc80015..1e9908b 100644
--- a/src/shared/utils/app/comments-to-flat-nodes.ts
+++ b/src/shared/utils/app/comments-to-flat-nodes.ts
@@ -2,7 +2,7 @@ import { CommentView } from "lemmy-js-client";
 import { CommentNodeI } from "../../interfaces";
 
 export default function commentsToFlatNodes(
-  comments: CommentView[]
+  comments: CommentView[],
 ): CommentNodeI[] {
   const nodes: CommentNodeI[] = [];
   for (const comment of comments) {
diff --git a/src/shared/utils/app/community-search.ts b/src/shared/utils/app/community-search.ts
index 4661c30..416da88 100644
--- a/src/shared/utils/app/community-search.ts
+++ b/src/shared/utils/app/community-search.ts
@@ -3,7 +3,7 @@ import { hostname } from "@utils/helpers";
 import { CommunityTribute } from "@utils/types";
 
 export default async function communitySearch(
-  text: string
+  text: string,
 ): Promise<CommunityTribute[]> {
   const communitiesResponse = await fetchCommunities(text);
 
diff --git a/src/shared/utils/app/convert-comment-sort-type.ts b/src/shared/utils/app/convert-comment-sort-type.ts
index 2f920d4..706671f 100644
--- a/src/shared/utils/app/convert-comment-sort-type.ts
+++ b/src/shared/utils/app/convert-comment-sort-type.ts
@@ -1,7 +1,7 @@
 import { CommentSortType, SortType } from "lemmy-js-client";
 
 export default function convertCommentSortType(
-  sort: SortType
+  sort: SortType,
 ): CommentSortType {
   switch (sort) {
     case "TopAll":
diff --git a/src/shared/utils/app/edit-comment-reply.ts b/src/shared/utils/app/edit-comment-reply.ts
index fe1eb62..812f283 100644
--- a/src/shared/utils/app/edit-comment-reply.ts
+++ b/src/shared/utils/app/edit-comment-reply.ts
@@ -3,7 +3,7 @@ import { CommentReplyView } from "lemmy-js-client";
 
 export default function editCommentReply(
   data: CommentReplyView,
-  replies: CommentReplyView[]
+  replies: CommentReplyView[],
 ): CommentReplyView[] {
   return editListImmutable("comment_reply", data, replies);
 }
diff --git a/src/shared/utils/app/edit-comment-report.ts b/src/shared/utils/app/edit-comment-report.ts
index c57b4d5..90632ff 100644
--- a/src/shared/utils/app/edit-comment-report.ts
+++ b/src/shared/utils/app/edit-comment-report.ts
@@ -3,7 +3,7 @@ import { CommentReportView } from "lemmy-js-client";
 
 export default function editCommentReport(
   data: CommentReportView,
-  reports: CommentReportView[]
+  reports: CommentReportView[],
 ): CommentReportView[] {
   return editListImmutable("comment_report", data, reports);
 }
diff --git a/src/shared/utils/app/edit-comment.ts b/src/shared/utils/app/edit-comment.ts
index 90c9c1b..08ff420 100644
--- a/src/shared/utils/app/edit-comment.ts
+++ b/src/shared/utils/app/edit-comment.ts
@@ -3,7 +3,7 @@ import { CommentView } from "lemmy-js-client";
 
 export default function editComment(
   data: CommentView,
-  comments: CommentView[]
+  comments: CommentView[],
 ): CommentView[] {
   return editListImmutable("comment", data, comments);
 }
diff --git a/src/shared/utils/app/edit-community.ts b/src/shared/utils/app/edit-community.ts
index f902142..8b07a60 100644
--- a/src/shared/utils/app/edit-community.ts
+++ b/src/shared/utils/app/edit-community.ts
@@ -3,7 +3,7 @@ import { CommunityView } from "lemmy-js-client";
 
 export default function editCommunity(
   data: CommunityView,
-  communities: CommunityView[]
+  communities: CommunityView[],
 ): CommunityView[] {
   return editListImmutable("community", data, communities);
 }
diff --git a/src/shared/utils/app/edit-mention.ts b/src/shared/utils/app/edit-mention.ts
index ce372b8..1f9cdfe 100644
--- a/src/shared/utils/app/edit-mention.ts
+++ b/src/shared/utils/app/edit-mention.ts
@@ -3,7 +3,7 @@ import { PersonMentionView } from "lemmy-js-client";
 
 export default function editMention(
   data: PersonMentionView,
-  comments: PersonMentionView[]
+  comments: PersonMentionView[],
 ): PersonMentionView[] {
   return editListImmutable("person_mention", data, comments);
 }
diff --git a/src/shared/utils/app/edit-post-report.ts b/src/shared/utils/app/edit-post-report.ts
index 721a141..a450196 100644
--- a/src/shared/utils/app/edit-post-report.ts
+++ b/src/shared/utils/app/edit-post-report.ts
@@ -3,7 +3,7 @@ import { PostReportView } from "lemmy-js-client";
 
 export default function editPostReport(
   data: PostReportView,
-  reports: PostReportView[]
+  reports: PostReportView[],
 ) {
   return editListImmutable("post_report", data, reports);
 }
diff --git a/src/shared/utils/app/edit-post.ts b/src/shared/utils/app/edit-post.ts
index 0c78fce..05683f1 100644
--- a/src/shared/utils/app/edit-post.ts
+++ b/src/shared/utils/app/edit-post.ts
@@ -3,7 +3,7 @@ import { PostView } from "lemmy-js-client";
 
 export default function editPost(
   data: PostView,
-  posts: PostView[]
+  posts: PostView[],
 ): PostView[] {
   return editListImmutable("post", data, posts);
 }
diff --git a/src/shared/utils/app/edit-private-message-report.ts b/src/shared/utils/app/edit-private-message-report.ts
index 2fb001f..4e534fd 100644
--- a/src/shared/utils/app/edit-private-message-report.ts
+++ b/src/shared/utils/app/edit-private-message-report.ts
@@ -3,7 +3,7 @@ import { PrivateMessageReportView } from "lemmy-js-client";
 
 export default function editPrivateMessageReport(
   data: PrivateMessageReportView,
-  reports: PrivateMessageReportView[]
+  reports: PrivateMessageReportView[],
 ): PrivateMessageReportView[] {
   return editListImmutable("private_message_report", data, reports);
 }
diff --git a/src/shared/utils/app/edit-private-message.ts b/src/shared/utils/app/edit-private-message.ts
index 8bb8ed9..99b2335 100644
--- a/src/shared/utils/app/edit-private-message.ts
+++ b/src/shared/utils/app/edit-private-message.ts
@@ -3,7 +3,7 @@ import { PrivateMessageView } from "lemmy-js-client";
 
 export default function editPrivateMessage(
   data: PrivateMessageView,
-  messages: PrivateMessageView[]
+  messages: PrivateMessageView[],
 ): PrivateMessageView[] {
   return editListImmutable("private_message", data, messages);
 }
diff --git a/src/shared/utils/app/edit-registration-application.ts b/src/shared/utils/app/edit-registration-application.ts
index 9a100cb..2ada6e3 100644
--- a/src/shared/utils/app/edit-registration-application.ts
+++ b/src/shared/utils/app/edit-registration-application.ts
@@ -3,7 +3,7 @@ import { RegistrationApplicationView } from "lemmy-js-client";
 
 export default function editRegistrationApplication(
   data: RegistrationApplicationView,
-  apps: RegistrationApplicationView[]
+  apps: RegistrationApplicationView[],
 ): RegistrationApplicationView[] {
   return editListImmutable("registration_application", data, apps);
 }
diff --git a/src/shared/utils/app/edit-with.ts b/src/shared/utils/app/edit-with.ts
index 6aa09e3..9003f76 100644
--- a/src/shared/utils/app/edit-with.ts
+++ b/src/shared/utils/app/edit-with.ts
@@ -2,13 +2,13 @@ import { WithComment } from "@utils/types";
 
 export default function editWith<D extends WithComment, L extends WithComment>(
   { comment, counts, saved, my_vote }: D,
-  list: L[]
+  list: L[],
 ) {
   return [
     ...list.map(c =>
       c.comment.id === comment.id
         ? { ...c, comment, counts, saved, my_vote }
-        : c
+        : c,
     ),
   ];
 }
diff --git a/src/shared/utils/app/get-comment-parent-id.ts b/src/shared/utils/app/get-comment-parent-id.ts
index 051446d..feaf5cc 100644
--- a/src/shared/utils/app/get-comment-parent-id.ts
+++ b/src/shared/utils/app/get-comment-parent-id.ts
@@ -1,7 +1,7 @@
 import { Comment } from "lemmy-js-client";
 
 export default function getCommentParentId(
-  comment?: Comment
+  comment?: Comment,
 ): number | undefined {
   const split = comment?.path.split(".");
   // remove the 0
diff --git a/src/shared/utils/app/get-depth-from-comment.ts b/src/shared/utils/app/get-depth-from-comment.ts
index caf757b..e8bbdee 100644
--- a/src/shared/utils/app/get-depth-from-comment.ts
+++ b/src/shared/utils/app/get-depth-from-comment.ts
@@ -1,7 +1,7 @@
 import { Comment } from "lemmy-js-client";
 
 export default function getDepthFromComment(
-  comment?: Comment
+  comment?: Comment,
 ): number | undefined {
   const len = comment?.path.split(".").length;
   return len ? len - 2 : undefined;
diff --git a/src/shared/utils/app/get-updated-search-id.ts b/src/shared/utils/app/get-updated-search-id.ts
index 47863be..cf235f2 100644
--- a/src/shared/utils/app/get-updated-search-id.ts
+++ b/src/shared/utils/app/get-updated-search-id.ts
@@ -1,6 +1,6 @@
 export default function getUpdatedSearchId(
   id?: number | null,
-  urlId?: number | null
+  urlId?: number | null,
 ) {
   return id === null
     ? undefined
diff --git a/src/shared/utils/app/insert-comment-into-tree.ts b/src/shared/utils/app/insert-comment-into-tree.ts
index a74f727..5895428 100644
--- a/src/shared/utils/app/insert-comment-into-tree.ts
+++ b/src/shared/utils/app/insert-comment-into-tree.ts
@@ -5,7 +5,7 @@ import { CommentNodeI } from "../../interfaces";
 export default function insertCommentIntoTree(
   tree: CommentNodeI[],
   cv: CommentView,
-  parentComment: boolean
+  parentComment: boolean,
 ) {
   // Building a fake node to be used for later
   const node: CommentNodeI = {
diff --git a/src/shared/utils/app/is-auth-path.ts b/src/shared/utils/app/is-auth-path.ts
index fc65e0c..1048368 100644
--- a/src/shared/utils/app/is-auth-path.ts
+++ b/src/shared/utils/app/is-auth-path.ts
@@ -1,5 +1,5 @@
 export default function isAuthPath(pathname: string) {
   return /^\/(create_.*?|inbox|settings|admin|reports|registration_applications)\b/g.test(
-    pathname
+    pathname,
   );
 }
diff --git a/src/shared/utils/app/is-post-blocked.ts b/src/shared/utils/app/is-post-blocked.ts
index a0c6957..3f5323b 100644
--- a/src/shared/utils/app/is-post-blocked.ts
+++ b/src/shared/utils/app/is-post-blocked.ts
@@ -3,7 +3,7 @@ import { UserService } from "../../services";
 
 export default function isPostBlocked(
   pv: PostView,
-  myUserInfo: MyUserInfo | undefined = UserService.Instance.myUserInfo
+  myUserInfo: MyUserInfo | undefined = UserService.Instance.myUserInfo,
 ): boolean {
   return (
     (myUserInfo?.community_blocks
diff --git a/src/shared/utils/app/nsfw-check.ts b/src/shared/utils/app/nsfw-check.ts
index a710775..d83af43 100644
--- a/src/shared/utils/app/nsfw-check.ts
+++ b/src/shared/utils/app/nsfw-check.ts
@@ -3,7 +3,7 @@ import { UserService } from "../../services";
 
 export default function nsfwCheck(
   pv: PostView,
-  myUserInfo = UserService.Instance.myUserInfo
+  myUserInfo = UserService.Instance.myUserInfo,
 ): boolean {
   const nsfw = pv.post.nsfw || pv.community.nsfw;
   const myShowNsfw = myUserInfo?.local_user_view.local_user.show_nsfw ?? false;
diff --git a/src/shared/utils/app/person-search.ts b/src/shared/utils/app/person-search.ts
index 2356466..fdfb5e7 100644
--- a/src/shared/utils/app/person-search.ts
+++ b/src/shared/utils/app/person-search.ts
@@ -3,7 +3,7 @@ import { hostname } from "@utils/helpers";
 import { PersonTribute } from "@utils/types";
 
 export default async function personSearch(
-  text: string
+  text: string,
 ): Promise<PersonTribute[]> {
   const usersResponse = await fetchUsers(text);
 
diff --git a/src/shared/utils/app/search-comment-tree.ts b/src/shared/utils/app/search-comment-tree.ts
index be1016c..847e696 100644
--- a/src/shared/utils/app/search-comment-tree.ts
+++ b/src/shared/utils/app/search-comment-tree.ts
@@ -2,7 +2,7 @@ import { CommentNodeI } from "../../interfaces";
 
 export default function searchCommentTree(
   tree: CommentNodeI[],
-  id: number
+  id: number,
 ): CommentNodeI | undefined {
   for (const node of tree) {
     if (node.comment_view.comment.id === id) {
diff --git a/src/shared/utils/app/selectable-languages.ts b/src/shared/utils/app/selectable-languages.ts
index d1754cc..521ea45 100644
--- a/src/shared/utils/app/selectable-languages.ts
+++ b/src/shared/utils/app/selectable-languages.ts
@@ -13,7 +13,7 @@ export default function selectableLanguages(
   siteLanguages: number[],
   showAll?: boolean,
   showSite?: boolean,
-  myUserInfo = UserService.Instance.myUserInfo
+  myUserInfo = UserService.Instance.myUserInfo,
 ): Language[] {
   const allLangIds = allLanguages.map(l => l.id);
   let myLangs = myUserInfo?.discussion_languages ?? allLangIds;
diff --git a/src/shared/utils/app/set-iso-data.ts b/src/shared/utils/app/set-iso-data.ts
index 1e149bb..ea8e3db 100644
--- a/src/shared/utils/app/set-iso-data.ts
+++ b/src/shared/utils/app/set-iso-data.ts
@@ -2,7 +2,7 @@ import { isBrowser } from "@utils/browser";
 import { IsoData, RouteData } from "../../interfaces";
 
 export default function setIsoData<T extends RouteData>(
-  context: any
+  context: any,
 ): IsoData<T> {
   // If its the browser, you need to deserialize the data from the window
   if (isBrowser()) {
diff --git a/src/shared/utils/app/setup-date-fns.ts b/src/shared/utils/app/setup-date-fns.ts
index 97e0c2e..aed5e22 100644
--- a/src/shared/utils/app/setup-date-fns.ts
+++ b/src/shared/utils/app/setup-date-fns.ts
@@ -30,7 +30,7 @@ export default async function () {
     ).default;
   } catch (e) {
     console.log(
-      `Could not load locale ${lang} from date-fns, falling back to ${EN_US}`
+      `Could not load locale ${lang} from date-fns, falling back to ${EN_US}`,
     );
     locale = (
       await import(
diff --git a/src/shared/utils/app/show-avatars.ts b/src/shared/utils/app/show-avatars.ts
index 34cf943..4ea022d 100644
--- a/src/shared/utils/app/show-avatars.ts
+++ b/src/shared/utils/app/show-avatars.ts
@@ -1,7 +1,7 @@
 import { UserService } from "../../services";
 
 export default function showAvatars(
-  myUserInfo = UserService.Instance.myUserInfo
+  myUserInfo = UserService.Instance.myUserInfo,
 ): boolean {
   return myUserInfo?.local_user_view.local_user.show_avatars ?? true;
 }
diff --git a/src/shared/utils/app/show-scores.ts b/src/shared/utils/app/show-scores.ts
index ea26634..03e2cd0 100644
--- a/src/shared/utils/app/show-scores.ts
+++ b/src/shared/utils/app/show-scores.ts
@@ -1,7 +1,7 @@
 import { UserService } from "../../services";
 
 export default function showScores(
-  myUserInfo = UserService.Instance.myUserInfo
+  myUserInfo = UserService.Instance.myUserInfo,
 ): boolean {
   return myUserInfo?.local_user_view.local_user.show_scores ?? true;
 }
diff --git a/src/shared/utils/app/update-community-block.ts b/src/shared/utils/app/update-community-block.ts
index 9faa1ca..dd33fbf 100644
--- a/src/shared/utils/app/update-community-block.ts
+++ b/src/shared/utils/app/update-community-block.ts
@@ -4,7 +4,7 @@ import { toast } from "../../toast";
 
 export default function updateCommunityBlock(
   data: BlockCommunityResponse,
-  myUserInfo: MyUserInfo | undefined = UserService.Instance.myUserInfo
+  myUserInfo: MyUserInfo | undefined = UserService.Instance.myUserInfo,
 ) {
   if (myUserInfo) {
     if (data.blocked) {
@@ -15,16 +15,16 @@ export default function updateCommunityBlock(
       toast(
         `${I18NextService.i18n.t("blocked")} ${
           data.community_view.community.name
-        }`
+        }`,
       );
     } else {
       myUserInfo.community_blocks = myUserInfo.community_blocks.filter(
-        i => i.community.id !== data.community_view.community.id
+        i => i.community.id !== data.community_view.community.id,
       );
       toast(
         `${I18NextService.i18n.t("unblocked")} ${
           data.community_view.community.name
-        }`
+        }`,
       );
     }
   }
diff --git a/src/shared/utils/app/update-person-block.ts b/src/shared/utils/app/update-person-block.ts
index cec72a3..08c77d4 100644
--- a/src/shared/utils/app/update-person-block.ts
+++ b/src/shared/utils/app/update-person-block.ts
@@ -4,7 +4,7 @@ import { toast } from "../../toast";
 
 export default function updatePersonBlock(
   data: BlockPersonResponse,
-  myUserInfo: MyUserInfo | undefined = UserService.Instance.myUserInfo
+  myUserInfo: MyUserInfo | undefined = UserService.Instance.myUserInfo,
 ) {
   if (myUserInfo) {
     if (data.blocked) {
@@ -13,14 +13,14 @@ export default function updatePersonBlock(
         target: data.person_view.person,
       });
       toast(
-        `${I18NextService.i18n.t("blocked")} ${data.person_view.person.name}`
+        `${I18NextService.i18n.t("blocked")} ${data.person_view.person.name}`,
       );
     } else {
       myUserInfo.person_blocks = myUserInfo.person_blocks.filter(
-        i => i.target.id !== data.person_view.person.id
+        i => i.target.id !== data.person_view.person.id,
       );
       toast(
-        `${I18NextService.i18n.t("unblocked")} ${data.person_view.person.name}`
+        `${I18NextService.i18n.t("unblocked")} ${data.person_view.person.name}`,
       );
     }
   }
diff --git a/src/shared/utils/env/http-external-path.ts b/src/shared/utils/env/http-external-path.ts
index f24ccac..e1f3df8 100644
--- a/src/shared/utils/env/http-external-path.ts
+++ b/src/shared/utils/env/http-external-path.ts
@@ -4,6 +4,6 @@ import { getExternalHost, getSecure } from "@utils/env";
 export default function httpExternalPath(path: string) {
   return `http${getSecure()}://${getExternalHost().replace(
     /:\d+/g,
-    ""
+    "",
   )}${path}`;
 }
diff --git a/src/shared/utils/helpers/debounce.ts b/src/shared/utils/helpers/debounce.ts
index 7e3b6f0..ccc6842 100644
--- a/src/shared/utils/helpers/debounce.ts
+++ b/src/shared/utils/helpers/debounce.ts
@@ -1,7 +1,7 @@
 export default function debounce<T extends any[], R>(
   func: (...e: T) => R,
   wait = 1000,
-  immediate = false
+  immediate = false,
 ) {
   let timeout: NodeJS.Timeout | null;
 
diff --git a/src/shared/utils/helpers/edit-list-immutable.ts b/src/shared/utils/helpers/edit-list-immutable.ts
index 7ebce70..77332d4 100644
--- a/src/shared/utils/helpers/edit-list-immutable.ts
+++ b/src/shared/utils/helpers/edit-list-immutable.ts
@@ -12,7 +12,7 @@ type ImmutableListKey =
 
 export default function editListImmutable<
   T extends { [key in F]: { id: number } },
-  F extends ImmutableListKey
+  F extends ImmutableListKey,
 >(fieldName: F, data: T, list: T[]): T[] {
   return [
     ...list.map(c => (c[fieldName].id === data[fieldName].id ? data : c)),
diff --git a/src/shared/utils/helpers/future-days-to-unix-time.ts b/src/shared/utils/helpers/future-days-to-unix-time.ts
index e9d4371..e057323 100644
--- a/src/shared/utils/helpers/future-days-to-unix-time.ts
+++ b/src/shared/utils/helpers/future-days-to-unix-time.ts
@@ -1,9 +1,9 @@
 export default function futureDaysToUnixTime(
-  days?: number
+  days?: number,
 ): number | undefined {
   return days
     ? Math.trunc(
-        new Date(Date.now() + 1000 * 60 * 60 * 24 * days).getTime() / 1000
+        new Date(Date.now() + 1000 * 60 * 60 * 24 * days).getTime() / 1000,
       )
     : undefined;
 }
diff --git a/src/shared/utils/helpers/get-query-params.ts b/src/shared/utils/helpers/get-query-params.ts
index 627341e..2ba22d4 100644
--- a/src/shared/utils/helpers/get-query-params.ts
+++ b/src/shared/utils/helpers/get-query-params.ts
@@ -1,7 +1,7 @@
 import { isBrowser } from "@utils/browser";
 
 export default function getQueryParams<
-  T extends Record<string, any>
+  T extends Record<string, any>,
 >(processors: {
   [K in keyof T]: (param: string) => T[K];
 }): T {
@@ -13,7 +13,7 @@ export default function getQueryParams<
         ...acc,
         [key]: process(searchParams.get(key)),
       }),
-      {} as T
+      {} as T,
     );
   }
 
diff --git a/src/shared/utils/helpers/get-query-string.ts b/src/shared/utils/helpers/get-query-string.ts
index 4b7bdbb..d74e2a6 100644
--- a/src/shared/utils/helpers/get-query-string.ts
+++ b/src/shared/utils/helpers/get-query-string.ts
@@ -1,10 +1,10 @@
 export default function getQueryString<
-  T extends Record<string, string | undefined>
+  T extends Record<string, string | undefined>,
 >(obj: T) {
   return Object.entries(obj)
     .filter(([, val]) => val !== undefined && val !== null)
     .reduce(
       (acc, [key, val], index) => `${acc}${index > 0 ? "&" : ""}${key}=${val}`,
-      "?"
+      "?",
     );
 }
diff --git a/src/shared/utils/helpers/group-by.ts b/src/shared/utils/helpers/group-by.ts
index 4dd5d5d..db2ad27 100644
--- a/src/shared/utils/helpers/group-by.ts
+++ b/src/shared/utils/helpers/group-by.ts
@@ -1,8 +1,11 @@
 export const groupBy = <T>(
   array: T[],
-  predicate: (value: T, index: number, array: T[]) => string
+  predicate: (value: T, index: number, array: T[]) => string,
 ) =>
-  array.reduce((acc, value, index, array) => {
-    (acc[predicate(value, index, array)] ||= []).push(value);
-    return acc;
-  }, {} as { [key: string]: T[] });
+  array.reduce(
+    (acc, value, index, array) => {
+      (acc[predicate(value, index, array)] ||= []).push(value);
+      return acc;
+    },
+    {} as { [key: string]: T[] },
+  );
diff --git a/src/shared/utils/helpers/random-str.ts b/src/shared/utils/helpers/random-str.ts
index b4be718..7d87658 100644
--- a/src/shared/utils/helpers/random-str.ts
+++ b/src/shared/utils/helpers/random-str.ts
@@ -5,7 +5,7 @@ const DEFAULT_ALPHABET =
 
 export default function randomStr(
   idDesiredLength = 20,
-  alphabet = DEFAULT_ALPHABET
+  alphabet = DEFAULT_ALPHABET,
 ): string {
   /**
    * Create n-long array and map it to random chars from given alphabet.
diff --git a/src/shared/utils/roles/am-admin.ts b/src/shared/utils/roles/am-admin.ts
index 69139d3..f9bd25f 100644
--- a/src/shared/utils/roles/am-admin.ts
+++ b/src/shared/utils/roles/am-admin.ts
@@ -1,7 +1,7 @@
 import { UserService } from "../../services";
 
 export default function amAdmin(
-  myUserInfo = UserService.Instance.myUserInfo
+  myUserInfo = UserService.Instance.myUserInfo,
 ): boolean {
   return myUserInfo?.local_user_view.person.admin ?? false;
 }
diff --git a/src/shared/utils/roles/am-community-creator.ts b/src/shared/utils/roles/am-community-creator.ts
index 3fcd228..4becdad 100644
--- a/src/shared/utils/roles/am-community-creator.ts
+++ b/src/shared/utils/roles/am-community-creator.ts
@@ -4,7 +4,7 @@ import { UserService } from "../../services";
 export default function amCommunityCreator(
   creator_id: number,
   mods?: CommunityModeratorView[],
-  myUserInfo = UserService.Instance.myUserInfo
+  myUserInfo = UserService.Instance.myUserInfo,
 ): boolean {
   const myId = myUserInfo?.local_user_view.person.id;
   // Don't allow mod actions on yourself
diff --git a/src/shared/utils/roles/am-mod.ts b/src/shared/utils/roles/am-mod.ts
index c0632f7..4cd0f44 100644
--- a/src/shared/utils/roles/am-mod.ts
+++ b/src/shared/utils/roles/am-mod.ts
@@ -4,7 +4,7 @@ import { UserService } from "../../services";
 
 export default function amMod(
   mods?: CommunityModeratorView[],
-  myUserInfo = UserService.Instance.myUserInfo
+  myUserInfo = UserService.Instance.myUserInfo,
 ): boolean {
   return myUserInfo ? isMod(myUserInfo.local_user_view.person.id, mods) : false;
 }
diff --git a/src/shared/utils/roles/am-site-creator.ts b/src/shared/utils/roles/am-site-creator.ts
index 071d28c..a4b49eb 100644
--- a/src/shared/utils/roles/am-site-creator.ts
+++ b/src/shared/utils/roles/am-site-creator.ts
@@ -4,7 +4,7 @@ import { UserService } from "../../services";
 export default function amSiteCreator(
   creator_id: number,
   admins?: PersonView[],
-  myUserInfo = UserService.Instance.myUserInfo
+  myUserInfo = UserService.Instance.myUserInfo,
 ): boolean {
   const myId = myUserInfo?.local_user_view.person.id;
   return myId === admins?.at(0)?.person.id && myId !== creator_id;
diff --git a/src/shared/utils/roles/am-top-mod.ts b/src/shared/utils/roles/am-top-mod.ts
index 3f96208..747c8ef 100644
--- a/src/shared/utils/roles/am-top-mod.ts
+++ b/src/shared/utils/roles/am-top-mod.ts
@@ -3,7 +3,7 @@ import { UserService } from "../../services";
 
 export default function amTopMod(
   mods: CommunityModeratorView[],
-  myUserInfo = UserService.Instance.myUserInfo
+  myUserInfo = UserService.Instance.myUserInfo,
 ): boolean {
   return mods.at(0)?.moderator.id === myUserInfo?.local_user_view.person.id;
 }
diff --git a/src/shared/utils/roles/can-admin.ts b/src/shared/utils/roles/can-admin.ts
index 55bfd1c..f2dffda 100644
--- a/src/shared/utils/roles/can-admin.ts
+++ b/src/shared/utils/roles/can-admin.ts
@@ -6,7 +6,7 @@ export default function canAdmin(
   creatorId: number,
   admins?: PersonView[],
   myUserInfo = UserService.Instance.myUserInfo,
-  onSelf = false
+  onSelf = false,
 ): boolean {
   return canMod(creatorId, undefined, admins, myUserInfo, onSelf);
 }
diff --git a/src/shared/utils/roles/can-create-community.ts b/src/shared/utils/roles/can-create-community.ts
index 1b5cf05..139557b 100644
--- a/src/shared/utils/roles/can-create-community.ts
+++ b/src/shared/utils/roles/can-create-community.ts
@@ -4,7 +4,7 @@ import { UserService } from "../../services";
 
 export default function canCreateCommunity(
   siteRes: GetSiteResponse,
-  myUserInfo = UserService.Instance.myUserInfo
+  myUserInfo = UserService.Instance.myUserInfo,
 ): boolean {
   const adminOnly = siteRes.site_view.local_site.community_creation_admin_only;
   // TODO: Make this check if user is logged on as well
diff --git a/src/shared/utils/roles/can-mod.ts b/src/shared/utils/roles/can-mod.ts
index ae2bf44..f50c868 100644
--- a/src/shared/utils/roles/can-mod.ts
+++ b/src/shared/utils/roles/can-mod.ts
@@ -6,7 +6,7 @@ export default function canMod(
   mods?: CommunityModeratorView[],
   admins?: PersonView[],
   myUserInfo = UserService.Instance.myUserInfo,
-  onSelf = false
+  onSelf = false,
 ): boolean {
   // You can do moderator actions only on the mods added after you.
   let adminsThenMods =
@@ -16,7 +16,7 @@ export default function canMod(
 
   if (myUserInfo) {
     const myIndex = adminsThenMods.findIndex(
-      id => id === myUserInfo.local_user_view.person.id
+      id => id === myUserInfo.local_user_view.person.id,
     );
     if (myIndex === -1) {
       return false;
diff --git a/src/shared/utils/roles/is-admin.ts b/src/shared/utils/roles/is-admin.ts
index bc0332e..2a5237e 100644
--- a/src/shared/utils/roles/is-admin.ts
+++ b/src/shared/utils/roles/is-admin.ts
@@ -2,7 +2,7 @@ import { PersonView } from "lemmy-js-client";
 
 export default function isAdmin(
   creatorId: number,
-  admins?: PersonView[]
+  admins?: PersonView[],
 ): boolean {
   return admins?.map(a => a.person.id).includes(creatorId) ?? false;
 }
diff --git a/src/shared/utils/roles/is-mod.ts b/src/shared/utils/roles/is-mod.ts
index 018b721..75c86dd 100644
--- a/src/shared/utils/roles/is-mod.ts
+++ b/src/shared/utils/roles/is-mod.ts
@@ -2,7 +2,7 @@ import { CommunityModeratorView } from "lemmy-js-client";
 
 export default function isMod(
   creatorId: number,
-  mods?: CommunityModeratorView[]
+  mods?: CommunityModeratorView[],
 ): boolean {
   return mods?.map(m => m.moderator.id).includes(creatorId) ?? false;
 }
diff --git a/yarn.lock b/yarn.lock
index 4dd9667..2c1e344 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -31,12 +31,17 @@
   dependencies:
     "@babel/highlight" "^7.22.5"
 
-"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.5", "@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6":
+"@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6":
   version "7.22.6"
   resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.6.tgz#15606a20341de59ba02cd2fcc5086fcbe73bf544"
   integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==
 
-"@babel/core@^7.11.1", "@babel/core@^7.2.2", "@babel/core@^7.21.8":
+"@babel/compat-data@^7.22.9":
+  version "7.22.9"
+  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730"
+  integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==
+
+"@babel/core@^7.11.1", "@babel/core@^7.2.2":
   version "7.22.8"
   resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.8.tgz#386470abe884302db9c82e8e5e87be9e46c86785"
   integrity sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==
@@ -57,6 +62,27 @@
     gensync "^1.0.0-beta.2"
     json5 "^2.2.2"
 
+"@babel/core@^7.22.9":
+  version "7.22.9"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f"
+  integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==
+  dependencies:
+    "@ampproject/remapping" "^2.2.0"
+    "@babel/code-frame" "^7.22.5"
+    "@babel/generator" "^7.22.9"
+    "@babel/helper-compilation-targets" "^7.22.9"
+    "@babel/helper-module-transforms" "^7.22.9"
+    "@babel/helpers" "^7.22.6"
+    "@babel/parser" "^7.22.7"
+    "@babel/template" "^7.22.5"
+    "@babel/traverse" "^7.22.8"
+    "@babel/types" "^7.22.5"
+    convert-source-map "^1.7.0"
+    debug "^4.1.0"
+    gensync "^1.0.0-beta.2"
+    json5 "^2.2.2"
+    semver "^6.3.1"
+
 "@babel/generator@^7.22.7":
   version "7.22.7"
   resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.7.tgz#a6b8152d5a621893f2c9dacf9a4e286d520633d5"
@@ -67,7 +93,17 @@
     "@jridgewell/trace-mapping" "^0.3.17"
     jsesc "^2.5.1"
 
-"@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@^7.22.5":
+"@babel/generator@^7.22.9":
+  version "7.22.9"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d"
+  integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==
+  dependencies:
+    "@babel/types" "^7.22.5"
+    "@jridgewell/gen-mapping" "^0.3.2"
+    "@jridgewell/trace-mapping" "^0.3.17"
+    jsesc "^2.5.1"
+
+"@babel/helper-annotate-as-pure@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
   integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==
@@ -81,7 +117,7 @@
   dependencies:
     "@babel/types" "^7.22.5"
 
-"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.5", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6":
+"@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6":
   version "7.22.6"
   resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz#e30d61abe9480aa5a83232eb31c111be922d2e52"
   integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==
@@ -92,7 +128,33 @@
     browserslist "^4.21.9"
     lru-cache "^5.1.1"
 
-"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.5", "@babel/helper-create-class-features-plugin@^7.22.6":
+"@babel/helper-compilation-targets@^7.22.9":
+  version "7.22.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892"
+  integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==
+  dependencies:
+    "@babel/compat-data" "^7.22.9"
+    "@babel/helper-validator-option" "^7.22.5"
+    browserslist "^4.21.9"
+    lru-cache "^5.1.1"
+    semver "^6.3.1"
+
+"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.9":
+  version "7.22.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz#c36ea240bb3348f942f08b0fbe28d6d979fab236"
+  integrity sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.22.5"
+    "@babel/helper-environment-visitor" "^7.22.5"
+    "@babel/helper-function-name" "^7.22.5"
+    "@babel/helper-member-expression-to-functions" "^7.22.5"
+    "@babel/helper-optimise-call-expression" "^7.22.5"
+    "@babel/helper-replace-supers" "^7.22.9"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+    "@babel/helper-split-export-declaration" "^7.22.6"
+    semver "^6.3.1"
+
+"@babel/helper-create-class-features-plugin@^7.22.5", "@babel/helper-create-class-features-plugin@^7.22.6":
   version "7.22.6"
   resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz#58564873c889a6fea05a538e23f9f6d201f10950"
   integrity sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ==
@@ -116,18 +178,6 @@
     "@nicolo-ribaudo/semver-v6" "^6.3.3"
     regexpu-core "^5.3.1"
 
-"@babel/helper-define-polyfill-provider@^0.3.3":
-  version "0.3.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a"
-  integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==
-  dependencies:
-    "@babel/helper-compilation-targets" "^7.17.7"
-    "@babel/helper-plugin-utils" "^7.16.7"
-    debug "^4.1.1"
-    lodash.debounce "^4.0.8"
-    resolve "^1.14.2"
-    semver "^6.1.2"
-
 "@babel/helper-define-polyfill-provider@^0.4.1":
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz#af1429c4a83ac316a6a8c2cc8ff45cb5d2998d3a"
@@ -139,7 +189,7 @@
     lodash.debounce "^4.0.8"
     resolve "^1.14.2"
 
-"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.5":
+"@babel/helper-environment-visitor@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98"
   integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==
@@ -187,6 +237,17 @@
     "@babel/traverse" "^7.22.5"
     "@babel/types" "^7.22.5"
 
+"@babel/helper-module-transforms@^7.22.9":
+  version "7.22.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129"
+  integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==
+  dependencies:
+    "@babel/helper-environment-visitor" "^7.22.5"
+    "@babel/helper-module-imports" "^7.22.5"
+    "@babel/helper-simple-access" "^7.22.5"
+    "@babel/helper-split-export-declaration" "^7.22.6"
+    "@babel/helper-validator-identifier" "^7.22.5"
+
 "@babel/helper-optimise-call-expression@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e"
@@ -194,12 +255,12 @@
   dependencies:
     "@babel/types" "^7.22.5"
 
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295"
   integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==
 
-"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.5":
+"@babel/helper-remap-async-to-generator@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz#14a38141a7bf2165ad38da61d61cf27b43015da2"
   integrity sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==
@@ -221,6 +282,15 @@
     "@babel/traverse" "^7.22.5"
     "@babel/types" "^7.22.5"
 
+"@babel/helper-replace-supers@^7.22.9":
+  version "7.22.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779"
+  integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==
+  dependencies:
+    "@babel/helper-environment-visitor" "^7.22.5"
+    "@babel/helper-member-expression-to-functions" "^7.22.5"
+    "@babel/helper-optimise-call-expression" "^7.22.5"
+
 "@babel/helper-simple-access@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de"
@@ -228,7 +298,7 @@
   dependencies:
     "@babel/types" "^7.22.5"
 
-"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5":
+"@babel/helper-skip-transparent-expression-wrappers@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847"
   integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==
@@ -252,7 +322,7 @@
   resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193"
   integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==
 
-"@babel/helper-validator-option@^7.21.0", "@babel/helper-validator-option@^7.22.5":
+"@babel/helper-validator-option@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac"
   integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==
@@ -290,14 +360,14 @@
   resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae"
   integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==
 
-"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5":
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e"
   integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==
   dependencies:
     "@babel/helper-plugin-utils" "^7.22.5"
 
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5":
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca"
   integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==
@@ -306,16 +376,6 @@
     "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
     "@babel/plugin-transform-optional-chaining" "^7.22.5"
 
-"@babel/plugin-proposal-async-generator-functions@^7.20.7":
-  version "7.20.7"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326"
-  integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==
-  dependencies:
-    "@babel/helper-environment-visitor" "^7.18.9"
-    "@babel/helper-plugin-utils" "^7.20.2"
-    "@babel/helper-remap-async-to-generator" "^7.18.9"
-    "@babel/plugin-syntax-async-generators" "^7.8.4"
-
 "@babel/plugin-proposal-class-properties@^7.18.6":
   version "7.18.6"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3"
@@ -324,15 +384,6 @@
     "@babel/helper-create-class-features-plugin" "^7.18.6"
     "@babel/helper-plugin-utils" "^7.18.6"
 
-"@babel/plugin-proposal-class-static-block@^7.21.0":
-  version "7.21.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d"
-  integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==
-  dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.21.0"
-    "@babel/helper-plugin-utils" "^7.20.2"
-    "@babel/plugin-syntax-class-static-block" "^7.14.5"
-
 "@babel/plugin-proposal-decorators@^7.21.0":
   version "7.22.7"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.7.tgz#9b5b73c2e404f0869ef8a8a53765f8203c5467a7"
@@ -344,106 +395,12 @@
     "@babel/helper-split-export-declaration" "^7.22.6"
     "@babel/plugin-syntax-decorators" "^7.22.5"
 
-"@babel/plugin-proposal-dynamic-import@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94"
-  integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/plugin-syntax-dynamic-import" "^7.8.3"
-
-"@babel/plugin-proposal-export-namespace-from@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203"
-  integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.18.9"
-    "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
-
-"@babel/plugin-proposal-json-strings@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b"
-  integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/plugin-syntax-json-strings" "^7.8.3"
-
-"@babel/plugin-proposal-logical-assignment-operators@^7.20.7":
-  version "7.20.7"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83"
-  integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.20.2"
-    "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1"
-  integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
-
-"@babel/plugin-proposal-numeric-separator@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75"
-  integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/plugin-syntax-numeric-separator" "^7.10.4"
-
-"@babel/plugin-proposal-object-rest-spread@^7.20.7":
-  version "7.20.7"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a"
-  integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==
-  dependencies:
-    "@babel/compat-data" "^7.20.5"
-    "@babel/helper-compilation-targets" "^7.20.7"
-    "@babel/helper-plugin-utils" "^7.20.2"
-    "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
-    "@babel/plugin-transform-parameters" "^7.20.7"
-
-"@babel/plugin-proposal-optional-catch-binding@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb"
-  integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
-
-"@babel/plugin-proposal-optional-chaining@^7.21.0":
-  version "7.21.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea"
-  integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.20.2"
-    "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0"
-    "@babel/plugin-syntax-optional-chaining" "^7.8.3"
-
-"@babel/plugin-proposal-private-methods@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea"
-  integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==
-  dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
-
 "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2":
   version "7.21.0-placeholder-for-preset-env.2"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703"
   integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==
 
-"@babel/plugin-proposal-private-property-in-object@^7.21.0":
-  version "7.21.11"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz#69d597086b6760c4126525cfa154f34631ff272c"
-  integrity sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.18.6"
-    "@babel/helper-create-class-features-plugin" "^7.21.0"
-    "@babel/helper-plugin-utils" "^7.20.2"
-    "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
-
-"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+"@babel/plugin-proposal-unicode-property-regex@^7.4.4":
   version "7.18.6"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e"
   integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==
@@ -493,7 +450,7 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-syntax-import-assertions@^7.20.0", "@babel/plugin-syntax-import-assertions@^7.22.5":
+"@babel/plugin-syntax-import-assertions@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98"
   integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==
@@ -599,7 +556,7 @@
     "@babel/helper-create-regexp-features-plugin" "^7.18.6"
     "@babel/helper-plugin-utils" "^7.18.6"
 
-"@babel/plugin-transform-arrow-functions@^7.21.5", "@babel/plugin-transform-arrow-functions@^7.22.5":
+"@babel/plugin-transform-arrow-functions@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958"
   integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==
@@ -616,7 +573,7 @@
     "@babel/helper-remap-async-to-generator" "^7.22.5"
     "@babel/plugin-syntax-async-generators" "^7.8.4"
 
-"@babel/plugin-transform-async-to-generator@^7.20.7", "@babel/plugin-transform-async-to-generator@^7.22.5":
+"@babel/plugin-transform-async-to-generator@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775"
   integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==
@@ -625,14 +582,14 @@
     "@babel/helper-plugin-utils" "^7.22.5"
     "@babel/helper-remap-async-to-generator" "^7.22.5"
 
-"@babel/plugin-transform-block-scoped-functions@^7.18.6", "@babel/plugin-transform-block-scoped-functions@^7.22.5":
+"@babel/plugin-transform-block-scoped-functions@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024"
   integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==
   dependencies:
     "@babel/helper-plugin-utils" "^7.22.5"
 
-"@babel/plugin-transform-block-scoping@^7.21.0", "@babel/plugin-transform-block-scoping@^7.22.5":
+"@babel/plugin-transform-block-scoping@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz#8bfc793b3a4b2742c0983fadc1480d843ecea31b"
   integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==
@@ -656,7 +613,7 @@
     "@babel/helper-plugin-utils" "^7.22.5"
     "@babel/plugin-syntax-class-static-block" "^7.14.5"
 
-"@babel/plugin-transform-classes@^7.21.0", "@babel/plugin-transform-classes@^7.22.6":
+"@babel/plugin-transform-classes@^7.22.6":
   version "7.22.6"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363"
   integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==
@@ -671,7 +628,7 @@
     "@babel/helper-split-export-declaration" "^7.22.6"
     globals "^11.1.0"
 
-"@babel/plugin-transform-computed-properties@^7.21.5", "@babel/plugin-transform-computed-properties@^7.22.5":
+"@babel/plugin-transform-computed-properties@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869"
   integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==
@@ -679,14 +636,14 @@
     "@babel/helper-plugin-utils" "^7.22.5"
     "@babel/template" "^7.22.5"
 
-"@babel/plugin-transform-destructuring@^7.21.3", "@babel/plugin-transform-destructuring@^7.22.5":
+"@babel/plugin-transform-destructuring@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz#d3aca7438f6c26c78cdd0b0ba920a336001b27cc"
   integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==
   dependencies:
     "@babel/helper-plugin-utils" "^7.22.5"
 
-"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4":
+"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165"
   integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==
@@ -694,7 +651,7 @@
     "@babel/helper-create-regexp-features-plugin" "^7.22.5"
     "@babel/helper-plugin-utils" "^7.22.5"
 
-"@babel/plugin-transform-duplicate-keys@^7.18.9", "@babel/plugin-transform-duplicate-keys@^7.22.5":
+"@babel/plugin-transform-duplicate-keys@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285"
   integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==
@@ -709,7 +666,7 @@
     "@babel/helper-plugin-utils" "^7.22.5"
     "@babel/plugin-syntax-dynamic-import" "^7.8.3"
 
-"@babel/plugin-transform-exponentiation-operator@^7.18.6", "@babel/plugin-transform-exponentiation-operator@^7.22.5":
+"@babel/plugin-transform-exponentiation-operator@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a"
   integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==
@@ -725,14 +682,14 @@
     "@babel/helper-plugin-utils" "^7.22.5"
     "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
 
-"@babel/plugin-transform-for-of@^7.21.5", "@babel/plugin-transform-for-of@^7.22.5":
+"@babel/plugin-transform-for-of@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f"
   integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==
   dependencies:
     "@babel/helper-plugin-utils" "^7.22.5"
 
-"@babel/plugin-transform-function-name@^7.18.9", "@babel/plugin-transform-function-name@^7.22.5":
+"@babel/plugin-transform-function-name@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143"
   integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==
@@ -749,7 +706,7 @@
     "@babel/helper-plugin-utils" "^7.22.5"
     "@babel/plugin-syntax-json-strings" "^7.8.3"
 
-"@babel/plugin-transform-literals@^7.18.9", "@babel/plugin-transform-literals@^7.22.5":
+"@babel/plugin-transform-literals@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920"
   integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==
@@ -764,14 +721,14 @@
     "@babel/helper-plugin-utils" "^7.22.5"
     "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
 
-"@babel/plugin-transform-member-expression-literals@^7.18.6", "@babel/plugin-transform-member-expression-literals@^7.22.5":
+"@babel/plugin-transform-member-expression-literals@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def"
   integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==
   dependencies:
     "@babel/helper-plugin-utils" "^7.22.5"
 
-"@babel/plugin-transform-modules-amd@^7.20.11", "@babel/plugin-transform-modules-amd@^7.22.5":
+"@babel/plugin-transform-modules-amd@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526"
   integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==
@@ -779,7 +736,7 @@
     "@babel/helper-module-transforms" "^7.22.5"
     "@babel/helper-plugin-utils" "^7.22.5"
 
-"@babel/plugin-transform-modules-commonjs@^7.21.5", "@babel/plugin-transform-modules-commonjs@^7.22.5":
+"@babel/plugin-transform-modules-commonjs@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa"
   integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==
@@ -788,7 +745,7 @@
     "@babel/helper-plugin-utils" "^7.22.5"
     "@babel/helper-simple-access" "^7.22.5"
 
-"@babel/plugin-transform-modules-systemjs@^7.20.11", "@babel/plugin-transform-modules-systemjs@^7.22.5":
+"@babel/plugin-transform-modules-systemjs@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz#18c31410b5e579a0092638f95c896c2a98a5d496"
   integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==
@@ -798,7 +755,7 @@
     "@babel/helper-plugin-utils" "^7.22.5"
     "@babel/helper-validator-identifier" "^7.22.5"
 
-"@babel/plugin-transform-modules-umd@^7.18.6", "@babel/plugin-transform-modules-umd@^7.22.5":
+"@babel/plugin-transform-modules-umd@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98"
   integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==
@@ -806,7 +763,7 @@
     "@babel/helper-module-transforms" "^7.22.5"
     "@babel/helper-plugin-utils" "^7.22.5"
 
-"@babel/plugin-transform-named-capturing-groups-regex@^7.20.5", "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5":
+"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f"
   integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==
@@ -814,7 +771,7 @@
     "@babel/helper-create-regexp-features-plugin" "^7.22.5"
     "@babel/helper-plugin-utils" "^7.22.5"
 
-"@babel/plugin-transform-new-target@^7.18.6", "@babel/plugin-transform-new-target@^7.22.5":
+"@babel/plugin-transform-new-target@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d"
   integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==
@@ -848,7 +805,7 @@
     "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
     "@babel/plugin-transform-parameters" "^7.22.5"
 
-"@babel/plugin-transform-object-super@^7.18.6", "@babel/plugin-transform-object-super@^7.22.5":
+"@babel/plugin-transform-object-super@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c"
   integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==
@@ -873,7 +830,7 @@
     "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
     "@babel/plugin-syntax-optional-chaining" "^7.8.3"
 
-"@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.21.3", "@babel/plugin-transform-parameters@^7.22.5":
+"@babel/plugin-transform-parameters@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18"
   integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==
@@ -898,14 +855,14 @@
     "@babel/helper-plugin-utils" "^7.22.5"
     "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
 
-"@babel/plugin-transform-property-literals@^7.18.6", "@babel/plugin-transform-property-literals@^7.22.5":
+"@babel/plugin-transform-property-literals@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766"
   integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==
   dependencies:
     "@babel/helper-plugin-utils" "^7.22.5"
 
-"@babel/plugin-transform-regenerator@^7.21.5", "@babel/plugin-transform-regenerator@^7.22.5":
+"@babel/plugin-transform-regenerator@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz#cd8a68b228a5f75fa01420e8cc2fc400f0fc32aa"
   integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==
@@ -913,33 +870,33 @@
     "@babel/helper-plugin-utils" "^7.22.5"
     regenerator-transform "^0.15.1"
 
-"@babel/plugin-transform-reserved-words@^7.18.6", "@babel/plugin-transform-reserved-words@^7.22.5":
+"@babel/plugin-transform-reserved-words@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb"
   integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==
   dependencies:
     "@babel/helper-plugin-utils" "^7.22.5"
 
-"@babel/plugin-transform-runtime@^7.21.4":
-  version "7.22.7"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.7.tgz#eb9094b5fb756cc2d98d398b2c88aeefa9205de9"
-  integrity sha512-o02xM7iY7mSPI+TvaYDH0aYl+lg3+KT7qrD705JlsB/GrZSNaYO/4i+aDFKPiJ7ubq3hgv8NNLCdyB5MFxT8mg==
+"@babel/plugin-transform-runtime@^7.22.9":
+  version "7.22.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz#a87b11e170cbbfb018e6a2bf91f5c6e533b9e027"
+  integrity sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==
   dependencies:
     "@babel/helper-module-imports" "^7.22.5"
     "@babel/helper-plugin-utils" "^7.22.5"
-    "@nicolo-ribaudo/semver-v6" "^6.3.3"
     babel-plugin-polyfill-corejs2 "^0.4.4"
     babel-plugin-polyfill-corejs3 "^0.8.2"
     babel-plugin-polyfill-regenerator "^0.5.1"
+    semver "^6.3.1"
 
-"@babel/plugin-transform-shorthand-properties@^7.18.6", "@babel/plugin-transform-shorthand-properties@^7.22.5":
+"@babel/plugin-transform-shorthand-properties@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624"
   integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==
   dependencies:
     "@babel/helper-plugin-utils" "^7.22.5"
 
-"@babel/plugin-transform-spread@^7.20.7", "@babel/plugin-transform-spread@^7.22.5":
+"@babel/plugin-transform-spread@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b"
   integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==
@@ -947,28 +904,28 @@
     "@babel/helper-plugin-utils" "^7.22.5"
     "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
 
-"@babel/plugin-transform-sticky-regex@^7.18.6", "@babel/plugin-transform-sticky-regex@^7.22.5":
+"@babel/plugin-transform-sticky-regex@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa"
   integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==
   dependencies:
     "@babel/helper-plugin-utils" "^7.22.5"
 
-"@babel/plugin-transform-template-literals@^7.18.9", "@babel/plugin-transform-template-literals@^7.22.5":
+"@babel/plugin-transform-template-literals@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff"
   integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==
   dependencies:
     "@babel/helper-plugin-utils" "^7.22.5"
 
-"@babel/plugin-transform-typeof-symbol@^7.18.9", "@babel/plugin-transform-typeof-symbol@^7.22.5":
+"@babel/plugin-transform-typeof-symbol@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34"
   integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==
   dependencies:
     "@babel/helper-plugin-utils" "^7.22.5"
 
-"@babel/plugin-transform-typescript@^7.21.3", "@babel/plugin-transform-typescript@^7.22.5":
+"@babel/plugin-transform-typescript@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz#5c0f7adfc1b5f38c4dbc8f79b1f0f8074134bd7d"
   integrity sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA==
@@ -978,7 +935,17 @@
     "@babel/helper-plugin-utils" "^7.22.5"
     "@babel/plugin-syntax-typescript" "^7.22.5"
 
-"@babel/plugin-transform-unicode-escapes@^7.21.5", "@babel/plugin-transform-unicode-escapes@^7.22.5":
+"@babel/plugin-transform-typescript@^7.22.9":
+  version "7.22.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz#91e08ad1eb1028ecc62662a842e93ecfbf3c7234"
+  integrity sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.22.5"
+    "@babel/helper-create-class-features-plugin" "^7.22.9"
+    "@babel/helper-plugin-utils" "^7.22.5"
+    "@babel/plugin-syntax-typescript" "^7.22.5"
+
+"@babel/plugin-transform-unicode-escapes@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz#ce0c248522b1cb22c7c992d88301a5ead70e806c"
   integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==
@@ -993,7 +960,7 @@
     "@babel/helper-create-regexp-features-plugin" "^7.22.5"
     "@babel/helper-plugin-utils" "^7.22.5"
 
-"@babel/plugin-transform-unicode-regex@^7.18.6", "@babel/plugin-transform-unicode-regex@^7.22.5":
+"@babel/plugin-transform-unicode-regex@^7.22.5":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183"
   integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==
@@ -1009,38 +976,25 @@
     "@babel/helper-create-regexp-features-plugin" "^7.22.5"
     "@babel/helper-plugin-utils" "^7.22.5"
 
-"@babel/preset-env@7.21.5":
-  version "7.21.5"
-  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.21.5.tgz#db2089d99efd2297716f018aeead815ac3decffb"
-  integrity sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==
-  dependencies:
-    "@babel/compat-data" "^7.21.5"
-    "@babel/helper-compilation-targets" "^7.21.5"
-    "@babel/helper-plugin-utils" "^7.21.5"
-    "@babel/helper-validator-option" "^7.21.0"
-    "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6"
-    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7"
-    "@babel/plugin-proposal-async-generator-functions" "^7.20.7"
-    "@babel/plugin-proposal-class-properties" "^7.18.6"
-    "@babel/plugin-proposal-class-static-block" "^7.21.0"
-    "@babel/plugin-proposal-dynamic-import" "^7.18.6"
-    "@babel/plugin-proposal-export-namespace-from" "^7.18.9"
-    "@babel/plugin-proposal-json-strings" "^7.18.6"
-    "@babel/plugin-proposal-logical-assignment-operators" "^7.20.7"
-    "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6"
-    "@babel/plugin-proposal-numeric-separator" "^7.18.6"
-    "@babel/plugin-proposal-object-rest-spread" "^7.20.7"
-    "@babel/plugin-proposal-optional-catch-binding" "^7.18.6"
-    "@babel/plugin-proposal-optional-chaining" "^7.21.0"
-    "@babel/plugin-proposal-private-methods" "^7.18.6"
-    "@babel/plugin-proposal-private-property-in-object" "^7.21.0"
-    "@babel/plugin-proposal-unicode-property-regex" "^7.18.6"
+"@babel/preset-env@7.22.9":
+  version "7.22.9"
+  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.9.tgz#57f17108eb5dfd4c5c25a44c1977eba1df310ac7"
+  integrity sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==
+  dependencies:
+    "@babel/compat-data" "^7.22.9"
+    "@babel/helper-compilation-targets" "^7.22.9"
+    "@babel/helper-plugin-utils" "^7.22.5"
+    "@babel/helper-validator-option" "^7.22.5"
+    "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5"
+    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5"
+    "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2"
     "@babel/plugin-syntax-async-generators" "^7.8.4"
     "@babel/plugin-syntax-class-properties" "^7.12.13"
     "@babel/plugin-syntax-class-static-block" "^7.14.5"
     "@babel/plugin-syntax-dynamic-import" "^7.8.3"
     "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
-    "@babel/plugin-syntax-import-assertions" "^7.20.0"
+    "@babel/plugin-syntax-import-assertions" "^7.22.5"
+    "@babel/plugin-syntax-import-attributes" "^7.22.5"
     "@babel/plugin-syntax-import-meta" "^7.10.4"
     "@babel/plugin-syntax-json-strings" "^7.8.3"
     "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
@@ -1051,45 +1005,62 @@
     "@babel/plugin-syntax-optional-chaining" "^7.8.3"
     "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
     "@babel/plugin-syntax-top-level-await" "^7.14.5"
-    "@babel/plugin-transform-arrow-functions" "^7.21.5"
-    "@babel/plugin-transform-async-to-generator" "^7.20.7"
-    "@babel/plugin-transform-block-scoped-functions" "^7.18.6"
-    "@babel/plugin-transform-block-scoping" "^7.21.0"
-    "@babel/plugin-transform-classes" "^7.21.0"
-    "@babel/plugin-transform-computed-properties" "^7.21.5"
-    "@babel/plugin-transform-destructuring" "^7.21.3"
-    "@babel/plugin-transform-dotall-regex" "^7.18.6"
-    "@babel/plugin-transform-duplicate-keys" "^7.18.9"
-    "@babel/plugin-transform-exponentiation-operator" "^7.18.6"
-    "@babel/plugin-transform-for-of" "^7.21.5"
-    "@babel/plugin-transform-function-name" "^7.18.9"
-    "@babel/plugin-transform-literals" "^7.18.9"
-    "@babel/plugin-transform-member-expression-literals" "^7.18.6"
-    "@babel/plugin-transform-modules-amd" "^7.20.11"
-    "@babel/plugin-transform-modules-commonjs" "^7.21.5"
-    "@babel/plugin-transform-modules-systemjs" "^7.20.11"
-    "@babel/plugin-transform-modules-umd" "^7.18.6"
-    "@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5"
-    "@babel/plugin-transform-new-target" "^7.18.6"
-    "@babel/plugin-transform-object-super" "^7.18.6"
-    "@babel/plugin-transform-parameters" "^7.21.3"
-    "@babel/plugin-transform-property-literals" "^7.18.6"
-    "@babel/plugin-transform-regenerator" "^7.21.5"
-    "@babel/plugin-transform-reserved-words" "^7.18.6"
-    "@babel/plugin-transform-shorthand-properties" "^7.18.6"
-    "@babel/plugin-transform-spread" "^7.20.7"
-    "@babel/plugin-transform-sticky-regex" "^7.18.6"
-    "@babel/plugin-transform-template-literals" "^7.18.9"
-    "@babel/plugin-transform-typeof-symbol" "^7.18.9"
-    "@babel/plugin-transform-unicode-escapes" "^7.21.5"
-    "@babel/plugin-transform-unicode-regex" "^7.18.6"
+    "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
+    "@babel/plugin-transform-arrow-functions" "^7.22.5"
+    "@babel/plugin-transform-async-generator-functions" "^7.22.7"
+    "@babel/plugin-transform-async-to-generator" "^7.22.5"
+    "@babel/plugin-transform-block-scoped-functions" "^7.22.5"
+    "@babel/plugin-transform-block-scoping" "^7.22.5"
+    "@babel/plugin-transform-class-properties" "^7.22.5"
+    "@babel/plugin-transform-class-static-block" "^7.22.5"
+    "@babel/plugin-transform-classes" "^7.22.6"
+    "@babel/plugin-transform-computed-properties" "^7.22.5"
+    "@babel/plugin-transform-destructuring" "^7.22.5"
+    "@babel/plugin-transform-dotall-regex" "^7.22.5"
+    "@babel/plugin-transform-duplicate-keys" "^7.22.5"
+    "@babel/plugin-transform-dynamic-import" "^7.22.5"
+    "@babel/plugin-transform-exponentiation-operator" "^7.22.5"
+    "@babel/plugin-transform-export-namespace-from" "^7.22.5"
+    "@babel/plugin-transform-for-of" "^7.22.5"
+    "@babel/plugin-transform-function-name" "^7.22.5"
+    "@babel/plugin-transform-json-strings" "^7.22.5"
+    "@babel/plugin-transform-literals" "^7.22.5"
+    "@babel/plugin-transform-logical-assignment-operators" "^7.22.5"
+    "@babel/plugin-transform-member-expression-literals" "^7.22.5"
+    "@babel/plugin-transform-modules-amd" "^7.22.5"
+    "@babel/plugin-transform-modules-commonjs" "^7.22.5"
+    "@babel/plugin-transform-modules-systemjs" "^7.22.5"
+    "@babel/plugin-transform-modules-umd" "^7.22.5"
+    "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5"
+    "@babel/plugin-transform-new-target" "^7.22.5"
+    "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5"
+    "@babel/plugin-transform-numeric-separator" "^7.22.5"
+    "@babel/plugin-transform-object-rest-spread" "^7.22.5"
+    "@babel/plugin-transform-object-super" "^7.22.5"
+    "@babel/plugin-transform-optional-catch-binding" "^7.22.5"
+    "@babel/plugin-transform-optional-chaining" "^7.22.6"
+    "@babel/plugin-transform-parameters" "^7.22.5"
+    "@babel/plugin-transform-private-methods" "^7.22.5"
+    "@babel/plugin-transform-private-property-in-object" "^7.22.5"
+    "@babel/plugin-transform-property-literals" "^7.22.5"
+    "@babel/plugin-transform-regenerator" "^7.22.5"
+    "@babel/plugin-transform-reserved-words" "^7.22.5"
+    "@babel/plugin-transform-shorthand-properties" "^7.22.5"
+    "@babel/plugin-transform-spread" "^7.22.5"
+    "@babel/plugin-transform-sticky-regex" "^7.22.5"
+    "@babel/plugin-transform-template-literals" "^7.22.5"
+    "@babel/plugin-transform-typeof-symbol" "^7.22.5"
+    "@babel/plugin-transform-unicode-escapes" "^7.22.5"
+    "@babel/plugin-transform-unicode-property-regex" "^7.22.5"
+    "@babel/plugin-transform-unicode-regex" "^7.22.5"
+    "@babel/plugin-transform-unicode-sets-regex" "^7.22.5"
     "@babel/preset-modules" "^0.1.5"
-    "@babel/types" "^7.21.5"
-    babel-plugin-polyfill-corejs2 "^0.3.3"
-    babel-plugin-polyfill-corejs3 "^0.6.0"
-    babel-plugin-polyfill-regenerator "^0.4.1"
-    core-js-compat "^3.25.1"
-    semver "^6.3.0"
+    "@babel/types" "^7.22.5"
+    babel-plugin-polyfill-corejs2 "^0.4.4"
+    babel-plugin-polyfill-corejs3 "^0.8.2"
+    babel-plugin-polyfill-regenerator "^0.5.1"
+    core-js-compat "^3.31.0"
+    semver "^6.3.1"
 
 "@babel/preset-env@^7.11.0":
   version "7.22.7"
@@ -1236,7 +1207,7 @@
     debug "^4.1.0"
     globals "^11.1.0"
 
-"@babel/types@^7", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.21.5", "@babel/types@^7.22.5", "@babel/types@^7.4.4":
+"@babel/types@^7", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.22.5", "@babel/types@^7.4.4":
   version "7.22.5"
   resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe"
   integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==
@@ -1255,7 +1226,7 @@
   resolved "https://registry.yarnpkg.com/@emoji-mart/data/-/data-1.1.2.tgz#777c976f8f143df47cbb23a7077c9ca9fe5fc513"
   integrity sha512-1HP8BxD2azjqWJvxIaWAMyTySeZY0Osr83ukYjltPVkNXeJvTz7yDrPLBtnrD5uqJ3tg4CcLuuBW09wahqL/fg==
 
-"@eslint-community/eslint-utils@^4.2.0":
+"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
   version "4.4.0"
   resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
   integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
@@ -1267,6 +1238,11 @@
   resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884"
   integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==
 
+"@eslint-community/regexpp@^4.5.1":
+  version "4.6.2"
+  resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8"
+  integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==
+
 "@eslint/eslintrc@^2.1.0":
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.0.tgz#82256f164cc9e0b59669efc19d57f8092706841d"
@@ -1602,7 +1578,7 @@
   dependencies:
     "@types/node" "*"
 
-"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
+"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
   version "7.0.12"
   resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb"
   integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==
@@ -1624,10 +1600,10 @@
   resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632"
   integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==
 
-"@types/markdown-it-container@^2.0.5":
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/@types/markdown-it-container/-/markdown-it-container-2.0.5.tgz#abd793b64c5adc7b2d1e8963eddb388198248152"
-  integrity sha512-8v5jIC5gcCUv+JcD0DExwNBkoKC0kLB4acensF0NoNlTIcXmQxF3RDjzAdIW82sXSoR+n772ePguxIWlq2ELvA==
+"@types/markdown-it-container@^2.0.6":
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/@types/markdown-it-container/-/markdown-it-container-2.0.6.tgz#acf0a02dff2add8df9d68e7b033b7165ebe37ca3"
+  integrity sha512-euUVSCx2+tGV8BlI7yA7AXmNsLzYCoUbg/O2jJ0wzV/0oxKbmd5RJZI2map8cuEKgmjNy13ndFWRZZO+6rl0GA==
   dependencies:
     "@types/markdown-it" "*"
 
@@ -1659,11 +1635,16 @@
   resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca"
   integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
 
-"@types/node@*", "@types/node@^20.4.0":
+"@types/node@*":
   version "20.4.0"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.0.tgz#01d637d1891e419bc85763b46f42809cd2d5addb"
   integrity sha512-jfT7iTf/4kOQ9S7CHV9BIyRaQqHu67mOjsIQBC3BKZvzvUB6zLxEwJ6sBE3ozcvP8kF6Uk5PXN0Q+c0dfhGX0g==
 
+"@types/node@^20.4.5":
+  version "20.4.5"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.5.tgz#9dc0a5cb1ccce4f7a731660935ab70b9c00a5d69"
+  integrity sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg==
+
 "@types/path-browserify@^1.0.0":
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/@types/path-browserify/-/path-browserify-1.0.0.tgz#294ec6e88b6b0d340a3897b7120e5b393f16690e"
@@ -1698,7 +1679,7 @@
   dependencies:
     htmlparser2 "^8.0.0"
 
-"@types/semver@^7.3.12":
+"@types/semver@^7.5.0":
   version "7.5.0"
   resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a"
   integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==
@@ -1739,10 +1720,10 @@
   dependencies:
     "@types/node" "*"
 
-"@types/toastify-js@^1.11.1":
-  version "1.11.1"
-  resolved "https://registry.yarnpkg.com/@types/toastify-js/-/toastify-js-1.11.1.tgz#48f96596e087025c7f7821668599fd74dcdd8549"
-  integrity sha512-Ef03kGFWseAQYIQwN83WbhRxD+DOd+X6p22j9olA/TnvE0crDMc3fyoctKSpXgEDVWq5l3p98otIdpNX1pOYMA==
+"@types/toastify-js@^1.12.0":
+  version "1.12.0"
+  resolved "https://registry.yarnpkg.com/@types/toastify-js/-/toastify-js-1.12.0.tgz#e3278196e040d6da82d84babee31af8e97abba56"
+  integrity sha512-fqpDHaKhFukN9KRm24bbH0wozvHmSwjvkaLjBUrWcSfSS4zysIwTYqNLG3XbSNhRlsTNRNLGS23tp/VhPwsfHQ==
 
 "@types/trusted-types@^2.0.2":
   version "2.0.3"
@@ -1756,89 +1737,91 @@
   dependencies:
     "@types/node" "*"
 
-"@typescript-eslint/eslint-plugin@^5.61.0":
-  version "5.61.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz#a1a5290cf33863b4db3fb79350b3c5275a7b1223"
-  integrity sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==
-  dependencies:
-    "@eslint-community/regexpp" "^4.4.0"
-    "@typescript-eslint/scope-manager" "5.61.0"
-    "@typescript-eslint/type-utils" "5.61.0"
-    "@typescript-eslint/utils" "5.61.0"
+"@typescript-eslint/eslint-plugin@^6.2.0":
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.2.0.tgz#57047c400be0632d4797ac081af8d399db3ebc3b"
+  integrity sha512-rClGrMuyS/3j0ETa1Ui7s6GkLhfZGKZL3ZrChLeAiACBE/tRc1wq8SNZESUuluxhLj9FkUefRs2l6bCIArWBiQ==
+  dependencies:
+    "@eslint-community/regexpp" "^4.5.1"
+    "@typescript-eslint/scope-manager" "6.2.0"
+    "@typescript-eslint/type-utils" "6.2.0"
+    "@typescript-eslint/utils" "6.2.0"
+    "@typescript-eslint/visitor-keys" "6.2.0"
     debug "^4.3.4"
     graphemer "^1.4.0"
-    ignore "^5.2.0"
+    ignore "^5.2.4"
+    natural-compare "^1.4.0"
     natural-compare-lite "^1.4.0"
-    semver "^7.3.7"
-    tsutils "^3.21.0"
+    semver "^7.5.4"
+    ts-api-utils "^1.0.1"
 
-"@typescript-eslint/parser@^5.61.0":
-  version "5.61.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.61.0.tgz#7fbe3e2951904bb843f8932ebedd6e0635bffb70"
-  integrity sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==
+"@typescript-eslint/parser@^6.2.0":
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.2.0.tgz#d37c30b0f459c6f39455335d8f4f085919a1c644"
+  integrity sha512-igVYOqtiK/UsvKAmmloQAruAdUHihsOCvplJpplPZ+3h4aDkC/UKZZNKgB6h93ayuYLuEymU3h8nF1xMRbh37g==
   dependencies:
-    "@typescript-eslint/scope-manager" "5.61.0"
-    "@typescript-eslint/types" "5.61.0"
-    "@typescript-eslint/typescript-estree" "5.61.0"
+    "@typescript-eslint/scope-manager" "6.2.0"
+    "@typescript-eslint/types" "6.2.0"
+    "@typescript-eslint/typescript-estree" "6.2.0"
+    "@typescript-eslint/visitor-keys" "6.2.0"
     debug "^4.3.4"
 
-"@typescript-eslint/scope-manager@5.61.0":
-  version "5.61.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.61.0.tgz#b670006d069c9abe6415c41f754b1b5d949ef2b2"
-  integrity sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==
+"@typescript-eslint/scope-manager@6.2.0":
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.2.0.tgz#412a710d8fa20bc045533b3b19f423810b24f87a"
+  integrity sha512-1ZMNVgm5nnHURU8ZSJ3snsHzpFeNK84rdZjluEVBGNu7jDymfqceB3kdIZ6A4xCfEFFhRIB6rF8q/JIqJd2R0Q==
   dependencies:
-    "@typescript-eslint/types" "5.61.0"
-    "@typescript-eslint/visitor-keys" "5.61.0"
+    "@typescript-eslint/types" "6.2.0"
+    "@typescript-eslint/visitor-keys" "6.2.0"
 
-"@typescript-eslint/type-utils@5.61.0":
-  version "5.61.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.61.0.tgz#e90799eb2045c4435ea8378cb31cd8a9fddca47a"
-  integrity sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==
+"@typescript-eslint/type-utils@6.2.0":
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.2.0.tgz#02b27a3eeb41aa5460d6275d12cce5dd72e1c9fc"
+  integrity sha512-DnGZuNU2JN3AYwddYIqrVkYW0uUQdv0AY+kz2M25euVNlujcN2u+rJgfJsBFlUEzBB6OQkUqSZPyuTLf2bP5mw==
   dependencies:
-    "@typescript-eslint/typescript-estree" "5.61.0"
-    "@typescript-eslint/utils" "5.61.0"
+    "@typescript-eslint/typescript-estree" "6.2.0"
+    "@typescript-eslint/utils" "6.2.0"
     debug "^4.3.4"
-    tsutils "^3.21.0"
+    ts-api-utils "^1.0.1"
 
-"@typescript-eslint/types@5.61.0":
-  version "5.61.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.61.0.tgz#e99ff11b5792d791554abab0f0370936d8ca50c0"
-  integrity sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==
+"@typescript-eslint/types@6.2.0":
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.2.0.tgz#b341a4e6d5f609267306b07afc6f62bcf92b1495"
+  integrity sha512-1nRRaDlp/XYJQLvkQJG5F3uBTno5SHPT7XVcJ5n1/k2WfNI28nJsvLakxwZRNY5spuatEKO7d5nZWsQpkqXwBA==
 
-"@typescript-eslint/typescript-estree@5.61.0":
-  version "5.61.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.61.0.tgz#4c7caca84ce95bb41aa585d46a764bcc050b92f3"
-  integrity sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==
+"@typescript-eslint/typescript-estree@6.2.0":
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.2.0.tgz#4969944b831b481996aa4fbd73c7164ca683b8ef"
+  integrity sha512-Mts6+3HQMSM+LZCglsc2yMIny37IhUgp1Qe8yJUYVyO6rHP7/vN0vajKu3JvHCBIy8TSiKddJ/Zwu80jhnGj1w==
   dependencies:
-    "@typescript-eslint/types" "5.61.0"
-    "@typescript-eslint/visitor-keys" "5.61.0"
+    "@typescript-eslint/types" "6.2.0"
+    "@typescript-eslint/visitor-keys" "6.2.0"
     debug "^4.3.4"
     globby "^11.1.0"
     is-glob "^4.0.3"
-    semver "^7.3.7"
-    tsutils "^3.21.0"
+    semver "^7.5.4"
+    ts-api-utils "^1.0.1"
 
-"@typescript-eslint/utils@5.61.0":
-  version "5.61.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.61.0.tgz#5064838a53e91c754fffbddd306adcca3fe0af36"
-  integrity sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==
+"@typescript-eslint/utils@6.2.0":
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.2.0.tgz#606a20e5c13883c2d2bd0538ddc4b96b8d410979"
+  integrity sha512-RCFrC1lXiX1qEZN8LmLrxYRhOkElEsPKTVSNout8DMzf8PeWoQG7Rxz2SadpJa3VSh5oYKGwt7j7X/VRg+Y3OQ==
+  dependencies:
+    "@eslint-community/eslint-utils" "^4.4.0"
+    "@types/json-schema" "^7.0.12"
+    "@types/semver" "^7.5.0"
+    "@typescript-eslint/scope-manager" "6.2.0"
+    "@typescript-eslint/types" "6.2.0"
+    "@typescript-eslint/typescript-estree" "6.2.0"
+    semver "^7.5.4"
+
+"@typescript-eslint/visitor-keys@6.2.0":
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.2.0.tgz#71943f42fdaa2ec86dc3222091f41761a49ae71a"
+  integrity sha512-QbaYUQVKKo9bgCzpjz45llCfwakyoxHetIy8CAvYCtd16Zu1KrpzNHofwF8kGkpPOxZB2o6kz+0nqH8ZkIzuoQ==
   dependencies:
-    "@eslint-community/eslint-utils" "^4.2.0"
-    "@types/json-schema" "^7.0.9"
-    "@types/semver" "^7.3.12"
-    "@typescript-eslint/scope-manager" "5.61.0"
-    "@typescript-eslint/types" "5.61.0"
-    "@typescript-eslint/typescript-estree" "5.61.0"
-    eslint-scope "^5.1.1"
-    semver "^7.3.7"
-
-"@typescript-eslint/visitor-keys@5.61.0":
-  version "5.61.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz#c79414fa42158fd23bd2bb70952dc5cdbb298140"
-  integrity sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==
-  dependencies:
-    "@typescript-eslint/types" "5.61.0"
-    eslint-visitor-keys "^3.3.0"
+    "@typescript-eslint/types" "6.2.0"
+    eslint-visitor-keys "^3.4.1"
 
 "@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5":
   version "1.11.6"
@@ -2380,6 +2363,11 @@ axobject-query@^3.1.1:
   dependencies:
     dequal "^2.0.3"
 
+b4a@^1.6.4:
+  version "1.6.4"
+  resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.4.tgz#ef1c1422cae5ce6535ec191baeed7567443f36c9"
+  integrity sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==
+
 babel-loader@^9.1.2:
   version "9.1.3"
   resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a"
@@ -2396,15 +2384,6 @@ babel-plugin-inferno@^6.6.0:
     "@babel/plugin-syntax-jsx" "^7"
     "@babel/types" "^7"
 
-babel-plugin-polyfill-corejs2@^0.3.3:
-  version "0.3.3"
-  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122"
-  integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==
-  dependencies:
-    "@babel/compat-data" "^7.17.7"
-    "@babel/helper-define-polyfill-provider" "^0.3.3"
-    semver "^6.1.1"
-
 babel-plugin-polyfill-corejs2@^0.4.4:
   version "0.4.4"
   resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz#9f9a0e1cd9d645cc246a5e094db5c3aa913ccd2b"
@@ -2414,14 +2393,6 @@ babel-plugin-polyfill-corejs2@^0.4.4:
     "@babel/helper-define-polyfill-provider" "^0.4.1"
     "@nicolo-ribaudo/semver-v6" "^6.3.3"
 
-babel-plugin-polyfill-corejs3@^0.6.0:
-  version "0.6.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a"
-  integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==
-  dependencies:
-    "@babel/helper-define-polyfill-provider" "^0.3.3"
-    core-js-compat "^3.25.1"
-
 babel-plugin-polyfill-corejs3@^0.8.2:
   version "0.8.2"
   resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz#d406c5738d298cd9c66f64a94cf8d5904ce4cc5e"
@@ -2430,13 +2401,6 @@ babel-plugin-polyfill-corejs3@^0.8.2:
     "@babel/helper-define-polyfill-provider" "^0.4.1"
     core-js-compat "^3.31.0"
 
-babel-plugin-polyfill-regenerator@^0.4.1:
-  version "0.4.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747"
-  integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==
-  dependencies:
-    "@babel/helper-define-polyfill-provider" "^0.3.3"
-
 babel-plugin-polyfill-regenerator@^0.5.1:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz#ace7a5eced6dff7d5060c335c52064778216afd3"
@@ -2542,10 +2506,10 @@ bonjour-service@^1.0.11:
     fast-deep-equal "^3.1.3"
     multicast-dns "^7.2.5"
 
-bootstrap@^5.2.3:
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.0.tgz#0718a7cc29040ee8dbf1bd652b896f3436a87c29"
-  integrity sha512-UnBV3E3v4STVNQdms6jSGO2CvOkjUMdDAVR2V5N4uCMdaIkaQjbcEAMqRimDHIs4uqBYzDAKCQwCB+97tJgHQw==
+bootstrap@^5.3.1:
+  version "5.3.1"
+  resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.1.tgz#8ca07040ad15d7f75891d1504cf14c5dedfb1cfe"
+  integrity sha512-jzwza3Yagduci2x0rr9MeFSORjcHpt0lRZukZPZQJT1Dth5qzV7XcgGqYzi39KGAVYR8QEDVoO0ubFKOxzMG+g==
 
 boxen@^1.2.1:
   version "1.3.0"
@@ -3145,7 +3109,7 @@ copy-webpack-plugin@^11.0.0:
     schema-utils "^4.0.0"
     serialize-javascript "^6.0.0"
 
-core-js-compat@^3.25.1, core-js-compat@^3.31.0:
+core-js-compat@^3.31.0:
   version "3.31.1"
   resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.31.1.tgz#5084ad1a46858df50ff89ace152441a63ba7aae0"
   integrity sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==
@@ -3449,11 +3413,16 @@ detect-indent@~5.0.0:
   resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
   integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==
 
-detect-libc@^2.0.0, detect-libc@^2.0.1:
+detect-libc@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd"
   integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==
 
+detect-libc@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d"
+  integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==
+
 detect-newline@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
@@ -3838,14 +3807,15 @@ eslint-plugin-jsx-a11y@^6.7.1:
     object.fromentries "^2.0.6"
     semver "^6.3.0"
 
-eslint-plugin-prettier@^4.2.1:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b"
-  integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==
+eslint-plugin-prettier@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz#6887780ed95f7708340ec79acfdf60c35b9be57a"
+  integrity sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==
   dependencies:
     prettier-linter-helpers "^1.0.0"
+    synckit "^0.8.5"
 
-eslint-scope@5.1.1, eslint-scope@^5.1.1:
+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==
@@ -3866,10 +3836,10 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1:
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994"
   integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==
 
-eslint@^8.44.0:
-  version "8.44.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.44.0.tgz#51246e3889b259bbcd1d7d736a0c10add4f0e500"
-  integrity sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==
+eslint@^8.45.0:
+  version "8.45.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.45.0.tgz#bab660f90d18e1364352c0a6b7c6db8edb458b78"
+  integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==
   dependencies:
     "@eslint-community/eslint-utils" "^4.2.0"
     "@eslint-community/regexpp" "^4.4.0"
@@ -3896,7 +3866,6 @@ eslint@^8.44.0:
     globals "^13.19.0"
     graphemer "^1.4.0"
     ignore "^5.2.0"
-    import-fresh "^3.0.0"
     imurmurhash "^0.1.4"
     is-glob "^4.0.0"
     is-path-inside "^3.0.3"
@@ -3908,7 +3877,6 @@ eslint@^8.44.0:
     natural-compare "^1.4.0"
     optionator "^0.9.3"
     strip-ansi "^6.0.1"
-    strip-json-comments "^3.1.0"
     text-table "^0.2.0"
 
 espree@^9.6.0:
@@ -4089,6 +4057,11 @@ fast-diff@^1.1.2:
   resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0"
   integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==
 
+fast-fifo@^1.1.0, fast-fifo@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.0.tgz#03e381bcbfb29932d7c3afde6e15e83e05ab4d8b"
+  integrity sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw==
+
 fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0"
@@ -4896,10 +4869,10 @@ husky@^8.0.3:
   resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184"
   integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==
 
-i18next@^23.2.8:
-  version "23.2.8"
-  resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.2.8.tgz#dd54fab8f68c1ef2e0408249e042cf9cef683554"
-  integrity sha512-wU0pMlJ91ZbB89i77G3YQ11/pBQrzgWpxJYl7HFyA9aU9v3aHMI/oBKQmAJNURr0A8cLG4EHjgSMK8IqQTp4PQ==
+i18next@^23.3.0:
+  version "23.3.0"
+  resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.3.0.tgz#88528a735bb3e61019093899867b9fdb26436508"
+  integrity sha512-xd/UzWT71zYudCT7qVn6tB4yUVuXAhgCorsowYgM2EOdc14WqQBp5P2wEsxgfiDgdLN5XwJvTbzxrMfoY/nxnw==
   dependencies:
     "@babel/runtime" "^7.22.5"
 
@@ -4962,7 +4935,7 @@ import-fresh@^2.0.0:
     caller-path "^2.0.0"
     resolve-from "^3.0.0"
 
-import-fresh@^3.0.0, import-fresh@^3.2.1:
+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==
@@ -7468,23 +7441,23 @@ prettier-plugin-import-sort@^0.0.7:
     import-sort-parser-babylon "^6.0.0"
     import-sort-parser-typescript "^6.0.0"
 
-prettier-plugin-organize-imports@^3.2.2:
-  version "3.2.2"
-  resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.2.tgz#91993365e017daa5d0d28d8183179834224d8dd1"
-  integrity sha512-e97lE6odGSiHonHJMTYC0q0iLXQyw0u5z/PJpvP/3vRy6/Zi9kLBwFAbEGjDzIowpjQv8b+J04PDamoUSQbzGA==
+prettier-plugin-organize-imports@^3.2.3:
+  version "3.2.3"
+  resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.3.tgz#6b0141ac71f7ee9a673ce83e95456319e3a7cf0d"
+  integrity sha512-KFvk8C/zGyvUaE3RvxN2MhCLwzV6OBbFSkwZ2OamCrs9ZY4i5L77jQ/w4UmUr+lqX8qbaqVq6bZZkApn+IgJSg==
 
-prettier-plugin-packagejson@^2.4.4:
-  version "2.4.4"
-  resolved "https://registry.yarnpkg.com/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.4.4.tgz#06a532de7a0234610493f971ba5f452b57438451"
-  integrity sha512-Xk74PATiZDW+kELIh8e8EY0JpwHo9xbSGc4YfIfxmITWAF8yqHa7A+yAQLLMRoQEkKNi+xaMnR8BX2F9zrsczg==
+prettier-plugin-packagejson@^2.4.5:
+  version "2.4.5"
+  resolved "https://registry.yarnpkg.com/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.4.5.tgz#20cc396e5654b5736657bd2dfb7ac859afc618cc"
+  integrity sha512-glG71jE1gO3y5+JNAhC8X+4yrlN28rub6Aj461SKbaPie9RgMiHKcInH2Moi2VGOfkTXaEHBhg4uVMBqa+kBUA==
   dependencies:
-    sort-package-json "2.5.0"
+    sort-package-json "2.5.1"
     synckit "0.8.5"
 
-prettier@^2.8.8:
-  version "2.8.8"
-  resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
-  integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
+prettier@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.0.tgz#e7b19f691245a21d618c68bc54dc06122f6105ae"
+  integrity sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==
 
 pretty-bytes@^5.3.0, pretty-bytes@^5.4.1:
   version "5.6.0"
@@ -7630,6 +7603,11 @@ queue-microtask@^1.2.2:
   resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
   integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
 
+queue-tick@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142"
+  integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==
+
 qw@~1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/qw/-/qw-1.0.2.tgz#0c31a6f810320a91c58b05198679427103b03c4a"
@@ -8097,10 +8075,10 @@ sass-loader@^13.3.2:
   dependencies:
     neo-async "^2.6.2"
 
-sass@^1.63.6:
-  version "1.63.6"
-  resolved "https://registry.yarnpkg.com/sass/-/sass-1.63.6.tgz#481610e612902e0c31c46b46cf2dad66943283ea"
-  integrity sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==
+sass@^1.64.1:
+  version "1.64.1"
+  resolved "https://registry.yarnpkg.com/sass/-/sass-1.64.1.tgz#6a46f6d68e0fa5ad90aa59ce025673ddaa8441cf"
+  integrity sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==
   dependencies:
     chokidar ">=3.0.0 <4.0.0"
     immutable "^4.0.0"
@@ -8156,12 +8134,17 @@ semver-diff@^2.0.0:
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
   integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
 
-semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
+semver@^6.3.0:
   version "6.3.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
   integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
 
-semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.0:
+semver@^6.3.1:
+  version "6.3.1"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+  integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.3.5, semver@^7.3.8, semver@^7.5.4:
   version "7.5.4"
   resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
   integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
@@ -8276,18 +8259,18 @@ shallowequal@^1.0.1:
   resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
   integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
 
-sharp@^0.32.1:
-  version "0.32.1"
-  resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.1.tgz#41aa0d0b2048b2e0ee453d9fcb14ec1f408390fe"
-  integrity sha512-kQTFtj7ldpUqSe8kDxoGLZc1rnMFU0AO2pqbX6pLy3b7Oj8ivJIdoKNwxHVQG2HN6XpHPJqCSM2nsma2gOXvOg==
+sharp@^0.32.4:
+  version "0.32.4"
+  resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.4.tgz#0354653b7924f2520b2264ac9bcd10a58bf411b6"
+  integrity sha512-exUnZewqVZC6UXqXuQ8fyJJv0M968feBi04jb9GcUHrWtkRoAKnbJt8IfwT4NJs7FskArbJ14JAFGVuooszoGg==
   dependencies:
     color "^4.2.3"
-    detect-libc "^2.0.1"
+    detect-libc "^2.0.2"
     node-addon-api "^6.1.0"
     prebuild-install "^7.1.1"
-    semver "^7.5.0"
+    semver "^7.5.4"
     simple-get "^4.0.1"
-    tar-fs "^2.1.1"
+    tar-fs "^3.0.4"
     tunnel-agent "^0.6.0"
 
 shebang-command@^1.2.0:
@@ -8465,10 +8448,10 @@ sort-object-keys@^1.1.3:
   resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45"
   integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==
 
-sort-package-json@2.5.0:
-  version "2.5.0"
-  resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-2.5.0.tgz#6e249a8d3b4a637b491676019524533e23208bb8"
-  integrity sha512-KIsqEi/ameVyhhatpzwialQVSMP1mFzRLJgTBKJDz0duQmhnBDjf8MFyFoIoVnW69SqjH3/bziCSlgiuz2KbHg==
+sort-package-json@2.5.1:
+  version "2.5.1"
+  resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-2.5.1.tgz#5c0f2ce8cc8851988e5039f76b8978439439039d"
+  integrity sha512-vx/KoZxm8YNMUqdlw7SGTfqR5pqZ/sUfgOuRtDILiOy/3AvzhAibyUe2cY3OpLs3oRSow9up4yLVtQaM24rbDQ==
   dependencies:
     detect-indent "^7.0.1"
     detect-newline "^4.0.0"
@@ -8650,6 +8633,14 @@ stream-shift@^1.0.0:
   resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
   integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
 
+streamx@^2.15.0:
+  version "2.15.0"
+  resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.15.0.tgz#f58c92e6f726b5390dcabd6dd9094d29a854d698"
+  integrity sha512-HcxY6ncGjjklGs1xsP1aR71INYcsXFJet5CU1CHqihQ2J5nOsbd4OjgjHO42w/4QNv9gZb3BueV+Vxok5pLEXg==
+  dependencies:
+    fast-fifo "^1.1.0"
+    queue-tick "^1.0.1"
+
 strict-uri-encode@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
@@ -8828,7 +8819,7 @@ strip-final-newline@^3.0.0:
   resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd"
   integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==
 
-strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
+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==
@@ -8869,7 +8860,7 @@ supports-preserve-symlinks-flag@^1.0.0:
   resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
   integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
 
-synckit@0.8.5:
+synckit@0.8.5, synckit@^0.8.5:
   version "0.8.5"
   resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3"
   integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==
@@ -8882,7 +8873,7 @@ tapable@^2.1.1, tapable@^2.2.0:
   resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
   integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
 
-tar-fs@^2.0.0, tar-fs@^2.1.1:
+tar-fs@^2.0.0:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
   integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
@@ -8892,6 +8883,15 @@ tar-fs@^2.0.0, tar-fs@^2.1.1:
     pump "^3.0.0"
     tar-stream "^2.1.4"
 
+tar-fs@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.4.tgz#a21dc60a2d5d9f55e0089ccd78124f1d3771dbbf"
+  integrity sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==
+  dependencies:
+    mkdirp-classic "^0.5.2"
+    pump "^3.0.0"
+    tar-stream "^3.1.5"
+
 tar-stream@^2.1.4:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
@@ -8903,6 +8903,15 @@ tar-stream@^2.1.4:
     inherits "^2.0.3"
     readable-stream "^3.1.1"
 
+tar-stream@^3.1.5:
+  version "3.1.6"
+  resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.6.tgz#6520607b55a06f4a2e2e04db360ba7d338cc5bab"
+  integrity sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==
+  dependencies:
+    b4a "^1.6.4"
+    fast-fifo "^1.2.0"
+    streamx "^2.15.0"
+
 tar@^2.0.0:
   version "2.2.2"
   resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40"
@@ -8958,7 +8967,7 @@ terser-webpack-plugin@^5.3.7:
     serialize-javascript "^6.0.1"
     terser "^5.16.8"
 
-terser@^5.0.0, terser@^5.16.8, terser@^5.18.2:
+terser@^5.0.0, terser@^5.16.8:
   version "5.18.2"
   resolved "https://registry.yarnpkg.com/terser/-/terser-5.18.2.tgz#ff3072a0faf21ffd38f99acc9a0ddf7b5f07b948"
   integrity sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==
@@ -8968,6 +8977,16 @@ terser@^5.0.0, terser@^5.16.8, terser@^5.18.2:
     commander "^2.20.0"
     source-map-support "~0.5.20"
 
+terser@^5.19.2:
+  version "5.19.2"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.2.tgz#bdb8017a9a4a8de4663a7983f45c506534f9234e"
+  integrity sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==
+  dependencies:
+    "@jridgewell/source-map" "^0.3.3"
+    acorn "^8.8.2"
+    commander "^2.20.0"
+    source-map-support "~0.5.20"
+
 text-table@^0.2.0, text-table@~0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
@@ -9065,23 +9084,16 @@ tributejs@^5.1.3:
   resolved "https://registry.yarnpkg.com/tributejs/-/tributejs-5.1.3.tgz#980600fc72865be5868893078b4bfde721129eae"
   integrity sha512-B5CXihaVzXw+1UHhNFyAwUTMDk1EfoLP5Tj1VhD9yybZ1I8DZJEv8tZ1l0RJo0t0tk9ZhR8eG5tEsaCvRigmdQ==
 
-tslib@^1.8.1:
-  version "1.14.1"
-  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
-  integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+ts-api-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.1.tgz#8144e811d44c749cd65b2da305a032510774452d"
+  integrity sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==
 
 tslib@^2.1.0, tslib@^2.5.0, tslib@^2.6.0:
   version "2.6.0"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3"
   integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==
 
-tsutils@^3.21.0:
-  version "3.21.0"
-  resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
-  integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
-  dependencies:
-    tslib "^1.8.1"
-
 tunnel-agent@^0.6.0:
   version "0.6.0"
   resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
@@ -9505,10 +9517,10 @@ webpack-sources@^3.2.3:
   resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
   integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
 
-webpack@5.88.1:
-  version "5.88.1"
-  resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.1.tgz#21eba01e81bd5edff1968aea726e2fbfd557d3f8"
-  integrity sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==
+webpack@5.88.2:
+  version "5.88.2"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e"
+  integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==
   dependencies:
     "@types/eslint-scope" "^3.7.3"
     "@types/estree" "^1.0.0"