Fix build issue tanstack router && add cli option for router 11d23fca
Maximilian Leodolter · 2025-08-08 08:52 33 file(s) · +1673 −0
test-app/.gitignore (added) +44 −0
1 +
# bhvr/.gitignore
2 +
# dependencies
3 +
node_modules
4 +
.pnp
5 +
.pnp.js
6 +
7 +
# testing
8 +
coverage
9 +
10 +
# production
11 +
dist
12 +
build
13 +
14 +
# misc
15 +
.DS_Store
16 +
.env
17 +
.env.local
18 +
.env.development.local
19 +
.env.test.local
20 +
.env.production.local
21 +
.env*.local
22 +
23 +
# logs
24 +
npm-debug.log*
25 +
yarn-debug.log*
26 +
yarn-error.log*
27 +
pnpm-debug.log*
28 +
29 +
# editor directories and files
30 +
.idea
31 +
.vscode/*
32 +
!.vscode/extensions.json
33 +
!.vscode/settings.json
34 +
*.suo
35 +
*.ntvs*
36 +
*.njsproj
37 +
*.sln
38 +
*.sw?
39 +
40 +
# Bun
41 +
bun.lockb
42 +
43 +
# Turbo
44 +
.turbo
test-app/CONTRIBUTING.md (added) +25 −0
1 +
# Contributing to create-bhvr
2 +
3 +
First off, thank you for considering contributing to `bhvr`! This is a true open source project and we welcome community ideas and contributions. In order to keep things clean please follow the contributing guidelines below.
4 +
5 +
## How Can I Contribute?
6 +
7 +
### Reporting Bugs
8 +
9 +
If you find a bug, please make sure the bug has not already been reported by searching on GitHub under [Issues](https://github.com/stevedylandev/bhvr/issues). If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/stevedylandev/bhvr/issues/new). Be sure to include a **title and clear description**, as much relevant information as possible, and a **code sample** or an **executable test case** demonstrating the expected behavior that is not occurring.
10 +
11 +
### Suggesting Enhancements
12 +
13 +
If you have an idea for an enhancement, please make sure the enhancement has not already been suggested by searching on GitHub under [Issues](https://github.com/stevedylandev/bhvr/issues). If you're unable to find an open issue addressing the suggestion, [open a new one](https://github.com/stevedylandev/bhvr/issues/new). Be sure to include a **title and clear description** of the enhancement you're suggesting.
14 +
15 +
### Submitting a Pull Request
16 +
17 +
1.  Fork the repository and create your branch from `main`.
18 +
2.  Run `bun install` to install the dependencies.
19 +
3.  Make your changes.
20 +
4.  Run `bun run build` to make sure your changes build correctly.
21 +
5.  Issue that pull request!
22 +
23 +
## License
24 +
25 +
By contributing, you agree that your contributions will be licensed under its MIT License.
test-app/LICENSE (added) +21 −0
1 +
MIT License
2 +
3 +
Copyright (c) 2025 Steve Simkins
4 +
5 +
Permission is hereby granted, free of charge, to any person obtaining a copy
6 +
of this software and associated documentation files (the "Software"), to deal
7 +
in the Software without restriction, including without limitation the rights
8 +
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 +
copies of the Software, and to permit persons to whom the Software is
10 +
furnished to do so, subject to the following conditions:
11 +
12 +
The above copyright notice and this permission notice shall be included in all
13 +
copies or substantial portions of the Software.
14 +
15 +
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 +
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 +
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 +
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 +
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 +
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 +
SOFTWARE.
test-app/README.md (added) +264 −0
1 +
# bhvr 🦫
2 +
3 +
![cover](https://cdn.stevedylan.dev/ipfs/bafybeievx27ar5qfqyqyud7kemnb5n2p4rzt2matogi6qttwkpxonqhra4)
4 +
5 +
A full-stack TypeScript monorepo starter with shared types, using Bun, Hono, Vite, and React.
6 +
7 +
## Why bhvr?
8 +
9 +
While there are plenty of existing app building stacks out there, many of them are either bloated, outdated, or have too much of a vendor lock-in. bhvr is built with the opinion that you should be able to deploy your client or server in any environment while also keeping type safety.
10 +
11 +
## Features
12 +
13 +
- **Full-Stack TypeScript**: End-to-end type safety between client and server
14 +
- **Shared Types**: Common type definitions shared between client and server
15 +
- **Monorepo Structure**: Organized as a workspaces-based monorepo with Turbo for build orchestration
16 +
- **Modern Stack**:
17 +
  - [Bun](https://bun.sh) as the JavaScript runtime and package manager
18 +
  - [Hono](https://hono.dev) as the backend framework
19 +
  - [Vite](https://vitejs.dev) for frontend bundling
20 +
  - [React](https://react.dev) for the frontend UI
21 +
  - [Turbo](https://turbo.build) for monorepo build orchestration and caching
22 +
23 +
## Project Structure
24 +
25 +
```
26 +
.
27 +
├── client/               # React frontend
28 +
├── server/               # Hono backend
29 +
├── shared/               # Shared TypeScript definitions
30 +
│   └── src/types/        # Type definitions used by both client and server
31 +
├── package.json          # Root package.json with workspaces
32 +
└── turbo.json            # Turbo configuration for build orchestration
33 +
```
34 +
35 +
### Server
36 +
37 +
bhvr uses Hono as a backend API for its simplicity and massive ecosystem of plugins. If you have ever used Express then it might feel familiar. Declaring routes and returning data is easy.
38 +
39 +
```
40 +
server
41 +
├── bun.lock
42 +
├── package.json
43 +
├── README.md
44 +
├── src
45 +
│   └── index.ts
46 +
└── tsconfig.json
47 +
```
48 +
49 +
```typescript src/index.ts
50 +
import { Hono } from 'hono'
51 +
import { cors } from 'hono/cors'
52 +
import type { ApiResponse } from 'shared/dist'
53 +
54 +
const app = new Hono()
55 +
56 +
app.use(cors())
57 +
58 +
app.get('/', (c) => {
59 +
  return c.text('Hello Hono!')
60 +
})
61 +
62 +
app.get('/hello', async (c) => {
63 +
64 +
  const data: ApiResponse = {
65 +
    message: "Hello BHVR!",
66 +
    success: true
67 +
  }
68 +
69 +
  return c.json(data, { status: 200 })
70 +
})
71 +
72 +
export default app
73 +
```
74 +
75 +
If you wanted to add a database to Hono you can do so with a multitude of Typescript libraries like [Supabase](https://supabase.com), or ORMs like [Drizzle](https://orm.drizzle.team/docs/get-started) or [Prisma](https://www.prisma.io/orm)
76 +
77 +
### Client
78 +
79 +
bhvr uses Vite + React Typescript template, which means you can build your frontend just as you would with any other React app. This makes it flexible to add UI components like [shadcn/ui](https://ui.shadcn.com) or routing using [React Router](https://reactrouter.com/start/declarative/installation).
80 +
81 +
```
82 +
client
83 +
├── eslint.config.js
84 +
├── index.html
85 +
├── package.json
86 +
├── public
87 +
│   └── vite.svg
88 +
├── README.md
89 +
├── src
90 +
│   ├── App.css
91 +
│   ├── App.tsx
92 +
│   ├── assets
93 +
│   ├── index.css
94 +
│   ├── main.tsx
95 +
│   └── vite-env.d.ts
96 +
├── tsconfig.app.json
97 +
├── tsconfig.json
98 +
├── tsconfig.node.json
99 +
└── vite.config.ts
100 +
```
101 +
102 +
```typescript src/App.tsx
103 +
import { useState } from 'react'
104 +
import beaver from './assets/beaver.svg'
105 +
import { ApiResponse } from 'shared'
106 +
import './App.css'
107 +
108 +
const SERVER_URL = import.meta.env.VITE_SERVER_URL || "http://localhost:3000"
109 +
110 +
function App() {
111 +
  const [data, setData] = useState<ApiResponse | undefined>()
112 +
113 +
  async function sendRequest() {
114 +
    try {
115 +
      const req = await fetch(`${SERVER_URL}/hello`)
116 +
      const res: ApiResponse = await req.json()
117 +
      setData(res)
118 +
    } catch (error) {
119 +
      console.log(error)
120 +
    }
121 +
  }
122 +
123 +
  return (
124 +
    <>
125 +
      <div>
126 +
        <a href="https://github.com/stevedylandev/bhvr" target="_blank">
127 +
          <img src={beaver} className="logo" alt="beaver logo" />
128 +
        </a>
129 +
      </div>
130 +
      <h1>bhvr</h1>
131 +
      <h2>Bun + Hono + Vite + React</h2>
132 +
      <p>A typesafe fullstack monorepo</p>
133 +
      <div className="card">
134 +
        <button onClick={sendRequest}>
135 +
          Call API
136 +
        </button>
137 +
        {data && (
138 +
          <pre className='response'>
139 +
            <code>
140 +
            Message: {data.message} <br />
141 +
            Success: {data.success.toString()}
142 +
            </code>
143 +
          </pre>
144 +
        )}
145 +
      </div>
146 +
      <p className="read-the-docs">
147 +
        Click the beaver to learn more
148 +
      </p>
149 +
    </>
150 +
  )
151 +
}
152 +
153 +
export default App
154 +
```
155 +
156 +
### Shared
157 +
158 +
The Shared package is used for anything you want to share between the Server and Client. This could be types or libraries that you use in both environments.
159 +
160 +
```
161 +
shared
162 +
├── package.json
163 +
├── src
164 +
│   ├── index.ts
165 +
│   └── types
166 +
│       └── index.ts
167 +
└── tsconfig.json
168 +
```
169 +
170 +
Inside the `src/index.ts` we export any of our code from the folders so it's usable in other parts of the monorepo
171 +
172 +
```typescript
173 +
export * from "./types"
174 +
```
175 +
176 +
By running `bun run dev` or `bun run build` it will compile and export the packages from `shared` so it can be used in either `client` or `server`
177 +
178 +
```typescript
179 +
import { ApiResponse } from 'shared'
180 +
```
181 +
182 +
## Getting Started
183 +
184 +
### Quick Start
185 +
186 +
You can start a new bhvr project using the [CLI](https://github.com/stevedylandev/create-bhvr)
187 +
188 +
```bash
189 +
bun create bhvr
190 +
```
191 +
192 +
### Installation
193 +
194 +
```bash
195 +
# Install dependencies for all workspaces
196 +
bun install
197 +
```
198 +
199 +
### Development
200 +
201 +
```bash
202 +
# Run all workspaces in development mode with Turbo
203 +
bun run dev
204 +
205 +
# Or run individual workspaces directly
206 +
bun run dev:client    # Run the Vite dev server for React
207 +
bun run dev:server    # Run the Hono backend
208 +
```
209 +
210 +
### Building
211 +
212 +
```bash
213 +
# Build all workspaces with Turbo
214 +
bun run build
215 +
216 +
# Or build individual workspaces directly
217 +
bun run build:client  # Build the React frontend
218 +
bun run build:server  # Build the Hono backend
219 +
```
220 +
221 +
### Additional Commands
222 +
223 +
```bash
224 +
# Lint all workspaces
225 +
bun run lint
226 +
227 +
# Type check all workspaces
228 +
bun run type-check
229 +
230 +
# Run tests across all workspaces
231 +
bun run test
232 +
```
233 +
234 +
### Deployment
235 +
236 +
Deplying each piece is very versatile and can be done numerous ways, and exploration into automating these will happen at a later date. Here are some references in the meantime.
237 +
238 +
**Client**
239 +
- [Orbiter](https://orbiter.host)
240 +
- [GitHub Pages](https://vite.dev/guide/static-deploy.html#github-pages)
241 +
- [Netlify](https://vite.dev/guide/static-deploy.html#netlify)
242 +
- [Cloudflare Pages](https://vite.dev/guide/static-deploy.html#cloudflare-pages)
243 +
244 +
**Server**
245 +
- [Cloudflare Worker](https://gist.github.com/stevedylandev/4aa1fc569bcba46b7169193c0498d0b3)
246 +
- [Bun](https://hono.dev/docs/getting-started/bun)
247 +
- [Node.js](https://hono.dev/docs/getting-started/nodejs)
248 +
249 +
## Type Sharing
250 +
251 +
Types are automatically shared between the client and server thanks to the shared package and TypeScript path aliases. You can import them in your code using:
252 +
253 +
```typescript
254 +
import { ApiResponse } from 'shared/types';
255 +
```
256 +
257 +
## Learn More
258 +
259 +
- [Bun Documentation](https://bun.sh/docs)
260 +
- [Vite Documentation](https://vitejs.dev/guide/)
261 +
- [React Documentation](https://react.dev/learn)
262 +
- [Hono Documentation](https://hono.dev/docs)
263 +
- [Turbo Documentation](https://turbo.build/docs)
264 +
- [TypeScript Documentation](https://www.typescriptlang.org/docs/)
test-app/bun.lock (added) +557 −0
1 +
{
2 +
  "lockfileVersion": 1,
3 +
  "workspaces": {
4 +
    "": {
5 +
      "name": "bhvr",
6 +
      "dependencies": {
7 +
        "hono": "^4.9.0",
8 +
      },
9 +
      "devDependencies": {
10 +
        "bun-types": "latest",
11 +
        "turbo": "^2.5.5",
12 +
      },
13 +
      "peerDependencies": {
14 +
        "typescript": "^5.7.3",
15 +
      },
16 +
    },
17 +
    "client": {
18 +
      "name": "client",
19 +
      "version": "0.0.1",
20 +
      "dependencies": {
21 +
        "react": "^19.1.0",
22 +
        "react-dom": "^19.1.0",
23 +
        "server": "workspace:*",
24 +
        "shared": "workspace:*",
25 +
      },
26 +
      "devDependencies": {
27 +
        "@eslint/js": "^9.28.0",
28 +
        "@types/node": "^22.15.31",
29 +
        "@types/react": "^19.1.8",
30 +
        "@types/react-dom": "^19.1.6",
31 +
        "@vitejs/plugin-react": "^4.5.2",
32 +
        "eslint": "^9.28.0",
33 +
        "eslint-plugin-react-hooks": "^5.2.0",
34 +
        "eslint-plugin-react-refresh": "^0.4.20",
35 +
        "globals": "^16.2.0",
36 +
        "typescript": "~5.7.3",
37 +
        "typescript-eslint": "^8.34.0",
38 +
        "vite": "^6.3.5",
39 +
      },
40 +
    },
41 +
    "server": {
42 +
      "name": "server",
43 +
      "version": "0.0.1",
44 +
      "dependencies": {
45 +
        "hono": "^4.7.11",
46 +
        "shared": "workspace:*",
47 +
      },
48 +
      "devDependencies": {
49 +
        "@types/bun": "latest",
50 +
      },
51 +
    },
52 +
    "shared": {
53 +
      "name": "shared",
54 +
      "version": "0.0.1",
55 +
      "devDependencies": {
56 +
        "typescript": "^5.8.3",
57 +
      },
58 +
    },
59 +
  },
60 +
  "packages": {
61 +
    "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="],
62 +
63 +
    "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="],
64 +
65 +
    "@babel/compat-data": ["@babel/compat-data@7.28.0", "", {}, "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw=="],
66 +
67 +
    "@babel/core": ["@babel/core@7.28.0", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.6", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.0", "@babel/types": "^7.28.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ=="],
68 +
69 +
    "@babel/generator": ["@babel/generator@7.28.0", "", { "dependencies": { "@babel/parser": "^7.28.0", "@babel/types": "^7.28.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg=="],
70 +
71 +
    "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="],
72 +
73 +
    "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="],
74 +
75 +
    "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="],
76 +
77 +
    "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.27.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.27.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg=="],
78 +
79 +
    "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="],
80 +
81 +
    "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
82 +
83 +
    "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="],
84 +
85 +
    "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="],
86 +
87 +
    "@babel/helpers": ["@babel/helpers@7.27.6", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.27.6" } }, "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug=="],
88 +
89 +
    "@babel/parser": ["@babel/parser@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.0" }, "bin": "./bin/babel-parser.js" }, "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g=="],
90 +
91 +
    "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="],
92 +
93 +
    "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="],
94 +
95 +
    "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="],
96 +
97 +
    "@babel/traverse": ["@babel/traverse@7.28.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/types": "^7.28.0", "debug": "^4.3.1" } }, "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg=="],
98 +
99 +
    "@babel/types": ["@babel/types@7.28.1", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ=="],
100 +
101 +
    "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.8", "", { "os": "aix", "cpu": "ppc64" }, "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA=="],
102 +
103 +
    "@esbuild/android-arm": ["@esbuild/android-arm@0.25.8", "", { "os": "android", "cpu": "arm" }, "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw=="],
104 +
105 +
    "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.8", "", { "os": "android", "cpu": "arm64" }, "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w=="],
106 +
107 +
    "@esbuild/android-x64": ["@esbuild/android-x64@0.25.8", "", { "os": "android", "cpu": "x64" }, "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA=="],
108 +
109 +
    "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw=="],
110 +
111 +
    "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg=="],
112 +
113 +
    "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.8", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA=="],
114 +
115 +
    "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.8", "", { "os": "freebsd", "cpu": "x64" }, "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw=="],
116 +
117 +
    "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.8", "", { "os": "linux", "cpu": "arm" }, "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg=="],
118 +
119 +
    "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w=="],
120 +
121 +
    "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.8", "", { "os": "linux", "cpu": "ia32" }, "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg=="],
122 +
123 +
    "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.8", "", { "os": "linux", "cpu": "none" }, "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ=="],
124 +
125 +
    "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.8", "", { "os": "linux", "cpu": "none" }, "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw=="],
126 +
127 +
    "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.8", "", { "os": "linux", "cpu": "ppc64" }, "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ=="],
128 +
129 +
    "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.8", "", { "os": "linux", "cpu": "none" }, "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg=="],
130 +
131 +
    "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.8", "", { "os": "linux", "cpu": "s390x" }, "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg=="],
132 +
133 +
    "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.8", "", { "os": "linux", "cpu": "x64" }, "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ=="],
134 +
135 +
    "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.8", "", { "os": "none", "cpu": "arm64" }, "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw=="],
136 +
137 +
    "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.8", "", { "os": "none", "cpu": "x64" }, "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg=="],
138 +
139 +
    "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.8", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ=="],
140 +
141 +
    "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.8", "", { "os": "openbsd", "cpu": "x64" }, "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ=="],
142 +
143 +
    "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.8", "", { "os": "none", "cpu": "arm64" }, "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg=="],
144 +
145 +
    "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.8", "", { "os": "sunos", "cpu": "x64" }, "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w=="],
146 +
147 +
    "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.8", "", { "os": "win32", "cpu": "arm64" }, "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ=="],
148 +
149 +
    "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.8", "", { "os": "win32", "cpu": "ia32" }, "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg=="],
150 +
151 +
    "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.8", "", { "os": "win32", "cpu": "x64" }, "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw=="],
152 +
153 +
    "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="],
154 +
155 +
    "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="],
156 +
157 +
    "@eslint/config-array": ["@eslint/config-array@0.21.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ=="],
158 +
159 +
    "@eslint/config-helpers": ["@eslint/config-helpers@0.3.0", "", {}, "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw=="],
160 +
161 +
    "@eslint/core": ["@eslint/core@0.15.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA=="],
162 +
163 +
    "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="],
164 +
165 +
    "@eslint/js": ["@eslint/js@9.31.0", "", {}, "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw=="],
166 +
167 +
    "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="],
168 +
169 +
    "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.4", "", { "dependencies": { "@eslint/core": "^0.15.1", "levn": "^0.4.1" } }, "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw=="],
170 +
171 +
    "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
172 +
173 +
    "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="],
174 +
175 +
    "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
176 +
177 +
    "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="],
178 +
179 +
    "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.12", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg=="],
180 +
181 +
    "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
182 +
183 +
    "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.4", "", {}, "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw=="],
184 +
185 +
    "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="],
186 +
187 +
    "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
188 +
189 +
    "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
190 +
191 +
    "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
192 +
193 +
    "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="],
194 +
195 +
    "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.45.1", "", { "os": "android", "cpu": "arm" }, "sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA=="],
196 +
197 +
    "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.45.1", "", { "os": "android", "cpu": "arm64" }, "sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ=="],
198 +
199 +
    "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.45.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA=="],
200 +
201 +
    "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.45.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og=="],
202 +
203 +
    "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.45.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g=="],
204 +
205 +
    "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.45.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A=="],
206 +
207 +
    "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.45.1", "", { "os": "linux", "cpu": "arm" }, "sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q=="],
208 +
209 +
    "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.45.1", "", { "os": "linux", "cpu": "arm" }, "sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q=="],
210 +
211 +
    "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.45.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw=="],
212 +
213 +
    "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.45.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog=="],
214 +
215 +
    "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.45.1", "", { "os": "linux", "cpu": "none" }, "sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg=="],
216 +
217 +
    "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.45.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg=="],
218 +
219 +
    "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.45.1", "", { "os": "linux", "cpu": "none" }, "sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw=="],
220 +
221 +
    "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.45.1", "", { "os": "linux", "cpu": "none" }, "sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA=="],
222 +
223 +
    "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.45.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw=="],
224 +
225 +
    "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.45.1", "", { "os": "linux", "cpu": "x64" }, "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw=="],
226 +
227 +
    "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.45.1", "", { "os": "linux", "cpu": "x64" }, "sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw=="],
228 +
229 +
    "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.45.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg=="],
230 +
231 +
    "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.45.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw=="],
232 +
233 +
    "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.45.1", "", { "os": "win32", "cpu": "x64" }, "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA=="],
234 +
235 +
    "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="],
236 +
237 +
    "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="],
238 +
239 +
    "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="],
240 +
241 +
    "@types/babel__traverse": ["@types/babel__traverse@7.20.7", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng=="],
242 +
243 +
    "@types/bun": ["@types/bun@1.2.19", "", { "dependencies": { "bun-types": "1.2.19" } }, "sha512-d9ZCmrH3CJ2uYKXQIUuZ/pUnTqIvLDS0SK7pFmbx8ma+ziH/FRMoAq5bYpRG7y+w1gl+HgyNZbtqgMq4W4e2Lg=="],
244 +
245 +
    "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
246 +
247 +
    "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
248 +
249 +
    "@types/node": ["@types/node@22.16.5", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ=="],
250 +
251 +
    "@types/react": ["@types/react@19.1.8", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g=="],
252 +
253 +
    "@types/react-dom": ["@types/react-dom@19.1.6", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw=="],
254 +
255 +
    "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.38.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.38.0", "@typescript-eslint/type-utils": "8.38.0", "@typescript-eslint/utils": "8.38.0", "@typescript-eslint/visitor-keys": "8.38.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.38.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA=="],
256 +
257 +
    "@typescript-eslint/parser": ["@typescript-eslint/parser@8.38.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.38.0", "@typescript-eslint/types": "8.38.0", "@typescript-eslint/typescript-estree": "8.38.0", "@typescript-eslint/visitor-keys": "8.38.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ=="],
258 +
259 +
    "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.38.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.38.0", "@typescript-eslint/types": "^8.38.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg=="],
260 +
261 +
    "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.38.0", "", { "dependencies": { "@typescript-eslint/types": "8.38.0", "@typescript-eslint/visitor-keys": "8.38.0" } }, "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ=="],
262 +
263 +
    "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.38.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ=="],
264 +
265 +
    "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.38.0", "", { "dependencies": { "@typescript-eslint/types": "8.38.0", "@typescript-eslint/typescript-estree": "8.38.0", "@typescript-eslint/utils": "8.38.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg=="],
266 +
267 +
    "@typescript-eslint/types": ["@typescript-eslint/types@8.38.0", "", {}, "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw=="],
268 +
269 +
    "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.38.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.38.0", "@typescript-eslint/tsconfig-utils": "8.38.0", "@typescript-eslint/types": "8.38.0", "@typescript-eslint/visitor-keys": "8.38.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ=="],
270 +
271 +
    "@typescript-eslint/utils": ["@typescript-eslint/utils@8.38.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.38.0", "@typescript-eslint/types": "8.38.0", "@typescript-eslint/typescript-estree": "8.38.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg=="],
272 +
273 +
    "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.38.0", "", { "dependencies": { "@typescript-eslint/types": "8.38.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g=="],
274 +
275 +
    "@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="],
276 +
277 +
    "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
278 +
279 +
    "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
280 +
281 +
    "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
282 +
283 +
    "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
284 +
285 +
    "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
286 +
287 +
    "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
288 +
289 +
    "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="],
290 +
291 +
    "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
292 +
293 +
    "browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="],
294 +
295 +
    "bun-types": ["bun-types@1.2.19", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-uAOTaZSPuYsWIXRpj7o56Let0g/wjihKCkeRqUBhlLVM/Bt+Fj9xTo+LhC1OV1XDaGkz4hNC80et5xgy+9KTHQ=="],
296 +
297 +
    "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
298 +
299 +
    "caniuse-lite": ["caniuse-lite@1.0.30001727", "", {}, "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q=="],
300 +
301 +
    "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
302 +
303 +
    "client": ["client@workspace:client"],
304 +
305 +
    "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
306 +
307 +
    "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
308 +
309 +
    "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
310 +
311 +
    "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
312 +
313 +
    "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
314 +
315 +
    "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
316 +
317 +
    "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="],
318 +
319 +
    "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
320 +
321 +
    "electron-to-chromium": ["electron-to-chromium@1.5.189", "", {}, "sha512-y9D1ntS1ruO/pZ/V2FtLE+JXLQe28XoRpZ7QCCo0T8LdQladzdcOVQZH/IWLVJvCw12OGMb6hYOeOAjntCmJRQ=="],
322 +
323 +
    "esbuild": ["esbuild@0.25.8", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.8", "@esbuild/android-arm": "0.25.8", "@esbuild/android-arm64": "0.25.8", "@esbuild/android-x64": "0.25.8", "@esbuild/darwin-arm64": "0.25.8", "@esbuild/darwin-x64": "0.25.8", "@esbuild/freebsd-arm64": "0.25.8", "@esbuild/freebsd-x64": "0.25.8", "@esbuild/linux-arm": "0.25.8", "@esbuild/linux-arm64": "0.25.8", "@esbuild/linux-ia32": "0.25.8", "@esbuild/linux-loong64": "0.25.8", "@esbuild/linux-mips64el": "0.25.8", "@esbuild/linux-ppc64": "0.25.8", "@esbuild/linux-riscv64": "0.25.8", "@esbuild/linux-s390x": "0.25.8", "@esbuild/linux-x64": "0.25.8", "@esbuild/netbsd-arm64": "0.25.8", "@esbuild/netbsd-x64": "0.25.8", "@esbuild/openbsd-arm64": "0.25.8", "@esbuild/openbsd-x64": "0.25.8", "@esbuild/openharmony-arm64": "0.25.8", "@esbuild/sunos-x64": "0.25.8", "@esbuild/win32-arm64": "0.25.8", "@esbuild/win32-ia32": "0.25.8", "@esbuild/win32-x64": "0.25.8" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q=="],
324 +
325 +
    "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
326 +
327 +
    "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
328 +
329 +
    "eslint": ["eslint@9.31.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.0", "@eslint/core": "^0.15.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.31.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ=="],
330 +
331 +
    "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="],
332 +
333 +
    "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.20", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA=="],
334 +
335 +
    "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="],
336 +
337 +
    "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="],
338 +
339 +
    "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="],
340 +
341 +
    "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="],
342 +
343 +
    "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
344 +
345 +
    "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
346 +
347 +
    "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
348 +
349 +
    "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
350 +
351 +
    "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
352 +
353 +
    "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
354 +
355 +
    "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
356 +
357 +
    "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="],
358 +
359 +
    "fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="],
360 +
361 +
    "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
362 +
363 +
    "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
364 +
365 +
    "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
366 +
367 +
    "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
368 +
369 +
    "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="],
370 +
371 +
    "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
372 +
373 +
    "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
374 +
375 +
    "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
376 +
377 +
    "globals": ["globals@16.3.0", "", {}, "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ=="],
378 +
379 +
    "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="],
380 +
381 +
    "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
382 +
383 +
    "hono": ["hono@4.9.0", "", {}, "sha512-JAUc4Sqi3lhby2imRL/67LMcJFKiCu7ZKghM7iwvltVZzxEC5bVJCsAa4NTnSfmWGb+N2eOVtFE586R+K3fejA=="],
384 +
385 +
    "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
386 +
387 +
    "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
388 +
389 +
    "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
390 +
391 +
    "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
392 +
393 +
    "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
394 +
395 +
    "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
396 +
397 +
    "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
398 +
399 +
    "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
400 +
401 +
    "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="],
402 +
403 +
    "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
404 +
405 +
    "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
406 +
407 +
    "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
408 +
409 +
    "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
410 +
411 +
    "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
412 +
413 +
    "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
414 +
415 +
    "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
416 +
417 +
    "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
418 +
419 +
    "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
420 +
421 +
    "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
422 +
423 +
    "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
424 +
425 +
    "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
426 +
427 +
    "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
428 +
429 +
    "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
430 +
431 +
    "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
432 +
433 +
    "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
434 +
435 +
    "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="],
436 +
437 +
    "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
438 +
439 +
    "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
440 +
441 +
    "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
442 +
443 +
    "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
444 +
445 +
    "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
446 +
447 +
    "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
448 +
449 +
    "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
450 +
451 +
    "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
452 +
453 +
    "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
454 +
455 +
    "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
456 +
457 +
    "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
458 +
459 +
    "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
460 +
461 +
    "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="],
462 +
463 +
    "react-dom": ["react-dom@19.1.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g=="],
464 +
465 +
    "react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="],
466 +
467 +
    "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
468 +
469 +
    "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
470 +
471 +
    "rollup": ["rollup@4.45.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.45.1", "@rollup/rollup-android-arm64": "4.45.1", "@rollup/rollup-darwin-arm64": "4.45.1", "@rollup/rollup-darwin-x64": "4.45.1", "@rollup/rollup-freebsd-arm64": "4.45.1", "@rollup/rollup-freebsd-x64": "4.45.1", "@rollup/rollup-linux-arm-gnueabihf": "4.45.1", "@rollup/rollup-linux-arm-musleabihf": "4.45.1", "@rollup/rollup-linux-arm64-gnu": "4.45.1", "@rollup/rollup-linux-arm64-musl": "4.45.1", "@rollup/rollup-linux-loongarch64-gnu": "4.45.1", "@rollup/rollup-linux-powerpc64le-gnu": "4.45.1", "@rollup/rollup-linux-riscv64-gnu": "4.45.1", "@rollup/rollup-linux-riscv64-musl": "4.45.1", "@rollup/rollup-linux-s390x-gnu": "4.45.1", "@rollup/rollup-linux-x64-gnu": "4.45.1", "@rollup/rollup-linux-x64-musl": "4.45.1", "@rollup/rollup-win32-arm64-msvc": "4.45.1", "@rollup/rollup-win32-ia32-msvc": "4.45.1", "@rollup/rollup-win32-x64-msvc": "4.45.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw=="],
472 +
473 +
    "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
474 +
475 +
    "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="],
476 +
477 +
    "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
478 +
479 +
    "server": ["server@workspace:server"],
480 +
481 +
    "shared": ["shared@workspace:shared"],
482 +
483 +
    "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
484 +
485 +
    "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
486 +
487 +
    "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
488 +
489 +
    "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
490 +
491 +
    "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
492 +
493 +
    "tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="],
494 +
495 +
    "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
496 +
497 +
    "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="],
498 +
499 +
    "turbo": ["turbo@2.5.5", "", { "optionalDependencies": { "turbo-darwin-64": "2.5.5", "turbo-darwin-arm64": "2.5.5", "turbo-linux-64": "2.5.5", "turbo-linux-arm64": "2.5.5", "turbo-windows-64": "2.5.5", "turbo-windows-arm64": "2.5.5" }, "bin": { "turbo": "bin/turbo" } }, "sha512-eZ7wI6KjtT1eBqCnh2JPXWNUAxtoxxfi6VdBdZFvil0ychCOTxbm7YLRBi1JSt7U3c+u3CLxpoPxLdvr/Npr3A=="],
500 +
501 +
    "turbo-darwin-64": ["turbo-darwin-64@2.5.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-RYnTz49u4F5tDD2SUwwtlynABNBAfbyT2uU/brJcyh5k6lDLyNfYKdKmqd3K2ls4AaiALWrFKVSBsiVwhdFNzQ=="],
502 +
503 +
    "turbo-darwin-arm64": ["turbo-darwin-arm64@2.5.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Tk+ZeSNdBobZiMw9aFypQt0DlLsWSFWu1ymqsAdJLuPoAH05qCfYtRxE1pJuYHcJB5pqI+/HOxtJoQ40726Btw=="],
504 +
505 +
    "turbo-linux-64": ["turbo-linux-64@2.5.5", "", { "os": "linux", "cpu": "x64" }, "sha512-2/XvMGykD7VgsvWesZZYIIVXMlgBcQy+ZAryjugoTcvJv8TZzSU/B1nShcA7IAjZ0q7OsZ45uP2cOb8EgKT30w=="],
506 +
507 +
    "turbo-linux-arm64": ["turbo-linux-arm64@2.5.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-DW+8CjCjybu0d7TFm9dovTTVg1VRnlkZ1rceO4zqsaLrit3DgHnN4to4uwyuf9s2V/BwS3IYcRy+HG9BL596Iw=="],
508 +
509 +
    "turbo-windows-64": ["turbo-windows-64@2.5.5", "", { "os": "win32", "cpu": "x64" }, "sha512-q5p1BOy8ChtSZfULuF1BhFMYIx6bevXu4fJ+TE/hyNfyHJIfjl90Z6jWdqAlyaFLmn99X/uw+7d6T/Y/dr5JwQ=="],
510 +
511 +
    "turbo-windows-arm64": ["turbo-windows-arm64@2.5.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-AXbF1KmpHUq3PKQwddMGoKMYhHsy5t1YBQO8HZ04HLMR0rWv9adYlQ8kaeQJTko1Ay1anOBFTqaxfVOOsu7+1Q=="],
512 +
513 +
    "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
514 +
515 +
    "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
516 +
517 +
    "typescript-eslint": ["typescript-eslint@8.38.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.38.0", "@typescript-eslint/parser": "8.38.0", "@typescript-eslint/typescript-estree": "8.38.0", "@typescript-eslint/utils": "8.38.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg=="],
518 +
519 +
    "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
520 +
521 +
    "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="],
522 +
523 +
    "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
524 +
525 +
    "vite": ["vite@6.3.5", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ=="],
526 +
527 +
    "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
528 +
529 +
    "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
530 +
531 +
    "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
532 +
533 +
    "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
534 +
535 +
    "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
536 +
537 +
    "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
538 +
539 +
    "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="],
540 +
541 +
    "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
542 +
543 +
    "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
544 +
545 +
    "@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
546 +
547 +
    "client/typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="],
548 +
549 +
    "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
550 +
551 +
    "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
552 +
553 +
    "server/hono": ["hono@4.8.5", "", {}, "sha512-Up2cQbtNz1s111qpnnECdTGqSIUIhZJMLikdKkshebQSEBcoUKq6XJayLGqSZWidiH0zfHRCJqFu062Mz5UuRA=="],
554 +
555 +
    "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
556 +
  }
557 +
}
test-app/client/.gitignore (added) +24 −0
1 +
# Logs
2 +
logs
3 +
*.log
4 +
npm-debug.log*
5 +
yarn-debug.log*
6 +
yarn-error.log*
7 +
pnpm-debug.log*
8 +
lerna-debug.log*
9 +
10 +
node_modules
11 +
dist
12 +
dist-ssr
13 +
*.local
14 +
15 +
# Editor directories and files
16 +
.vscode/*
17 +
!.vscode/extensions.json
18 +
.idea
19 +
.DS_Store
20 +
*.suo
21 +
*.ntvs*
22 +
*.njsproj
23 +
*.sln
24 +
*.sw?
test-app/client/README.md (added) +54 −0
1 +
# React + TypeScript + Vite
2 +
3 +
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4 +
5 +
Currently, two official plugins are available:
6 +
7 +
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
8 +
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9 +
10 +
## Expanding the ESLint configuration
11 +
12 +
If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
13 +
14 +
```js
15 +
export default tseslint.config({
16 +
  extends: [
17 +
    // Remove ...tseslint.configs.recommended and replace with this
18 +
    ...tseslint.configs.recommendedTypeChecked,
19 +
    // Alternatively, use this for stricter rules
20 +
    ...tseslint.configs.strictTypeChecked,
21 +
    // Optionally, add this for stylistic rules
22 +
    ...tseslint.configs.stylisticTypeChecked,
23 +
  ],
24 +
  languageOptions: {
25 +
    // other options...
26 +
    parserOptions: {
27 +
      project: ['./tsconfig.node.json', './tsconfig.app.json'],
28 +
      tsconfigRootDir: import.meta.dirname,
29 +
    },
30 +
  },
31 +
})
32 +
```
33 +
34 +
You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
35 +
36 +
```js
37 +
// eslint.config.js
38 +
import reactX from 'eslint-plugin-react-x'
39 +
import reactDom from 'eslint-plugin-react-dom'
40 +
41 +
export default tseslint.config({
42 +
  plugins: {
43 +
    // Add the react-x and react-dom plugins
44 +
    'react-x': reactX,
45 +
    'react-dom': reactDom,
46 +
  },
47 +
  rules: {
48 +
    // other rules...
49 +
    // Enable its recommended typescript rules
50 +
    ...reactX.configs['recommended-typescript'].rules,
51 +
    ...reactDom.configs.recommended.rules,
52 +
  },
53 +
})
54 +
```
test-app/client/eslint.config.js (added) +28 −0
1 +
import js from '@eslint/js'
2 +
import globals from 'globals'
3 +
import reactHooks from 'eslint-plugin-react-hooks'
4 +
import reactRefresh from 'eslint-plugin-react-refresh'
5 +
import tseslint from 'typescript-eslint'
6 +
7 +
export default tseslint.config(
8 +
  { ignores: ['dist'] },
9 +
  {
10 +
    extends: [js.configs.recommended, ...tseslint.configs.recommended],
11 +
    files: ['**/*.{ts,tsx}'],
