├── .dockerignore ├── .github └── workflows │ └── deploy.yml ├── .gitignore ├── .vscode ├── extensions.json └── settings.json ├── Dockerfile ├── README.md ├── app ├── app.css ├── entry.server.tsx ├── root.tsx ├── routes.ts ├── routes │ └── home.tsx └── welcome │ ├── logo-dark.svg │ ├── logo-light.svg │ └── welcome.tsx ├── deno.json ├── deno.lock ├── package.json ├── public └── favicon.ico ├── react-router.config.ts ├── server.production.ts └── vite.config.ts /.dockerignore: -------------------------------------------------------------------------------- 1 | .react-router 2 | build 3 | node_modules 4 | README.md 5 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy 2 | on: 3 | push: 4 | branches: main 5 | pull_request: 6 | branches: main 7 | 8 | jobs: 9 | deploy: 10 | name: Deploy 11 | runs-on: ubuntu-latest 12 | 13 | permissions: 14 | id-token: write # Needed for auth with Deno Deploy 15 | contents: read # Needed to clone the repository 16 | 17 | steps: 18 | - name: Clone repository 19 | uses: actions/checkout@v4 20 | 21 | - name: Install Deno 22 | uses: denoland/setup-deno@v2 23 | with: 24 | deno-version: v2.x 25 | 26 | - name: Install dependencies 27 | run: "deno install" 28 | 29 | - name: Build step 30 | run: "deno task build" 31 | 32 | - name: Upload to Deno Deploy 33 | uses: denoland/deployctl@v1 34 | with: 35 | project: "huge-badger-89" 36 | entrypoint: "server.production.ts" 37 | root: "" 38 | include: | 39 | deno.json 40 | deno.lock 41 | build 42 | package.json 43 | server.production.ts 44 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | !.env.example 3 | .DS_Store 4 | .react-router 5 | build 6 | node_modules 7 | *.tsbuildinfo 8 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["denoland.vscode-deno"] 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "deno.enable": true, 3 | "deno.lint": true, 4 | "editor.defaultFormatter": "denoland.vscode-deno" 5 | } 6 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM denoland/deno:2.1.4 AS build-env 2 | COPY . /app/ 3 | WORKDIR /app 4 | RUN deno install 5 | RUN deno task build 6 | RUN deno compile -A --output ./server ./server.production.ts 7 | 8 | FROM gcr.io/distroless/cc:nonroot 9 | COPY --from=build-env /app/build/client/ /app/build/client/ 10 | COPY --from=build-env /app/server /app/server 11 | WORKDIR /app 12 | CMD ["/app/server"] 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NOTES 2 | 3 | This template has been tested with Deno v2.2.1+. 4 | [Live deployment here](https://huge-badger-89.deno.dev/) hosted on 5 | [Deno Deploy](https://deno.com/deploy). 6 | 7 | ## Using this template 8 | 9 | Run the following command: 10 | 11 | ```zsh 12 | deno init --npm react-router --no-install --template redabacha/react-router-deno-template 13 | ``` 14 | 15 | And then run `deno install` in the created directory. 16 | 17 | ## Using JSR and HTTPS imports in `app/` 18 | 19 | Thanks to the [@deno/vite-plugin](https://github.com/denoland/deno-vite-plugin), 20 | it's possible to use packages from JSR and imports from HTTPS URLs (via the 21 | [deno.json `imports` field](https://docs.deno.com/runtime/fundamentals/modules/#managing-third-party-modules-and-libraries)) 22 | within the `app/` directory which will get included in the server and/or browser 23 | bundles as needed. 24 | 25 | # Welcome to React Router! 26 | 27 | A modern, production-ready template for building full-stack React applications 28 | using React Router. 29 | 30 | ## Features 31 | 32 | - 🚀 Server-side rendering 33 | - ⚡️ Hot Module Replacement (HMR) 34 | - 📦 Asset bundling and optimization 35 | - 🔄 Data loading and mutations 36 | - 🔒 TypeScript by default 37 | - 🎉 TailwindCSS for styling 38 | - 📖 [React Router docs](https://reactrouter.com/) 39 | 40 | ## Getting Started 41 | 42 | ### Installation 43 | 44 | Install the dependencies: 45 | 46 | ```bash 47 | deno install 48 | ``` 49 | 50 | ### Development 51 | 52 | Start the development server with HMR: 53 | 54 | ```bash 55 | deno task dev 56 | ``` 57 | 58 | Your application will be available at `http://localhost:5173`. 59 | 60 | ## Building for Production 61 | 62 | Create a production build: 63 | 64 | ```bash 65 | deno task build 66 | ``` 67 | 68 | ## Deployment 69 | 70 | ### Deno Deploy 71 | 72 | Deployment can be done using the 73 | [deployctl](https://github.com/denoland/deployctl) CLI: 74 | 75 | ```bash 76 | deployctl deploy --entrypoint ./server.production.ts 77 | ``` 78 | 79 | ### Docker Deployment 80 | 81 | To build and run using Docker: 82 | 83 | ```bash 84 | docker build -t my-app . 85 | 86 | # Run the container 87 | docker run --init -p 8000:8000 my-app 88 | ``` 89 | 90 | The containerized application can be deployed to any platform that supports 91 | Docker, including: 92 | 93 | - AWS ECS 94 | - Google Cloud Run 95 | - Azure Container Apps 96 | - Digital Ocean App Platform 97 | - Fly.io 98 | - Railway 99 | 100 | ### DIY Deployment 101 | 102 | If you're familiar with deploying Deno applications, the built-in app server is 103 | production-ready. 104 | 105 | Make sure to deploy the output of `deno task build` 106 | 107 | ``` 108 | ├── package.json 109 | ├── deno.json 110 | ├── deno.lock 111 | ├── build/ 112 | │ ├── client/ # Static assets 113 | │ └── server/ # Server-side code 114 | ├── server.production.ts # Entrypoint 115 | ``` 116 | 117 | ## Styling 118 | 119 | This template comes with [Tailwind CSS](https://tailwindcss.com/) already 120 | configured for a simple default starting experience. You can use whatever CSS 121 | framework you prefer. 122 | 123 | --- 124 | 125 | Built with ❤️ using React Router. 126 | -------------------------------------------------------------------------------- /app/app.css: -------------------------------------------------------------------------------- 1 | @import "tailwindcss"; 2 | 3 | @theme { 4 | --font-sans: 5 | "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", 6 | "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; 7 | } 8 | 9 | html, 10 | body { 11 | @apply bg-white dark:bg-gray-950; 12 | 13 | @media (prefers-color-scheme: dark) { 14 | color-scheme: dark; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/entry.server.tsx: -------------------------------------------------------------------------------- 1 | import { isbot } from "isbot"; 2 | import { renderToReadableStream } from "react-dom/server"; 3 | import type { AppLoadContext, EntryContext } from "react-router"; 4 | import { ServerRouter } from "react-router"; 5 | 6 | // Reject all pending promises from handler functions after 10 seconds 7 | export const streamTimeout = 5_000; 8 | 9 | export default async function handleRequest( 10 | request: Request, 11 | responseStatusCode: number, 12 | responseHeaders: Headers, 13 | routerContext: EntryContext, 14 | _loadContext: AppLoadContext, 15 | ) { 16 | let shellRendered = false; 17 | const userAgent = request.headers.get("user-agent"); 18 | 19 | const controller = new AbortController(); 20 | setTimeout(() => { 21 | // Abort the rendering stream after the `streamTimeout` so it has time to 22 | // flush down the rejected boundaries 23 | controller.abort(); 24 | }, streamTimeout + 1000); 25 | 26 | const body = await renderToReadableStream( 27 | , 28 | { 29 | onError(error: unknown) { 30 | responseStatusCode = 500; 31 | // Log streaming rendering errors from inside the shell. Don't log 32 | // errors encountered during initial shell rendering since they'll 33 | // reject and get logged in handleDocumentRequest. 34 | if (shellRendered) { 35 | console.error(error); 36 | } 37 | }, 38 | signal: controller.signal, 39 | }, 40 | ); 41 | shellRendered = true; 42 | 43 | // Ensure requests from bots and SPA Mode renders wait for all content to load before responding 44 | // https://react.dev/reference/react-dom/server/renderToReadableStream#waiting-for-all-content-to-load-for-crawlers-and-static-generation 45 | if ((userAgent && isbot(userAgent)) || routerContext.isSpaMode) { 46 | await body.allReady; 47 | } 48 | 49 | responseHeaders.set("Content-Type", "text/html"); 50 | return new Response(body, { 51 | headers: responseHeaders, 52 | status: responseStatusCode, 53 | }); 54 | } 55 | -------------------------------------------------------------------------------- /app/root.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | isRouteErrorResponse, 3 | Links, 4 | Meta, 5 | Outlet, 6 | Scripts, 7 | ScrollRestoration, 8 | } from "react-router"; 9 | 10 | import type { Route } from "./+types/root.ts"; 11 | import "./app.css"; 12 | 13 | export const links: Route.LinksFunction = () => [ 14 | { rel: "preconnect", href: "https://fonts.googleapis.com" }, 15 | { 16 | rel: "preconnect", 17 | href: "https://fonts.gstatic.com", 18 | crossOrigin: "anonymous", 19 | }, 20 | { 21 | rel: "stylesheet", 22 | href: 23 | "https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap", 24 | }, 25 | ]; 26 | 27 | export function Layout({ children }: { children: React.ReactNode }) { 28 | return ( 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | {children} 38 | 39 | 40 | 41 | 42 | ); 43 | } 44 | 45 | export default function App() { 46 | return ; 47 | } 48 | 49 | export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) { 50 | let message = "Oops!"; 51 | let details = "An unexpected error occurred."; 52 | let stack: string | undefined; 53 | 54 | if (isRouteErrorResponse(error)) { 55 | message = error.status === 404 ? "404" : "Error"; 56 | details = error.status === 404 57 | ? "The requested page could not be found." 58 | : error.statusText || details; 59 | } else if (import.meta.env.DEV && error && error instanceof Error) { 60 | details = error.message; 61 | stack = error.stack; 62 | } 63 | 64 | return ( 65 |
66 |

