From 976b8aa064a150dde674c5f7366fc3138219b568 Mon Sep 17 00:00:00 2001 From: Tomasz Kielar Date: Fri, 5 Jul 2024 13:37:13 +0200 Subject: [PATCH] feat(boilerplate): add auth guard in webapp --- .../apps/web/app/modules/Auth/authEffect.ts | 18 ++ .../apps/web/app/modules/Auth/authGuard.ts | 15 ++ .../apps/web/app/modules/Auth/authStore.ts | 11 + .../modules/Dashboard/Dashboard.layout.tsx | 8 + .../common_nestjs_remix/apps/web/package.json | 3 +- examples/common_nestjs_remix/pnpm-lock.yaml | 225 +++++++++++------- 6 files changed, 199 insertions(+), 81 deletions(-) create mode 100644 examples/common_nestjs_remix/apps/web/app/modules/Auth/authEffect.ts create mode 100644 examples/common_nestjs_remix/apps/web/app/modules/Auth/authGuard.ts create mode 100644 examples/common_nestjs_remix/apps/web/app/modules/Auth/authStore.ts diff --git a/examples/common_nestjs_remix/apps/web/app/modules/Auth/authEffect.ts b/examples/common_nestjs_remix/apps/web/app/modules/Auth/authEffect.ts new file mode 100644 index 0000000..9cb3673 --- /dev/null +++ b/examples/common_nestjs_remix/apps/web/app/modules/Auth/authEffect.ts @@ -0,0 +1,18 @@ +import { useEffect } from "react"; +import { useAuthStore } from "./authStore"; +import { useNavigate } from "@remix-run/react"; + +/** + * @returns void + * @description This hook is used to rediect the user to the login page if they are not logged in. + */ +export function useAuthEffect() { + const loggedIn = useAuthStore((state) => state.isLoggedIn); + const navigate = useNavigate(); + + useEffect(() => { + if (!loggedIn) { + navigate("/login"); + } + }, [loggedIn, navigate]); +} diff --git a/examples/common_nestjs_remix/apps/web/app/modules/Auth/authGuard.ts b/examples/common_nestjs_remix/apps/web/app/modules/Auth/authGuard.ts new file mode 100644 index 0000000..ea77cf3 --- /dev/null +++ b/examples/common_nestjs_remix/apps/web/app/modules/Auth/authGuard.ts @@ -0,0 +1,15 @@ +import { redirect } from "@remix-run/react"; +import { useAuthStore } from "./authStore"; + +/** + * @returns void + * @description This function is used to rediect the user to the login page if they are not logged in. + * @description Should be moved to middlewares once they are supported in Remix/ReactRouter7 + */ +export function authGuard() { + const authStore = useAuthStore.getState(); + + if (!authStore.isLoggedIn) { + return redirect("/login"); + } +} diff --git a/examples/common_nestjs_remix/apps/web/app/modules/Auth/authStore.ts b/examples/common_nestjs_remix/apps/web/app/modules/Auth/authStore.ts new file mode 100644 index 0000000..cc1ab5e --- /dev/null +++ b/examples/common_nestjs_remix/apps/web/app/modules/Auth/authStore.ts @@ -0,0 +1,11 @@ +import { create } from "zustand"; + +type AuthStore = { + isLoggedIn: boolean; + setAuthState: (isLoggedIn: boolean) => void; +}; + +export const useAuthStore = create((set) => ({ + isLoggedIn: false, + setAuthState: (isLoggedIn) => set({ isLoggedIn }), +})); diff --git a/examples/common_nestjs_remix/apps/web/app/modules/Dashboard/Dashboard.layout.tsx b/examples/common_nestjs_remix/apps/web/app/modules/Dashboard/Dashboard.layout.tsx index 95b4bf8..81793de 100644 --- a/examples/common_nestjs_remix/apps/web/app/modules/Dashboard/Dashboard.layout.tsx +++ b/examples/common_nestjs_remix/apps/web/app/modules/Dashboard/Dashboard.layout.tsx @@ -1,6 +1,14 @@ import { Outlet } from "@remix-run/react"; +import { useAuthEffect } from "../Auth/authEffect"; +import { authGuard } from "../Auth/authGuard"; + +export function clientLoader() { + authGuard(); +} export default function DashboardLayout() { + useAuthEffect(); + return (

Dashboard Layout

diff --git a/examples/common_nestjs_remix/apps/web/package.json b/examples/common_nestjs_remix/apps/web/package.json index 24b673a..4a09e90 100644 --- a/examples/common_nestjs_remix/apps/web/package.json +++ b/examples/common_nestjs_remix/apps/web/package.json @@ -21,7 +21,8 @@ "isbot": "^4.1.0", "morgan": "^1.10.0", "react": "^18.3.1", - "react-dom": "^18.3.1" + "react-dom": "^18.3.1", + "zustand": "^4.5.4" }, "devDependencies": { "@remix-run/dev": "^2.9.2", diff --git a/examples/common_nestjs_remix/pnpm-lock.yaml b/examples/common_nestjs_remix/pnpm-lock.yaml index ff3b580..ee08509 100644 --- a/examples/common_nestjs_remix/pnpm-lock.yaml +++ b/examples/common_nestjs_remix/pnpm-lock.yaml @@ -28,10 +28,10 @@ importers: version: 10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': specifier: ^10.0.0 - version: 10.3.10(@nestjs/common@10.3.10)(@nestjs/platform-express@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1) + version: 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/platform-express': specifier: ^10.0.0 - version: 10.3.10(@nestjs/common@10.3.10)(@nestjs/core@10.3.10) + version: 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10) reflect-metadata: specifier: ^0.2.0 version: 0.2.2 @@ -44,10 +44,10 @@ importers: version: 10.4.2 '@nestjs/schematics': specifier: ^10.0.0 - version: 10.1.2(typescript@5.5.3) + version: 10.1.2(chokidar@3.6.0)(typescript@5.5.3) '@nestjs/testing': specifier: ^10.0.0 - version: 10.3.10(@nestjs/common@10.3.10)(@nestjs/core@10.3.10)(@nestjs/platform-express@10.3.10) + version: 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10)) '@types/express': specifier: ^4.17.17 version: 4.17.21 @@ -62,7 +62,7 @@ importers: version: 6.0.2 '@typescript-eslint/eslint-plugin': specifier: ^6.0.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.5.3) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) '@typescript-eslint/parser': specifier: ^6.0.0 version: 6.21.0(eslint@8.57.0)(typescript@5.5.3) @@ -74,10 +74,10 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-plugin-prettier: specifier: ^5.0.0 - version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.3.2) + version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2) jest: specifier: ^29.5.0 - version: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2) + version: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)) prettier: specifier: ^3.0.0 version: 3.3.2 @@ -89,7 +89,7 @@ importers: version: 6.3.4 ts-jest: specifier: ^29.1.0 - version: 29.1.5(@babel/core@7.24.7)(jest@29.7.0)(typescript@5.5.3) + version: 29.1.5(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(jest@29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)))(typescript@5.5.3) ts-loader: specifier: ^9.4.3 version: 9.5.1(typescript@5.5.3)(webpack@5.92.1) @@ -113,7 +113,7 @@ importers: version: 2.10.2(typescript@5.5.3) '@remix-run/react': specifier: ^2.9.2 - version: 2.10.2(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.3) + version: 2.10.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3) '@tanstack/react-query': specifier: ^5.40.1 version: 5.50.1(react@18.3.1) @@ -135,10 +135,13 @@ importers: react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) + zustand: + specifier: ^4.5.4 + version: 4.5.4(@types/react@18.3.3)(react@18.3.1) devDependencies: '@remix-run/dev': specifier: ^2.9.2 - version: 2.10.2(@remix-run/react@2.10.2)(typescript@5.5.3)(vite@5.3.3) + version: 2.10.2(@remix-run/react@2.10.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(@types/node@20.14.9)(terser@5.31.1)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3))(typescript@5.5.3)(vite@5.3.3(@types/node@20.14.9)(terser@5.31.1)) '@types/compression': specifier: ^1.7.5 version: 1.7.5 @@ -156,7 +159,7 @@ importers: version: 18.3.0 '@typescript-eslint/eslint-plugin': specifier: ^6.7.4 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.5.3) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) '@typescript-eslint/parser': specifier: ^6.7.4 version: 6.21.0(eslint@8.57.0)(typescript@5.5.3) @@ -171,10 +174,10 @@ importers: version: 8.57.0 eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: specifier: ^2.28.1 - version: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-jsx-a11y: specifier: ^6.7.1 version: 6.9.0(eslint@8.57.0) @@ -189,22 +192,22 @@ importers: version: 8.4.39 tailwindcss: specifier: ^3.4.4 - version: 3.4.4 + version: 3.4.4(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)) typescript: specifier: ^5.1.6 version: 5.5.3 vite: specifier: ^5.1.0 - version: 5.3.3 + version: 5.3.3(@types/node@20.14.9)(terser@5.31.1) vite-tsconfig-paths: specifier: ^4.2.1 - version: 4.3.2(typescript@5.5.3)(vite@5.3.3) + version: 4.3.2(typescript@5.5.3)(vite@5.3.3(@types/node@20.14.9)(terser@5.31.1)) packages/eslint-config: devDependencies: '@typescript-eslint/eslint-plugin': specifier: ^7.1.0 - version: 7.15.0(@typescript-eslint/parser@7.15.0)(eslint@8.57.0)(typescript@5.5.3) + version: 7.15.0(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) '@typescript-eslint/parser': specifier: ^7.1.0 version: 7.15.0(eslint@8.57.0)(typescript@5.5.3) @@ -5131,6 +5134,11 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -5350,6 +5358,21 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zustand@4.5.4: + resolution: {integrity: sha512-/BPMyLKJPtFEvVL0E9E9BTUM63MNyhPGlvxk1XjrfWTUlV+BR8jufjsovHzrtR6YNcBEcL7cMHovL1n9xHawEg==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0.6' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -5366,11 +5389,12 @@ snapshots: dependencies: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) - chokidar: 3.6.0 jsonc-parser: 3.2.1 picomatch: 4.0.1 rxjs: 7.8.1 source-map: 0.7.4 + optionalDependencies: + chokidar: 3.6.0 '@angular-devkit/schematics-cli@17.3.8(chokidar@3.6.0)': dependencies: @@ -5897,7 +5921,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2)': + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -5911,7 +5935,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -6141,10 +6165,9 @@ snapshots: tslib: 2.6.3 uid: 2.0.2 - '@nestjs/core@10.3.10(@nestjs/common@10.3.10)(@nestjs/platform-express@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1)': + '@nestjs/core@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/platform-express': 10.3.10(@nestjs/common@10.3.10)(@nestjs/core@10.3.10) '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 @@ -6153,13 +6176,15 @@ snapshots: rxjs: 7.8.1 tslib: 2.6.3 uid: 2.0.2 + optionalDependencies: + '@nestjs/platform-express': 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10) transitivePeerDependencies: - encoding - '@nestjs/platform-express@10.3.10(@nestjs/common@10.3.10)(@nestjs/core@10.3.10)': + '@nestjs/platform-express@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10)': dependencies: '@nestjs/common': 10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/core': 10.3.10(@nestjs/common@10.3.10)(@nestjs/platform-express@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1) body-parser: 1.20.2 cors: 2.8.5 express: 4.19.2 @@ -6179,7 +6204,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/schematics@10.1.2(typescript@5.5.3)': + '@nestjs/schematics@10.1.2(chokidar@3.6.0)(typescript@5.5.3)': dependencies: '@angular-devkit/core': 17.3.8(chokidar@3.6.0) '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0) @@ -6190,12 +6215,13 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/testing@10.3.10(@nestjs/common@10.3.10)(@nestjs/core@10.3.10)(@nestjs/platform-express@10.3.10)': + '@nestjs/testing@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10))': dependencies: '@nestjs/common': 10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/core': 10.3.10(@nestjs/common@10.3.10)(@nestjs/platform-express@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/platform-express': 10.3.10(@nestjs/common@10.3.10)(@nestjs/core@10.3.10) + '@nestjs/core': 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1) tslib: 2.6.3 + optionalDependencies: + '@nestjs/platform-express': 10.3.10(@nestjs/common@10.3.10(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10) '@nodelib/fs.scandir@2.1.5': dependencies: @@ -6255,7 +6281,7 @@ snapshots: '@pkgr/core@0.1.1': {} - '@remix-run/dev@2.10.2(@remix-run/react@2.10.2)(typescript@5.5.3)(vite@5.3.3)': + '@remix-run/dev@2.10.2(@remix-run/react@2.10.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(@types/node@20.14.9)(terser@5.31.1)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3))(typescript@5.5.3)(vite@5.3.3(@types/node@20.14.9)(terser@5.31.1))': dependencies: '@babel/core': 7.24.7 '@babel/generator': 7.24.7 @@ -6268,11 +6294,11 @@ snapshots: '@mdx-js/mdx': 2.3.0 '@npmcli/package-json': 4.0.1 '@remix-run/node': 2.10.2(typescript@5.5.3) - '@remix-run/react': 2.10.2(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.3) + '@remix-run/react': 2.10.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3) '@remix-run/router': 1.17.1 '@remix-run/server-runtime': 2.10.2(typescript@5.5.3) '@types/mdx': 2.0.13 - '@vanilla-extract/integration': 6.5.0 + '@vanilla-extract/integration': 6.5.0(@types/node@20.14.9)(terser@5.31.1) arg: 5.0.2 cacache: 17.1.4 chalk: 4.1.2 @@ -6299,7 +6325,7 @@ snapshots: pidtree: 0.6.0 postcss: 8.4.39 postcss-discard-duplicates: 5.1.0(postcss@8.4.39) - postcss-load-config: 4.0.2(postcss@8.4.39) + postcss-load-config: 4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)) postcss-modules: 6.0.0(postcss@8.4.39) prettier: 2.8.8 pretty-ms: 7.0.1 @@ -6310,9 +6336,10 @@ snapshots: set-cookie-parser: 2.6.0 tar-fs: 2.1.1 tsconfig-paths: 4.2.0 - typescript: 5.5.3 - vite: 5.3.3 ws: 7.5.10 + optionalDependencies: + typescript: 5.5.3 + vite: 5.3.3(@types/node@20.14.9)(terser@5.31.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -6332,6 +6359,7 @@ snapshots: dependencies: '@remix-run/node': 2.10.2(typescript@5.5.3) express: 4.19.2 + optionalDependencies: typescript: 5.5.3 '@remix-run/node@2.10.2(typescript@5.5.3)': @@ -6342,18 +6370,20 @@ snapshots: cookie-signature: 1.2.1 source-map-support: 0.5.21 stream-slice: 0.1.2 - typescript: 5.5.3 undici: 6.19.2 + optionalDependencies: + typescript: 5.5.3 - '@remix-run/react@2.10.2(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.3)': + '@remix-run/react@2.10.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)': dependencies: '@remix-run/router': 1.17.1 '@remix-run/server-runtime': 2.10.2(typescript@5.5.3) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-router: 6.24.1(react@18.3.1) - react-router-dom: 6.24.1(react-dom@18.3.1)(react@18.3.1) + react-router-dom: 6.24.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) turbo-stream: 2.2.0 + optionalDependencies: typescript: 5.5.3 '@remix-run/router@1.17.1': {} @@ -6367,6 +6397,7 @@ snapshots: set-cookie-parser: 2.6.0 source-map: 0.7.4 turbo-stream: 2.2.0 + optionalDependencies: typescript: 5.5.3 '@remix-run/web-blob@3.1.0': @@ -6699,7 +6730,7 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.5.3)': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': dependencies: '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.3) @@ -6714,11 +6745,12 @@ snapshots: natural-compare: 1.4.0 semver: 7.6.2 ts-api-utils: 1.3.0(typescript@5.5.3) + optionalDependencies: typescript: 5.5.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@7.15.0(@typescript-eslint/parser@7.15.0)(eslint@8.57.0)(typescript@5.5.3)': + '@typescript-eslint/eslint-plugin@7.15.0(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': dependencies: '@eslint-community/regexpp': 4.11.0 '@typescript-eslint/parser': 7.15.0(eslint@8.57.0)(typescript@5.5.3) @@ -6731,6 +6763,7 @@ snapshots: ignore: 5.3.1 natural-compare: 1.4.0 ts-api-utils: 1.3.0(typescript@5.5.3) + optionalDependencies: typescript: 5.5.3 transitivePeerDependencies: - supports-color @@ -6743,6 +6776,7 @@ snapshots: '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.5 eslint: 8.57.0 + optionalDependencies: typescript: 5.5.3 transitivePeerDependencies: - supports-color @@ -6755,6 +6789,7 @@ snapshots: '@typescript-eslint/visitor-keys': 7.15.0 debug: 4.3.5 eslint: 8.57.0 + optionalDependencies: typescript: 5.5.3 transitivePeerDependencies: - supports-color @@ -6776,6 +6811,7 @@ snapshots: debug: 4.3.5 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.3) + optionalDependencies: typescript: 5.5.3 transitivePeerDependencies: - supports-color @@ -6787,6 +6823,7 @@ snapshots: debug: 4.3.5 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.3) + optionalDependencies: typescript: 5.5.3 transitivePeerDependencies: - supports-color @@ -6805,6 +6842,7 @@ snapshots: minimatch: 9.0.3 semver: 7.6.2 ts-api-utils: 1.3.0(typescript@5.5.3) + optionalDependencies: typescript: 5.5.3 transitivePeerDependencies: - supports-color @@ -6819,6 +6857,7 @@ snapshots: minimatch: 9.0.5 semver: 7.6.2 ts-api-utils: 1.3.0(typescript@5.5.3) + optionalDependencies: typescript: 5.5.3 transitivePeerDependencies: - supports-color @@ -6882,7 +6921,7 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - '@vanilla-extract/integration@6.5.0': + '@vanilla-extract/integration@6.5.0(@types/node@20.14.9)(terser@5.31.1)': dependencies: '@babel/core': 7.24.7 '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7) @@ -6895,8 +6934,8 @@ snapshots: lodash: 4.17.21 mlly: 1.7.1 outdent: 0.8.0 - vite: 5.3.3 - vite-node: 1.6.0 + vite: 5.3.3(@types/node@20.14.9)(terser@5.31.1) + vite-node: 1.6.0(@types/node@20.14.9)(terser@5.31.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -7030,7 +7069,7 @@ snapshots: indent-string: 4.0.0 ajv-formats@2.1.1(ajv@8.12.0): - dependencies: + optionalDependencies: ajv: 8.12.0 ajv-keywords@3.5.2(ajv@6.12.6): @@ -7586,15 +7625,16 @@ snapshots: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 + optionalDependencies: typescript: 5.3.3 - create-jest@29.7.0(@types/node@20.14.9)(ts-node@10.9.2): + create-jest@29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -8005,13 +8045,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: debug: 4.3.5 enhanced-resolve: 5.17.0 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.5 is-core-module: 2.14.0 @@ -8022,19 +8062,19 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.3) debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.3) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.3) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -8043,7 +8083,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.14.0 is-glob: 4.0.3 @@ -8053,6 +8093,8 @@ snapshots: object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -8080,13 +8122,15 @@ snapshots: eslint-plugin-only-warn@1.1.0: {} - eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.3.2): + eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2): dependencies: eslint: 8.57.0 - eslint-config-prettier: 9.1.0(eslint@8.57.0) prettier: 3.3.2 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 + optionalDependencies: + '@types/eslint': 8.56.10 + eslint-config-prettier: 9.1.0(eslint@8.57.0) eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): dependencies: @@ -9034,16 +9078,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.14.9)(ts-node@10.9.2): + jest-cli@29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2) + create-jest: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -9053,12 +9097,11 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.14.9)(ts-node@10.9.2): + jest-config@29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)): dependencies: '@babel/core': 7.24.7 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.9 babel-jest: 29.7.0(@babel/core@7.24.7) chalk: 4.1.2 ci-info: 3.9.0 @@ -9078,6 +9121,8 @@ snapshots: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.14.9 ts-node: 10.9.2(@types/node@20.14.9)(typescript@5.5.3) transitivePeerDependencies: - babel-plugin-macros @@ -9160,7 +9205,7 @@ snapshots: jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - dependencies: + optionalDependencies: jest-resolve: 29.7.0 jest-regex-util@29.6.3: {} @@ -9304,12 +9349,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.14.9)(ts-node@10.9.2): + jest@29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2) + jest-cli: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -10266,11 +10311,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.4.39 - postcss-load-config@4.0.2(postcss@8.4.39): + postcss-load-config@4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)): dependencies: lilconfig: 3.1.2 - postcss: 8.4.39 yaml: 2.4.5 + optionalDependencies: + postcss: 8.4.39 + ts-node: 10.9.2(@types/node@20.14.9)(typescript@5.5.3) postcss-modules-extract-imports@3.1.0(postcss@8.4.39): dependencies: @@ -10449,7 +10496,7 @@ snapshots: react-refresh@0.14.2: {} - react-router-dom@6.24.1(react-dom@18.3.1)(react@18.3.1): + react-router-dom@6.24.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.17.1 react: 18.3.1 @@ -10978,7 +11025,7 @@ snapshots: '@pkgr/core': 0.1.1 tslib: 2.6.3 - tailwindcss@3.4.4: + tailwindcss@3.4.4(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -10997,7 +11044,7 @@ snapshots: postcss: 8.4.39 postcss-import: 15.1.0(postcss@8.4.39) postcss-js: 4.0.1(postcss@8.4.39) - postcss-load-config: 4.0.2(postcss@8.4.39) + postcss-load-config: 4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)) postcss-nested: 6.0.1(postcss@8.4.39) postcss-selector-parser: 6.1.0 resolve: 1.22.8 @@ -11112,12 +11159,11 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.1.5(@babel/core@7.24.7)(jest@29.7.0)(typescript@5.5.3): + ts-jest@29.1.5(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(jest@29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)))(typescript@5.5.3): dependencies: - '@babel/core': 7.24.7 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2) + jest: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -11125,6 +11171,11 @@ snapshots: semver: 7.6.2 typescript: 5.5.3 yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.24.7 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.7) ts-loader@9.5.1(typescript@5.5.3)(webpack@5.92.1): dependencies: @@ -11155,7 +11206,7 @@ snapshots: yn: 3.1.1 tsconfck@3.1.1(typescript@5.5.3): - dependencies: + optionalDependencies: typescript: 5.5.3 tsconfig-paths-webpack-plugin@4.1.0: @@ -11360,6 +11411,10 @@ snapshots: dependencies: punycode: 2.3.1 + use-sync-external-store@1.2.0(react@18.3.1): + dependencies: + react: 18.3.1 + util-deprecate@1.0.2: {} util@0.12.5: @@ -11408,13 +11463,13 @@ snapshots: unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 - vite-node@1.6.0: + vite-node@1.6.0(@types/node@20.14.9)(terser@5.31.1): dependencies: cac: 6.7.14 debug: 4.3.5 pathe: 1.1.2 picocolors: 1.0.1 - vite: 5.3.3 + vite: 5.3.3(@types/node@20.14.9)(terser@5.31.1) transitivePeerDependencies: - '@types/node' - less @@ -11425,23 +11480,26 @@ snapshots: - supports-color - terser - vite-tsconfig-paths@4.3.2(typescript@5.5.3)(vite@5.3.3): + vite-tsconfig-paths@4.3.2(typescript@5.5.3)(vite@5.3.3(@types/node@20.14.9)(terser@5.31.1)): dependencies: debug: 4.3.5 globrex: 0.1.2 tsconfck: 3.1.1(typescript@5.5.3) - vite: 5.3.3 + optionalDependencies: + vite: 5.3.3(@types/node@20.14.9)(terser@5.31.1) transitivePeerDependencies: - supports-color - typescript - vite@5.3.3: + vite@5.3.3(@types/node@20.14.9)(terser@5.31.1): dependencies: esbuild: 0.21.5 postcss: 8.4.39 rollup: 4.18.0 optionalDependencies: + '@types/node': 20.14.9 fsevents: 2.3.3 + terser: 5.31.1 walker@1.0.8: dependencies: @@ -11609,4 +11667,11 @@ snapshots: yocto-queue@0.1.0: {} + zustand@4.5.4(@types/react@18.3.3)(react@18.3.1): + dependencies: + use-sync-external-store: 1.2.0(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + react: 18.3.1 + zwitch@2.0.4: {}