12 +
    languageOptions: {
13 +
      ecmaVersion: 2020,
14 +
      globals: globals.browser,
15 +
    },
16 +
    plugins: {
17 +
      'react-hooks': reactHooks,
18 +
      'react-refresh': reactRefresh,
19 +
    },
20 +
    rules: {
21 +
      ...reactHooks.configs.recommended.rules,
22 +
      'react-refresh/only-export-components': [
23 +
        'warn',
24 +
        { allowConstantExport: true },
25 +
      ],
26 +
    },
27 +
  },
28 +
)
test-app/client/index.html (added) +13 −0
1 +
<!doctype html>
2 +
<html lang="en">
3 +
  <head>
4 +
    <meta charset="UTF-8" />
5 +
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6 +
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7 +
    <title>BHVR</title>
8 +
  </head>
9 +
  <body>
10 +
    <div id="root"></div>
11 +
    <script type="module" src="/src/main.tsx"></script>
12 +
  </body>
13 +
</html>
test-app/client/package.json (added) +32 −0
1 +
{
2 +
  "name": "client",
3 +
  "private": true,
4 +
  "version": "0.0.1",
5 +
  "type": "module",
6 +
  "scripts": {
7 +
    "dev": "vite",
8 +
    "build": "tsc -b && vite build",
9 +
    "lint": "eslint .",
10 +
    "preview": "vite preview"
11 +
  },
12 +
  "dependencies": {
13 +
    "react": "^19.1.0",
14 +
    "react-dom": "^19.1.0",
15 +
    "shared": "workspace:*",
16 +
    "server": "workspace:*"
17 +
  },
18 +
  "devDependencies": {
19 +
    "@eslint/js": "^9.28.0",
20 +
    "@types/node": "^22.15.31",
21 +
    "@types/react": "^19.1.8",
22 +
    "@types/react-dom": "^19.1.6",
23 +
    "@vitejs/plugin-react": "^4.5.2",
24 +
    "eslint": "^9.28.0",
25 +
    "eslint-plugin-react-hooks": "^5.2.0",
26 +
    "eslint-plugin-react-refresh": "^0.4.20",
27 +
    "globals": "^16.2.0",
28 +
    "typescript": "~5.7.3",
29 +
    "typescript-eslint": "^8.34.0",
30 +
    "vite": "^6.3.5"
31 +
  }
32 +
}
test-app/client/public/vite.svg (added) +1 −0
1 +
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
test-app/client/src/App.css (added) +80 −0
1 +
#root {
2 +
  max-width: 1280px;