{message}

67 |

{details}

68 | {stack && ( 69 |
70 |           {stack}
71 |         
72 | )} 73 |
74 | ); 75 | } 76 | -------------------------------------------------------------------------------- /app/routes.ts: -------------------------------------------------------------------------------- 1 | import { index, type RouteConfig } from "@react-router/dev/routes"; 2 | 3 | export default [index("routes/home.tsx")] satisfies RouteConfig; 4 | -------------------------------------------------------------------------------- /app/routes/home.tsx: -------------------------------------------------------------------------------- 1 | import { Welcome } from "~/welcome/welcome.tsx"; 2 | import type { Route } from "./+types/home.ts"; 3 | 4 | export function meta({}: Route.MetaArgs) { 5 | return [ 6 | { title: "New React Router App" }, 7 | { name: "description", content: "Welcome to React Router!" }, 8 | ]; 9 | } 10 | 11 | export function loader() { 12 | return { 13 | message: `Hello from Deno ${ 14 | Deno.version.deno ? `v${Deno.version.deno}` : "Deploy" 15 | }`, 16 | }; 17 | } 18 | 19 | export default function Home({ loaderData }: Route.ComponentProps) { 20 | return ; 21 | } 22 | -------------------------------------------------------------------------------- /app/welcome/logo-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/welcome/logo-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/welcome/welcome.tsx: -------------------------------------------------------------------------------- 1 | import logoDark from "./logo-dark.svg"; 2 | import logoLight from "./logo-light.svg"; 3 | 4 | export function Welcome({ message }: { message: string }) { 5 | return ( 6 |
7 |
8 |
9 |
10 | React Router 15 | React Router 20 |
21 |
22 |
23 | 44 |
45 |
46 |
47 | ); 48 | } 49 | 50 | const resources = [ 51 | { 52 | href: "https://reactrouter.com/docs", 53 | text: "React Router Docs", 54 | icon: ( 55 | 63 | 68 | 69 | ), 70 | }, 71 | { 72 | href: "https://rmx.as/discord", 73 | text: "Join Discord", 74 | icon: ( 75 | 83 | 87 | 88 | ), 89 | }, 90 | ]; 91 | -------------------------------------------------------------------------------- /deno.json: -------------------------------------------------------------------------------- 1 | { 2 | "tasks": { 3 | "build": "NODE_ENV=production react-router build", 4 | "dev": "react-router dev", 5 | "format": "deno fmt", 6 | "lint": "deno lint", 7 | "start": "deno run -A ./server.production.ts", 8 | "typecheck": { 9 | "command": "deno check --node-modules-dir=auto '**/*'", 10 | "dependencies": ["typegen"] 11 | }, 12 | "typegen": "react-router typegen" 13 | }, 14 | "compilerOptions": { 15 | "lib": ["deno.window", "dom"], 16 | "jsx": "react-jsx", 17 | "jsxImportSource": "react", 18 | "jsxImportSourceTypes": "@types/react", 19 | "rootDirs": [".", "./.react-router/types"], 20 | "types": ["vite/client"] 21 | }, 22 | "unstable": ["sloppy-imports"], 23 | "exclude": ["build/"], 24 | "nodeModulesDir": "manual", 25 | "imports": { 26 | "~/": "./app/", 27 | "@std/http": "jsr:@std/http@^1.0.11", 28 | "@std/path": "jsr:@std/path@^1.0.8" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /deno.lock: -------------------------------------------------------------------------------- 1 | { 2 | "version": "4", 3 | "specifiers": { 4 | "jsr:@std/cli@^1.0.12": "1.0.13", 5 | "jsr:@std/encoding@^1.0.7": "1.0.7", 6 | "jsr:@std/fmt@^1.0.5": "1.0.5", 7 | "jsr:@std/html@^1.0.3": "1.0.3", 8 | "jsr:@std/http@^1.0.11": "1.0.13", 9 | "jsr:@std/media-types@^1.1.0": "1.1.0", 10 | "jsr:@std/net@^1.0.4": "1.0.4", 11 | "jsr:@std/path@^1.0.8": "1.0.8", 12 | "jsr:@std/streams@^1.0.9": "1.0.9", 13 | "npm:@deno/vite-plugin@^1.0.2": "1.0.4_vite@6.1.1__@types+node@22.13.5__lightningcss@1.29.1_@types+node@22.13.5", 14 | "npm:@react-router/dev@*": "7.2.0_react-router@7.2.0__react@19.0.0__react-dom@19.0.0___react@19.0.0_vite@6.1.1__@types+node@22.13.5__lightningcss@1.29.1_@babel+core@7.26.9_react@19.0.0_react-dom@19.0.0__react@19.0.0_@types+node@22.13.5", 15 | "npm:@tailwindcss/vite@^4.0.8": "4.0.8_vite@6.1.1__@types+node@22.13.5__lightningcss@1.29.1_@types+node@22.13.5_lightningcss@1.29.1", 16 | "npm:@types/node@^22.10.2": "22.13.5", 17 | "npm:@types/react-dom@^19.0.2": "19.0.4_@types+react@19.0.10", 18 | "npm:@types/react@^19.0.2": "19.0.10", 19 | "npm:isbot@^5.1.18": "5.1.23", 20 | "npm:react-dom@19": "19.0.0_react@19.0.0", 21 | "npm:react-router@*": "7.2.0_react@19.0.0_react-dom@19.0.0__react@19.0.0", 22 | "npm:react@19": "19.0.0", 23 | "npm:tailwindcss@^4.0.8": "4.0.8", 24 | "npm:vite@^6.0.5": "6.1.1_@types+node@22.13.5_lightningcss@1.29.1" 25 | }, 26 | "jsr": { 27 | "@std/cli@1.0.13": { 28 | "integrity": "5db2d95ab2dca3bca9fb6ad3c19908c314e93d6391c8b026725e4892d4615a69" 29 | }, 30 | "@std/encoding@1.0.7": { 31 | "integrity": "f631247c1698fef289f2de9e2a33d571e46133b38d042905e3eac3715030a82d" 32 | }, 33 | "@std/fmt@1.0.5": { 34 | "integrity": "0cfab43364bc36650d83c425cd6d99910fc20c4576631149f0f987eddede1a4d" 35 | }, 36 | "@std/html@1.0.3": { 37 | "integrity": "7a0ac35e050431fb49d44e61c8b8aac1ebd55937e0dc9ec6409aa4bab39a7988" 38 | }, 39 | "@std/http@1.0.13": { 40 | "integrity": "d29618b982f7ae44380111f7e5b43da59b15db64101198bb5f77100d44eb1e1e", 41 | "dependencies": [ 42 | "jsr:@std/cli", 43 | "jsr:@std/encoding", 44 | "jsr:@std/fmt", 45 | "jsr:@std/html", 46 | "jsr:@std/media-types", 47 | "jsr:@std/net", 48 | "jsr:@std/path", 49 | "jsr:@std/streams" 50 | ] 51 | }, 52 | "@std/media-types@1.1.0": { 53 | "integrity": "c9d093f0c05c3512932b330e3cc1fe1d627b301db33a4c2c2185c02471d6eaa4" 54 | }, 55 | "@std/net@1.0.4": { 56 | "integrity": "2f403b455ebbccf83d8a027d29c5a9e3a2452fea39bb2da7f2c04af09c8bc852" 57 | }, 58 | "@std/path@1.0.8": { 59 | "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be" 60 | }, 61 | "@std/streams@1.0.9": { 62 | "integrity": "a9d26b1988cdd7aa7b1f4b51e1c36c1557f3f252880fa6cc5b9f37078b1a5035" 63 | } 64 | }, 65 | "npm": { 66 | "@ampproject/remapping@2.3.0": { 67 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 68 | "dependencies": [ 69 | "@jridgewell/gen-mapping", 70 | "@jridgewell/trace-mapping" 71 | ] 72 | }, 73 | "@babel/code-frame@7.26.2": { 74 | "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", 75 | "dependencies": [ 76 | "@babel/helper-validator-identifier", 77 | "js-tokens", 78 | "picocolors" 79 | ] 80 | }, 81 | "@babel/compat-data@7.26.8": { 82 | "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==" 83 | }, 84 | "@babel/core@7.26.9": { 85 | "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", 86 | "dependencies": [ 87 | "@ampproject/remapping", 88 | "@babel/code-frame", 89 | "@babel/generator", 90 | "@babel/helper-compilation-targets", 91 | "@babel/helper-module-transforms", 92 | "@babel/helpers", 93 | "@babel/parser", 94 | "@babel/template", 95 | "@babel/traverse", 96 | "@babel/types", 97 | "convert-source-map", 98 | "debug", 99 | "gensync", 100 | "json5", 101 | "semver@6.3.1" 102 | ] 103 | }, 104 | "@babel/generator@7.26.9": { 105 | "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", 106 | "dependencies": [ 107 | "@babel/parser", 108 | "@babel/types", 109 | "@jridgewell/gen-mapping", 110 | "@jridgewell/trace-mapping", 111 | "jsesc" 112 | ] 113 | }, 114 | "@babel/helper-annotate-as-pure@7.25.9": { 115 | "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", 116 | "dependencies": [ 117 | "@babel/types" 118 | ] 119 | }, 120 | "@babel/helper-compilation-targets@7.26.5": { 121 | "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", 122 | "dependencies": [ 123 | "@babel/compat-data", 124 | "@babel/helper-validator-option", 125 | "browserslist", 126 | "lru-cache@5.1.1", 127 | "semver@6.3.1" 128 | ] 129 | }, 130 | "@babel/helper-create-class-features-plugin@7.26.9_@babel+core@7.26.9": { 131 | "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", 132 | "dependencies": [ 133 | "@babel/core", 134 | "@babel/helper-annotate-as-pure", 135 | "@babel/helper-member-expression-to-functions", 136 | "@babel/helper-optimise-call-expression", 137 | "@babel/helper-replace-supers", 138 | "@babel/helper-skip-transparent-expression-wrappers", 139 | "@babel/traverse", 140 | "semver@6.3.1" 141 | ] 142 | }, 143 | "@babel/helper-member-expression-to-functions@7.25.9": { 144 | "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", 145 | "dependencies": [ 146 | "@babel/traverse", 147 | "@babel/types" 148 | ] 149 | }, 150 | "@babel/helper-module-imports@7.25.9": { 151 | "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", 152 | "dependencies": [ 153 | "@babel/traverse", 154 | "@babel/types" 155 | ] 156 | }, 157 | "@babel/helper-module-transforms@7.26.0_@babel+core@7.26.9": { 158 | "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", 159 | "dependencies": [ 160 | "@babel/core", 161 | "@babel/helper-module-imports", 162 | "@babel/helper-validator-identifier", 163 | "@babel/traverse" 164 | ] 165 | }, 166 | "@babel/helper-optimise-call-expression@7.25.9": { 167 | "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", 168 | "dependencies": [ 169 | "@babel/types" 170 | ] 171 | }, 172 | "@babel/helper-plugin-utils@7.26.5": { 173 | "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==" 174 | }, 175 | "@babel/helper-replace-supers@7.26.5_@babel+core@7.26.9": { 176 | "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", 177 | "dependencies": [ 178 | "@babel/core", 179 | "@babel/helper-member-expression-to-functions", 180 | "@babel/helper-optimise-call-expression", 181 | "@babel/traverse" 182 | ] 183 | }, 184 | "@babel/helper-skip-transparent-expression-wrappers@7.25.9": { 185 | "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", 186 | "dependencies": [ 187 | "@babel/traverse", 188 | "@babel/types" 189 | ] 190 | }, 191 | "@babel/helper-string-parser@7.25.9": { 192 | "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==" 193 | }, 194 | "@babel/helper-validator-identifier@7.25.9": { 195 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" 196 | }, 197 | "@babel/helper-validator-option@7.25.9": { 198 | "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==" 199 | }, 200 | "@babel/helpers@7.26.9": { 201 | "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", 202 | "dependencies": [ 203 | "@babel/template", 204 | "@babel/types" 205 | ] 206 | }, 207 | "@babel/parser@7.26.9": { 208 | "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", 209 | "dependencies": [ 210 | "@babel/types" 211 | ] 212 | }, 213 | "@babel/plugin-syntax-decorators@7.25.9_@babel+core@7.26.9": { 214 | "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", 215 | "dependencies": [ 216 | "@babel/core", 217 | "@babel/helper-plugin-utils" 218 | ] 219 | }, 220 | "@babel/plugin-syntax-jsx@7.25.9_@babel+core@7.26.9": { 221 | "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", 222 | "dependencies": [ 223 | "@babel/core", 224 | "@babel/helper-plugin-utils" 225 | ] 226 | }, 227 | "@babel/plugin-syntax-typescript@7.25.9_@babel+core@7.26.9": { 228 | "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", 229 | "dependencies": [ 230 | "@babel/core", 231 | "@babel/helper-plugin-utils" 232 | ] 233 | }, 234 | "@babel/plugin-transform-modules-commonjs@7.26.3_@babel+core@7.26.9": { 235 | "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", 236 | "dependencies": [ 237 | "@babel/core", 238 | "@babel/helper-module-transforms", 239 | "@babel/helper-plugin-utils" 240 | ] 241 | }, 242 | "@babel/plugin-transform-typescript@7.26.8_@babel+core@7.26.9": { 243 | "integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==", 244 | "dependencies": [ 245 | "@babel/core", 246 | "@babel/helper-annotate-as-pure", 247 | "@babel/helper-create-class-features-plugin", 248 | "@babel/helper-plugin-utils", 249 | "@babel/helper-skip-transparent-expression-wrappers", 250 | "@babel/plugin-syntax-typescript" 251 | ] 252 | }, 253 | "@babel/preset-typescript@7.26.0_@babel+core@7.26.9": { 254 | "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", 255 | "dependencies": [ 256 | "@babel/core", 257 | "@babel/helper-plugin-utils", 258 | "@babel/helper-validator-option", 259 | "@babel/plugin-syntax-jsx", 260 | "@babel/plugin-transform-modules-commonjs", 261 | "@babel/plugin-transform-typescript" 262 | ] 263 | }, 264 | "@babel/template@7.26.9": { 265 | "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", 266 | "dependencies": [ 267 | "@babel/code-frame", 268 | "@babel/parser", 269 | "@babel/types" 270 | ] 271 | }, 272 | "@babel/traverse@7.26.9": { 273 | "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", 274 | "dependencies": [ 275 | "@babel/code-frame", 276 | "@babel/generator", 277 | "@babel/parser", 278 | "@babel/template", 279 | "@babel/types", 280 | "debug", 281 | "globals" 282 | ] 283 | }, 284 | "@babel/types@7.26.9": { 285 | "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", 286 | "dependencies": [ 287 | "@babel/helper-string-parser", 288 | "@babel/helper-validator-identifier" 289 | ] 290 | }, 291 | "@deno/vite-plugin@1.0.4_vite@6.1.1__@types+node@22.13.5__lightningcss@1.29.1_@types+node@22.13.5": { 292 | "integrity": "sha512-xg8YT8Wn2sGXSnJgiGTpBGX1Dov0c6fd1rAp8VsfrCUtyBRRWzwVMAnd3fQ4yq8h7LSVvJUxEFN4U421k/DQLA==", 293 | "dependencies": [ 294 | "vite@6.1.1_@types+node@22.13.5_lightningcss@1.29.1" 295 | ] 296 | }, 297 | "@esbuild/aix-ppc64@0.24.2": { 298 | "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==" 299 | }, 300 | "@esbuild/android-arm64@0.24.2": { 301 | "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==" 302 | }, 303 | "@esbuild/android-arm@0.24.2": { 304 | "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==" 305 | }, 306 | "@esbuild/android-x64@0.24.2": { 307 | "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==" 308 | }, 309 | "@esbuild/darwin-arm64@0.24.2": { 310 | "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==" 311 | }, 312 | "@esbuild/darwin-x64@0.24.2": { 313 | "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==" 314 | }, 315 | "@esbuild/freebsd-arm64@0.24.2": { 316 | "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==" 317 | }, 318 | "@esbuild/freebsd-x64@0.24.2": { 319 | "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==" 320 | }, 321 | "@esbuild/linux-arm64@0.24.2": { 322 | "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==" 323 | }, 324 | "@esbuild/linux-arm@0.24.2": { 325 | "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==" 326 | }, 327 | "@esbuild/linux-ia32@0.24.2": { 328 | "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==" 329 | }, 330 | "@esbuild/linux-loong64@0.24.2": { 331 | "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==" 332 | }, 333 | "@esbuild/linux-mips64el@0.24.2": { 334 | "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==" 335 | }, 336 | "@esbuild/linux-ppc64@0.24.2": { 337 | "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==" 338 | }, 339 | "@esbuild/linux-riscv64@0.24.2": { 340 | "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==" 341 | }, 342 | "@esbuild/linux-s390x@0.24.2": { 343 | "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==" 344 | }, 345 | "@esbuild/linux-x64@0.24.2": { 346 | "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==" 347 | }, 348 | "@esbuild/netbsd-arm64@0.24.2": { 349 | "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==" 350 | }, 351 | "@esbuild/netbsd-x64@0.24.2": { 352 | "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==" 353 | }, 354 | "@esbuild/openbsd-arm64@0.24.2": { 355 | "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==" 356 | }, 357 | "@esbuild/openbsd-x64@0.24.2": { 358 | "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==" 359 | }, 360 | "@esbuild/sunos-x64@0.24.2": { 361 | "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==" 362 | }, 363 | "@esbuild/win32-arm64@0.24.2": { 364 | "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==" 365 | }, 366 | "@esbuild/win32-ia32@0.24.2": { 367 | "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==" 368 | }, 369 | "@esbuild/win32-x64@0.24.2": { 370 | "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==" 371 | }, 372 | "@isaacs/cliui@8.0.2": { 373 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 374 | "dependencies": [ 375 | "string-width@5.1.2", 376 | "string-width-cjs@npm:string-width@4.2.3", 377 | "strip-ansi@7.1.0", 378 | "strip-ansi-cjs@npm:strip-ansi@6.0.1", 379 | "wrap-ansi@8.1.0", 380 | "wrap-ansi-cjs@npm:wrap-ansi@7.0.0" 381 | ] 382 | }, 383 | "@jridgewell/gen-mapping@0.3.8": { 384 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 385 | "dependencies": [ 386 | "@jridgewell/set-array", 387 | "@jridgewell/sourcemap-codec", 388 | "@jridgewell/trace-mapping" 389 | ] 390 | }, 391 | "@jridgewell/resolve-uri@3.1.2": { 392 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" 393 | }, 394 | "@jridgewell/set-array@1.2.1": { 395 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" 396 | }, 397 | "@jridgewell/sourcemap-codec@1.5.0": { 398 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" 399 | }, 400 | "@jridgewell/trace-mapping@0.3.25": { 401 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 402 | "dependencies": [ 403 | "@jridgewell/resolve-uri", 404 | "@jridgewell/sourcemap-codec" 405 | ] 406 | }, 407 | "@mjackson/node-fetch-server@0.2.0": { 408 | "integrity": "sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==" 409 | }, 410 | "@npmcli/git@4.1.0": { 411 | "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", 412 | "dependencies": [ 413 | "@npmcli/promise-spawn", 414 | "lru-cache@7.18.3", 415 | "npm-pick-manifest", 416 | "proc-log", 417 | "promise-inflight", 418 | "promise-retry", 419 | "semver@7.7.1", 420 | "which@3.0.1" 421 | ] 422 | }, 423 | "@npmcli/package-json@4.0.1": { 424 | "integrity": "sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q==", 425 | "dependencies": [ 426 | "@npmcli/git", 427 | "glob", 428 | "hosted-git-info", 429 | "json-parse-even-better-errors", 430 | "normalize-package-data", 431 | "proc-log", 432 | "semver@7.7.1" 433 | ] 434 | }, 435 | "@npmcli/promise-spawn@6.0.2": { 436 | "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", 437 | "dependencies": [ 438 | "which@3.0.1" 439 | ] 440 | }, 441 | "@pkgjs/parseargs@0.11.0": { 442 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==" 443 | }, 444 | "@react-router/dev@7.2.0_react-router@7.2.0__react@19.0.0__react-dom@19.0.0___react@19.0.0_vite@6.1.1__@types+node@22.13.5__lightningcss@1.29.1_@babel+core@7.26.9_react@19.0.0_react-dom@19.0.0__react@19.0.0_@types+node@22.13.5": { 445 | "integrity": "sha512-GzSNGeWuhx6sMsnidCQAlCAephibUMC61xIAdsc6hBXWCJe/T9wUrvtnh2Xbcpr7BRZJtJN4UhI472ZURA6m9w==", 446 | "dependencies": [ 447 | "@babel/core", 448 | "@babel/generator", 449 | "@babel/parser", 450 | "@babel/plugin-syntax-decorators", 451 | "@babel/plugin-syntax-jsx", 452 | "@babel/preset-typescript", 453 | "@babel/traverse", 454 | "@babel/types", 455 | "@npmcli/package-json", 456 | "@react-router/node", 457 | "arg", 458 | "babel-dead-code-elimination", 459 | "chokidar", 460 | "dedent", 461 | "es-module-lexer", 462 | "exit-hook", 463 | "fs-extra", 464 | "gunzip-maybe", 465 | "jsesc", 466 | "lodash", 467 | "pathe", 468 | "picocolors", 469 | "picomatch", 470 | "prettier", 471 | "react-refresh", 472 | "react-router", 473 | "semver@7.7.1", 474 | "set-cookie-parser", 475 | "valibot", 476 | "vite@6.1.1_@types+node@22.13.5_lightningcss@1.29.1", 477 | "vite-node" 478 | ] 479 | }, 480 | "@react-router/node@7.2.0_react-router@7.2.0__react@19.0.0__react-dom@19.0.0___react@19.0.0_react@19.0.0_react-dom@19.0.0__react@19.0.0": { 481 | "integrity": "sha512-CqBHLwvvV4BB8htmaSwT+SOwX9B4RVOIiEdTlaIp12sNVCGSYDIEGbv3T4Wxeq8p5ynNfhNcdBeXtZ6ZPWVozA==", 482 | "dependencies": [ 483 | "@mjackson/node-fetch-server", 484 | "react-router", 485 | "source-map-support", 486 | "stream-slice", 487 | "undici" 488 | ] 489 | }, 490 | "@rollup/rollup-android-arm-eabi@4.34.8": { 491 | "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==" 492 | }, 493 | "@rollup/rollup-android-arm64@4.34.8": { 494 | "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==" 495 | }, 496 | "@rollup/rollup-darwin-arm64@4.34.8": { 497 | "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==" 498 | }, 499 | "@rollup/rollup-darwin-x64@4.34.8": { 500 | "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==" 501 | }, 502 | "@rollup/rollup-freebsd-arm64@4.34.8": { 503 | "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==" 504 | }, 505 | "@rollup/rollup-freebsd-x64@4.34.8": { 506 | "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==" 507 | }, 508 | "@rollup/rollup-linux-arm-gnueabihf@4.34.8": { 509 | "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==" 510 | }, 511 | "@rollup/rollup-linux-arm-musleabihf@4.34.8": { 512 | "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==" 513 | }, 514 | "@rollup/rollup-linux-arm64-gnu@4.34.8": { 515 | "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==" 516 | }, 517 | "@rollup/rollup-linux-arm64-musl@4.34.8": { 518 | "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==" 519 | }, 520 | "@rollup/rollup-linux-loongarch64-gnu@4.34.8": { 521 | "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==" 522 | }, 523 | "@rollup/rollup-linux-powerpc64le-gnu@4.34.8": { 524 | "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==" 525 | }, 526 | "@rollup/rollup-linux-riscv64-gnu@4.34.8": { 527 | "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==" 528 | }, 529 | "@rollup/rollup-linux-s390x-gnu@4.34.8": { 530 | "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==" 531 | }, 532 | "@rollup/rollup-linux-x64-gnu@4.34.8": { 533 | "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==" 534 | }, 535 | "@rollup/rollup-linux-x64-musl@4.34.8": { 536 | "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==" 537 | }, 538 | "@rollup/rollup-win32-arm64-msvc@4.34.8": { 539 | "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==" 540 | }, 541 | "@rollup/rollup-win32-ia32-msvc@4.34.8": { 542 | "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==" 543 | }, 544 | "@rollup/rollup-win32-x64-msvc@4.34.8": { 545 | "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==" 546 | }, 547 | "@tailwindcss/node@4.0.8": { 548 | "integrity": "sha512-FKArQpbrbwv08TNT0k7ejYXpF+R8knZFAatNc0acOxbgeqLzwb86r+P3LGOjIeI3Idqe9CVkZrh4GlsJLJKkkw==", 549 | "dependencies": [ 550 | "enhanced-resolve", 551 | "jiti", 552 | "tailwindcss" 553 | ] 554 | }, 555 | "@tailwindcss/oxide-android-arm64@4.0.8": { 556 | "integrity": "sha512-We7K79+Sm4mwJHk26Yzu/GAj7C7myemm7PeXvpgMxyxO70SSFSL3uCcqFbz9JA5M5UPkrl7N9fkBe/Y0iazqpA==" 557 | }, 558 | "@tailwindcss/oxide-darwin-arm64@4.0.8": { 559 | "integrity": "sha512-Lv9Isi2EwkCTG1sRHNDi0uRNN1UGFdEThUAGFrydRmQZnraGLMjN8gahzg2FFnOizDl7LB2TykLUuiw833DSNg==" 560 | }, 561 | "@tailwindcss/oxide-darwin-x64@4.0.8": { 562 | "integrity": "sha512-fWfywfYIlSWtKoqWTjukTHLWV3ARaBRjXCC2Eo0l6KVpaqGY4c2y8snUjp1xpxUtpqwMvCvFWFaleMoz1Vhzlw==" 563 | }, 564 | "@tailwindcss/oxide-freebsd-x64@4.0.8": { 565 | "integrity": "sha512-SO+dyvjJV9G94bnmq2288Ke0BIdvrbSbvtPLaQdqjqHR83v5L2fWADyFO+1oecHo9Owsk8MxcXh1agGVPIKIqw==" 566 | }, 567 | "@tailwindcss/oxide-linux-arm-gnueabihf@4.0.8": { 568 | "integrity": "sha512-ZSHggWiEblQNV69V0qUK5vuAtHP+I+S2eGrKGJ5lPgwgJeAd6GjLsVBN+Mqn2SPVfYM3BOpS9jX/zVg9RWQVDQ==" 569 | }, 570 | "@tailwindcss/oxide-linux-arm64-gnu@4.0.8": { 571 | "integrity": "sha512-xWpr6M0OZLDNsr7+bQz+3X7zcnDJZJ1N9gtBWCtfhkEtDjjxYEp+Lr5L5nc/yXlL4MyCHnn0uonGVXy3fhxaVA==" 572 | }, 573 | "@tailwindcss/oxide-linux-arm64-musl@4.0.8": { 574 | "integrity": "sha512-5tz2IL7LN58ssGEq7h/staD7pu/izF/KeMWdlJ86WDe2Ah46LF3ET6ZGKTr5eZMrnEA0M9cVFuSPprKRHNgjeg==" 575 | }, 576 | "@tailwindcss/oxide-linux-x64-gnu@4.0.8": { 577 | "integrity": "sha512-KSzMkhyrxAQyY2o194NKVKU9j/c+NFSoMvnHWFaNHKi3P1lb+Vq1UC19tLHrmxSkKapcMMu69D7+G1+FVGNDXQ==" 578 | }, 579 | "@tailwindcss/oxide-linux-x64-musl@4.0.8": { 580 | "integrity": "sha512-yFYKG5UtHTRimjtqxUWXBgI4Tc6NJe3USjRIVdlTczpLRxq/SFwgzGl5JbatCxgSRDPBFwRrNPxq+ukfQFGdrw==" 581 | }, 582 | "@tailwindcss/oxide-win32-arm64-msvc@4.0.8": { 583 | "integrity": "sha512-tndGujmCSba85cRCnQzXgpA2jx5gXimyspsUYae5jlPyLRG0RjXbDshFKOheVXU4TLflo7FSG8EHCBJ0EHTKdQ==" 584 | }, 585 | "@tailwindcss/oxide-win32-x64-msvc@4.0.8": { 586 | "integrity": "sha512-T77jroAc0p4EHVVgTUiNeFn6Nj3jtD3IeNId2X+0k+N1XxfNipy81BEkYErpKLiOkNhpNFjPee8/ZVas29b2OQ==" 587 | }, 588 | "@tailwindcss/oxide@4.0.8": { 589 | "integrity": "sha512-KfMcuAu/Iw+DcV1e8twrFyr2yN8/ZDC/odIGta4wuuJOGkrkHZbvJvRNIbQNhGh7erZTYV6Ie0IeD6WC9Y8Hcw==", 590 | "dependencies": [ 591 | "@tailwindcss/oxide-android-arm64", 592 | "@tailwindcss/oxide-darwin-arm64", 593 | "@tailwindcss/oxide-darwin-x64", 594 | "@tailwindcss/oxide-freebsd-x64", 595 | "@tailwindcss/oxide-linux-arm-gnueabihf", 596 | "@tailwindcss/oxide-linux-arm64-gnu", 597 | "@tailwindcss/oxide-linux-arm64-musl", 598 | "@tailwindcss/oxide-linux-x64-gnu", 599 | "@tailwindcss/oxide-linux-x64-musl", 600 | "@tailwindcss/oxide-win32-arm64-msvc", 601 | "@tailwindcss/oxide-win32-x64-msvc" 602 | ] 603 | }, 604 | "@tailwindcss/vite@4.0.8_vite@6.1.1__@types+node@22.13.5__lightningcss@1.29.1_@types+node@22.13.5_lightningcss@1.29.1": { 605 | "integrity": "sha512-+SAq44yLzYlzyrb7QTcFCdU8Xa7FOA0jp+Xby7fPMUie+MY9HhJysM7Vp+vL8qIp8ceQJfLD+FjgJuJ4lL6nyg==", 606 | "dependencies": [ 607 | "@tailwindcss/node", 608 | "@tailwindcss/oxide", 609 | "lightningcss", 610 | "tailwindcss", 611 | "vite@6.1.1_@types+node@22.13.5_lightningcss@1.29.1" 612 | ] 613 | }, 614 | "@types/cookie@0.6.0": { 615 | "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" 616 | }, 617 | "@types/estree@1.0.6": { 618 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" 619 | }, 620 | "@types/node@22.13.5": { 621 | "integrity": "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==", 622 | "dependencies": [ 623 | "undici-types" 624 | ] 625 | }, 626 | "@types/react-dom@19.0.4_@types+react@19.0.10": { 627 | "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==", 628 | "dependencies": [ 629 | "@types/react" 630 | ] 631 | }, 632 | "@types/react@19.0.10": { 633 | "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", 634 | "dependencies": [ 635 | "csstype" 636 | ] 637 | }, 638 | "ansi-regex@5.0.1": { 639 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 640 | }, 641 | "ansi-regex@6.1.0": { 642 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" 643 | }, 644 | "ansi-styles@4.3.0": { 645 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 646 | "dependencies": [ 647 | "color-convert" 648 | ] 649 | }, 650 | "ansi-styles@6.2.1": { 651 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" 652 | }, 653 | "arg@5.0.2": { 654 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" 655 | }, 656 | "babel-dead-code-elimination@1.0.9": { 657 | "integrity": "sha512-JLIhax/xullfInZjtu13UJjaLHDeTzt3vOeomaSUdO/nAMEL/pWC/laKrSvWylXMnVWyL5bpmG9njqBZlUQOdg==", 658 | "dependencies": [ 659 | "@babel/core", 660 | "@babel/parser", 661 | "@babel/traverse", 662 | "@babel/types" 663 | ] 664 | }, 665 | "balanced-match@1.0.2": { 666 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 667 | }, 668 | "brace-expansion@2.0.1": { 669 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 670 | "dependencies": [ 671 | "balanced-match" 672 | ] 673 | }, 674 | "browserify-zlib@0.1.4": { 675 | "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", 676 | "dependencies": [ 677 | "pako" 678 | ] 679 | }, 680 | "browserslist@4.24.4": { 681 | "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", 682 | "dependencies": [ 683 | "caniuse-lite", 684 | "electron-to-chromium", 685 | "node-releases", 686 | "update-browserslist-db" 687 | ] 688 | }, 689 | "buffer-from@1.1.2": { 690 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 691 | }, 692 | "cac@6.7.14": { 693 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==" 694 | }, 695 | "caniuse-lite@1.0.30001700": { 696 | "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==" 697 | }, 698 | "chokidar@4.0.3": { 699 | "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", 700 | "dependencies": [ 701 | "readdirp" 702 | ] 703 | }, 704 | "color-convert@2.0.1": { 705 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 706 | "dependencies": [ 707 | "color-name" 708 | ] 709 | }, 710 | "color-name@1.1.4": { 711 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 712 | }, 713 | "convert-source-map@2.0.0": { 714 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" 715 | }, 716 | "cookie@1.0.2": { 717 | "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==" 718 | }, 719 | "core-util-is@1.0.3": { 720 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 721 | }, 722 | "cross-spawn@7.0.6": { 723 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 724 | "dependencies": [ 725 | "path-key", 726 | "shebang-command", 727 | "which@2.0.2" 728 | ] 729 | }, 730 | "csstype@3.1.3": { 731 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" 732 | }, 733 | "debug@4.4.0": { 734 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 735 | "dependencies": [ 736 | "ms" 737 | ] 738 | }, 739 | "dedent@1.5.3": { 740 | "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==" 741 | }, 742 | "detect-libc@1.0.3": { 743 | "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" 744 | }, 745 | "duplexify@3.7.1": { 746 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 747 | "dependencies": [ 748 | "end-of-stream", 749 | "inherits", 750 | "readable-stream", 751 | "stream-shift" 752 | ] 753 | }, 754 | "eastasianwidth@0.2.0": { 755 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" 756 | }, 757 | "electron-to-chromium@1.5.103": { 758 | "integrity": "sha512-P6+XzIkfndgsrjROJWfSvVEgNHtPgbhVyTkwLjUM2HU/h7pZRORgaTlHqfAikqxKmdJMLW8fftrdGWbd/Ds0FA==" 759 | }, 760 | "emoji-regex@8.0.0": { 761 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 762 | }, 763 | "emoji-regex@9.2.2": { 764 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" 765 | }, 766 | "end-of-stream@1.4.4": { 767 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 768 | "dependencies": [ 769 | "once" 770 | ] 771 | }, 772 | "enhanced-resolve@5.18.1": { 773 | "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", 774 | "dependencies": [ 775 | "graceful-fs", 776 | "tapable" 777 | ] 778 | }, 779 | "err-code@2.0.3": { 780 | "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" 781 | }, 782 | "es-module-lexer@1.6.0": { 783 | "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==" 784 | }, 785 | "esbuild@0.24.2": { 786 | "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", 787 | "dependencies": [ 788 | "@esbuild/aix-ppc64", 789 | "@esbuild/android-arm", 790 | "@esbuild/android-arm64", 791 | "@esbuild/android-x64", 792 | "@esbuild/darwin-arm64", 793 | "@esbuild/darwin-x64", 794 | "@esbuild/freebsd-arm64", 795 | "@esbuild/freebsd-x64", 796 | "@esbuild/linux-arm", 797 | "@esbuild/linux-arm64", 798 | "@esbuild/linux-ia32", 799 | "@esbuild/linux-loong64", 800 | "@esbuild/linux-mips64el", 801 | "@esbuild/linux-ppc64", 802 | "@esbuild/linux-riscv64", 803 | "@esbuild/linux-s390x", 804 | "@esbuild/linux-x64", 805 | "@esbuild/netbsd-arm64", 806 | "@esbuild/netbsd-x64", 807 | "@esbuild/openbsd-arm64", 808 | "@esbuild/openbsd-x64", 809 | "@esbuild/sunos-x64", 810 | "@esbuild/win32-arm64", 811 | "@esbuild/win32-ia32", 812 | "@esbuild/win32-x64" 813 | ] 814 | }, 815 | "escalade@3.2.0": { 816 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" 817 | }, 818 | "exit-hook@2.2.1": { 819 | "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==" 820 | }, 821 | "foreground-child@3.3.0": { 822 | "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", 823 | "dependencies": [ 824 | "cross-spawn", 825 | "signal-exit" 826 | ] 827 | }, 828 | "fs-extra@10.1.0": { 829 | "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", 830 | "dependencies": [ 831 | "graceful-fs", 832 | "jsonfile", 833 | "universalify" 834 | ] 835 | }, 836 | "fsevents@2.3.3": { 837 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" 838 | }, 839 | "function-bind@1.1.2": { 840 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" 841 | }, 842 | "gensync@1.0.0-beta.2": { 843 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" 844 | }, 845 | "glob@10.4.5": { 846 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 847 | "dependencies": [ 848 | "foreground-child", 849 | "jackspeak", 850 | "minimatch", 851 | "minipass", 852 | "package-json-from-dist", 853 | "path-scurry" 854 | ] 855 | }, 856 | "globals@11.12.0": { 857 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" 858 | }, 859 | "graceful-fs@4.2.11": { 860 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 861 | }, 862 | "gunzip-maybe@1.4.2": { 863 | "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", 864 | "dependencies": [ 865 | "browserify-zlib", 866 | "is-deflate", 867 | "is-gzip", 868 | "peek-stream", 869 | "pumpify", 870 | "through2" 871 | ] 872 | }, 873 | "hasown@2.0.2": { 874 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 875 | "dependencies": [ 876 | "function-bind" 877 | ] 878 | }, 879 | "hosted-git-info@6.1.3": { 880 | "integrity": "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==", 881 | "dependencies": [ 882 | "lru-cache@7.18.3" 883 | ] 884 | }, 885 | "inherits@2.0.4": { 886 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 887 | }, 888 | "is-core-module@2.16.1": { 889 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 890 | "dependencies": [ 891 | "hasown" 892 | ] 893 | }, 894 | "is-deflate@1.0.0": { 895 | "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==" 896 | }, 897 | "is-fullwidth-code-point@3.0.0": { 898 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 899 | }, 900 | "is-gzip@1.0.0": { 901 | "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==" 902 | }, 903 | "isarray@1.0.0": { 904 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 905 | }, 906 | "isbot@5.1.23": { 907 | "integrity": "sha512-ie3ehy2iXdkuzaZx32SoKb9b8l9Cm8cqQ1lJjQXnq8GRTrk/Jx7IUDcB4mhlw6H3gWaMqGYoWeV0lPv1P/20Ig==" 908 | }, 909 | "isexe@2.0.0": { 910 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 911 | }, 912 | "jackspeak@3.4.3": { 913 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 914 | "dependencies": [ 915 | "@isaacs/cliui", 916 | "@pkgjs/parseargs" 917 | ] 918 | }, 919 | "jiti@2.4.2": { 920 | "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==" 921 | }, 922 | "js-tokens@4.0.0": { 923 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 924 | }, 925 | "jsesc@3.0.2": { 926 | "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==" 927 | }, 928 | "json-parse-even-better-errors@3.0.2": { 929 | "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==" 930 | }, 931 | "json5@2.2.3": { 932 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" 933 | }, 934 | "jsonfile@6.1.0": { 935 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 936 | "dependencies": [ 937 | "graceful-fs", 938 | "universalify" 939 | ] 940 | }, 941 | "lightningcss-darwin-arm64@1.29.1": { 942 | "integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==" 943 | }, 944 | "lightningcss-darwin-x64@1.29.1": { 945 | "integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==" 946 | }, 947 | "lightningcss-freebsd-x64@1.29.1": { 948 | "integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==" 949 | }, 950 | "lightningcss-linux-arm-gnueabihf@1.29.1": { 951 | "integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==" 952 | }, 953 | "lightningcss-linux-arm64-gnu@1.29.1": { 954 | "integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==" 955 | }, 956 | "lightningcss-linux-arm64-musl@1.29.1": { 957 | "integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==" 958 | }, 959 | "lightningcss-linux-x64-gnu@1.29.1": { 960 | "integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==" 961 | }, 962 | "lightningcss-linux-x64-musl@1.29.1": { 963 | "integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==" 964 | }, 965 | "lightningcss-win32-arm64-msvc@1.29.1": { 966 | "integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==" 967 | }, 968 | "lightningcss-win32-x64-msvc@1.29.1": { 969 | "integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==" 970 | }, 971 | "lightningcss@1.29.1": { 972 | "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==", 973 | "dependencies": [ 974 | "detect-libc", 975 | "lightningcss-darwin-arm64", 976 | "lightningcss-darwin-x64", 977 | "lightningcss-freebsd-x64", 978 | "lightningcss-linux-arm-gnueabihf", 979 | "lightningcss-linux-arm64-gnu", 980 | "lightningcss-linux-arm64-musl", 981 | "lightningcss-linux-x64-gnu", 982 | "lightningcss-linux-x64-musl", 983 | "lightningcss-win32-arm64-msvc", 984 | "lightningcss-win32-x64-msvc" 985 | ] 986 | }, 987 | "lodash@4.17.21": { 988 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 989 | }, 990 | "lru-cache@10.4.3": { 991 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" 992 | }, 993 | "lru-cache@5.1.1": { 994 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 995 | "dependencies": [ 996 | "yallist" 997 | ] 998 | }, 999 | "lru-cache@7.18.3": { 1000 | "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" 1001 | }, 1002 | "minimatch@9.0.5": { 1003 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1004 | "dependencies": [ 1005 | "brace-expansion" 1006 | ] 1007 | }, 1008 | "minipass@7.1.2": { 1009 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" 1010 | }, 1011 | "ms@2.1.3": { 1012 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1013 | }, 1014 | "nanoid@3.3.8": { 1015 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==" 1016 | }, 1017 | "node-releases@2.0.19": { 1018 | "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" 1019 | }, 1020 | "normalize-package-data@5.0.0": { 1021 | "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", 1022 | "dependencies": [ 1023 | "hosted-git-info", 1024 | "is-core-module", 1025 | "semver@7.7.1", 1026 | "validate-npm-package-license" 1027 | ] 1028 | }, 1029 | "npm-install-checks@6.3.0": { 1030 | "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", 1031 | "dependencies": [ 1032 | "semver@7.7.1" 1033 | ] 1034 | }, 1035 | "npm-normalize-package-bin@3.0.1": { 1036 | "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==" 1037 | }, 1038 | "npm-package-arg@10.1.0": { 1039 | "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", 1040 | "dependencies": [ 1041 | "hosted-git-info", 1042 | "proc-log", 1043 | "semver@7.7.1", 1044 | "validate-npm-package-name" 1045 | ] 1046 | }, 1047 | "npm-pick-manifest@8.0.2": { 1048 | "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", 1049 | "dependencies": [ 1050 | "npm-install-checks", 1051 | "npm-normalize-package-bin", 1052 | "npm-package-arg", 1053 | "semver@7.7.1" 1054 | ] 1055 | }, 1056 | "once@1.4.0": { 1057 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1058 | "dependencies": [ 1059 | "wrappy" 1060 | ] 1061 | }, 1062 | "package-json-from-dist@1.0.1": { 1063 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" 1064 | }, 1065 | "pako@0.2.9": { 1066 | "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" 1067 | }, 1068 | "path-key@3.1.1": { 1069 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" 1070 | }, 1071 | "path-scurry@1.11.1": { 1072 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 1073 | "dependencies": [ 1074 | "lru-cache@10.4.3", 1075 | "minipass" 1076 | ] 1077 | }, 1078 | "pathe@1.1.2": { 1079 | "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" 1080 | }, 1081 | "peek-stream@1.1.3": { 1082 | "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", 1083 | "dependencies": [ 1084 | "buffer-from", 1085 | "duplexify", 1086 | "through2" 1087 | ] 1088 | }, 1089 | "picocolors@1.1.1": { 1090 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" 1091 | }, 1092 | "picomatch@2.3.1": { 1093 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 1094 | }, 1095 | "postcss@8.5.3": { 1096 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 1097 | "dependencies": [ 1098 | "nanoid", 1099 | "picocolors", 1100 | "source-map-js" 1101 | ] 1102 | }, 1103 | "prettier@2.8.8": { 1104 | "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==" 1105 | }, 1106 | "proc-log@3.0.0": { 1107 | "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==" 1108 | }, 1109 | "process-nextick-args@2.0.1": { 1110 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1111 | }, 1112 | "promise-inflight@1.0.1": { 1113 | "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" 1114 | }, 1115 | "promise-retry@2.0.1": { 1116 | "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", 1117 | "dependencies": [ 1118 | "err-code", 1119 | "retry" 1120 | ] 1121 | }, 1122 | "pump@2.0.1": { 1123 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 1124 | "dependencies": [ 1125 | "end-of-stream", 1126 | "once" 1127 | ] 1128 | }, 1129 | "pumpify@1.5.1": { 1130 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 1131 | "dependencies": [ 1132 | "duplexify", 1133 | "inherits", 1134 | "pump" 1135 | ] 1136 | }, 1137 | "react-dom@19.0.0_react@19.0.0": { 1138 | "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", 1139 | "dependencies": [ 1140 | "react", 1141 | "scheduler" 1142 | ] 1143 | }, 1144 | "react-refresh@0.14.2": { 1145 | "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==" 1146 | }, 1147 | "react-router@7.2.0_react@19.0.0_react-dom@19.0.0__react@19.0.0": { 1148 | "integrity": "sha512-fXyqzPgCPZbqhrk7k3hPcCpYIlQ2ugIXDboHUzhJISFVy2DEPsmHgN588MyGmkIOv3jDgNfUE3kJi83L28s/LQ==", 1149 | "dependencies": [ 1150 | "@types/cookie", 1151 | "cookie", 1152 | "react", 1153 | "react-dom", 1154 | "set-cookie-parser", 1155 | "turbo-stream" 1156 | ] 1157 | }, 1158 | "react@19.0.0": { 1159 | "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==" 1160 | }, 1161 | "readable-stream@2.3.8": { 1162 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", 1163 | "dependencies": [ 1164 | "core-util-is", 1165 | "inherits", 1166 | "isarray", 1167 | "process-nextick-args", 1168 | "safe-buffer", 1169 | "string_decoder", 1170 | "util-deprecate" 1171 | ] 1172 | }, 1173 | "readdirp@4.1.2": { 1174 | "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==" 1175 | }, 1176 | "retry@0.12.0": { 1177 | "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" 1178 | }, 1179 | "rollup@4.34.8": { 1180 | "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", 1181 | "dependencies": [ 1182 | "@rollup/rollup-android-arm-eabi", 1183 | "@rollup/rollup-android-arm64", 1184 | "@rollup/rollup-darwin-arm64", 1185 | "@rollup/rollup-darwin-x64", 1186 | "@rollup/rollup-freebsd-arm64", 1187 | "@rollup/rollup-freebsd-x64", 1188 | "@rollup/rollup-linux-arm-gnueabihf", 1189 | "@rollup/rollup-linux-arm-musleabihf", 1190 | "@rollup/rollup-linux-arm64-gnu", 1191 | "@rollup/rollup-linux-arm64-musl", 1192 | "@rollup/rollup-linux-loongarch64-gnu", 1193 | "@rollup/rollup-linux-powerpc64le-gnu", 1194 | "@rollup/rollup-linux-riscv64-gnu", 1195 | "@rollup/rollup-linux-s390x-gnu", 1196 | "@rollup/rollup-linux-x64-gnu", 1197 | "@rollup/rollup-linux-x64-musl", 1198 | "@rollup/rollup-win32-arm64-msvc", 1199 | "@rollup/rollup-win32-ia32-msvc", 1200 | "@rollup/rollup-win32-x64-msvc", 1201 | "@types/estree", 1202 | "fsevents" 1203 | ] 1204 | }, 1205 | "safe-buffer@5.1.2": { 1206 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1207 | }, 1208 | "scheduler@0.25.0": { 1209 | "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==" 1210 | }, 1211 | "semver@6.3.1": { 1212 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" 1213 | }, 1214 | "semver@7.7.1": { 1215 | "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==" 1216 | }, 1217 | "set-cookie-parser@2.7.1": { 1218 | "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==" 1219 | }, 1220 | "shebang-command@2.0.0": { 1221 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1222 | "dependencies": [ 1223 | "shebang-regex" 1224 | ] 1225 | }, 1226 | "shebang-regex@3.0.0": { 1227 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" 1228 | }, 1229 | "signal-exit@4.1.0": { 1230 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" 1231 | }, 1232 | "source-map-js@1.2.1": { 1233 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" 1234 | }, 1235 | "source-map-support@0.5.21": { 1236 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 1237 | "dependencies": [ 1238 | "buffer-from", 1239 | "source-map" 1240 | ] 1241 | }, 1242 | "source-map@0.6.1": { 1243 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 1244 | }, 1245 | "spdx-correct@3.2.0": { 1246 | "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", 1247 | "dependencies": [ 1248 | "spdx-expression-parse", 1249 | "spdx-license-ids" 1250 | ] 1251 | }, 1252 | "spdx-exceptions@2.5.0": { 1253 | "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" 1254 | }, 1255 | "spdx-expression-parse@3.0.1": { 1256 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 1257 | "dependencies": [ 1258 | "spdx-exceptions", 1259 | "spdx-license-ids" 1260 | ] 1261 | }, 1262 | "spdx-license-ids@3.0.21": { 1263 | "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==" 1264 | }, 1265 | "stream-shift@1.0.3": { 1266 | "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" 1267 | }, 1268 | "stream-slice@0.1.2": { 1269 | "integrity": "sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA==" 1270 | }, 1271 | "string-width@4.2.3": { 1272 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1273 | "dependencies": [ 1274 | "emoji-regex@8.0.0", 1275 | "is-fullwidth-code-point", 1276 | "strip-ansi@6.0.1" 1277 | ] 1278 | }, 1279 | "string-width@5.1.2": { 1280 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1281 | "dependencies": [ 1282 | "eastasianwidth", 1283 | "emoji-regex@9.2.2", 1284 | "strip-ansi@7.1.0" 1285 | ] 1286 | }, 1287 | "string_decoder@1.1.1": { 1288 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1289 | "dependencies": [ 1290 | "safe-buffer" 1291 | ] 1292 | }, 1293 | "strip-ansi@6.0.1": { 1294 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1295 | "dependencies": [ 1296 | "ansi-regex@5.0.1" 1297 | ] 1298 | }, 1299 | "strip-ansi@7.1.0": { 1300 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1301 | "dependencies": [ 1302 | "ansi-regex@6.1.0" 1303 | ] 1304 | }, 1305 | "tailwindcss@4.0.8": { 1306 | "integrity": "sha512-Me7N5CKR+D2A1xdWA5t5+kjjT7bwnxZOE6/yDI/ixJdJokszsn2n++mdU5yJwrsTpqFX2B9ZNMBJDwcqk9C9lw==" 1307 | }, 1308 | "tapable@2.2.1": { 1309 | "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" 1310 | }, 1311 | "through2@2.0.5": { 1312 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 1313 | "dependencies": [ 1314 | "readable-stream", 1315 | "xtend" 1316 | ] 1317 | }, 1318 | "turbo-stream@2.4.0": { 1319 | "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==" 1320 | }, 1321 | "undici-types@6.20.0": { 1322 | "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" 1323 | }, 1324 | "undici@6.21.1": { 1325 | "integrity": "sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==" 1326 | }, 1327 | "universalify@2.0.1": { 1328 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" 1329 | }, 1330 | "update-browserslist-db@1.1.2_browserslist@4.24.4": { 1331 | "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", 1332 | "dependencies": [ 1333 | "browserslist", 1334 | "escalade", 1335 | "picocolors" 1336 | ] 1337 | }, 1338 | "util-deprecate@1.0.2": { 1339 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 1340 | }, 1341 | "valibot@0.41.0": { 1342 | "integrity": "sha512-igDBb8CTYr8YTQlOKgaN9nSS0Be7z+WRuaeYqGf3Cjz3aKmSnqEmYnkfVjzIuumGqfHpa3fLIvMEAfhrpqN8ng==" 1343 | }, 1344 | "validate-npm-package-license@3.0.4": { 1345 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 1346 | "dependencies": [ 1347 | "spdx-correct", 1348 | "spdx-expression-parse" 1349 | ] 1350 | }, 1351 | "validate-npm-package-name@5.0.1": { 1352 | "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==" 1353 | }, 1354 | "vite-node@3.0.0-beta.2_@types+node@22.13.5": { 1355 | "integrity": "sha512-ofTf6cfRdL30Wbl9n/BX81EyIR5s4PReLmSurrxQ+koLaWUNOEo8E0lCM53OJkb8vpa2URM2nSrxZsIFyvY1rg==", 1356 | "dependencies": [ 1357 | "cac", 1358 | "debug", 1359 | "es-module-lexer", 1360 | "pathe", 1361 | "vite@6.1.1_@types+node@22.13.5" 1362 | ] 1363 | }, 1364 | "vite@6.1.1_@types+node@22.13.5": { 1365 | "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==", 1366 | "dependencies": [ 1367 | "@types/node", 1368 | "esbuild", 1369 | "fsevents", 1370 | "postcss", 1371 | "rollup" 1372 | ] 1373 | }, 1374 | "vite@6.1.1_@types+node@22.13.5_lightningcss@1.29.1": { 1375 | "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==", 1376 | "dependencies": [ 1377 | "@types/node", 1378 | "esbuild", 1379 | "fsevents", 1380 | "lightningcss", 1381 | "postcss", 1382 | "rollup" 1383 | ] 1384 | }, 1385 | "which@2.0.2": { 1386 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1387 | "dependencies": [ 1388 | "isexe" 1389 | ] 1390 | }, 1391 | "which@3.0.1": { 1392 | "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", 1393 | "dependencies": [ 1394 | "isexe" 1395 | ] 1396 | }, 1397 | "wrap-ansi@7.0.0": { 1398 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1399 | "dependencies": [ 1400 | "ansi-styles@4.3.0", 1401 | "string-width@4.2.3", 1402 | "strip-ansi@6.0.1" 1403 | ] 1404 | }, 1405 | "wrap-ansi@8.1.0": { 1406 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 1407 | "dependencies": [ 1408 | "ansi-styles@6.2.1", 1409 | "string-width@5.1.2", 1410 | "strip-ansi@7.1.0" 1411 | ] 1412 | }, 1413 | "wrappy@1.0.2": { 1414 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 1415 | }, 1416 | "xtend@4.0.2": { 1417 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1418 | }, 1419 | "yallist@3.1.1": { 1420 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 1421 | } 1422 | }, 1423 | "workspace": { 1424 | "dependencies": [ 1425 | "jsr:@std/http@^1.0.11", 1426 | "jsr:@std/path@^1.0.8" 1427 | ], 1428 | "packageJson": { 1429 | "dependencies": [ 1430 | "npm:@deno/vite-plugin@^1.0.2", 1431 | "npm:@react-router/dev@*", 1432 | "npm:@tailwindcss/vite@^4.0.8", 1433 | "npm:@types/node@^22.10.2", 1434 | "npm:@types/react-dom@^19.0.2", 1435 | "npm:@types/react@^19.0.2", 1436 | "npm:isbot@^5.1.18", 1437 | "npm:react-dom@19", 1438 | "npm:react-router@*", 1439 | "npm:react@19", 1440 | "npm:tailwindcss@^4.0.8", 1441 | "npm:vite@^6.0.5" 1442 | ] 1443 | } 1444 | } 1445 | } 1446 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "type": "module", 4 | "dependencies": { 5 | "isbot": "^5.1.18", 6 | "react": "^19.0.0", 7 | "react-dom": "^19.0.0", 8 | "react-router": "*" 9 | }, 10 | "devDependencies": { 11 | "@deno/vite-plugin": "^1.0.2", 12 | "@react-router/dev": "*", 13 | "@tailwindcss/vite": "^4.0.8", 14 | "@types/node": "^22.10.2", 15 | "@types/react": "^19.0.2", 16 | "@types/react-dom": "^19.0.2", 17 | "tailwindcss": "^4.0.8", 18 | "vite": "^6.0.5" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/redabacha/react-router-deno-template/ea0ae6cdb90fc8766378665d035b9d4e9297cebf/public/favicon.ico -------------------------------------------------------------------------------- /react-router.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "@react-router/dev/config"; 2 | 3 | export default { 4 | // Config options... 5 | // Server-side render by default, to enable SPA mode set this to `false` 6 | ssr: true, 7 | } satisfies Config; 8 | -------------------------------------------------------------------------------- /server.production.ts: -------------------------------------------------------------------------------- 1 | import { serveFile } from "@std/http/file-server"; 2 | import { join } from "@std/path/join"; 3 | import { createRequestHandler } from "react-router"; 4 | 5 | const handleRequest = createRequestHandler( 6 | // @ts-expect-error - build output 7 | await import("./build/server/index.js"), 8 | "production", 9 | ); 10 | 11 | Deno.serve(async (request) => { 12 | const pathname = new URL(request.url).pathname; 13 | 14 | try { 15 | const filePath = join("./build/client", pathname); 16 | const fileInfo = await Deno.stat(filePath); 17 | 18 | if (fileInfo.isDirectory) { 19 | throw new Deno.errors.NotFound(); 20 | } 21 | 22 | const response = await serveFile(request, filePath, { fileInfo }); 23 | 24 | if (pathname.startsWith("/assets/")) { 25 | response.headers.set( 26 | "cache-control", 27 | "public, max-age=31536000, immutable", 28 | ); 29 | } else { 30 | response.headers.set("cache-control", "public, max-age=600"); 31 | } 32 | 33 | return response; 34 | } catch (error) { 35 | if (!(error instanceof Deno.errors.NotFound)) { 36 | throw error; 37 | } 38 | } 39 | 40 | return handleRequest(request); 41 | }); 42 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import deno from "@deno/vite-plugin"; 2 | import { reactRouter } from "@react-router/dev/vite"; 3 | import tailwindcss from "@tailwindcss/vite"; 4 | import { defineConfig } from "vite"; 5 | 6 | export default defineConfig({ 7 | plugins: [deno(), tailwindcss(), reactRouter()], 8 | ssr: { 9 | resolve: { 10 | conditions: ["module", "deno", "node", "development|production"], 11 | externalConditions: ["deno", "node"], 12 | }, 13 | }, 14 | }); 15 | --------------------------------------------------------------------------------