Copy forward-headers from nginx to local node-fetch. Fixes #73
authorDessalines <tyhou13@gmx.com>
Thu, 12 Nov 2020 21:56:46 +0000 (15:56 -0600)
committerDessalines <tyhou13@gmx.com>
Thu, 12 Nov 2020 21:56:46 +0000 (15:56 -0600)
18 files changed:
package.json
src/server/index.tsx
src/shared/components/admin-settings.tsx
src/shared/components/communities.tsx
src/shared/components/community.tsx
src/shared/components/create-community.tsx
src/shared/components/create-post.tsx
src/shared/components/create-private-message.tsx
src/shared/components/inbox.tsx
src/shared/components/main.tsx
src/shared/components/modlog.tsx
src/shared/components/post.tsx
src/shared/components/search.tsx
src/shared/components/user.tsx
src/shared/interfaces.ts
src/shared/routes.ts
src/shared/utils.ts
yarn.lock

index c158667e04741a00578eb2d3b7e42c04a92b942d..c748b5a9f287d9e4cb9ca65ee817d4631a6811db 100644 (file)
@@ -15,7 +15,7 @@
   },
   "repository": "https://github.com/LemmyNet/lemmy-ui",
   "dependencies": {
-    "@typescript-eslint/parser": "^4.6.1",
+    "@typescript-eslint/parser": "^4.7.0",
     "autosize": "^4.0.2",
     "choices.js": "^9.0.1",
     "emoji-short-name": "^1.0.0",
@@ -43,7 +43,7 @@
     "tippy.js": "^6.2.7",
     "toastify-js": "^1.9.3",
     "tributejs": "^5.1.3",
-    "ws": "^7.3.1"
+    "ws": "^7.4.0"
   },
   "devDependencies": {
     "@babel/core": "^7.12.3",
     "@babel/preset-typescript": "^7.12.1",
     "@babel/runtime": "^7.12.5",
     "@types/autosize": "^3.0.6",
-    "@types/express": "^4.17.8",
-    "@types/node": "^14.14.6",
+    "@types/express": "^4.17.9",
+    "@types/node": "^14.14.7",
     "@types/node-fetch": "^2.5.7",
     "@types/serialize-javascript": "^4.0.0",
-    "babel-loader": "^8.0.6",
+    "babel-loader": "^8.2.1",
     "babel-plugin-inferno": "^6",
     "bootstrap": "^4.5.3",
     "bootswatch": "^4.5.3",
     "clean-webpack-plugin": "^3.0.0",
     "copy-webpack-plugin": "^6.3.0",
     "css-loader": "^5.0.1",
-    "eslint": "^7.12.1",
+    "eslint": "^7.13.0",
     "eslint-plugin-jane": "^9.0.4",
     "husky": "^4.3.0",
-    "lemmy-js-client": "^1.0.14",
+    "lemmy-js-client": "^1.0.15",
     "lint-staged": "^10.5.1",
-    "mini-css-extract-plugin": "^1.2.1",
+    "mini-css-extract-plugin": "^1.3.1",
     "node-fetch": "^2.6.1",
     "node-sass": "^5.0.0",
     "prettier": "^2.1.2",
     "rimraf": "^3.0.2",
     "run-node-webpack-plugin": "^1.3.0",
-    "sass-loader": "^10.0.5",
+    "sass-loader": "^10.1.0",
     "sortpack": "^2.1.9",
     "style-loader": "^2.0.0",
     "terser": "^5.3.8",
index 7d32258048ba9483ae0b0d169f0b127aea3a6f10..5222a86a3deb2e9f179a5bb261c5d63c1a510b02 100644 (file)
@@ -1,4 +1,3 @@
-// import cookieParser = require('cookie-parser');
 import serialize from 'serialize-javascript';
 import express from 'express';
 import { StaticRouter } from 'inferno-router';
@@ -6,14 +5,16 @@ import { renderToString } from 'inferno-server';
 import { matchPath } from 'inferno-router';
 import path from 'path';
 import { App } from '../shared/components/app';
-import { IsoData } from '../shared/interfaces';
+import { InitialFetchRequest, IsoData } from '../shared/interfaces';
 import { routes } from '../shared/routes';
 import IsomorphicCookie from 'isomorphic-cookie';
-import { lemmyHttp, setAuth } from '../shared/utils';
-import { GetSiteForm } from 'lemmy-js-client';
+import { setAuth } from '../shared/utils';
+import { GetSiteForm, LemmyHttp } from 'lemmy-js-client';
 import process from 'process';
 import { Helmet } from 'inferno-helmet';
 import { initializeSite } from '../shared/initialize';
+import { httpUri } from '../shared/env';
+import { IncomingHttpHeaders } from 'http';
 
 const server = express();
 const port = 1234;
@@ -34,12 +35,20 @@ server.get('/*', async (req, res) => {
 
   let promises: Promise<any>[] = [];
 
+  let headers = setForwardedHeaders(req.headers);
+
+  let initialFetchReq: InitialFetchRequest = {
+    client: new LemmyHttp(httpUri, headers),
+    auth,
+    path: req.path,
+  };
+
   // Get site data first
-  let site = await lemmyHttp.getSite(getSiteForm);
+  let site = await initialFetchReq.client.getSite(getSiteForm);
   initializeSite(site);
 
   if (activeRoute.fetchInitialData) {
-    promises.push(...activeRoute.fetchInitialData(auth, req.path));
+    promises.push(...activeRoute.fetchInitialData(initialFetchReq));
   }
 
   let routeData = await Promise.all(promises);
@@ -119,16 +128,25 @@ server.get('/*', async (req, res) => {
          </html>
 `);
 });
-let Server = server.listen(port, () => {
+
+server.listen(port, () => {
   console.log(`http://localhost:${port}`);
 });
 
-/**
- * Used to restart server by fuseBox
- */
-export async function shutdown() {
-  Server.close();
-  Server = undefined;
+function setForwardedHeaders(
+  headers: IncomingHttpHeaders
+): { [key: string]: string } {
+  let out = {
+    host: headers.host,
+  };
+  if (headers['x-real-ip']) {
+    out['x-real-ip'] = headers['x-real-ip'];
+  }
+  if (headers['x-forwarded-for']) {
+    out['x-forwarded-for'] = headers['x-forwarded-for'];
+  }
+
+  return out;
 }
 
 process.on('SIGINT', () => {
index 871dcf815d9f87786485083c782bc3005727981c..6340d4fc54efe418633c5a9499f17d0be0bc15b9 100644 (file)
@@ -18,7 +18,6 @@ import {
   setIsoData,
   wsSubscribe,
   isBrowser,
-  lemmyHttp,
   setAuth,
 } from '../utils';
 import autosize from 'autosize';
@@ -26,6 +25,7 @@ import { SiteForm } from './site-form';
 import { UserListing } from './user-listing';
 import { HtmlTags } from './html-tags';
 import { i18n } from '../i18next';
+import { InitialFetchRequest } from 'shared/interfaces';
 
 interface AdminSettingsState {
   siteRes: GetSiteResponse;
@@ -71,10 +71,10 @@ export class AdminSettings extends Component<any, AdminSettingsState> {
     }
   }
 
-  static fetchInitialData(auth: string, _path: string): Promise<any>[] {
+  static fetchInitialData(req: InitialFetchRequest): Promise<any>[] {
     let form: GetSiteConfig = {};
-    setAuth(form, auth);
-    return [lemmyHttp.getSiteConfig(form)];
+    setAuth(form, req.auth);
+    return [req.client.getSiteConfig(form)];
   }
 
   componentDidMount() {
index 4caf24d4d5feb1d2843d33e26f8d961b4d7d4764..523f9a9b6b61ba7976858db0f713e03ef3d774ea 100644 (file)
@@ -18,13 +18,13 @@ import {
   toast,
   getPageFromProps,
   isBrowser,
-  lemmyHttp,
   setAuth,
   setIsoData,
   wsSubscribe,
 } from '../utils';
 import { CommunityLink } from './community-link';
 import { i18n } from '../i18next';
+import { InitialFetchRequest } from 'shared/interfaces';
 
 const communityLimit = 100;
 
@@ -237,17 +237,17 @@ export class Communities extends Component<any, CommunitiesState> {
     WebSocketService.Instance.listCommunities(listCommunitiesForm);
   }
 
-  static fetchInitialData(auth: string, path: string): Promise<any>[] {
-    let pathSplit = path.split('/');
+  static fetchInitialData(req: InitialFetchRequest): Promise<any>[] {
+    let pathSplit = req.path.split('/');
     let page = pathSplit[3] ? Number(pathSplit[3]) : 1;
     let listCommunitiesForm: ListCommunitiesForm = {
       sort: SortType.TopAll,
       limit: communityLimit,
       page,
     };
-    setAuth(listCommunitiesForm, auth);
+    setAuth(listCommunitiesForm, req.auth);
 
-    return [lemmyHttp.listCommunities(listCommunitiesForm)];
+    return [req.client.listCommunities(listCommunitiesForm)];
   }
 
   parseMessage(msg: WebSocketJsonResponse) {
index 86d2c1cc2cfe20eb550863a7344a80de0454b20d..18fa459d0eb20dd3a6dd28190b4e2e13032615d8 100644 (file)
@@ -1,6 +1,6 @@
 import { Component, linkEvent } from 'inferno';
 import { Subscription } from 'rxjs';
-import { DataType } from '../interfaces';
+import { DataType, InitialFetchRequest } from '../interfaces';
 import {
   UserOperation,
   GetCommunityResponse,
@@ -50,7 +50,6 @@ import {
   setIsoData,
   wsSubscribe,
   isBrowser,
-  lemmyHttp,
   setAuth,
   communityRSSUrl,
 } from '../utils';
@@ -150,8 +149,8 @@ export class Community extends Component<any, State> {
     };
   }
 
-  static fetchInitialData(auth: string, path: string): Promise<any>[] {
-    let pathSplit = path.split('/');
+  static fetchInitialData(req: InitialFetchRequest): Promise<any>[] {
+    let pathSplit = req.path.split('/');
     let promises: Promise<any>[] = [];
 
     // It can be /c/main, or /c/1
@@ -165,8 +164,8 @@ export class Community extends Component<any, State> {
     }
 
     let communityForm: GetCommunityForm = id ? { id } : { name: name_ };
-    setAuth(communityForm, auth);
-    promises.push(lemmyHttp.getCommunity(communityForm));
+    setAuth(communityForm, req.auth);
+    promises.push(req.client.getCommunity(communityForm));
 
     let dataType: DataType = pathSplit[4]
       ? DataType[pathSplit[4]]
@@ -188,8 +187,8 @@ export class Community extends Component<any, State> {
         type_: ListingType.Community,
       };
       this.setIdOrName(getPostsForm, id, name_);
-      setAuth(getPostsForm, auth);
-      promises.push(lemmyHttp.getPosts(getPostsForm));
+      setAuth(getPostsForm, req.auth);
+      promises.push(req.client.getPosts(getPostsForm));
     } else {
       let getCommentsForm: GetCommentsForm = {
         page,
@@ -198,11 +197,11 @@ export class Community extends Component<any, State> {
         type_: ListingType.Community,
       };
       this.setIdOrName(getCommentsForm, id, name_);
-      setAuth(getCommentsForm, auth);
-      promises.push(lemmyHttp.getComments(getCommentsForm));
+      setAuth(getCommentsForm, req.auth);
+      promises.push(req.client.getComments(getCommentsForm));
     }
 
-    promises.push(lemmyHttp.listCategories());
+    promises.push(req.client.listCategories());
 
     return promises;
   }
index c1edefdf1c86a46ffd09811d1a44bd5a10d10e8d..c96a8260c05494c831dfac43753ad8d3c048f773 100644 (file)
@@ -16,10 +16,10 @@ import {
   wsJsonToRes,
   wsSubscribe,
   isBrowser,
-  lemmyHttp,
 } from '../utils';
 import { WebSocketService, UserService } from '../services';
 import { i18n } from '../i18next';
+import { InitialFetchRequest } from 'shared/interfaces';
 
 interface CreateCommunityState {
   site: Site;
@@ -100,8 +100,8 @@ export class CreateCommunity extends Component<any, CreateCommunityState> {
     this.props.history.push(`/c/${community.name}`);
   }
 
-  static fetchInitialData(_auth: string, _path: string): Promise<any>[] {
-    return [lemmyHttp.listCategories()];
+  static fetchInitialData(req: InitialFetchRequest): Promise<any>[] {
+    return [req.client.listCategories()];
   }
 
   parseMessage(msg: WebSocketJsonResponse) {
index 06043a7d36b323ba7983f415e9a717d3828f6cf6..d692b8a2133df4127c5ee15e0074c148189ae1d3 100644 (file)
@@ -4,7 +4,6 @@ import { PostForm } from './post-form';
 import { HtmlTags } from './html-tags';
 import {
   isBrowser,
-  lemmyHttp,
   setAuth,
   setIsoData,
   toast,
@@ -23,6 +22,7 @@ import {
   SortType,
 } from 'lemmy-js-client';
 import { i18n } from '../i18next';
+import { InitialFetchRequest } from 'shared/interfaces';
 
 interface CreatePostState {
   site: Site;
@@ -138,13 +138,13 @@ export class CreatePost extends Component<any, CreatePostState> {
     this.props.history.push(`/post/${id}`);
   }
 
-  static fetchInitialData(auth: string, _path: string): Promise<any>[] {
+  static fetchInitialData(req: InitialFetchRequest): Promise<any>[] {
     let listCommunitiesForm: ListCommunitiesForm = {
       sort: SortType.TopAll,
       limit: 9999,
     };
-    setAuth(listCommunitiesForm, auth);
-    return [lemmyHttp.listCommunities(listCommunitiesForm)];
+    setAuth(listCommunitiesForm, req.auth);
+    return [req.client.listCommunities(listCommunitiesForm)];
   }
 
   parseMessage(msg: WebSocketJsonResponse) {
index e96c77fc143609d96b1c7b948b8965345b5f7237..e08bc56f5d951ed7f1059a7daa6fbfeff1f2901c 100644 (file)
@@ -15,7 +15,6 @@ import {
 import {
   getRecipientIdFromProps,
   isBrowser,
-  lemmyHttp,
   setAuth,
   setIsoData,
   toast,
@@ -23,6 +22,7 @@ import {
   wsSubscribe,
 } from '../utils';
 import { i18n } from '../i18next';
+import { InitialFetchRequest } from 'shared/interfaces';
 
 interface CreatePrivateMessageProps {}
 
@@ -78,15 +78,15 @@ export class CreatePrivateMessage extends Component<
     WebSocketService.Instance.getUserDetails(form);
   }
 
-  static fetchInitialData(auth: string, path: string): Promise<any>[] {
-    let user_id = Number(path.split('/').pop());
+  static fetchInitialData(req: InitialFetchRequest): Promise<any>[] {
+    let user_id = Number(req.path.split('/').pop());
     let form: GetUserDetailsForm = {
       user_id,
       sort: SortType.New,
       saved_only: false,
     };
-    setAuth(form, auth);
-    return [lemmyHttp.getUserDetails(form)];
+    setAuth(form, req.auth);
+    return [req.client.getUserDetails(form)];
   }
 
   get documentTitle(): string {
index e141f1e7695aa23e2fab5b39449334e90f1864a0..70feb4bed767c1fd49e5ce2b803c89df27efee01 100644 (file)
@@ -30,7 +30,6 @@ import {
   setupTippy,
   setIsoData,
   wsSubscribe,
-  lemmyHttp,
   setAuth,
   isBrowser,
 } from '../utils';
@@ -39,6 +38,7 @@ import { PrivateMessage } from './private-message';
 import { HtmlTags } from './html-tags';
 import { SortSelect } from './sort-select';
 import { i18n } from '../i18next';
+import { InitialFetchRequest } from 'shared/interfaces';
 
 enum UnreadOrAll {
   Unread,
@@ -404,7 +404,7 @@ export class Inbox extends Component<any, InboxState> {
     i.refetch();
   }
 
-  static fetchInitialData(auth: string, _path: string): Promise<any>[] {
+  static fetchInitialData(req: InitialFetchRequest): Promise<any>[] {
     let promises: Promise<any>[] = [];
 
     // It can be /u/me, or /username/1
@@ -414,8 +414,8 @@ export class Inbox extends Component<any, InboxState> {
       page: 1,
       limit: fetchLimit,
     };
-    setAuth(repliesForm, auth);
-    promises.push(lemmyHttp.getReplies(repliesForm));
+    setAuth(repliesForm, req.auth);
+    promises.push(req.client.getReplies(repliesForm));
 
     let userMentionsForm: GetUserMentionsForm = {
       sort: SortType.New,
@@ -423,16 +423,16 @@ export class Inbox extends Component<any, InboxState> {
       page: 1,
       limit: fetchLimit,
     };
-    setAuth(userMentionsForm, auth);
-    promises.push(lemmyHttp.getUserMentions(userMentionsForm));
+    setAuth(userMentionsForm, req.auth);
+    promises.push(req.client.getUserMentions(userMentionsForm));
 
     let privateMessagesForm: GetPrivateMessagesForm = {
       unread_only: true,
       page: 1,
       limit: fetchLimit,
     };
-    setAuth(privateMessagesForm, auth);
-    promises.push(lemmyHttp.getPrivateMessages(privateMessagesForm));
+    setAuth(privateMessagesForm, req.auth);
+    promises.push(req.client.getPrivateMessages(privateMessagesForm));
 
     return promises;
   }
index 5f7b7776d9d51e5f31fbbad970962cbeb3e7510a..5f54efa178e5fa7a3b9bda316f5961b348275b7f 100644 (file)
@@ -24,7 +24,7 @@ import {
   BanUserResponse,
   WebSocketJsonResponse,
 } from 'lemmy-js-client';
-import { DataType } from '../interfaces';
+import { DataType, InitialFetchRequest } from '../interfaces';
 import { WebSocketService, UserService } from '../services';
 import { PostListings } from './post-listings';
 import { CommentNodes } from './comment-nodes';
@@ -56,7 +56,6 @@ import {
   wsSubscribe,
   isBrowser,
   setAuth,
-  lemmyHttp,
 } from '../utils';
 import { i18n } from '../i18next';
 import { T } from 'inferno-i18next';
@@ -175,8 +174,8 @@ export class Main extends Component<any, MainState> {
     };
   }
 
-  static fetchInitialData(auth: string, path: string): Promise<any>[] {
-    let pathSplit = path.split('/');
+  static fetchInitialData(req: InitialFetchRequest): Promise<any>[] {
+    let pathSplit = req.path.split('/');
     let dataType: DataType = pathSplit[3]
       ? DataType[pathSplit[3]]
       : DataType.Post;
@@ -206,8 +205,8 @@ export class Main extends Component<any, MainState> {
         sort,
         type_,
       };
-      setAuth(getPostsForm, auth);
-      promises.push(lemmyHttp.getPosts(getPostsForm));
+      setAuth(getPostsForm, req.auth);
+      promises.push(req.client.getPosts(getPostsForm));
     } else {
       let getCommentsForm: GetCommentsForm = {
         page,
@@ -215,18 +214,18 @@ export class Main extends Component<any, MainState> {
         sort,
         type_,
       };
-      setAuth(getCommentsForm, auth);
-      promises.push(lemmyHttp.getComments(getCommentsForm));
+      setAuth(getCommentsForm, req.auth);
+      promises.push(req.client.getComments(getCommentsForm));
     }
 
     let trendingCommunitiesForm: ListCommunitiesForm = {
       sort: SortType.Hot,
       limit: 6,
     };
-    promises.push(lemmyHttp.listCommunities(trendingCommunitiesForm));
+    promises.push(req.client.listCommunities(trendingCommunitiesForm));
 
-    if (auth) {
-      promises.push(lemmyHttp.getFollowedCommunities({ auth }));
+    if (req.auth) {
+      promises.push(req.client.getFollowedCommunities({ auth: req.auth }));
     }
 
     return promises;
index 86e93be817af651f5548c8b0d275f0b151a110e9..ded9a30a096526f3940541a4d94663f435952963 100644 (file)
@@ -26,12 +26,12 @@ import {
   setIsoData,
   wsSubscribe,
   isBrowser,
-  lemmyHttp,
 } from '../utils';
 import { MomentTime } from './moment-time';
 import { HtmlTags } from './html-tags';
 import moment from 'moment';
 import { i18n } from '../i18next';
+import { InitialFetchRequest } from 'shared/interfaces';
 
 interface ModlogState {
   combined: {
@@ -443,8 +443,8 @@ export class Modlog extends Component<any, ModlogState> {
     WebSocketService.Instance.getModlog(modlogForm);
   }
 
-  static fetchInitialData(_auth: string, path: string): Promise<any>[] {
-    let pathSplit = path.split('/');
+  static fetchInitialData(req: InitialFetchRequest): Promise<any>[] {
+    let pathSplit = req.path.split('/');
     let communityId = pathSplit[3];
     let promises: Promise<any>[] = [];
 
@@ -457,7 +457,7 @@ export class Modlog extends Component<any, ModlogState> {
       modlogForm.community_id = Number(communityId);
     }
 
-    promises.push(lemmyHttp.getModlog(modlogForm));
+    promises.push(req.client.getModlog(modlogForm));
     return promises;
   }
 
index 37bae27dd8666831ebc6e700c0d6ed80db5ae315..017ff451cdf1ce64ea403e7878a7c8a0fca0cf9f 100644 (file)
@@ -25,7 +25,11 @@ import {
   ListCategoriesResponse,
   Category,
 } from 'lemmy-js-client';
-import { CommentSortType, CommentViewType } from '../interfaces';
+import {
+  CommentSortType,
+  CommentViewType,
+  InitialFetchRequest,
+} from '../interfaces';
 import { WebSocketService, UserService } from '../services';
 import {
   wsJsonToRes,
@@ -41,7 +45,6 @@ import {
   getCommentIdFromProps,
   wsSubscribe,
   setAuth,
-  lemmyHttp,
   isBrowser,
   previewLines,
   isImage,
@@ -112,8 +115,8 @@ export class Post extends Component<any, PostState> {
     WebSocketService.Instance.getPost(form);
   }
 
-  static fetchInitialData(auth: string, path: string): Promise<any>[] {
-    let pathSplit = path.split('/');
+  static fetchInitialData(req: InitialFetchRequest): Promise<any>[] {
+    let pathSplit = req.path.split('/');
     let promises: Promise<any>[] = [];
 
     let id = Number(pathSplit[2]);
@@ -121,10 +124,10 @@ export class Post extends Component<any, PostState> {
     let postForm: GetPostForm = {
       id,
     };
-    setAuth(postForm, auth);
+    setAuth(postForm, req.auth);
 
-    promises.push(lemmyHttp.getPost(postForm));
-    promises.push(lemmyHttp.listCategories());
+    promises.push(req.client.getPost(postForm));
+    promises.push(req.client.listCategories());
 
     return promises;
   }
index af6a6b6ed84c0e68c90f8a12509154c06be04457..0bda38e1049f314b3c52bd6ab6b8475d413e20cd 100644 (file)
@@ -27,7 +27,6 @@ import {
   commentsToFlatNodes,
   setIsoData,
   wsSubscribe,
-  lemmyHttp,
   setAuth,
 } from '../utils';
 import { PostListing } from './post-listing';
@@ -37,6 +36,7 @@ import { CommunityLink } from './community-link';
 import { SortSelect } from './sort-select';
 import { CommentNodes } from './comment-nodes';
 import { i18n } from '../i18next';
+import { InitialFetchRequest } from 'shared/interfaces';
 
 interface SearchProps {
   q: string;
@@ -132,8 +132,8 @@ export class Search extends Component<any, SearchState> {
     };
   }
 
-  static fetchInitialData(auth: string, path: string): Promise<any>[] {
-    let pathSplit = path.split('/');
+  static fetchInitialData(req: InitialFetchRequest): Promise<any>[] {
+    let pathSplit = req.path.split('/');
     let promises: Promise<any>[] = [];
 
     let form: SearchForm = {
@@ -143,10 +143,10 @@ export class Search extends Component<any, SearchState> {
       page: this.getPageFromProps(pathSplit[9]),
       limit: fetchLimit,
     };
-    setAuth(form, auth);
+    setAuth(form, req.auth);
 
     if (form.q != '') {
-      promises.push(lemmyHttp.search(form));
+      promises.push(req.client.search(form));
     }
 
     return promises;
index f93ab94bb7372d79f04cf643cac2bafa1e5f575f..37a1384513f91550c81867e8f2caf13642662804 100644 (file)
@@ -17,7 +17,7 @@ import {
   PostResponse,
   BanUserResponse,
 } from 'lemmy-js-client';
-import { UserDetailsView } from '../interfaces';
+import { InitialFetchRequest, UserDetailsView } from '../interfaces';
 import { WebSocketService, UserService } from '../services';
 import {
   wsJsonToRes,
@@ -41,7 +41,6 @@ import {
   saveCommentRes,
   createPostLikeFindRes,
   setAuth,
-  lemmyHttp,
   previewLines,
   editPostFindRes,
 } from '../utils';
@@ -187,8 +186,8 @@ export class User extends Component<any, UserState> {
     return page ? Number(page) : 1;
   }
 
-  static fetchInitialData(auth: string, path: string): Promise<any>[] {
-    let pathSplit = path.split('/');
+  static fetchInitialData(req: InitialFetchRequest): Promise<any>[] {
+    let pathSplit = req.path.split('/');
     let promises: Promise<any>[] = [];
 
     // It can be /u/me, or /username/1
@@ -212,8 +211,8 @@ export class User extends Component<any, UserState> {
       limit: fetchLimit,
     };
     this.setIdOrName(form, user_id, username);
-    setAuth(form, auth);
-    promises.push(lemmyHttp.getUserDetails(form));
+    setAuth(form, req.auth);
+    promises.push(req.client.getUserDetails(form));
     return promises;
   }
 
index 4f834c84b58173a23bdb328d9749d620abaae55c..df083b9bcfad9267399989645c190e5c59b6210a 100644 (file)
@@ -1,4 +1,4 @@
-import { GetSiteResponse } from 'lemmy-js-client';
+import { GetSiteResponse, LemmyHttp } from 'lemmy-js-client';
 
 export interface IsoData {
   path: string;
@@ -15,6 +15,12 @@ declare global {
   }
 }
 
+export interface InitialFetchRequest {
+  auth: string;
+  path: string;
+  client: LemmyHttp;
+}
+
 export enum CommentSortType {
   Hot,
   Top,
index 1e45561b7fa86e918e6f442950c5c0d51516abdd..92a412ed4742f3c5325bebfec7fe16f1b39220af 100644 (file)
@@ -15,9 +15,10 @@ import { AdminSettings } from './components/admin-settings';
 import { Inbox } from './components/inbox';
 import { Search } from './components/search';
 import { Instances } from './components/instances';
+import { InitialFetchRequest } from './interfaces';
 
 interface IRoutePropsWithFetch extends IRouteProps {
-  fetchInitialData?(auth: string, path: string): Promise<any>[];
+  fetchInitialData?(req: InitialFetchRequest): Promise<any>[];
 }
 
 export const routes: IRoutePropsWithFetch[] = [
@@ -25,12 +26,12 @@ export const routes: IRoutePropsWithFetch[] = [
     path: `/`,
     exact: true,
     component: Main,
-    fetchInitialData: (auth, path) => Main.fetchInitialData(auth, path),
+    fetchInitialData: req => Main.fetchInitialData(req),
   },
   {
     path: `/home/data_type/:data_type/listing_type/:listing_type/sort/:sort/page/:page`,
     component: Main,
-    fetchInitialData: (auth, path) => Main.fetchInitialData(auth, path),
+    fetchInitialData: req => Main.fetchInitialData(req),
   },
   {
     path: `/login`,
@@ -39,101 +40,98 @@ export const routes: IRoutePropsWithFetch[] = [
   {
     path: `/create_post`,
     component: CreatePost,
-    fetchInitialData: (auth, path) => CreatePost.fetchInitialData(auth, path),
+    fetchInitialData: req => CreatePost.fetchInitialData(req),
   },
   {
     path: `/create_community`,
     component: CreateCommunity,
-    fetchInitialData: (auth, path) =>
-      CreateCommunity.fetchInitialData(auth, path),
+    fetchInitialData: req => CreateCommunity.fetchInitialData(req),
   },
   {
     path: `/create_private_message/recipient/:recipient_id`,
     component: CreatePrivateMessage,
-    fetchInitialData: (auth, path) =>
-      CreatePrivateMessage.fetchInitialData(auth, path),
+    fetchInitialData: req => CreatePrivateMessage.fetchInitialData(req),
   },
   {
     path: `/communities/page/:page`,
     component: Communities,
-    fetchInitialData: (auth, path) => Communities.fetchInitialData(auth, path),
+    fetchInitialData: req => Communities.fetchInitialData(req),
   },
   {
     path: `/communities`,
     component: Communities,
-    fetchInitialData: (auth, path) => Communities.fetchInitialData(auth, path),
+    fetchInitialData: req => Communities.fetchInitialData(req),
   },
   {
     path: `/post/:id/comment/:comment_id`,
     component: Post,
-    fetchInitialData: (auth, path) => Post.fetchInitialData(auth, path),
+    fetchInitialData: req => Post.fetchInitialData(req),
   },
   {
     path: `/post/:id`,
     component: Post,
-    fetchInitialData: (auth, path) => Post.fetchInitialData(auth, path),
+    fetchInitialData: req => Post.fetchInitialData(req),
   },
   {
     path: `/c/:name/data_type/:data_type/sort/:sort/page/:page`,
     component: Community,
-    fetchInitialData: (auth, path) => Community.fetchInitialData(auth, path),
+    fetchInitialData: req => Community.fetchInitialData(req),
   },
   {
     path: `/community/:id`,
     component: Community,
-    fetchInitialData: (auth, path) => Community.fetchInitialData(auth, path),
+    fetchInitialData: req => Community.fetchInitialData(req),
   },
   {
     path: `/c/:name`,
     component: Community,
-    fetchInitialData: (auth, path) => Community.fetchInitialData(auth, path),
+    fetchInitialData: req => Community.fetchInitialData(req),
   },
   {
     path: `/u/:username/view/:view/sort/:sort/page/:page`,
     component: User,
-    fetchInitialData: (auth, path) => User.fetchInitialData(auth, path),
+    fetchInitialData: req => User.fetchInitialData(req),
   },
   {
     path: `/user/:id`,
     component: User,
-    fetchInitialData: (auth, path) => User.fetchInitialData(auth, path),
+    fetchInitialData: req => User.fetchInitialData(req),
   },
   {
     path: `/u/:username`,
     component: User,
-    fetchInitialData: (auth, path) => User.fetchInitialData(auth, path),
+    fetchInitialData: req => User.fetchInitialData(req),
   },
   {
     path: `/inbox`,
     component: Inbox,
-    fetchInitialData: (auth, path) => Inbox.fetchInitialData(auth, path),
+    fetchInitialData: req => Inbox.fetchInitialData(req),
   },
   {
     path: `/modlog/community/:community_id`,
     component: Modlog,
-    fetchInitialData: (auth, path) => Modlog.fetchInitialData(auth, path),
+    fetchInitialData: req => Modlog.fetchInitialData(req),
   },
   {
     path: `/modlog`,
     component: Modlog,
-    fetchInitialData: (auth, path) => Modlog.fetchInitialData(auth, path),
+    fetchInitialData: req => Modlog.fetchInitialData(req),
   },
   { path: `/setup`, component: Setup },
   {
     path: `/admin`,
     component: AdminSettings,
-    fetchInitialData: (auth, path) =>
-      AdminSettings.fetchInitialData(auth, path),
+    fetchInitialData: req => AdminSettings.fetchInitialData(req),
   },
   {
     path: `/search/q/:q/type/:type/sort/:sort/page/:page`,
     component: Search,
-    fetchInitialData: (auth, path) => Search.fetchInitialData(auth, path),
+    fetchInitialData: req => Search.fetchInitialData(req),
   },
   {
     path: `/search`,
     component: Search,
-    fetchInitialData: (auth, path) => Search.fetchInitialData(auth, path),
+    fetchInitialData: req => Search.fetchInitialData(req),
   },
   {
     path: `/password_change/:token`,
index 11a04b918c9a93c43f4ecf61bfe6d963f8402e35..4053ad21b528462235b7cb4769f9917d820dcfd9 100644 (file)
@@ -43,11 +43,8 @@ import {
   SearchResponse,
   CommentResponse,
   PostResponse,
-  LemmyHttp,
 } from 'lemmy-js-client';
 
-import { httpUri } from './env';
-
 import { CommentSortType, DataType, IsoData } from './interfaces';
 import { UserService, WebSocketService } from './services';
 
@@ -84,8 +81,6 @@ export const postRefetchSeconds: number = 60 * 1000;
 export const fetchLimit: number = 20;
 export const mentionDropdownFetchLimit = 10;
 
-export const lemmyHttp = new LemmyHttp(httpUri);
-
 export const languages = [
   { code: 'ca', name: 'Català' },
   { code: 'en', name: 'English' },
index a3c7e4d973033d9c1d68d4421419013bec1f1e48..fd15c78269d1d5e72c2834552a53e9f17808ca56 100644 (file)
--- a/yarn.lock
+++ b/yarn.lock
     "@types/qs" "*"
     "@types/range-parser" "*"
 
-"@types/express@^4.17.8":
-  version "4.17.8"
-  resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.8.tgz#3df4293293317e61c60137d273a2e96cd8d5f27a"
-  integrity sha512-wLhcKh3PMlyA2cNAB9sjM1BntnhPMiM0JOBwPBqttjHev2428MLEB4AYVN+d8s2iyCVZac+o41Pflm/ZH5vLXQ==
+"@types/express@^4.17.9":
+  version "4.17.9"
+  resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.9.tgz#f5f2df6add703ff28428add52bdec8a1091b0a78"
+  integrity sha512-SDzEIZInC4sivGIFY4Sz1GG6J9UObPwCInYJjko2jzOf/Imx/dlpume6Xxwj1ORL82tBbmN4cPDIDkLbWHk9hw==
   dependencies:
     "@types/body-parser" "*"
     "@types/express-serve-static-core" "*"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.0.tgz#7d4411bf5157339337d7cff864d9ff45f177b499"
   integrity sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==
 
-"@types/node@^14.14.6":
-  version "14.14.6"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.6.tgz#146d3da57b3c636cc0d1769396ce1cfa8991147f"
-  integrity sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==
+"@types/node@^14.14.7":
+  version "14.14.7"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.7.tgz#8ea1e8f8eae2430cf440564b98c6dfce1ec5945d"
+  integrity sha512-Zw1vhUSQZYw+7u5dAwNbIA9TuTotpzY/OF7sJM9FqPOF3SPjKnxrjoTktXDZgUjybf4cWVBP7O8wvKdSaGHweg==
 
 "@types/normalize-package-data@^2.4.0":
   version "2.4.0"
     "@typescript-eslint/typescript-estree" "4.5.0"
     debug "^4.1.1"
 
-"@typescript-eslint/parser@^4.6.1":
-  version "4.6.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.6.1.tgz#b801bff67b536ecc4a840ac9289ba2be57e02428"
-  integrity sha512-lScKRPt1wM9UwyKkGKyQDqf0bh6jm8DQ5iN37urRIXDm16GEv+HGEmum2Fc423xlk5NUOkOpfTnKZc/tqKZkDQ==
+"@typescript-eslint/parser@^4.7.0":
+  version "4.7.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.7.0.tgz#44bdab0f788b478178368baa65d3365fdc63da1c"
+  integrity sha512-+meGV8bMP1sJHBI2AFq1GeTwofcGiur8LoIr6v+rEmD9knyCqDlrQcFHR0KDDfldHIFDU/enZ53fla6ReF4wRw==
   dependencies:
-    "@typescript-eslint/scope-manager" "4.6.1"
-    "@typescript-eslint/types" "4.6.1"
-    "@typescript-eslint/typescript-estree" "4.6.1"
+    "@typescript-eslint/scope-manager" "4.7.0"
+    "@typescript-eslint/types" "4.7.0"
+    "@typescript-eslint/typescript-estree" "4.7.0"
     debug "^4.1.1"
 
 "@typescript-eslint/scope-manager@4.1.0":
     "@typescript-eslint/types" "4.5.0"
     "@typescript-eslint/visitor-keys" "4.5.0"
 
-"@typescript-eslint/scope-manager@4.6.1":
-  version "4.6.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.6.1.tgz#21872b91cbf7adfc7083f17b8041149148baf992"
-  integrity sha512-f95+80r6VdINYscJY1KDUEDcxZ3prAWHulL4qRDfNVD0I5QAVSGqFkwHERDoLYJJWmEAkUMdQVvx7/c2Hp+Bjg==
+"@typescript-eslint/scope-manager@4.7.0":
+  version "4.7.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.7.0.tgz#2115526085fb72723ccdc1eeae75dec7126220ed"
+  integrity sha512-ILITvqwDJYbcDCROj6+Ob0oCKNg3SH46iWcNcTIT9B5aiVssoTYkhKjxOMNzR1F7WSJkik4zmuqve5MdnA0DyA==
   dependencies:
-    "@typescript-eslint/types" "4.6.1"
-    "@typescript-eslint/visitor-keys" "4.6.1"
+    "@typescript-eslint/types" "4.7.0"
+    "@typescript-eslint/visitor-keys" "4.7.0"
 
 "@typescript-eslint/types@4.1.0":
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.5.0.tgz#98256e07bad1c8d15d0c9627ebec82fd971bb3c3"
   integrity sha512-n2uQoXnyWNk0Les9MtF0gCK3JiWd987JQi97dMSxBOzVoLZXCNtxFckVqt1h8xuI1ix01t+iMY4h4rFMj/303g==
 
-"@typescript-eslint/types@4.6.1":
-  version "4.6.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.6.1.tgz#d3ad7478f53f22e7339dc006ab61aac131231552"
-  integrity sha512-k2ZCHhJ96YZyPIsykickez+OMHkz06xppVLfJ+DY90i532/Cx2Z+HiRMH8YZQo7a4zVd/TwNBuRCdXlGK4yo8w==
+"@typescript-eslint/types@4.7.0":
+  version "4.7.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.7.0.tgz#5e95ef5c740f43d942542b35811f87b62fccca69"
+  integrity sha512-uLszFe0wExJc+I7q0Z/+BnP7wao/kzX0hB5vJn4LIgrfrMLgnB2UXoReV19lkJQS1a1mHWGGODSxnBx6JQC3Sg==
 
 "@typescript-eslint/typescript-estree@4.1.0":
   version "4.1.0"
     semver "^7.3.2"
     tsutils "^3.17.1"
 
-"@typescript-eslint/typescript-estree@4.6.1":
-  version "4.6.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.6.1.tgz#6025cce724329413f57e4959b2d676fceeca246f"
-  integrity sha512-/J/kxiyjQQKqEr5kuKLNQ1Finpfb8gf/NpbwqFFYEBjxOsZ621r9AqwS9UDRA1Rrr/eneX/YsbPAIhU2rFLjXQ==
+"@typescript-eslint/typescript-estree@4.7.0":
+  version "4.7.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.7.0.tgz#539531167f05ba20eb0b6785567076679e29d393"
+  integrity sha512-5XZRQznD1MfUmxu1t8/j2Af4OxbA7EFU2rbo0No7meb46eHgGkSieFdfV6omiC/DGIBhH9H9gXn7okBbVOm8jw==
   dependencies:
-    "@typescript-eslint/types" "4.6.1"
-    "@typescript-eslint/visitor-keys" "4.6.1"
+    "@typescript-eslint/types" "4.7.0"
+    "@typescript-eslint/visitor-keys" "4.7.0"
     debug "^4.1.1"
     globby "^11.0.1"
     is-glob "^4.0.1"
     "@typescript-eslint/types" "4.5.0"
     eslint-visitor-keys "^2.0.0"
 
-"@typescript-eslint/visitor-keys@4.6.1":
-  version "4.6.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.6.1.tgz#6b125883402d8939df7b54528d879e88f7ba3614"
-  integrity sha512-owABze4toX7QXwOLT3/D5a8NecZEjEWU1srqxENTfqsY3bwVnl3YYbOh6s1rp2wQKO9RTHFGjKes08FgE7SVMw==
+"@typescript-eslint/visitor-keys@4.7.0":
+  version "4.7.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.7.0.tgz#6783824f22acfc49e754970ed21b88ac03b80e6f"
+  integrity sha512-aDJDWuCRsf1lXOtignlfiPODkzSxxop7D0rZ91L6ZuMlcMCSh0YyK+gAfo5zN/ih6WxMwhoXgJWC3cWQdaKC+A==
   dependencies:
-    "@typescript-eslint/types" "4.6.1"
+    "@typescript-eslint/types" "4.7.0"
     eslint-visitor-keys "^2.0.0"
 
 "@webassemblyjs/ast@1.9.0":
@@ -1971,14 +1971,14 @@ babel-eslint@10.1.0, babel-eslint@^10.1.0:
     eslint-visitor-keys "^1.0.0"
     resolve "^1.12.0"
 
-babel-loader@^8.0.6:
-  version "8.1.0"
-  resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3"
-  integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==
+babel-loader@^8.2.1:
+  version "8.2.1"
+  resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.1.tgz#e53313254677e86f27536f5071d807e01d24ec00"
+  integrity sha512-dMF8sb2KQ8kJl21GUjkW1HWmcsL39GOV5vnzjqrCzEPNY0S0UfMLnumidiwIajDSBmKhYf5iRW+HXaM4cvCKBw==
   dependencies:
     find-cache-dir "^2.1.0"
     loader-utils "^1.4.0"
-    mkdirp "^0.5.3"
+    make-dir "^2.1.0"
     pify "^4.0.1"
     schema-utils "^2.6.5"
 
@@ -3589,10 +3589,10 @@ eslint-visitor-keys@^2.0.0:
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
   integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
 
-eslint@^7.12.1:
-  version "7.12.1"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.12.1.tgz#bd9a81fa67a6cfd51656cdb88812ce49ccec5801"
-  integrity sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg==
+eslint@^7.13.0:
+  version "7.13.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.13.0.tgz#7f180126c0dcdef327bfb54b211d7802decc08da"
+  integrity sha512-uCORMuOO8tUzJmsdRtrvcGq5qposf7Rw0LwkTJkoDbOycVQtQjmnhZSuLQnozLE4TmAzlMVV45eCHmQ1OpDKUQ==
   dependencies:
     "@babel/code-frame" "^7.0.0"
     "@eslint/eslintrc" "^0.2.1"
@@ -5457,10 +5457,10 @@ lcid@^1.0.0:
   dependencies:
     invert-kv "^1.0.0"
 
-lemmy-js-client@^1.0.14:
-  version "1.0.14"
-  resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-1.0.14.tgz#81a847dd0c7d97c83913f198717498c223dc371e"
-  integrity sha512-hiGxAnAD5RFmE8qHMBtYNNYD/UrfCZ5JzmVEH/i5Vg/v5i/ZVmebx20uWtRMmdSSy6s4GbW0w4niszLW6SaJ3Q==
+lemmy-js-client@^1.0.15:
+  version "1.0.15"
+  resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-1.0.15.tgz#7f47c8fd93c50d77a770d8828ca9aac7a227606e"
+  integrity sha512-2NkdwtdjuvyYsBiro5sdOirN3IuoQW1X7hH5az5fu59nKHLDpHm8BoktMmtf0u2cmOy+C5zg4ksK2UlG60Pe0g==
 
 leven@^3.1.0:
   version "3.1.0"
@@ -5780,7 +5780,7 @@ make-dir@^1.0.0:
   dependencies:
     pify "^3.0.0"
 
-make-dir@^2.0.0:
+make-dir@^2.0.0, make-dir@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
   integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
@@ -6019,10 +6019,10 @@ mimic-fn@^2.1.0:
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
   integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
 
-mini-css-extract-plugin@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.2.1.tgz#30ea7dee632b3002b0c77aeed447790408cb247e"
-  integrity sha512-G3yw7/TQaPfkuiR73MDcyiqhyP8SnbmLhUbpC76H+wtQxA6wfKhMCQOCb6wnPK0dQbjORAeOILQqEesg4/wF7A==
+mini-css-extract-plugin@^1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.1.tgz#1375c88b2bc2a9d197670a55761edcd1b5d72f21"
+  integrity sha512-jIOheqh9EU98rqj6ZaFTYNNDSFqdakNqaUZfkYwaXPjI9batmXVXX+K71NrqRAgtoGefELBMld1EQ7dqSAD5SQ==
   dependencies:
     loader-utils "^2.0.0"
     schema-utils "^3.0.0"
@@ -6152,7 +6152,7 @@ mixin-deep@^1.2.0:
     for-in "^1.0.2"
     is-extendable "^1.0.1"
 
-"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.0, mkdirp@~0.5.1:
+"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.0, mkdirp@~0.5.1:
   version "0.5.5"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
   integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
@@ -8064,10 +8064,10 @@ sass-graph@2.2.5:
     scss-tokenizer "^0.2.3"
     yargs "^13.3.2"
 
-sass-loader@^10.0.5:
-  version "10.0.5"
-  resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.0.5.tgz#f53505b5ddbedf43797470ceb34066ded82bb769"
-  integrity sha512-2LqoNPtKkZq/XbXNQ4C64GFEleSEHKv6NPSI+bMC/l+jpEXGJhiRYkAQToO24MR7NU4JRY2RpLpJ/gjo2Uf13w==
+sass-loader@^10.1.0:
+  version "10.1.0"
+  resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.1.0.tgz#1727fcc0c32ab3eb197cda61d78adf4e9174a4b3"
+  integrity sha512-ZCKAlczLBbFd3aGAhowpYEy69Te3Z68cg8bnHHl6WnSCvnKpbM6pQrz957HWMa8LKVuhnD9uMplmMAHwGQtHeg==
   dependencies:
     klona "^2.0.4"
     loader-utils "^2.0.0"
@@ -9644,10 +9644,10 @@ ws@^6.2.1:
   dependencies:
     async-limiter "~1.0.0"
 
-ws@^7.3.1:
-  version "7.3.1"
-  resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8"
-  integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==
+ws@^7.4.0:
+  version "7.4.0"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.0.tgz#a5dd76a24197940d4a8bb9e0e152bb4503764da7"
+  integrity sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ==
 
 xdg-basedir@^3.0.0:
   version "3.0.0"