From ffd1a7c866159b2b1a89cc81e969a878e3ec8e55 Mon Sep 17 00:00:00 2001 From: DNLHC Date: Tue, 4 Apr 2023 21:43:06 +0300 Subject: [PATCH 01/13] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20ssr=20=D0=B2=20=D0=B4=D0=B5=D0=B2=20=D0=B8=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B4=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/.env.development | 1 + packages/client/index.html | 6 +- packages/client/jest.config.js | 2 +- packages/client/package.json | 23 +- packages/client/public/sw.js | 4 +- packages/client/src/api/auth.ts | 12 +- packages/client/src/app.tsx | 71 +- .../components/auth-layout/auth-layout.tsx | 21 +- .../components/client-only/client-only.tsx | 13 + .../src/components/client-only/index.ts | 1 + .../game-view/game-view-completed.tsx | 6 +- .../src/components/game-view/game-view.tsx | 15 +- .../game-view/utils/draw-history.ts | 5 +- .../components/game-view/utils/render-path.ts | 9 +- .../game-view/utils/use-pattern-image.ts | 13 + .../src/components/hooks/use-fullscreen.ts | 64 +- .../client/src/components/hooks/use-theme.tsx | 24 +- .../src/components/isomorphic-portal/index.ts | 1 + .../isomorphic-portal/isomorphic-portal.tsx | 16 + .../client/src/components/modal/modal.tsx | 29 +- packages/client/src/entry-client.tsx | 13 + packages/client/src/entry-server.tsx | 61 ++ packages/client/src/main.tsx | 17 - packages/client/src/pages/game/game.tsx | 39 +- packages/client/src/routes.tsx | 47 ++ packages/eslint-config-shared/index.js | 2 +- packages/server/.eslintrc.cjs | 12 +- packages/server/index.ts | 135 +++- packages/server/jest.config.js | 2 +- packages/server/package.json | 18 +- packages/server/tsconfig.json | 6 +- yarn.lock | 633 +++++++++++++----- 32 files changed, 934 insertions(+), 387 deletions(-) create mode 100644 packages/client/.env.development create mode 100644 packages/client/src/components/client-only/client-only.tsx create mode 100644 packages/client/src/components/client-only/index.ts create mode 100644 packages/client/src/components/game-view/utils/use-pattern-image.ts create mode 100644 packages/client/src/components/isomorphic-portal/index.ts create mode 100644 packages/client/src/components/isomorphic-portal/isomorphic-portal.tsx create mode 100644 packages/client/src/entry-client.tsx create mode 100644 packages/client/src/entry-server.tsx delete mode 100644 packages/client/src/main.tsx create mode 100644 packages/client/src/routes.tsx diff --git a/packages/client/.env.development b/packages/client/.env.development new file mode 100644 index 0000000..d3867ab --- /dev/null +++ b/packages/client/.env.development @@ -0,0 +1 @@ +VITE_API_BASE_URL=http://localhost:3001/api/v2 diff --git a/packages/client/index.html b/packages/client/index.html index fc05d5b..a104b2c 100644 --- a/packages/client/index.html +++ b/packages/client/index.html @@ -1,5 +1,5 @@ - + @@ -7,9 +7,9 @@ Fancy Colors -
+
- +
diff --git a/packages/client/src/app.tsx b/packages/client/src/app.tsx index 1ff6c3d..2a3bc34 100644 --- a/packages/client/src/app.tsx +++ b/packages/client/src/app.tsx @@ -1,20 +1,26 @@ import { ThemeProvider, Theme } from 'components/hooks/use-theme'; import React from 'react'; -import { Provider } from 'react-redux'; -import { store } from './store'; +import { Provider as StoreProvider } from 'react-redux'; +import { createStore, InitialState } from './store'; import './styles/index.pcss'; function App({ children, theme = Theme.LIGHT, + store, + initialState, }: { children: React.ReactNode; theme?: string; + store: ReturnType; + initialState?: InitialState; }) { return ( - {children} + + {children} + ); diff --git a/packages/client/src/client.d.ts b/packages/client/src/client.d.ts index f40a65e..224bedf 100644 --- a/packages/client/src/client.d.ts +++ b/packages/client/src/client.d.ts @@ -1 +1,10 @@ declare const __SERVER_PORT__: number; + +declare global { + interface Window { + // eslint-disable-next-line @typescript-eslint/naming-convention + __INITIAL_STATE__?: string; + } +} + +export {}; diff --git a/packages/client/src/entry-client.tsx b/packages/client/src/entry-client.tsx index cec9311..06b0be4 100644 --- a/packages/client/src/entry-client.tsx +++ b/packages/client/src/entry-client.tsx @@ -2,12 +2,18 @@ import App from './app'; import ReactDOM from 'react-dom/client'; import { routes } from './routes'; import { createBrowserRouter, RouterProvider } from 'react-router-dom'; +import { createStore } from './store'; const router = createBrowserRouter(routes); +const initialState = window.__INITIAL_STATE__ ?? {}; +delete window.__INITIAL_STATE__; + +const store = createStore(initialState); + ReactDOM.hydrateRoot( document.querySelector('#root') as HTMLElement, - + ); diff --git a/packages/client/src/entry-server.tsx b/packages/client/src/entry-server.tsx index da355e8..eae9a66 100644 --- a/packages/client/src/entry-server.tsx +++ b/packages/client/src/entry-server.tsx @@ -1,61 +1,28 @@ import App from './app'; import ReactDOMServer from 'react-dom/server'; -import { - createStaticRouter, - StaticRouterProvider, -} from 'react-router-dom/server'; +import { StaticRouterProvider } from 'react-router-dom/server'; import { createStaticHandler, type StaticHandlerContext, + type Router, } from '@remix-run/router'; -import type * as express from 'express'; import { routes } from './routes'; -import { createRemixHeaders as createRequestHeaders } from '@remix-run/express/dist/server'; +import { createStore } from './store'; -const { query, dataRoutes } = createStaticHandler(routes); +export const staticHandler = createStaticHandler(routes); -export async function render( - req: express.Request, - res: express.Response, +export function render( + router: Router, + context: StaticHandlerContext, theme: string ) { - const fetchRequest = createFetchRequest(req); - const context = (await query(fetchRequest)) as StaticHandlerContext; - const router = createStaticRouter(dataRoutes, context); - - if ( - context instanceof Response && - [301, 302, 303, 307, 308].includes(context.status) - ) { - return res.redirect( - context.status, - context.headers.get('Location') as string - ); - } + const store = createStore(); - return ReactDOMServer.renderToString( - + const renderResult = ReactDOMServer.renderToString( + ); -} - -export function createFetchRequest(req: express.Request): Request { - const origin = `${req.protocol}://${req.get('host')}`; - const url = new URL(req.originalUrl || req.url, origin); - - const controller = new AbortController(); - req.on('close', () => controller.abort()); - - const requestInit: RequestInit = { - method: req.method, - headers: createRequestHeaders(req.headers), - signal: controller.signal, - }; - - if (req.method !== 'GET' && req.method !== 'HEAD') { - requestInit.body = req.body; - } - return new Request(url.href, requestInit); + return { renderResult, initialState: store.getState() }; } diff --git a/packages/client/src/services/forum-slice.ts b/packages/client/src/services/forum-slice.ts index e744b31..64abced 100644 --- a/packages/client/src/services/forum-slice.ts +++ b/packages/client/src/services/forum-slice.ts @@ -28,7 +28,7 @@ export type Thread = { messages: ForumMessage; }; -type ForumState = { +export type ForumState = { count: number; forum: Threads; threads: { diff --git a/packages/client/src/services/game-slice.ts b/packages/client/src/services/game-slice.ts index 2d718be..98e8bf5 100644 --- a/packages/client/src/services/game-slice.ts +++ b/packages/client/src/services/game-slice.ts @@ -7,7 +7,7 @@ type GameCompletedData = { id: string; }; -interface Game { +export interface Game { readonly completedGame: Nullable; readonly gamesHistory: Array< Omit & { diff --git a/packages/client/src/store.ts b/packages/client/src/store.ts index e0472e2..01c3662 100644 --- a/packages/client/src/store.ts +++ b/packages/client/src/store.ts @@ -1,11 +1,20 @@ import { configureStore } from '@reduxjs/toolkit'; import reducer from './services'; +import { ForumState } from './services/forum-slice'; +import { Game } from './services/game-slice'; -export const store = configureStore({ - reducer, -}); +export type RootState = { + game: Game; + forum: ForumState; +}; -// Infer the `RootState` and `AppDispatch` types from the store itself -export type RootState = ReturnType; -// Inferred type: {posts: PostsState, comments: CommentsState, users: UsersState} -export type AppDispatch = typeof store.dispatch; +export type InitialState = Partial; + +export function createStore(initialState?: InitialState) { + return configureStore({ + reducer, + preloadedState: initialState, + }); +} + +export type AppDispatch = ReturnType['dispatch']; diff --git a/packages/server/.eslintrc.cjs b/packages/server/.eslintrc.cjs index 2f2e7d4..0f1eee9 100644 --- a/packages/server/.eslintrc.cjs +++ b/packages/server/.eslintrc.cjs @@ -13,6 +13,12 @@ module.exports = { rules: { 'unicorn/prefer-node-protocol': 'error', 'unicorn/prefer-module': 'error', + 'n/no-extraneous-import': [ + 'error', + { + allowModules: ['@remix-run/router'], + }, + ], }, overrides: [ { diff --git a/packages/server/index.ts b/packages/server/index.ts index d5748e6..98ccfe7 100644 --- a/packages/server/index.ts +++ b/packages/server/index.ts @@ -8,15 +8,24 @@ import { createRequire } from 'node:module'; import { createServer as createViteServer, type ViteDevServer } from 'vite'; import { createProxyMiddleware } from 'http-proxy-middleware'; import cookieParser from 'cookie-parser'; +import jsesc from 'jsesc'; +import type { + StaticHandlerContext, + StaticHandler, + Router, +} from '@remix-run/router'; +import { createStaticRouter } from 'react-router-dom/server.js'; const isDev = process.env.NODE_ENV === 'development'; type SSRModule = { + staticHandler: StaticHandler; render: ( - req: express.Request, - res: express.Response, + router: Router, + context: StaticHandlerContext, theme: string - ) => Promise; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ) => { renderResult: string; initialState: Record }; }; async function bootstrap() { @@ -55,6 +64,10 @@ async function bootstrap() { }) ); + if (!isDev) { + app.use(express.static(staticPath, { index: false })); + } + app.use('*', cookieParser(), async (req, res, next) => { if (!req.get('Accept')?.includes('text/html')) { return next(); @@ -64,13 +77,6 @@ async function bootstrap() { let template: string; let ssrModule: SSRModule; - const storedTheme = req.cookies.theme; - // Получаем предпочитаемую пользователем тему из настроек браузера - // https://web.dev/user-preference-media-features-headers/ - const userPreferredTheme = - req.headers['sec-ch-prefers-color-scheme'] ?? 'light'; - const detectedTheme = storedTheme || userPreferredTheme; - try { if (isDev) { template = fs.readFileSync( @@ -92,14 +98,40 @@ async function bootstrap() { ssrModule = (await import('client')) as SSRModule; } - const result = await ssrModule.render(req, res, detectedTheme); + const { staticHandler, render } = ssrModule; + const fetchRequest = createFetchRequest(req); + const context = await staticHandler.query(fetchRequest); - if (typeof result !== 'string') { - return; + if (context instanceof Response) { + return res.redirect( + context.status, + context.headers.get('Location') as string + ); } + const router = createStaticRouter(staticHandler.dataRoutes, context); + + const storedTheme = req.cookies.theme; + // Получаем предпочитаемую пользователем тему из настроек браузера + // https://web.dev/user-preference-media-features-headers/ + const userPreferredTheme = + req.headers['sec-ch-prefers-color-scheme'] ?? 'light'; + const detectedTheme = storedTheme || userPreferredTheme; + + const { initialState, renderResult } = render( + router, + context, + detectedTheme + ); + + const initialStateSerialized = jsesc(initialState, { + json: true, + isScriptContext: true, + }); + const html = template - .replace('', result) + .replace('', renderResult) + .replace('', initialStateSerialized) .replace('{{__THEME__}}', detectedTheme); // eslint-disable-next-line @typescript-eslint/naming-convention @@ -112,14 +144,50 @@ async function bootstrap() { } }); - if (!isDev) { - app.use(express.static(staticPath)); - } - app.listen(port, () => { // eslint-disable-next-line no-console console.log(` ➜ 🎸 Server is listening on port: ${port}`); }); } +function createRequestHeaders( + requestHeaders: express.Request['headers'] +): Headers { + const headers = new Headers(); + + for (const [key, values] of Object.entries(requestHeaders)) { + if (values) { + if (Array.isArray(values)) { + for (const value of values) { + headers.append(key, value); + } + } else { + headers.set(key, values); + } + } + } + + return headers; +} + +function createFetchRequest(req: express.Request): Request { + const origin = `${req.protocol}://${req.get('host')}`; + const url = new URL(req.originalUrl || req.url, origin); + + const controller = new AbortController(); + req.on('close', () => controller.abort()); + + const requestInit: RequestInit = { + method: req.method, + headers: createRequestHeaders(req.headers), + signal: controller.signal, + }; + + if (req.method !== 'GET' && req.method !== 'HEAD') { + requestInit.body = req.body; + } + + return new Request(url.href, requestInit); +} + bootstrap(); diff --git a/packages/server/package.json b/packages/server/package.json index 0b15673..c1586d9 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -24,6 +24,7 @@ "http-proxy-middleware": "2.0.6", "jsesc": "3.0.2", "pg": "8.8.0", + "react-router-dom": "6.10.0", "vite": "4.2.1" }, "devDependencies": { @@ -31,6 +32,7 @@ "@types/cors": "2.8.12", "@types/express": "4.17.13", "@types/jest": "29.4.0", + "@types/jsesc": "3.0.1", "@types/pg": "8.6.5", "babel-jest": "29.4.3", "cross-env": "7.0.3", diff --git a/yarn.lock b/yarn.lock index 74d48f2..6214ed9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1646,6 +1646,11 @@ "@types/tough-cookie" "*" parse5 "^7.0.0" +"@types/jsesc@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/jsesc/-/jsesc-3.0.1.tgz#ed1720ae08eae2f64341452e1693a84324029d99" + integrity sha512-F2g93pJlhV0RlW9uSUAM/hIxywlwlZcuRB/nZ82GaMPaO8mdexYbJ8Qt3UGbUS1M19YFQykEetrWW004M+vPCg== + "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" @@ -7428,6 +7433,14 @@ react-refresh@^0.14.0: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== +react-router-dom@6.10.0: + version "6.10.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.10.0.tgz#090ddc5c84dc41b583ce08468c4007c84245f61f" + integrity sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg== + dependencies: + "@remix-run/router" "1.5.0" + react-router "6.10.0" + react-router-dom@6.8.1: version "6.8.1" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.8.1.tgz#7e136b67d9866f55999e9a8482c7008e3c575ac9" @@ -7436,6 +7449,13 @@ react-router-dom@6.8.1: "@remix-run/router" "1.3.2" react-router "6.8.1" +react-router@6.10.0: + version "6.10.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.10.0.tgz#230f824fde9dd0270781b5cb497912de32c0a971" + integrity sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ== + dependencies: + "@remix-run/router" "1.5.0" + react-router@6.8.1: version "6.8.1" resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.8.1.tgz#e362caf93958a747c649be1b47cd505cf28ca63e" From fa0f227fb87f7f1dea867e942e4ad7696fbbed4e Mon Sep 17 00:00:00 2001 From: DNLHC Date: Thu, 6 Apr 2023 09:31:28 +0300 Subject: [PATCH 05/13] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=20=D0=BA=20=D1=81?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D1=83=20=D0=B2=20=D0=BB=D0=BE=D0=B0=D0=B4?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D1=85=20=D1=80=D0=BE=D1=83=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/src/app.tsx | 4 +- packages/client/src/entry-client.tsx | 5 +-- packages/client/src/entry-server.tsx | 31 +++++++------- packages/client/src/routes.tsx | 63 +++++++++++++++------------- packages/client/src/store.ts | 4 +- packages/server/index.ts | 19 +++++---- 6 files changed, 69 insertions(+), 57 deletions(-) diff --git a/packages/client/src/app.tsx b/packages/client/src/app.tsx index 2a3bc34..1c2b4cc 100644 --- a/packages/client/src/app.tsx +++ b/packages/client/src/app.tsx @@ -1,7 +1,7 @@ import { ThemeProvider, Theme } from 'components/hooks/use-theme'; import React from 'react'; import { Provider as StoreProvider } from 'react-redux'; -import { createStore, InitialState } from './store'; +import type { AppStore, InitialState } from './store'; import './styles/index.pcss'; function App({ @@ -12,7 +12,7 @@ function App({ }: { children: React.ReactNode; theme?: string; - store: ReturnType; + store: AppStore; initialState?: InitialState; }) { return ( diff --git a/packages/client/src/entry-client.tsx b/packages/client/src/entry-client.tsx index 06b0be4..62e41c0 100644 --- a/packages/client/src/entry-client.tsx +++ b/packages/client/src/entry-client.tsx @@ -1,15 +1,14 @@ import App from './app'; import ReactDOM from 'react-dom/client'; -import { routes } from './routes'; +import { createRoutes } from './routes'; import { createBrowserRouter, RouterProvider } from 'react-router-dom'; import { createStore } from './store'; -const router = createBrowserRouter(routes); - const initialState = window.__INITIAL_STATE__ ?? {}; delete window.__INITIAL_STATE__; const store = createStore(initialState); +const router = createBrowserRouter(createRoutes(store)); ReactDOM.hydrateRoot( document.querySelector('#root') as HTMLElement, diff --git a/packages/client/src/entry-server.tsx b/packages/client/src/entry-server.tsx index eae9a66..a2248d2 100644 --- a/packages/client/src/entry-server.tsx +++ b/packages/client/src/entry-server.tsx @@ -6,23 +6,26 @@ import { type StaticHandlerContext, type Router, } from '@remix-run/router'; -import { routes } from './routes'; +import { createRoutes } from './routes'; import { createStore } from './store'; -export const staticHandler = createStaticHandler(routes); - -export function render( - router: Router, - context: StaticHandlerContext, - theme: string -) { +export function createRenderer() { const store = createStore(); + const routes = createRoutes(store); + const staticHandler = createStaticHandler(routes); - const renderResult = ReactDOMServer.renderToString( - - - - ); + const render = ( + router: Router, + context: StaticHandlerContext, + theme: string + ) => { + const renderResult = ReactDOMServer.renderToString( + + + + ); + return { renderResult, initialState: store.getState() }; + }; - return { renderResult, initialState: store.getState() }; + return { render, staticHandler }; } diff --git a/packages/client/src/routes.tsx b/packages/client/src/routes.tsx index 73162a3..c66f9a4 100644 --- a/packages/client/src/routes.tsx +++ b/packages/client/src/routes.tsx @@ -13,35 +13,40 @@ import { MainPage } from 'pages/main'; import { Profile } from 'pages/profile'; import { createRoutesFromElements, defer, Route } from 'react-router-dom'; import { RouterPaths } from './app.types'; +import { AppStore } from './store'; -export const routes = createRoutesFromElements( - } - loader={async ({ request }) => { - const user = await getCurrentUser(request); - return defer({ - user, - }); - }} - > - } /> - } /> - }> - }> - } /> - - } /> - }> - } /> - - } /> - }> - } /> - } /> +// Доступ к стору для лоадеров +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export const createRoutes = (store: AppStore) => { + return createRoutesFromElements( + } + loader={async ({ request }) => { + const user = await getCurrentUser(request); + return defer({ + user, + }); + }} + > + } /> + } /> + }> + }> + } /> + + } /> + }> + } /> + + } /> + }> + } /> + } /> + + } /> + } /> + } /> - } /> - } /> - } /> - -); + ); +}; diff --git a/packages/client/src/store.ts b/packages/client/src/store.ts index 01c3662..a46ffd6 100644 --- a/packages/client/src/store.ts +++ b/packages/client/src/store.ts @@ -17,4 +17,6 @@ export function createStore(initialState?: InitialState) { }); } -export type AppDispatch = ReturnType['dispatch']; +export type AppStore = ReturnType; + +export type AppDispatch = AppStore['dispatch']; diff --git a/packages/server/index.ts b/packages/server/index.ts index 98ccfe7..930e197 100644 --- a/packages/server/index.ts +++ b/packages/server/index.ts @@ -19,13 +19,15 @@ import { createStaticRouter } from 'react-router-dom/server.js'; const isDev = process.env.NODE_ENV === 'development'; type SSRModule = { - staticHandler: StaticHandler; - render: ( - router: Router, - context: StaticHandlerContext, - theme: string - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ) => { renderResult: string; initialState: Record }; + createRenderer: () => { + staticHandler: StaticHandler; + render: ( + router: Router, + context: StaticHandlerContext, + theme: string + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ) => { renderResult: string; initialState: Record }; + }; }; async function bootstrap() { @@ -98,7 +100,8 @@ async function bootstrap() { ssrModule = (await import('client')) as SSRModule; } - const { staticHandler, render } = ssrModule; + const { createRenderer } = ssrModule; + const { render, staticHandler } = createRenderer(); const fetchRequest = createFetchRequest(req); const context = await staticHandler.query(fetchRequest); From f7b7333f48404d4a9ca2205720ca21a64214bfc7 Mon Sep 17 00:00:00 2001 From: DNLHC Date: Thu, 6 Apr 2023 10:56:39 +0300 Subject: [PATCH 06/13] =?UTF-8?q?=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=80=D1=82=203001=20->=205000=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D1=81=D0=BE=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=B8=D0=BC?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8=20=D1=81=20oauth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.sample | 2 +- packages/client/.env.development | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.env.sample b/.env.sample index 2b2b0e0..542bc79 100644 --- a/.env.sample +++ b/.env.sample @@ -1,5 +1,5 @@ CLIENT_PORT=3000 -SERVER_PORT=3001 +SERVER_PORT=5000 POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres POSTGRES_DB=postgres diff --git a/packages/client/.env.development b/packages/client/.env.development index d3867ab..d9ccd00 100644 --- a/packages/client/.env.development +++ b/packages/client/.env.development @@ -1 +1 @@ -VITE_API_BASE_URL=http://localhost:3001/api/v2 +VITE_API_BASE_URL=http://localhost:5000/api/v2 From bcf0ceb760d860b70c79c5411ecc71c45aef3bfb Mon Sep 17 00:00:00 2001 From: DNLHC Date: Fri, 7 Apr 2023 11:54:22 +0300 Subject: [PATCH 07/13] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BB=D0=B8=D1=86=D0=B8=D1=8E?= =?UTF-8?q?=20=D1=82=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=BF=D0=B0=D0=BA=D0=B5?= =?UTF-8?q?=D1=82=D0=B0=20client?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/package.json | 16 +- packages/client/public/sw.js | 2 +- .../isomorphic-portal/isomorphic-portal.tsx | 8 +- packages/client/src/services/game-slice.ts | 2 +- packages/client/tsconfig.prod.json | 12 + packages/client/vite.config.ts | 2 +- packages/server/index.ts | 25 +- yarn.lock | 216 +----------------- 8 files changed, 34 insertions(+), 249 deletions(-) create mode 100644 packages/client/tsconfig.prod.json diff --git a/packages/client/package.json b/packages/client/package.json index a455dd0..288349f 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -2,9 +2,12 @@ "name": "client", "version": "0.0.0", "type": "module", - "main": "./dist/server/assets/js/main.js", + "main": "./dist/server/assets/js/entry-server.js", "exports": { - ".": "./dist/server/assets/js/main.js", + ".": { + "import": "./dist/server/assets/js/entry-server.js", + "types": "./dist/server/assets/js/entry-server.d.ts" + }, "./index.html": "./dist/client/index.html", "./dev/index.html": "./index.html", "./dev/entry-server": "./src/entry-server.tsx", @@ -12,8 +15,9 @@ }, "scripts": { "dev": "vite", - "build": "tsc && vite build --outDir dist/client", - "build:ssr": "tsc && vite build --outDir dist/server --ssr ./src/entry-server.tsx", + "build": "vite build --outDir dist/client && yarn build:types", + "build:types": "tsc --p tsconfig.prod.json", + "build:ssr": "vite build --outDir dist/server --ssr ./src/entry-server.tsx && yarn build:types", "preview": "vite preview --host", "lint": "run-p lint:*", "lint:eslint": "eslint \"src/**/*.{ts,tsx}\" --cache --cache-location ./node_modules/.cache/eslint", @@ -30,7 +34,6 @@ }, "dependencies": { "@reduxjs/toolkit": "2.0.0-alpha.1", - "@remix-run/express": "1.15.0", "classnames": "2.3.2", "colorjs.io": "0.4.3", "dotenv": "16.0.2", @@ -40,14 +43,13 @@ "react-dom": "18.2.0", "react-hook-form": "7.43.2", "react-redux": "8.0.5", - "react-router-dom": "6.8.1", + "react-router-dom": "6.10.0", "swiper": "9.1.0" }, "devDependencies": { "@testing-library/jest-dom": "5.16.5", "@testing-library/react": "14.0.0", "@testing-library/user-event": "14.4.3", - "@types/express": "4.17.17", "@types/jest": "29.4.0", "@types/js-cookie": "3.0.3", "@types/react": "18.0.18", diff --git a/packages/client/public/sw.js b/packages/client/public/sw.js index 9ae3b85..6afffeb 100644 --- a/packages/client/public/sw.js +++ b/packages/client/public/sw.js @@ -14,7 +14,7 @@ const URLS = [ '/game/village', '/index.html', '/assets/css/index.css', - '/assets/js/main.js', + '/assets/js/entry-server.js', '/assets/png/bg-image.png', '/assets/woff2/MontserratAlternates-Bold.woff2', '/assets/woff2/MontserratAlternates-Regular.woff2', diff --git a/packages/client/src/components/isomorphic-portal/isomorphic-portal.tsx b/packages/client/src/components/isomorphic-portal/isomorphic-portal.tsx index 4c33cb6..9da21ae 100644 --- a/packages/client/src/components/isomorphic-portal/isomorphic-portal.tsx +++ b/packages/client/src/components/isomorphic-portal/isomorphic-portal.tsx @@ -1,12 +1,10 @@ +import { FC } from 'react'; import { createPortal } from 'react-dom'; -export const IsomorphicPortal = ({ - selector, - children, -}: { +export const IsomorphicPortal: FC<{ selector: string; children: JSX.Element | JSX.Element[]; -}) => { +}> = ({ selector, children }) => { if (import.meta.env.SSR) return null; return createPortal( diff --git a/packages/client/src/services/game-slice.ts b/packages/client/src/services/game-slice.ts index 98e8bf5..7c515ba 100644 --- a/packages/client/src/services/game-slice.ts +++ b/packages/client/src/services/game-slice.ts @@ -8,7 +8,7 @@ type GameCompletedData = { }; export interface Game { - readonly completedGame: Nullable; + readonly completedGame: GameCompletedData | null; readonly gamesHistory: Array< Omit & { completedAt: string; diff --git a/packages/client/tsconfig.prod.json b/packages/client/tsconfig.prod.json new file mode 100644 index 0000000..4d5bd6c --- /dev/null +++ b/packages/client/tsconfig.prod.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig", + "compilerOptions": { + "baseUrl": ".", + "declaration": true, + "emitDeclarationOnly": true, + "outDir": "./dist/server/assets/js/", + "noEmit": false, + "jsx": "react-jsx" + }, + "include": ["typings", "src/vite-env.d.ts", "src/entry-server.tsx"] +} diff --git a/packages/client/vite.config.ts b/packages/client/vite.config.ts index ee34cb9..dc9614f 100644 --- a/packages/client/vite.config.ts +++ b/packages/client/vite.config.ts @@ -32,7 +32,7 @@ export default defineConfig({ output: { assetFileNames: 'assets/[ext]/[name][extname]', chunkFileNames: 'assets/[chunks]/[name].[hash].js', - entryFileNames: 'assets/js/main.js', + entryFileNames: 'assets/js/entry-server.js', }, }, }, diff --git a/packages/server/index.ts b/packages/server/index.ts index 930e197..1513892 100644 --- a/packages/server/index.ts +++ b/packages/server/index.ts @@ -9,27 +9,10 @@ import { createServer as createViteServer, type ViteDevServer } from 'vite'; import { createProxyMiddleware } from 'http-proxy-middleware'; import cookieParser from 'cookie-parser'; import jsesc from 'jsesc'; -import type { - StaticHandlerContext, - StaticHandler, - Router, -} from '@remix-run/router'; import { createStaticRouter } from 'react-router-dom/server.js'; const isDev = process.env.NODE_ENV === 'development'; -type SSRModule = { - createRenderer: () => { - staticHandler: StaticHandler; - render: ( - router: Router, - context: StaticHandlerContext, - theme: string - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ) => { renderResult: string; initialState: Record }; - }; -}; - async function bootstrap() { const app = express(); const port = Number(process.env.SERVER_PORT) || 3001; @@ -77,7 +60,7 @@ async function bootstrap() { const url = req.originalUrl; let template: string; - let ssrModule: SSRModule; + let ssrModule; try { if (isDev) { @@ -93,11 +76,9 @@ async function bootstrap() { if (isDev) { ssrModule = (await vite!.ssrLoadModule( require.resolve('client/dev/entry-server') - )) as SSRModule; + )) as typeof import('client'); } else { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore Разобраться как подтянуть типизацию внешнего пакета - ssrModule = (await import('client')) as SSRModule; + ssrModule = await import('client'); } const { createRenderer } = ssrModule; diff --git a/yarn.lock b/yarn.lock index 6214ed9..b3a60ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1199,93 +1199,11 @@ redux-thunk "3.0.0-alpha.1" reselect "^4.1.7" -"@remix-run/express@1.15.0": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@remix-run/express/-/express-1.15.0.tgz#09fd18ad1119aab074fe1f75ad672e218ffe6db2" - integrity sha512-mvDZB03W6NqbtyVpeiJfmGQY1L7CX+KEfSIV/kNgyK+gAMAWhsioC/Vjlo4IFY3NvOD0rh9mxuC+/IPT6Al3uw== - dependencies: - "@remix-run/node" "1.15.0" - -"@remix-run/node@1.15.0": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@remix-run/node/-/node-1.15.0.tgz#55058094dcb9ac4c37bccd30c10a82381560892e" - integrity sha512-CS0p8T6A2KvMoAW5zzLA/BtNNCsv34A5RJoouJvXK9/o6MriAQ/YSugg6ldS5mec49neSep+CGeL1RS6tL+3NQ== - dependencies: - "@remix-run/server-runtime" "1.15.0" - "@remix-run/web-fetch" "^4.3.2" - "@remix-run/web-file" "^3.0.2" - "@remix-run/web-stream" "^1.0.3" - "@web3-storage/multipart-parser" "^1.0.0" - abort-controller "^3.0.0" - cookie-signature "^1.1.0" - source-map-support "^0.5.21" - stream-slice "^0.1.2" - -"@remix-run/router@1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.3.2.tgz#58cd2bd25df2acc16c628e1b6f6150ea6c7455bc" - integrity sha512-t54ONhl/h75X94SWsHGQ4G/ZrCEguKSRQr7DrjTciJXW0YU1QhlwYeycvK5JgkzlxmvrK7wq1NB/PLtHxoiDcA== - "@remix-run/router@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.5.0.tgz#57618e57942a5f0131374a9fdb0167e25a117fdc" integrity sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg== -"@remix-run/server-runtime@1.15.0": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@remix-run/server-runtime/-/server-runtime-1.15.0.tgz#78a3ad5e076d2cb9a0ed01d92df1caef09466514" - integrity sha512-DL9xjHfYYrEcOq5VbhYtrjJUWo/nFQAT7Y+Np/oC55HokyU6cb2jGhl52nx96aAxKwaFCse5N90GeodFsRzX7w== - dependencies: - "@remix-run/router" "1.5.0" - "@types/cookie" "^0.4.0" - "@types/react" "^18.0.15" - "@web3-storage/multipart-parser" "^1.0.0" - cookie "^0.4.1" - set-cookie-parser "^2.4.8" - source-map "^0.7.3" - -"@remix-run/web-blob@^3.0.3", "@remix-run/web-blob@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@remix-run/web-blob/-/web-blob-3.0.4.tgz#99c67b9d0fb641bd0c07d267fd218ae5aa4ae5ed" - integrity sha512-AfegzZvSSDc+LwnXV+SwROTrDtoLiPxeFW+jxgvtDAnkuCX1rrzmVJ6CzqZ1Ai0bVfmJadkG5GxtAfYclpPmgw== - dependencies: - "@remix-run/web-stream" "^1.0.0" - web-encoding "1.1.5" - -"@remix-run/web-fetch@^4.3.2": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@remix-run/web-fetch/-/web-fetch-4.3.3.tgz#708371a43f20e645090150dfadb983e950bff12d" - integrity sha512-DK9vA2tgsadcFPpxW4fvN198tiWpyPhwR0EYOuM4QjpDCz0G619c9RDMdyMy6a7Qb/jwiyx9SOPHWc65QAl+1g== - dependencies: - "@remix-run/web-blob" "^3.0.4" - "@remix-run/web-form-data" "^3.0.3" - "@remix-run/web-stream" "^1.0.3" - "@web3-storage/multipart-parser" "^1.0.0" - abort-controller "^3.0.0" - data-uri-to-buffer "^3.0.1" - mrmime "^1.0.0" - -"@remix-run/web-file@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@remix-run/web-file/-/web-file-3.0.2.tgz#1a6cc0900a1310ede4bc96abad77ac6eb27a2131" - integrity sha512-eFC93Onh/rZ5kUNpCQersmBtxedGpaXK2/gsUl49BYSGK/DvuPu3l06vmquEDdcPaEuXcsdGP0L7zrmUqrqo4A== - dependencies: - "@remix-run/web-blob" "^3.0.3" - -"@remix-run/web-form-data@^3.0.3": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@remix-run/web-form-data/-/web-form-data-3.0.4.tgz#18c5795edaffbc88c320a311766dc04644125bab" - integrity sha512-UMF1jg9Vu9CLOf8iHBdY74Mm3PUvMW8G/XZRJE56SxKaOFWGSWlfxfG+/a3boAgHFLTkP7K4H1PxlRugy1iQtw== - dependencies: - web-encoding "1.1.5" - -"@remix-run/web-stream@^1.0.0", "@remix-run/web-stream@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@remix-run/web-stream/-/web-stream-1.0.3.tgz#3284a6a45675d1455c4d9c8f31b89225c9006438" - integrity sha512-wlezlJaA5NF6SsNMiwQnnAW6tnPzQ5I8qk0Y0pSohm0eHKa2FQ1QhEKLVVcDDu02TmkfHgnux0igNfeYhDOXiA== - dependencies: - web-streams-polyfill "^3.1.1" - "@rollup/pluginutils@^5.0.2": version "5.0.2" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33" @@ -1539,11 +1457,6 @@ dependencies: "@types/express" "*" -"@types/cookie@^0.4.0": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - "@types/cors@2.8.12": version "2.8.12" resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" @@ -1563,7 +1476,7 @@ "@types/qs" "*" "@types/range-parser" "*" -"@types/express@*", "@types/express@4.17.17": +"@types/express@*": version "4.17.17" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== @@ -1740,15 +1653,6 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@^18.0.15": - version "18.0.31" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.31.tgz#a69ef8dd7bfa849734d258c793a8fe343a338205" - integrity sha512-EEG67of7DsvRDU6BLLI0p+k1GojDLz9+lZsnCpCRTa/lOokvyPBvp8S5x+A24hME3yyQuIipcP70KJ6H7Qupww== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - "@types/scheduler@*": version "0.16.2" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" @@ -1992,11 +1896,6 @@ magic-string "^0.27.0" react-refresh "^0.14.0" -"@web3-storage/multipart-parser@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz#6b69dc2a32a5b207ba43e556c25cc136a56659c4" - integrity sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw== - "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -2017,11 +1916,6 @@ dependencies: argparse "^2.0.1" -"@zxing/text-encoding@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" - integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== - JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -2040,13 +1934,6 @@ abbrev@1, abbrev@^1.0.0: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -2992,11 +2879,6 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie-signature@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.1.tgz#790dea2cce64638c7ae04d9fabed193bd7ccf3b4" - integrity sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw== - cookie@0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" @@ -3007,11 +2889,6 @@ cookie@0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -cookie@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -3144,11 +3021,6 @@ dargs@^7.0.0: resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== -data-uri-to-buffer@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" - integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== - data-urls@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" @@ -3882,11 +3754,6 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - eventemitter3@^4.0.0, eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -4800,7 +4667,7 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-arguments@^1.0.4, is-arguments@^1.1.1: +is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -4897,13 +4764,6 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -5038,7 +4898,7 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: +is-typed-array@^1.1.10, is-typed-array@^1.1.9: version "1.1.10" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== @@ -6246,11 +6106,6 @@ modify-values@^1.0.0: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== -mrmime@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" - integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -7441,14 +7296,6 @@ react-router-dom@6.10.0: "@remix-run/router" "1.5.0" react-router "6.10.0" -react-router-dom@6.8.1: - version "6.8.1" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.8.1.tgz#7e136b67d9866f55999e9a8482c7008e3c575ac9" - integrity sha512-67EXNfkQgf34P7+PSb6VlBuaacGhkKn3kpE51+P6zYSG2kiRoumXEL6e27zTa9+PGF2MNXbgIUHTVlleLbIcHQ== - dependencies: - "@remix-run/router" "1.3.2" - react-router "6.8.1" - react-router@6.10.0: version "6.10.0" resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.10.0.tgz#230f824fde9dd0270781b5cb497912de32c0a971" @@ -7456,13 +7303,6 @@ react-router@6.10.0: dependencies: "@remix-run/router" "1.5.0" -react-router@6.8.1: - version "6.8.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.8.1.tgz#e362caf93958a747c649be1b47cd505cf28ca63e" - integrity sha512-Jgi8BzAJQ8MkPt8ipXnR73rnD7EmZ0HFFb7jdQU24TynGW1Ooqin2KVDN9voSC+7xhqbbCd2cjGUepb6RObnyg== - dependencies: - "@remix-run/router" "1.3.2" - react@18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -7865,11 +7705,6 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-cookie-parser@^2.4.8: - version "2.6.0" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz#131921e50f62ff1a66a461d7d62d7b21d5d15a51" - integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== - setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -7993,24 +7828,11 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.5.21: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" @@ -8092,11 +7914,6 @@ stop-iteration-iterator@^1.0.0: dependencies: internal-slot "^1.0.4" -stream-slice@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/stream-slice/-/stream-slice-0.1.2.tgz#2dc4f4e1b936fb13f3eb39a2def1932798d07a4b" - integrity sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA== - string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -8742,17 +8559,6 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util@^0.12.3: - version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -8855,20 +8661,6 @@ wcwidth@^1.0.0, wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -web-encoding@1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" - integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== - dependencies: - util "^0.12.3" - optionalDependencies: - "@zxing/text-encoding" "0.9.0" - -web-streams-polyfill@^3.1.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" - integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -8933,7 +8725,7 @@ which-collection@^1.0.1: is-weakmap "^2.0.1" is-weakset "^2.0.1" -which-typed-array@^1.1.2, which-typed-array@^1.1.9: +which-typed-array@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== From 4eb4c791cc699fd80b6d156035220728c37c7da0 Mon Sep 17 00:00:00 2001 From: DNLHC Date: Fri, 7 Apr 2023 11:55:55 +0300 Subject: [PATCH 08/13] =?UTF-8?q?client-only=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B2=D0=BE=D0=B4=20=D0=B2=20jsx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/src/components/client-only/client-only.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/client-only/client-only.tsx b/packages/client/src/components/client-only/client-only.tsx index e8d69b0..96613f1 100644 --- a/packages/client/src/components/client-only/client-only.tsx +++ b/packages/client/src/components/client-only/client-only.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect, createElement, Fragment } from 'react'; +import { useState, useEffect } from 'react'; export const ClientOnly = ({ children }: { children: React.ReactNode }) => { const [hasMounted, setHasMounted] = useState(false); @@ -9,5 +9,5 @@ export const ClientOnly = ({ children }: { children: React.ReactNode }) => { if (!hasMounted) return null; - return createElement(Fragment, {}, children); + return <>{children}; }; From 4084e4b0675971c3595800ea4dd5b8c437716746 Mon Sep 17 00:00:00 2001 From: DNLHC Date: Fri, 7 Apr 2023 16:57:05 +0300 Subject: [PATCH 09/13] =?UTF-8?q?=D0=BC=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/server/index.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/server/index.ts b/packages/server/index.ts index 1513892..37b7a6d 100644 --- a/packages/server/index.ts +++ b/packages/server/index.ts @@ -134,9 +134,7 @@ async function bootstrap() { }); } -function createRequestHeaders( - requestHeaders: express.Request['headers'] -): Headers { +function createRequestHeaders(requestHeaders: express.Request['headers']) { const headers = new Headers(); for (const [key, values] of Object.entries(requestHeaders)) { @@ -154,7 +152,7 @@ function createRequestHeaders( return headers; } -function createFetchRequest(req: express.Request): Request { +function createFetchRequest(req: express.Request) { const origin = `${req.protocol}://${req.get('host')}`; const url = new URL(req.originalUrl || req.url, origin); From 6bbc46427efd986b2f0cd5055099ff0fdea04a8e Mon Sep 17 00:00:00 2001 From: DNLHC Date: Fri, 7 Apr 2023 17:00:28 +0300 Subject: [PATCH 10/13] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20rimraf=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D1=81=D0=BF=D0=BB=D0=B0=D1=82=D1=84=D0=BE=D1=80=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/server/package.json | 3 ++- yarn.lock | 42 ++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/packages/server/package.json b/packages/server/package.json index c1586d9..9f6793d 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -4,7 +4,7 @@ "type": "module", "description": "", "scripts": { - "build": "rm -rf dist && tsc --p ./tsconfig.prod.json", + "build": "rimraf dist && tsc --p ./tsconfig.prod.json", "preview": "node ./dist/index.js", "start": "yarn build && yarn preview", "dev": "cross-env NODE_ENV=development nodemon -x ts-node --esm index.ts", @@ -42,6 +42,7 @@ "jest": "29.4.3", "nodemon": "2.0.19", "prettier": "2.8.4", + "rimraf": "4.4.1", "ts-jest": "29.0.5", "ts-node": "10.9.1", "typescript": "4.9.5" diff --git a/yarn.lock b/yarn.lock index b3a60ce..f7b5822 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4255,6 +4255,16 @@ glob@^8.0.1: minimatch "^5.0.1" once "^1.3.0" +glob@^9.2.0: + version "9.3.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.4.tgz#e75dee24891a80c25cc7ee1dd327e126b98679af" + integrity sha512-qaSc49hojMOv1EPM4EuyITjDSgSKI0rthoHnvE81tcOi1SCVndHko7auqxdQ14eiQG2NDBJBE86+2xIrbIvrbA== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -5799,6 +5809,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: version "7.18.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.1.tgz#4716408dec51d5d0104732647f584d1f6738b109" @@ -6006,6 +6021,13 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" +minimatch@^8.0.2: + version "8.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.3.tgz#0415cb9bb0c1d8ac758c8a673eb1d288e13f5e75" + integrity sha512-tEEvU9TkZgnFDCtpnrEYnPsjT7iUx42aXfs4bzmQ5sMA09/6hZY0jeZcGkXyDagiBOvkUjNo8Viom+Me6+2x7g== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -6079,6 +6101,11 @@ minipass@^4.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.4.tgz#7d0d97434b6a19f59c5c3221698b48bbf3b2cd06" integrity sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ== +minipass@^4.0.2, minipass@^4.2.4: + version "4.2.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.5.tgz#9e0e5256f1e3513f8c34691dd68549e85b2c8ceb" + integrity sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q== + minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -6880,6 +6907,14 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.6.1: + version "1.6.3" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.6.3.tgz#4eba7183d64ef88b63c7d330bddc3ba279dc6c40" + integrity sha512-RAmB+n30SlN+HnNx6EbcpoDy9nwdpcGPnEKrJnu6GZoDWBdIjo1UQMVtW2ybtC7LC2oKLcMq8y5g8WnKLiod9g== + dependencies: + lru-cache "^7.14.1" + minipass "^4.0.2" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -7564,6 +7599,13 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rimraf@4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.4.1.tgz#bd33364f67021c5b79e93d7f4fa0568c7c21b755" + integrity sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og== + dependencies: + glob "^9.2.0" + rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" From afe6be2dc14551d8271bd18a824c3a0fea393deb Mon Sep 17 00:00:00 2001 From: DNLHC Date: Mon, 10 Apr 2023 09:49:07 +0300 Subject: [PATCH 11/13] =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B0=20`q?= =?UTF-8?q?uerySelector`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/src/entry-client.tsx | 2 +- packages/eslint-config-shared/index.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/client/src/entry-client.tsx b/packages/client/src/entry-client.tsx index 62e41c0..fb4a45e 100644 --- a/packages/client/src/entry-client.tsx +++ b/packages/client/src/entry-client.tsx @@ -11,7 +11,7 @@ const store = createStore(initialState); const router = createBrowserRouter(createRoutes(store)); ReactDOM.hydrateRoot( - document.querySelector('#root') as HTMLElement, + document.getElementById('root') as HTMLElement, diff --git a/packages/eslint-config-shared/index.js b/packages/eslint-config-shared/index.js index 6b7ef7e..3d64043 100644 --- a/packages/eslint-config-shared/index.js +++ b/packages/eslint-config-shared/index.js @@ -164,7 +164,6 @@ module.exports = { 'unicorn/prefer-date-now': 'error', 'unicorn/prefer-keyboard-event-key': 'error', 'unicorn/prefer-modern-math-apis': 'error', - 'unicorn/prefer-query-selector': 'error', 'unicorn/throw-new-error': 'error', }, }; From 16dfd95fd73c2fad35f6d45fdee86c84507a36f1 Mon Sep 17 00:00:00 2001 From: DNLHC Date: Wed, 12 Apr 2023 00:05:45 +0300 Subject: [PATCH 12/13] =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=B3=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=BA=20=D0=BC=D0=B5=D1=80=D0=B4?= =?UTF-8?q?=D0=B6=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/src/routes.tsx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/client/src/routes.tsx b/packages/client/src/routes.tsx index c66f9a4..91c79fd 100644 --- a/packages/client/src/routes.tsx +++ b/packages/client/src/routes.tsx @@ -1,5 +1,4 @@ import { ProtectedRoutes } from 'utils/protected-routes'; -import { HowToModal } from 'components/how-to-modal'; import { MainLayout } from 'components/main-layout'; import { NewThreadModal } from 'components/modal-new-thread'; import { AuthLayout, getCurrentUser } from 'components/auth-layout'; @@ -30,10 +29,14 @@ export const createRoutes = (store: AppStore) => { > } /> } /> - }> - }> - } /> - + } + loader={({ request }) => { + const url = new URL(request.url); + return url.searchParams.get('modal'); + }} + > + } /> } /> }> } /> From 4661b5df290022addb3a497289ec79e6f9844a60 Mon Sep 17 00:00:00 2001 From: DNLHC Date: Wed, 12 Apr 2023 00:27:44 +0300 Subject: [PATCH 13/13] =?UTF-8?q?=D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=82=20=D1=82=D0=B8=D0=BF=20leaderboard=20=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=B9=D1=82=D0=B0,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=20=D1=83=D1=81=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D0=B8=20SSR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/src/components/hooks/use-window-size.ts | 2 +- packages/client/src/services/leaderboard-slice.ts | 4 ++-- packages/client/src/store.ts | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/client/src/components/hooks/use-window-size.ts b/packages/client/src/components/hooks/use-window-size.ts index 794313a..57b5566 100644 --- a/packages/client/src/components/hooks/use-window-size.ts +++ b/packages/client/src/components/hooks/use-window-size.ts @@ -1,7 +1,7 @@ import { useEffect, useState } from 'react'; export const useWindowSize = () => { - const isSSR = typeof window !== 'undefined'; + const isSSR = typeof window === 'undefined'; const [windowSize, setWindowSize] = useState({ width: isSSR ? 1440 : window.innerWidth, diff --git a/packages/client/src/services/leaderboard-slice.ts b/packages/client/src/services/leaderboard-slice.ts index 05acac8..1bc4ba1 100644 --- a/packages/client/src/services/leaderboard-slice.ts +++ b/packages/client/src/services/leaderboard-slice.ts @@ -5,13 +5,13 @@ export type FilteredUser = { place: number; } & UserParams; -type State = { +export type LeaderboardState = { leaderboard: PlayerData[]; filteredPlayers: FilteredUser[]; player: PlayerData | null; }; -const initialState: State = { +const initialState: LeaderboardState = { leaderboard: [], filteredPlayers: [], player: null, diff --git a/packages/client/src/store.ts b/packages/client/src/store.ts index a46ffd6..7408eda 100644 --- a/packages/client/src/store.ts +++ b/packages/client/src/store.ts @@ -2,10 +2,12 @@ import { configureStore } from '@reduxjs/toolkit'; import reducer from './services'; import { ForumState } from './services/forum-slice'; import { Game } from './services/game-slice'; +import { LeaderboardState } from './services/leaderboard-slice'; export type RootState = { game: Game; forum: ForumState; + leaderboard: LeaderboardState; }; export type InitialState = Partial;