3 +
  margin: 0 auto;
4 +
  padding: 2rem;
5 +
  text-align: center;
6 +
}
7 +
8 +
.logo {
9 +
  height: 6em;
10 +
  padding: 1.5em;
11 +
  will-change: filter;
12 +
  transition: filter 300ms;
13 +
}
14 +
.logo:hover {
15 +
  filter: drop-shadow(0 0 2em #646cffaa);
16 +
}
17 +
.logo.react:hover {
18 +
  filter: drop-shadow(0 0 2em #61dafbaa);
19 +
}
20 +
21 +
@keyframes logo-spin {
22 +
  from {
23 +
    transform: rotate(0deg);
24 +
  }
25 +
  to {
26 +
    transform: rotate(360deg);
27 +
  }
28 +
}
29 +
30 +
@media (prefers-reduced-motion: no-preference) {
31 +
  a:nth-of-type(1) .logo {
32 +
    animation: logo-spin infinite 20s linear;
33 +
  }
34 +
}
35 +
36 +
.card {
37 +
  padding: 2em;
38 +
}
39 +
40 +
.read-the-docs {
41 +
  color: #888;
42 +
}
43 +
44 +
.response {
45 +
  background: #444444;
46 +
  border-radius: 15px;
47 +
  padding: 2rem;
48 +
}
49 +
50 +
.code {
51 +
  text-align: start;
52 +
  max-width: 500px;
53 +
  margin: auto;
54 +
}
55 +
56 +
.button-container {
57 +
  display: flex;
58 +
  align-items: center;
59 +
  gap: 2rem;
60 +
}
61 +
62 +
.docs-link {
63 +
  border-radius: 8px;
64 +
  border: 1px solid transparent;
65 +
  padding: 0.6em 1.2em;
66 +
  font-size: 1em;
67 +
  font-weight: 500;
68 +
  font-family: inherit;
69 +
  background-color: #1a1a1a;
70 +
  cursor: pointer;
71 +
  transition: border-color 0.25s;
72 +
  color: rgba(255, 255, 255, 0.87);
73 +
}
74 +
.docs-link:hover {
75 +
  border-color: #646cff;
76 +
}
77 +
.docs-link:focus,
78 +
.docs-link:focus-visible {
79 +
  outline: 4px auto -webkit-focus-ring-color;
80 +
}
test-app/client/src/App.tsx (added) +51 −0
1 +
import { useState } from 'react'
2 +
import beaver from './assets/beaver.svg'
3 +
import type { ApiResponse } from 'shared'
4 +
import './App.css'
5 +
6 +
const SERVER_URL = import.meta.env.VITE_SERVER_URL || "http://localhost:3000"
7 +
8 +
function App() {
9 +
  const [data, setData] = useState<ApiResponse | undefined>()
10 +
11 +
  async function sendRequest() {
12 +
    try {
13 +
      const req = await fetch(`${SERVER_URL}/hello`)
14 +
      const res: ApiResponse = await req.json()
15 +
      setData(res)
16 +
    } catch (error) {
17 +
      console.log(error)
18 +
    }
19 +
  }
20 +
21 +
  return (
22 +
    <>
23 +
      <div>
24 +
        <a href="https://github.com/stevedylandev/bhvr" target="_blank">
25 +
          <img src={beaver} className="logo" alt="beaver logo" />
26 +
        </a>
27 +
      </div>
28 +
      <h1>bhvr</h1>
29 +
      <h2>Bun + Hono + Vite + React</h2>
30 +
      <p>A typesafe fullstack monorepo</p>
31 +
      <div className="card">
32 +
        <div className='button-container'>
33 +
          <button onClick={sendRequest}>
34 +
            Call API
35 +
          </button>
36 +
          <a className='docs-link' target='_blank' href="https://bhvr.dev">Docs</a>
37 +
        </div>
38 +
        {data && (
39 +
          <pre className='response'>
40 +
            <code>
41 +
            Message: {data.message} <br />
42 +
            Success: {data.success.toString()}
43 +
            </code>
44 +
          </pre>
45 +
        )}
46 +
      </div>
47 +
    </>
48 +
  )
49 +
}
50 +
51 +
export default App
test-app/client/src/assets/beaver.svg (added) +1 −0
1 +
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 128 128"><!-- Icon from Noto Emoji by Google Inc - https://github.com/googlefonts/noto-emoji/blob/main/svg/LICENSE --><path fill="#694D42" d="M77.52 83.78c4.93 2.51 14.08 4.86 18.94 4.15c12.6-1.85 21.69-9.13 27.2-19.22c2.33-4.27 2.53-12.92-1.21-13.86c-4.74-1.19-10.37-.26-19.11 3.87c-8.89 4.2-11.03 10.84-21.5 5.73"/><path fill="#B3937C" d="M79.88 75.09c1.83 1.22 2.09 1.88 3.6 3.48c2.97 3.16 9.99 3.33 11.35 3.35c8.09.11 12-1.85 17.22-5.3s10.13-10.99 11.01-14.73c.61-2.58.92-4.54.8-6.13c-.39-.44-.85-.77-1.4-.91c-4.74-1.19-10.37-.26-19.11 3.87c-8.89 4.2-11.03 10.84-21.5 5.73l-2.28 10.17z" opacity=".44"/><path fill="#694D42" d="M123.47 59.99c.18-.95.31-1.8.37-2.57l-5.37-2.35l.31-.7c-1.85-.03-3.89.24-6.19.83l2.58 1.14l-2.66 6.03l-6.03-2.66l1.29-2.91c-1.07.42-5.12 2.14-6.83 3.2l2.25.99l-2.66 6.03l-6-2.72c-1.13.71-2.25 1.29-3.46 1.64l-6.05 13.68c.73.37 1.53.66 2.34.89l2.46-5.56l6.03 2.66s-1.25 2.79-1.91 4.28c.39.02 2.11.03 2.69.01l1.51-3.28l5.33 2.31c1.6-.46 3.05-1.08 4.49-1.83l2.18-5.12l3.42 1.53c.69-.56 1.37-1.18 2.02-1.84l-4.43-1.97l2.66-6.03l6.08 2.69c.49-.73.93-1.45 1.32-2.15l-6.39-2.83l2.66-6.03zM96.84 75.33l-6.03-2.66l2.66-6.03l6.03 2.66zm8.32 3.68l-6.03-2.66l2.66-6.03l6.03 2.66zm3.67-8.32l-6.03-2.66l2.66-6.03l6.03 2.66z"/><path fill="#825B4E" d="M17.36 8.23c-1.03-.16-2.06-.28-3.1-.34c-.43-.03-.9-.04-1.27.18c-.31.18-.51.5-.67.82a6.98 6.98 0 0 0-.29 5.69c.18.45.53.95 1 .87c.19-.03.34-.15.49-.27a30 30 0 0 0 4.08-3.86c.21-.24.41-.63.16-.84"/><path fill="#694D42" d="M57.41 102.05c-8.65 4.19-14.38 9.08-20.38 15.08c-.45.45-2.33 2.5-1.17 3.12s4.03-1.48 4.85-.93c.98.65.26 1.8 1.29 2.54s3.8-1.42 5.2-.79s.78 1.71 1.6 2.67c1.07 1.26 3.45.09 4.09-.42c3.77-2.98 13.16-11.93 14.82-13.86c2.2-2.56 3.6-6 1.64-8.28m-41.09-1.97a76 76 0 0 0-14.73 6.46c-.97.55-1.93 1.14-2.73 1.91c-.35.33-.73.92-.38 1.25c.8.73 2.33-.46 3.49.45c.4.32.17 1.7.47 2.12c.32.44.93.6 1.48.56s1.07-.25 1.6-.41c1.17-.35 2.37-.57 3.14.35c.48.58.45 1.12.76 1.74c.21.43.56.77 1.43.76c1.32-.01 2.53-.61 3.62-1.34c4.92-3.3 9.55-6.98 14.18-10.65"/><path fill="#825B4E" d="M47.3 12.38c3.46.97 4.32-.02 6.92.18c3.33.25 2.93 3.4 2.44 5.14c-.63 2.23-1.87 4.04-3.64 5.53c-.3.25-.64.51-1.04.54c-.47.04-.9-.25-1.26-.55c-2.36-1.93-3.86-4.88-4.03-7.92"/><path fill="#B38A6D" d="M12.16 41.12s-6.13.71-8.28 7.29C.73 58.03 9.1 63.61 9.1 63.61s-2.3 19.71 9.71 30.51s15.93 11.2 29.97 13.77s27.13-6.48 30.51-10.12s8.64-11.23 9.58-20.67c.94-9.43-7.42-25.94-14.98-34.56S50.8 20.56 50.8 20.56L28.4 41.44z"/><path fill="#B38A6D" d="M48.27 13.23c-5.59-7.84-11.8-9.39-18.63-9.39c-7.37 0-14.36 5.41-17.58 9.69c-2.6 3.47-5.84 9.11-6.3 15.6c-.36 5.1 1.26 9.87 6.3 13.4s25.07 7.74 33.29 2.09c7.2-4.95 9.64-11.6 8.92-17.18c-.51-4.01-1.67-8.14-6-14.21"/><ellipse cx="36.34" cy="17.7" fill="#212121" rx="2.43" ry="3.15" transform="rotate(-17.768 36.335 17.7)"/><path fill="#FFECB3" d="M15.62 32.75c-.52 3.64 1.09 9.12 2.44 9.04c1.12-.07 1.38-2.29 1.38-2.29s.96 2.84 2.72 2.66c1.68-.18 1.6-6.19 2.03-9.13l-5.7-2.33z"/><path fill="#212121" d="M11.84 15.91c.33-1.02 1.26-2.35 2.77-2.31c1.61.05 1.33 2.36.78 3.58c-.56 1.22-1.85 2.4-3.06 1.64c-.83-.52-.72-2.19-.49-2.91"/><path fill="#825B4E" d="M41.53 67.39c-12.8-4.32-13.34-17.07-17.28-20.07c-1.34-1.03-2.63-1.28-3.99-1.99c-1.25-.65-2.69-1.31-4-.79c.9.61 1.71 1.37 2.36 2.25c-1.3.13-3.23.29-3.87 1.11c-.11.14.04.36.2.44s2.3.47 3.15 1.33c-.68.58-1.46 1.06-2.05 1.73c-.34.38-.03.62.11.66c.92.25 1.95.1 2.81.52s1.49 1.21 2.25 1.77a5.42 5.42 0 0 0 3.23 1.07c1.92 4.01 4.42 7.35 7.67 10.37c3 2.79 6.7 4.78 10.81 5.53c12.93 2.36 18.67-10.8 18.67-10.8s-9.19 10.54-20.07 6.87"/><path fill="#212121" d="M21.8 18.45c-.5-.66-1.45-.75-2.06-.2c-1.53 1.39-3.01 2.67-3.65 3.69c-.42.69-.79 2.08.02 3.07s3.36 3.06 3.36 3.06s3.23-1.51 4.23-2.22c1.21-.87 1.48-2.72.45-4.25c-.41-.61-1.55-2.09-2.35-3.15"/><path fill="#212121" d="M28.47 32.39c.84-1.31-.1-1.93-.65-1.29c-.62.71-2.26 1.84-4.51 1.05c-1.25-.44-2.09-.84-2.57-2.27c-.34-1.02-.22-2.39-.21-3.45c0-.48-2.14-.53-2.28-.13c-.29.82-.27 1.67-.3 2.53c-.03.95-.16 2.08-.97 2.58c-2.64 1.67-4.2-.83-4.51-1.12c-.13-.12-.43.65-.17 1.48c1.24 4.01 5.67 3.28 6.94 1.36c.23 1.6 5.88 4.49 9.23-.74"/><path fill="#825B4E" d="M7.91 62.65c.17.15.39.38.55.51c.42.35 1.04.32 1.43-.07c.45-.47.99-1.3 1.33-2.41c.66-2.11.42-5.06-.86-7.18l-1.2 1.22c.92 2.92.56 5.41-.37 6.97c-.37.61-.86.91-.88.96m31.18-19.71l-.73 3.37c3.13-.38 6.45-6.44 6.45-6.44l.04 4.05c4-2.17 6.07-11.49 6.07-11.49c.36 4.52.76 14.58-12.76 16.33c-4.9.64-10.03-1.38-10.03-1.38s7.62-.5 10.96-4.44"/><path fill="#825B4E" d="M6.93 47.01c1.7-2.66 4.7-3.49 7.14-3.11c.11.02.41.13.49.2c.16.15.09.44-.09.58c-.17.14-.41.17-.62.23c-1.22.3-2.32 1.23-2.53 2.47c.87-.36 1.91-.28 2.72.19c.22.13.46.39.33.62c-.07.13-.24.18-.39.23c-1.06.34-1.78 1.45-1.95 2.55c.57-.12 1.16-.25 1.74-.15s1.35.59 1.29 1.04c-.07.48-1.37.16-1.96 1.19c-.41.72-.63 1.59-1.27 2.11c-.59.48-1.44.58-2.17.36c-.73-.21-1.36-.7-1.86-1.27c-1.71-1.95-2.08-4.96-.87-7.24"/></svg>
test-app/client/src/index.css (added) +68 −0
1 +
:root {
2 +
  font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
3 +
  line-height: 1.5;
4 +
  font-weight: 400;
5 +
6 +
  color-scheme: light dark;
7 +
  color: rgba(255, 255, 255, 0.87);
8 +
  background-color: #242424;
9 +
10 +
  font-synthesis: none;
11 +
  text-rendering: optimizeLegibility;
12 +
  -webkit-font-smoothing: antialiased;
13 +
  -moz-osx-font-smoothing: grayscale;
14 +
}
15 +
16 +
a {
17 +
  font-weight: 500;
18 +
  color: #646cff;
19 +
  text-decoration: inherit;
20 +
}
21 +
a:hover {
22 +
  color: #535bf2;
23 +
}
24 +
25 +
body {
26 +
  margin: 0;
27 +
  display: flex;
28 +
  place-items: center;
29 +
  min-width: 320px;
30 +
  min-height: 100vh;
31 +
}
32 +
33 +
h1 {
34 +
  font-size: 3.2em;
35 +
  line-height: 1.1;
36 +
}
37 +
38 +
button {
39 +
  border-radius: 8px;
40 +
  border: 1px solid transparent;
41 +
  padding: 0.6em 1.2em;
42 +
  font-size: 1em;
43 +
  font-weight: 500;
44 +
  font-family: inherit;
45 +
  background-color: #1a1a1a;
46 +
  cursor: pointer;
47 +
  transition: border-color 0.25s;
48 +
}
49 +
button:hover {
50 +
  border-color: #646cff;
51 +
}
52 +
button:focus,
53 +
button:focus-visible {
54 +
  outline: 4px auto -webkit-focus-ring-color;
55 +
}
56 +
57 +
@media (prefers-color-scheme: light) {
58 +
  :root {
59 +
    color: #213547;
60 +
    background-color: #ffffff;
61 +
  }
62 +
  a:hover {
63 +
    color: #747bff;
64 +
  }
65 +
  button {
66 +
    background-color: #f9f9f9;
67 +
  }
68 +
}
test-app/client/src/main.tsx (added) +10 −0
1 +
import { StrictMode } from 'react'
2 +
import { createRoot } from 'react-dom/client'
3 +
import './index.css'
4 +
import App from './App.tsx'
5 +
6 +
createRoot(document.getElementById('root')!).render(
7 +
  <StrictMode>
8 +
    <App />
9 +
  </StrictMode>,
10 +
)
test-app/client/src/vite-env.d.ts (added) +1 −0
1 +
/// <reference types="vite/client" />
test-app/client/tsconfig.app.json (added) +22 −0
1 +
{
2 +
  "compilerOptions": {
3 +
    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4 +
    "target": "ES2020",
5 +
    "useDefineForClassFields": true,
6 +
    "lib": ["ES2020", "DOM", "DOM.Iterable"],
7 +
    "module": "ESNext",
8 +
    "skipLibCheck": true,
9 +
    "moduleResolution": "bundler",
10 +
    "allowImportingTsExtensions": true,
11 +
    "isolatedModules": true,
12 +
    "moduleDetection": "force",
13 +
    "noEmit": true,
14 +
    "jsx": "react-jsx",
15 +
    "strict": true,
16 +
    "noUnusedLocals": true,
17 +
    "noUnusedParameters": true,
18 +
    "noFallthroughCasesInSwitch": true,
19 +
    "noUncheckedSideEffectImports": true
20 +
  },
21 +
  "include": ["src"]
22 +
}
test-app/client/tsconfig.json (added) +5 −0
1 +
{
2 +
  "extends": "../tsconfig.json",
3 +
  "files": [],
4 +
  "references": [{ "path": "./tsconfig.node.json" }, { "path": "./tsconfig.app.json"}]
5 +
}
test-app/client/tsconfig.node.json (added) +24 −0
1 +
{
2 +
  "compilerOptions": {
3 +
    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4 +
    "target": "ES2022",
5 +
    "lib": ["ES2023"],
6 +
    "module": "ESNext",
7 +
    "skipLibCheck": true,
8 +
9 +
    /* Bundler mode */
10 +
    "moduleResolution": "bundler",
11 +
    "allowImportingTsExtensions": true,
12 +
    "isolatedModules": true,
13 +
    "moduleDetection": "force",
14 +
    "noEmit": true,
15 +
16 +
    /* Linting */
17 +
    "strict": true,
18 +
    "noUnusedLocals": true,
19 +
    "noUnusedParameters": true,
20 +
    "noFallthroughCasesInSwitch": true,
21 +
    "noUncheckedSideEffectImports": true
22 +
  },
23 +
  "include": ["vite.config.ts"]
24 +
}
test-app/client/vite.config.ts (added) +6 −0
1 +
import { defineConfig } from 'vite'
2 +
import react from '@vitejs/plugin-react'
3 +
4 +
export default defineConfig({
5 +
  plugins: [react()],
6 +
})
test-app/package.json (added) +41 −0
1 +
{
2 +
  "name": "test-app",
3 +
  "version": "0.4.0",
4 +
  "description": "A monorepo template built with Bun, Hono, Vite, and React",
5 +
  "author": "Steve Simkins",
6 +
  "license": "MIT",
7 +
  "homepage": "https://github.com/stevedylandev/bhvr",
8 +
  "packageManager": "bun@1.2.4",
9 +
  "workspaces": [
10 +
    "./server",
11 +
    "./client",
12 +
    "./shared"
13 +
  ],
14 +
  "scripts": {
15 +
    "dev": "turbo dev",
16 +
    "dev:client": "turbo dev --filter=client",
17 +
    "dev:server": "turbo dev --filter=server",
18 +
    "build": "turbo build",
19 +
    "build:client": "turbo build --filter=client",
20 +
    "build:server": "turbo build --filter=server",
21 +
    "lint": "turbo lint",
22 +
    "type-check": "turbo type-check",
23 +
    "test": "turbo test",
24 +
    "postinstall": "turbo build --filter=shared --filter=server"
25 +
  },
26 +
  "keywords": [
27 +
    "bun",
28 +
    "hono",
29 +
    "react",
30 +
    "vite",
31 +
    "monorepo",
32 +
    "turbo"
33 +
  ],
34 +
  "devDependencies": {
35 +
    "bun-types": "latest",
36 +
    "turbo": "^2.5.5"
37 +
  },
38 +
  "peerDependencies": {
39 +
    "typescript": "^5.7.3"
40 +
  }
41 +
}
test-app/server/.gitignore (added) +2 −0
1 +
# deps
2 +
node_modules/
test-app/server/README.md (added) +11 −0
1 +
To install dependencies:
2 +
```sh
3 +
bun install
4 +
```
5 +
6 +
To run:
7 +
```sh
8 +
bun run dev
9 +
```
10 +
11 +
open http://localhost:3000
test-app/server/package.json (added) +17 −0
1 +
{
2 +
  "name": "server",
3 +
  "version": "0.0.1",
4 +
  "main": "dist/index.js",
5 +
  "types": "dist/index.d.ts",
6 +
  "scripts": {
7 +
    "build": "tsc",
8 +
    "dev": "bun --watch run src/index.ts"
9 +
  },
10 +
  "dependencies": {
11 +
    "hono": "^4.7.11",
12 +
    "shared": "workspace:*"
13 +
  },
14 +
  "devDependencies": {
15 +
    "@types/bun": "latest"
16 +
  }
17 +
}
test-app/server/src/index.ts (added) +23 −0
1 +
import { Hono } from 'hono'
2 +
import { cors } from 'hono/cors'
3 +
import type { ApiResponse } from 'shared/dist'
4 +
5 +
const app = new Hono()
6 +
7 +
app.use(cors())
8 +
9 +
app.get('/', (c) => {
10 +
  return c.text('Hello Hono!')
11 +
})
12 +
13 +
app.get('/hello', async (c) => {
14 +
15 +
  const data: ApiResponse = {
16 +
    message: "Hello BHVR!",
17 +
    success: true
18 +
  }
19 +
20 +
  return c.json(data, { status: 200 })
21 +
})
22 +
23 +
export default app
test-app/server/tsconfig.json (added) +26 −0
1 +
{
2 +
  "extends": "../tsconfig.json",
3 +
  "compilerOptions": {
4 +
    // Environment settings
5 +
    "lib": ["ESNext"],
6 +
    "target": "ESNext",
7 +
    "module": "ESNext",
8 +
    "jsx": "react-jsx",
9 +
    "jsxImportSource": "hono/jsx",
10 +
11 +
    // Types
12 +
    "types": ["bun-types"],
13 +
14 +
    // Output settings
15 +
    "declaration": true,
16 +
    "outDir": "dist",
17 +
    "noEmit": false,
18 +
    "emitDecoratorMetadata": true,
19 +
20 +
    // Module resolution
21 +
    "moduleResolution": "bundler",
22 +
    "allowImportingTsExtensions": false
23 +
  },
24 +
  "include": ["src/**/*"],
25 +
  "exclude": ["node_modules", "dist"]
26 +
}
test-app/shared/package.json (added) +13 −0
1 +
{
2 +
  "name": "shared",
3 +
  "version": "0.0.1",
4 +
  "main": "dist/index.js",
5 +
  "types": "dist/index.d.ts",
6 +
  "scripts": {
7 +
    "build": "tsc",
8 +
    "dev": "tsc --watch"
9 +
  },
10 +
  "devDependencies": {
11 +
    "typescript": "^5.8.3"
12 +
  }
13 +
}
test-app/shared/src/index.ts (added) +1 −0
1 +
export * from "./types"
test-app/shared/src/types/index.ts (added) +4 −0
1 +
export type ApiResponse = {
2 +
  message: string;
3 +
  success: true;
4 +
}
test-app/shared/tsconfig.json (added) +24 −0
1 +
{
2 +
  "extends": "../tsconfig.json",
3 +
  "compilerOptions": {
4 +
    // Environment setup
5 +
    "lib": ["ESNext"],
6 +
    "target": "ESNext",
7 +
    "module": "ESNext",
8 +
9 +
    // Output configuration
10 +
    "declaration": true,
11 +
    "outDir": "./dist",
12 +
    "noEmit": false,
13 +
14 +
    // Type checking
15 +
    "strict": true,
16 +
    "skipLibCheck": true,
17 +
18 +
    // Additional checks
19 +
    "noFallthroughCasesInSwitch": true,
20 +
    "noUncheckedIndexedAccess": true
21 +
  },
22 +
  "include": ["src/**/*"],
23 +
  "exclude": ["node_modules", "**/*.test.ts", "dist"]
24 +
}
test-app/tsconfig.json (added) +32 −0
1 +
{
2 +
  "compilerOptions": {
3 +
    // Environment setup & latest features
4 +
    "lib": ["ESNext", "DOM", "DOM.Iterable"],
5 +
    "target": "ESNext",
6 +
    "module": "ESNext",
7 +
    "moduleDetection": "force",
8 +
    "jsx": "react-jsx",
9 +
    "allowJs": true,
10 +
11 +
    // Module resolution
12 +
    "moduleResolution": "bundler",
13 +
    "allowSyntheticDefaultImports": true,
14 +
    "esModuleInterop": true,
15 +
    "verbatimModuleSyntax": true,
16 +
17 +
    // Strictness and best practices
18 +
    "strict": true,
19 +
    "forceConsistentCasingInFileNames": true,
20 +
    "noFallthroughCasesInSwitch": true,
21 +
    "noUncheckedIndexedAccess": true,
22 +
    "experimentalDecorators": true,
23 +
24 +
    // Output control
25 +
    "skipLibCheck": true,
26 +
27 +
    // Optional strict flags (disabled by default)
28 +
    "noUnusedLocals": false,
29 +
    "noUnusedParameters": false,
30 +
    "noPropertyAccessFromIndexSignature": false
31 +
  }
32 +
}
test-app/turbo.json (added) +148 −0
1 +
{
2 +
    "$schema": "https://turbo.build/schema.json",
3 +
    "ui": "tui",
4 +
    "tasks": {
5 +
        "build": {
6 +
            "dependsOn": [
7 +
                "^build"
8 +
            ],
9 +
            "inputs": [
10 +
                "src/**/*.ts",
11 +
                "src/**/*.tsx",
12 +
                "src/**/*.js",
13 +
                "src/**/*.jsx",
14 +
                "src/**/*.json",
15 +
                "tsconfig.json",
16 +
                "tsconfig.*.json",
17 +
                "vite.config.ts",
18 +
                "package.json",
19 +
                "bun.lock",
20 +
                "eslint.config.js",
21 +
                "index.html"
22 +
            ],
23 +
            "outputs": [
24 +
                "dist/**",
25 +
                "build/**",
26 +
                ".turbo/**"
27 +
            ],
28 +
            "env": [
29 +
                "NODE_ENV",
30 +
                "VITE_*"
31 +
            ]
32 +
        },
33 +
        "dev": {
34 +
            "cache": false,
35 +
            "persistent": true,
36 +
            "inputs": [
37 +
                "src/**/*.ts",
38 +
                "src/**/*.tsx",
39 +
                "src/**/*.js",
40 +
                "src/**/*.jsx",
41 +
                "tsconfig.json",
42 +
                "tsconfig.*.json",
43 +
                "vite.config.ts",
44 +
                "package.json"
45 +
            ],
46 +
            "env": [
47 +
                "NODE_ENV",
48 +
                "PORT",
49 +
                "VITE_*"
50 +
            ]
51 +
        },
52 +
        "lint": {
53 +
            "dependsOn": [
54 +
                "^build"
55 +
            ],
56 +
            "inputs": [
57 +
                "src/**/*.ts",
58 +
                "src/**/*.tsx",
59 +
                "src/**/*.js",
60 +
                "src/**/*.jsx",
61 +
                "eslint.config.js",
62 +
                ".eslintrc*",
63 +
                "package.json",
64 +
                "tsconfig.json",
65 +
                "tsconfig.*.json"
66 +
            ],
67 +
            "outputs": [
68 +
                ".eslintcache"
69 +
            ],
70 +
            "env": [
71 +
                "NODE_ENV"
72 +
            ]
73 +
        },
74 +
        "type-check": {
75 +
            "dependsOn": [
76 +
                "^build"
77 +
            ],
78 +
            "inputs": [
79 +
                "src/**/*.ts",
80 +
                "src/**/*.tsx",
81 +
                "src/**/*.d.ts",
82 +
                "tsconfig.json",
83 +
                "tsconfig.*.json",
84 +
                "package.json"
85 +
            ],
86 +
            "outputs": [
87 +
                "dist/**/*.d.ts",
88 +
                ".tsbuildinfo"
89 +
            ],
90 +
            "env": [
91 +
                "NODE_ENV"
92 +
            ]
93 +
        },
94 +
        "test": {
95 +
            "dependsOn": [
96 +
                "^build"
97 +
            ],
98 +
            "inputs": [
99 +
                "src/**/*.ts",
100 +
                "src/**/*.tsx",
101 +
                "src/**/*.js",
102 +
                "src/**/*.jsx",
103 +
                "test/**/*.ts",
104 +
                "test/**/*.tsx",
105 +
                "test/**/*.js",
106 +
                "test/**/*.jsx",
107 +
                "__tests__/**/*.ts",
108 +
                "__tests__/**/*.tsx",
109 +
                "**/*.test.ts",
110 +
                "**/*.test.tsx",
111 +
                "**/*.spec.ts",
112 +
                "**/*.spec.tsx",
113 +
                "jest.config.*",
114 +
                "vitest.config.*",
115 +
                "package.json",
116 +
                "tsconfig.json",
117 +
                "tsconfig.*.json"
118 +
            ],
119 +
            "outputs": [
120 +
                "coverage/**",
121 +
                ".nyc_output/**",
122 +
                "test-results/**"
123 +
            ],
124 +
            "env": [
125 +
                "NODE_ENV",
126 +
                "CI"
127 +
            ]
128 +
        }
129 +
    },
130 +
    "globalDependencies": [
131 +
        "**/.env",
132 +
        "**/.env.*",
133 +
        "**/.env.local",
134 +
        "**/.env.*.local",
135 +
        ".gitignore",
136 +
        "turbo.json",
137 +
        "package.json",
138 +
        "bun.lock",
139 +
        "tsconfig.json"
140 +
    ],
141 +
    "globalEnv": [
142 +
        "NODE_ENV",
143 +
        "CI",
144 +
        "TURBO_TOKEN",
145 +
        "TURBO_TEAM",
146 +
        "TURBO_REMOTE_ONLY"
147 +
    ]
148 +
}