diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 4de68113bd..1c0a7232f0 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -16,6 +16,16 @@ body: - `router` Discussions tab: https://github.com/tanstack/router/discussions The more information you fill in, the better the community can help you. + - type: dropdown + id: project + attributes: + label: Which project does this relate to? + description: If you are unsure, please leave this as "Router". + options: + - Router + - Start + validations: + required: true - type: textarea id: description attributes: diff --git a/.github/renovate.json b/.github/renovate.json index 66367ceae5..fcdf2db6d9 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -32,6 +32,7 @@ "typescript52", "typescript53", "typescript54", + "typescript55", "unplugin", "use-sync-external-store", "waku" diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 8bee4aac3e..58184731f3 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -27,7 +27,7 @@ jobs: - name: Setup Tools uses: tanstack/config/.github/setup@main - name: Get base and head commits for `nx affected` - uses: nrwl/nx-set-shas@v4.0.6 + uses: nrwl/nx-set-shas@v4.1.0 with: main-branch-name: main - name: Run Checks diff --git a/docs/config.json b/docs/config.json index 93e3e287b7..e36001d3a7 100644 --- a/docs/config.json +++ b/docs/config.json @@ -72,6 +72,10 @@ "label": "File-Based Routing", "to": "framework/react/guide/file-based-routing" }, + { + "label": "Virtual File Routes", + "to": "framework/react/guide/virtual-file-routes" + }, { "label": "Code Based Routing", "to": "framework/react/guide/code-based-routing" @@ -214,6 +218,10 @@ { "label": "Static Prerendering", "to": "framework/react/start/static-prerendering" + }, + { + "label": "Path Aliases", + "to": "framework/react/start/path-aliases" } ] } @@ -234,6 +242,19 @@ } ] }, + { + "label": "ESLint", + "children": [ + { + "label": "ESLint Plugin Router", + "to": "eslint/eslint-plugin-router" + }, + { + "label": "Create Route Property Order", + "to": "eslint/create-route-property-order" + } + ] + }, { "label": "Router Examples", "children": [], @@ -344,6 +365,10 @@ "label": "Basic + DIY Auth", "to": "framework/react/examples/start-basic-auth" }, + { + "label": "Basic + Supabase Auth", + "to": "framework/react/examples/start-supabase-basic" + }, { "label": "Trellaux + Convex", "to": "framework/react/examples/start-convex-trellaux" diff --git a/docs/eslint/create-route-property-order.md b/docs/eslint/create-route-property-order.md new file mode 100644 index 0000000000..fa82f1dc57 --- /dev/null +++ b/docs/eslint/create-route-property-order.md @@ -0,0 +1,57 @@ +--- +id: create-route-property-order +title: Ensure correct order of inference sensitive properties for createRoute functions +--- + +For the following functions, the property order of the passed in object matters due to type inference: + +- `createRoute` +- `createFileRoute` +- `createRootRoute` +- `createRootRouteWithContext` + +The correct property order is as follows: + +- `params` +- `validateSearch` +- `context` +- `beforeLoad` +- `loaderDeps` +- `loader` + +All other properties are insensitive to the order as they do not depend on type inference. + +## Rule Details + +Examples of **incorrect** code for this rule: + +```tsx +/* eslint "@tanstack/router/create-route-property-order": "warn" */ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/foo/bar/$id')({ + loader: async ({context}) => { + await context.queryClient.ensureQueryData(getQueryOptions(context.hello)), + }, + beforeLoad: () => ({hello: 'world'}) +}) +``` + +Examples of **correct** code for this rule: + +```tsx +/* eslint "@tanstack/router/create-route-property-order": "warn" */ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/foo/bar/$id')({ + beforeLoad: () => ({hello: 'world'}), + loader: async ({context}) => { + await context.queryClient.ensureQueryData(getQueryOptions(context.hello)), + } +}) +``` + +## Attributes + +- [x] βœ… Recommended +- [x] πŸ”§ Fixable diff --git a/docs/eslint/eslint-plugin-router.md b/docs/eslint/eslint-plugin-router.md new file mode 100644 index 0000000000..ccfd7d1572 --- /dev/null +++ b/docs/eslint/eslint-plugin-router.md @@ -0,0 +1,96 @@ +--- +id: eslint-plugin-router +title: ESLint Plugin Router +--- + +TanStack Router comes with its own ESLint plugin. This plugin is used to enforce best practices and to help you avoid common mistakes. + +## Installation + +The plugin is a separate package that you need to install: + +```bash +$ npm i -D @tanstack/eslint-plugin-router +``` + +or + +```bash +$ pnpm add -D @tanstack/eslint-plugin-router +``` + +or + +```bash +$ yarn add -D @tanstack/eslint-plugin-router +``` + +or + +```bash +$ bun add -D @tanstack/eslint-plugin-router +``` + +## Flat Config (`eslint.config.js`) + +### Recommended setup + +To enable all of the recommended rules for our plugin, add the following config: + +```js +import pluginRouter from '@tanstack/eslint-plugin-router' + +export default [ + ...pluginRouter.configs['flat/recommended'], + // Any other config... +] +``` + +### Custom setup + +Alternatively, you can load the plugin and configure only the rules you want to use: + +```js +import pluginRouter from '@tanstack/eslint-plugin-router' + +export default [ + { + plugins: { + '@tanstack/router': pluginRouter, + }, + rules: { + '@tanstack/router/create-route-property-order': 'error', + }, + }, + // Any other config... +] +``` + +## Legacy Config (`.eslintrc`) + +### Recommended setup + +To enable all of the recommended rules for our plugin, add `plugin:@tanstack/eslint-plugin-router/recommended` in extends: + +```json +{ + "extends": ["plugin:@tanstack/eslint-plugin-router/recommended"] +} +``` + +### Custom setup + +Alternatively, add `@tanstack/eslint-plugin-router` to the plugins section, and configure the rules you want to use: + +```json +{ + "plugins": ["@tanstack/eslint-plugin-router"], + "rules": { + "@tanstack/router/create-route-property-order": "error" + } +} +``` + +## Rules + +- [@tanstack/router/create-route-property-order](../create-route-property-order) diff --git a/docs/framework/react/comparison.md b/docs/framework/react/comparison.md index e7cce153b3..56ba0e41cc 100644 --- a/docs/framework/react/comparison.md +++ b/docs/framework/react/comparison.md @@ -25,6 +25,7 @@ Feature/Capability Key: | Typesafe Routes | βœ… | πŸ›‘ | 🟑 | | Code-based Routes | βœ… | βœ… | πŸ›‘ | | File-based Routes | βœ… | βœ… | βœ… | +| Virtual/Programmatic File-based Routes | βœ… | βœ… | πŸ›‘ | | Router Loaders | βœ… | βœ… | βœ… | | SWR Loader Caching | βœ… | πŸ›‘ | βœ… | | Route Prefetching | βœ… | βœ… | βœ… | diff --git a/docs/framework/react/guide/code-based-routing.md b/docs/framework/react/guide/code-based-routing.md index 4d361b1b2d..41ad6d415e 100644 --- a/docs/framework/react/guide/code-based-routing.md +++ b/docs/framework/react/guide/code-based-routing.md @@ -302,6 +302,12 @@ const layoutBRoute = createRoute({ getParentRoute: () => layoutRoute, path: 'layout-b', }) + +const routeTree = rootRoute.addChildren([ + // The layout route has no path, only an id + // So its children will be nested under the layout route + layoutRoute.addChildren([layoutARoute, layoutBRoute]), +]) ``` Now both `/layout-a` and `/layout-b` will render the their contents inside of the `LayoutComponent`: diff --git a/docs/framework/react/guide/external-data-loading.md b/docs/framework/react/guide/external-data-loading.md index 4f29532248..c0907b8314 100644 --- a/docs/framework/react/guide/external-data-loading.md +++ b/docs/framework/react/guide/external-data-loading.md @@ -175,7 +175,7 @@ export function createRouter() { // On the client, hydrate the loader client with the data // we dehydrated on the server hydrate: (dehydrated) => { - hydrate(client, dehydrated.queryClientState) + hydrate(queryClient, dehydrated.queryClientState) }, // Optionally, we can use `Wrap` to wrap our router in the loader client provider Wrap: ({ children }) => { diff --git a/docs/framework/react/guide/file-based-routing.md b/docs/framework/react/guide/file-based-routing.md index a54037493b..02acb404b8 100644 --- a/docs/framework/react/guide/file-based-routing.md +++ b/docs/framework/react/guide/file-based-routing.md @@ -2,7 +2,7 @@ title: File-Based Routing --- -Most of the TanStack Router documentation is written for file-based routing and is intended to help you understand in more detail how to configure file-based routing and the technical details behind how it works. While file-based routing is the preferred and recommended way to configure TanStack Router, you can also use [code-based routing](./code-based-routing) if you prefer. +Most of the TanStack Router documentation is written for file-based routing and is intended to help you understand in more detail how to configure file-based routing and the technical details behind how it works. While file-based routing is the preferred and recommended way to configure TanStack Router, you can also use [code-based routing](./code-based-routing.md) if you prefer. ## What is File-Based Routing? @@ -87,6 +87,44 @@ It's extremely likely that a 100% directory or flat route structure won't be the Both flat and directory routes can be mixed together to create a route tree that uses the best of both worlds where it makes sense. +## Virtual File Routes + +> We'd like to thank the Remix team for [pioneering the concept of virtual file routes](https://www.youtube.com/watch?v=fjTX8hQTlEc&t=730s). We've taken inspiration from their work and adapted it to work with TanStack Router's existing file-based route-tree generation. + +Virtual file routes are a powerful concept that allows you to build a route tree programmatically using code that references real files in your project. This can be useful if: + +- You have an existing route organization that you want to keep. +- You want to customize the location of your route files. +- You want to completely override TanStack Router's file-based route generation and build your own convention. + +Here's a quick example of using virtual file routes to map a route tree to a set of real files in your project: + +```tsx +import { + rootRoute, + route, + index, + layout, + physical, +} from '@tanstack/virtual-file-routes' + +const virtualRouteConfig = rootRoute('root.tsx', [ + index('index.tsx'), + layout('layout.tsx', [ + route('/dashboard', 'app/dashboard.tsx', [ + index('app/dashboard-index.tsx'), + route('/invoices', 'app/dashboard-invoices.tsx', [ + index('app/invoices-index.tsx'), + route('$id', 'app/invoice-detail.tsx'), + ]), + ]), + physical('/posts', 'posts'), + ]), +]) +``` + +For more information on how to configure virtual file routes, see the [Virtual File Routes](./virtual-file-routes.md) guide. + ## Dynamic Path Params Dynamic path params can be used in both flat and directory routes to create routes that can match a dynamic segment of the URL path. Dynamic path params are denoted by the `$` character in the filename: @@ -96,7 +134,7 @@ Dynamic path params can be used in both flat and directory routes to create rout | ... | ... | ... | | Κ¦ `posts.$postId.tsx` | `/posts/$postId` | `` | -We'll learn more about dynamic path params in the [Path Params](./path-params) guide. +We'll learn more about dynamic path params in the [Path Params](./path-params.md) guide. ## Pathless Routes @@ -133,8 +171,10 @@ File-based routing requires that you follow a few simple file naming conventions - A folder that matches this pattern is treated as a **route group** which prevents this folder to be included in the route's URL path. - **`index` Token** - Routes segments ending with the `index` token (but before any file types) will be used to match the parent route when the URL pathname matches the parent route exactly. + This can be configured via the `indexToken` configuration option, see [options](#options). - **`.route.tsx` File Type** - When using directories to organize your routes, the `route` suffix can be used to create a route file at the directory's path. For example, `blog.post.route.tsx` or `blog/post/route.tsx` can be used at the route file for the `/blog/post` route. + This can be configured via the `routeToken` configuration option, see [options](#options). - **`.lazy.tsx` File Type** - The `lazy` suffix can be used to code-split components for a route. For example, `blog.post.lazy.tsx` will be used as the component for the `blog.post` route. @@ -331,6 +371,10 @@ The following options are available for configuration via the `tsr.config.json` - (Optional, **Defaults to `-`**) Route files and directories that start with this string will be ignored. By default this is set to `-` to allow for the use of directories to house related files that do not contain any route files. - **`routeFileIgnorePattern`** - (Optional) Ignore specific files and directories in the route directory. It can be used in regular expression format. For example, `.((css|const).ts)|test-page` will ignore files / directories with names containing `.css.ts`, `.const.ts` or `test-page`. +- **`indexToken`** + - (Optional, **Defaults to `'index'`**) allows to customize the `index` Token [file naming convention](#file-naming-conventions). +- **`routeToken`** + - (Optional, **Defaults to `'route'`**) allows to customize the `route` Token [file naming convention](#file-naming-conventions). - **`routesDirectory`** - (Required) The directory containing the routes relative to the cwd. - **`generatedRouteTree`** diff --git a/docs/framework/react/guide/navigation.md b/docs/framework/react/guide/navigation.md index a493604ccf..3eaa0f0969 100644 --- a/docs/framework/react/guide/navigation.md +++ b/docs/framework/react/guide/navigation.md @@ -206,6 +206,7 @@ It's also common to want to update a single search param without supplying any o ```tsx const link = ( ({ ...prev, page: prev.page + 1, diff --git a/docs/framework/react/guide/route-trees.md b/docs/framework/react/guide/route-trees.md index ff16339f00..eb29a7e93c 100644 --- a/docs/framework/react/guide/route-trees.md +++ b/docs/framework/react/guide/route-trees.md @@ -16,11 +16,13 @@ the [Code-Based Routing](./code-based-routing.md) guide. ## Route Trees -Nested routing is a powerful concept that allows you to use a URL to render a nested component tree. For example, given the URL of `/blog/posts/123`, you could match a path hierarchy that looks like this: +Nested routing is a powerful concept that allows you to use a URL to render a nested component tree. For example, given the URL of `/blog/posts/123`, you could create a route hierarchy that looks like this: -- /blog - - /posts - - /$postId +```tsx +β”œβ”€β”€ blog +β”‚ β”œβ”€β”€ posts +β”‚ β”‚ β”œβ”€β”€ $postId +``` And render a component tree that looks like this: @@ -32,7 +34,7 @@ And render a component tree that looks like this: ``` -A file-based route tree might look something like this: +Let's take that concept and expand it out to a larger site structure, but with file-names now: ``` /routes @@ -53,20 +55,16 @@ A file-based route tree might look something like this: β”‚ β”œβ”€β”€ $.tsx ``` -There's a lot of power and convention to unpack with file-based routing, so let's break it down a bit. +The above is a valid route tree configuration that can be used with TanStack Router! There's a lot of power and convention to unpack with file-based routing, so let's break it down a bit. ## Route Tree Configuration -Route trees can be represented using a number of different ways: - -- [Flat Routes](./route-trees.md#flat-routes) -- [Directory Routes](./route-trees.md#directory-routes) -- [Mixed Flat and Directory Routes](./route-trees.md#mixed-flat-and-directory-routes) -- [Code-Based Routes](./route-trees.md#code-based-routes) -- [Case-Sensitivity](./route-trees.md#case-sensitivity) - -For a birds-eye view, the route tree examples below showcase the [Routing Concepts](./routing-concepts.md) that are available in TanStack Router, but please be sure to check out the full documentation links above for each type of route tree, or just proceed to the next section to get started with file-based routing. +Route trees can be configured using a few different ways: -## Case-Sensitivity +- [Flat Routes](./file-based-routing.md#flat-routes) +- [Directories](./file-based-routing.md#directory-routes) +- [Mixed Flat Routes and Directories](./file-based-routing.md#mixed-flat-and-directory-routes) +- [Virtual File Routes](./file-based-routing.md#virtual-file-routes) +- [Code-Based Routes](./code-based-routing.md) -Route paths are **not case-sensitive** _by default_. This means that `about.tsx` and `AbOuT.tsx` are considered the same path out-of-the box. This is a good thing, since this is the way most of the web works anyway! That said, if you truly want to be weird and match a path with a different case, you can set a route's `caseSensitive` option to `true`. +Please be sure to check out the full documentation links above for each type of route tree, or just proceed to the next section to get started with file-based routing. diff --git a/docs/framework/react/guide/routing-concepts.md b/docs/framework/react/guide/routing-concepts.md index cafa3d5e49..b3febed35e 100644 --- a/docs/framework/react/guide/routing-concepts.md +++ b/docs/framework/react/guide/routing-concepts.md @@ -8,7 +8,7 @@ TanStack Router supports a number of powerful routing concepts that allow you to - [Static Routes](./routing-concepts.md#static-routes) - [Index Routes](./routing-concepts.md#index-routes) - [Dynamic Route Segments](./routing-concepts.md#dynamic-route-segments) -- [Splat / Catch-All Routes](./routing-concept.md#splat--catch-all-routes) +- [Splat / Catch-All Routes](./routing-concepts.md#splat--catch-all-routes) - [Pathless Routes](./routing-concepts.md#pathless--layout-routes) - [Non-Nested Routes](./routing-concepts.md#non-nested-routes) - [Not-Found Routes](./routing-concepts.md#404--notfoundroutes) diff --git a/docs/framework/react/guide/search-params.md b/docs/framework/react/guide/search-params.md index abd516038a..1db3a02c87 100644 --- a/docs/framework/react/guide/search-params.md +++ b/docs/framework/react/guide/search-params.md @@ -427,7 +427,10 @@ Now that you've learned how to read your route's search params, you'll be happy ### `` -The best way to update search params is to use the `search` prop on the `` component. Remember, if a `to` prop is omitted, will update the search for the current page. Here's an example: +The best way to update search params is to use the `search` prop on the `` component. + +If the search for the current page shall be updated and the `from` prop is specified, the `to` prop can be omitted. +Here's an example: ```tsx // /routes/shop.products.tsx @@ -449,6 +452,42 @@ const ProductList = () => { } ``` +If you want to update the search params in a generic component that is rendered on multiple routes, specifiying `from` can be challenging. + +In this scenario you can set `to="."` which will give you access to loosely typed search params. +Here is an example that illustrates this: + +```tsx +// `page` is a search param that is defined in the __root route and hence available on all routes. +const PageSelector = () => { + return ( +
+ ({ ...prev, page: prev.page + 1 })}> + Next Page + +
+ ) +} +``` + +If the generic component is only rendered in a specific subtree of the route tree, you can specify that subtree using `from`. Here you can omit `to='.'` if you want. + +```tsx +// `page` is a search param that is defined in the /posts route and hence available on all of its child routes. +const PageSelector = () => { + return ( +
+ ({ ...prev, page: prev.page + 1 })} + > + Next Page + +
+ ) +``` + ### `useNavigate(), navigate({ search })` The `navigate` function also accepts a `search` option that works the same way as the `search` prop on ``: diff --git a/docs/framework/react/guide/server-functions.md b/docs/framework/react/guide/server-functions.md deleted file mode 100644 index 8628fc2ef5..0000000000 --- a/docs/framework/react/guide/server-functions.md +++ /dev/null @@ -1,259 +0,0 @@ ---- -id: server-functions -title: Server Functions ---- - -As [TanStack Start](./tanstack-start.md) is a full-stack framework, we need a way to call a function on the client which then executes some code on the server. - -This is where Server Functions come in. - -## What are Server Functions? - -> [!TIP] -> You can think of Server Functions like mini-portals that let your users trigger a pre-defined action on the server (like a built-in RPC solution 🀯). - -Server Functions are actions that can be executed on the server from the client or from other server functions. - -When a server function is called, it will execute the server-side code and return the result to the caller (regardless of whether the caller is a client or another server function). - -Server Functions are more than just a way to send and receive data. They're like a bridge that lets you connect your backend code (the behind-the-scenes magic) directly to your frontend code (what the user sees), making it easier to build a seamless user experience. - -## How to use Server Functions in TanStack Start - -While some frameworks use special pragmas to denote a function that will execute on the server, Start uses a utility to -create an instance of a server function. - -```typescript -const yourFn = createServerFn('POST', async () => { - // Server-side code lives here -}) -``` - -This function can then be called from the client: - -```tsx -function Component() { - // Just to demonstrate that this is a client-side function - const buttonRef = (el: HTMLButtonElement) => { - if (!el) return - el.addEventListener('click', async () => { - const result = await yourFn() - console.info(result) - }) - } - - return -} - -// Or, even just: -function Component() { - return -} -``` - -Or from another server function: - -```typescript -const yourFn2 = createServerFn('POST', async () => { - const result = await yourFn() - console.info(result) -}) -``` - -Or even from other server-side code: - -```typescript -async function someServerFunction() { - const result = await yourFn() - console(result) -} -``` - -When this function is called from the client, it will make a request to the server, execute the server-side code, and -return the serialized result to the client. - -## Server Function Arguments - -Like any function, server functions can take arguments: - -```typescript -const yourFn = createServerFn('POST', async (val: number) => { - // Server-side code lives here -}) - -// Call it like this: -yourFn(123) -``` - -Only one argument is supported, but you can pass an object if you need to pass multiple values: - -```typescript -const yourFn = createServerFn('POST', async (obj: { a: number; b: number }) => { - // Server-side code lives here -}) -``` - -Any serializable value can be passed as an argument to a server function. - -## Serialization - -Anything that can be serialized via `JSON.stringify` and `JSON.parse` can be used as an argument to or returned from a -server function. - -This includes: - -- `string` -- `number` -- `boolean` -- `null` -- `Array` -- `Object` - -In addition, we support serializing the following: - -- [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream)s of other serializable types -- [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)s of other - serializable types - -## No-JS Server Functions - -Without JavaScript enabled, there's only one way to execute server functions: by submitting a form. - -This is done by adding a `form` element to the page -with [the HTML attribute `action`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/action). - -> Notice that we mentioned the **HTML** attribute `action`. This attribute only accepts a string in HTML, just like all -> other attributes. -> -> While React -> 19 [added support for passing a function to `action`](https://react.dev/reference/react-dom/components/form#form), -> it's -> a React-specific feature and not part of the HTML standard. - -The `action` attribute tells the browser where to send the form data when the form is submitted. In this case, we want -to send the form data to the server function. - -To do this, we can utilize the `url` property of the server function: - -```typescript -const yourFn = createServerFn('POST', async () => { - // Server-side code lives here -}) - -console.info(yourFn.url) -``` - -And pass this to the `action` attribute of the form: - -```tsx -function Component() { - return ( -
- -
- ) -} -``` - -When the form is submitted, the server function will be executed. - -### No-JS Server Function Arguments - -To pass arguments to a server function when submitting a form, you can use the `input` element with the `name` attribute -to attach the argument to the [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData) passed to your -server function: - -```tsx -const yourFn = createServerFn('POST', async (formData: FormData) => { - // `val` will be '123' - const val = formData.get('val') - // ... -}) - -function Component() { - return ( - // We need to tell the server that our data type is `multipart/form-data` by setting the `encType` attribute on the form. -
- - -
- ) -} -``` - -When the form is submitted, the server function will be executed with the form's data as an argument. - -### No-JS Server Function Return Value - -Regardless of whether JavaScript is enabled, the server function will return a response to the HTTP request made from -the client. - -When JavaScript is enabled, this response can be accessed as the return value of the server function in the client's -JavaScript code. - -```typescript -const yourFn = createServerFn('POST', async () => { - return 'Hello, world!' -}) - -// `.then` is not available when JavaScript is disabled -yourFn().then(console.log) -``` - -However, when JavaScript is disabled, there is no way to access the return value of the server function in the client's -JavaScript code. - -Instead, the server function can provide a response to the client, telling the browser to navigate in a certain way. - -When combined with a `loader`, we're able to provide an experience similar to a single-page application, even when -JavaScript is disabled; -all by telling the browser to reload the current page with new data piped through the `loader`: - -```tsx -import * as fs from 'fs' -import { createFileRoute } from '@tanstack/react-router' -import { createServerFn } from '@tanstack/start' - -const filePath = 'count.txt' - -async function readCount() { - return parseInt( - await fs.promises.readFile(filePath, 'utf-8').catch(() => '0'), - ) -} - -const getCount = createServerFn('GET', () => { - return readCount() -}) - -const updateCount = createServerFn('POST', async (formData: FormData) => { - const count = await readCount() - const addBy = Number(formData.get('addBy')) - await fs.promises.writeFile(filePath, `${count + addBy}`) - // Reload the page to trigger the loader again - return new Response('ok', { status: 301, headers: { Location: '/' } }) -}) - -export const Route = createFileRoute('/')({ - component: Home, - loader: async () => await getCount(), -}) - -function Home() { - const state = Route.useLoaderData() - - return ( -
-
- - -
-
{state}
-
- ) -} -``` diff --git a/docs/framework/react/guide/ssr.md b/docs/framework/react/guide/ssr.md index a166415230..8959423a8b 100644 --- a/docs/framework/react/guide/ssr.md +++ b/docs/framework/react/guide/ssr.md @@ -21,7 +21,7 @@ Non-Streaming server-side rendering is the classic process of rendering the mark To implement non-streaming SSR with TanStack Router, you will need the following utilities: -- `StartServer` from `@tanstack/start` +- `StartServer` from `@tanstack/start/server` - e.g. `` - Rendering this component in your server entry will render your application and also automatically handle application-level hydration/dehydration and implement the `Wrap` component option on `Router` - `StartClient` from `@tanstack/start` @@ -142,7 +142,7 @@ Here is a complete example of a server entry file that uses all of the concepts import * as React from 'react' import ReactDOMServer from 'react-dom/server' import { createMemoryHistory } from '@tanstack/react-router' -import { StartServer } from '@tanstack/start' +import { StartServer } from '@tanstack/start/server' import { createRouter } from './router' export async function render(url, response) { diff --git a/docs/framework/react/guide/type-safety.md b/docs/framework/react/guide/type-safety.md index 0cc6c0fc1d..8d7d60744f 100644 --- a/docs/framework/react/guide/type-safety.md +++ b/docs/framework/react/guide/type-safety.md @@ -161,12 +161,11 @@ Consider the following usage of `Link` ```tsx - ``` -**These examples are bad for TS performance**. That's because `search` resolves to a union of all `search` params for all routes and TS has to check whatever you pass to the `search` prop against this potentially big union. As your application grows, this check time will increase linearly to number of routes and search params. We have done our best to optimize for this case (TypeScript will typically do this work once and cache it) but the initial check against this large union is expensive. This also applies to `params` and other API's such as `useSearch`, `useParams`, `useNavigate` etc +**These examples are bad for TS performance**. That's because `search` resolves to a union of all `search` params for all routes and TS has to check whatever you pass to the `search` prop against this potentially big union. As your application grows, this check time will increase linearly to number of routes and search params. We have done our best to optimize for this case (TypeScript will typically do this work once and cache it) but the initial check against this large union is expensive. This also applies to `params` and other API's such as `useSearch`, `useParams`, `useNavigate` etc. -Instead you should try to narrow to relevant routes with `from` or `to` +Instead you should try to narrow to relevant routes with `from` or `to`. ```tsx @@ -180,7 +179,7 @@ const from: '/posts/$postId/deep' | '/posts/' = '/posts/' ``` -You can also pass branches to `from` to only resolve `search` or `params` to be from any descendants of that branch +You can also pass branches to `from` to only resolve `search` or `params` to be from any descendants of that branch: ```tsx const from = '/posts' diff --git a/docs/framework/react/guide/virtual-file-routes.md b/docs/framework/react/guide/virtual-file-routes.md new file mode 100644 index 0000000000..d8abcdffe8 --- /dev/null +++ b/docs/framework/react/guide/virtual-file-routes.md @@ -0,0 +1,310 @@ +--- +id: virtual-file-routes +title: Virtual File Routes +--- + +> We'd like to thank the Remix team for [pioneering the concept of virtual file routes](https://www.youtube.com/watch?v=fjTX8hQTlEc&t=730s). We've taken inspiration from their work and adapted it to work with TanStack Router's existing file-based route-tree generation. + +Virtual file routes are a powerful concept that allows you to build a route tree programmatically using code that references real files in your project. This can be useful if: + +- You have an existing route organization that you want to keep. +- You want to customize the location of your route files. +- You want to completely override TanStack Router's file-based route generation and build your own convention. + +Here's a quick example of using virtual file routes to map a route tree to a set of real files in your project: + +```tsx +import { + rootRoute, + route, + index, + layout, + physical, +} from '@tanstack/virtual-file-routes' + +const virtualRouteConfig = rootRoute('root.tsx', [ + index('index.tsx'), + layout('layout.tsx', [ + route('/dashboard', 'app/dashboard.tsx', [ + index('app/dashboard-index.tsx'), + route('/invoices', 'app/dashboard-invoices.tsx', [ + index('app/invoices-index.tsx'), + route('$id', 'app/invoice-detail.tsx'), + ]), + ]), + physical('/posts', 'posts'), + ]), +]) +``` + +## Configuration + +Virtual file routes can be configured either via: + +- The `TanStackRouter` plugin for Vite/Rspack/Webpack +- The `tsr.config.json` file for the TanStack Router CLI + +## Configuration via the TanStackRouter Plugin + +If you're using the `TanStackRouter` plugin for Vite/Rspack/Webpack, you can configure virtual file routes by passing a `virtualRoutesConfig` option to the plugin: + +```tsx +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import { TanStackRouterVite } from '@tanstack/router-plugin/vite' +import { rootRoute } from '@tanstack/virtual-file-routes' + +const routes = rootRoute('root.tsx', [ + // ... the rest of your virtual route tree +]) + +export default defineConfig({ + plugins: [TanStackRouterVite({ virtualRouteConfig: routes }), react()], +}) +``` + +## Creating Virtual File Routes + +To create virtual file routes, you'll need to import the `@tanstack/virtual-file-routes` package. This package provides a set of functions that allow you to create virtual routes that reference real files in your project. A few utility functions are exported from the package: + +- `rootRoute` - Creates a virtual root route. +- `route` - Creates a virtual route. +- `index` - Creates a virtual index route. +- `layout` - Creates a virtual layout route. +- `physical` - Creates a physical virtual route (more on this later). + +## Virtual Root Route + +The `rootRoute` function is used to create a virtual root route. It takes a file name and an array of children routes. Here's an example of a virtual root route: + +```tsx +import { rootRoute } from '@tanstack/virtual-file-routes' + +const virtualRouteConfig = rootRoute('root.tsx', [ + // ... children routes +]) +``` + +## Virtual Route + +The `route` function is used to create a virtual route. It takes a path, a file name, and an array of children routes. Here's an example of a virtual route: + +```tsx +import { route } from '@tanstack/virtual-file-routes' + +const virtualRouteConfig = rootRoute('root.tsx', [ + route('/about', 'about.tsx', [ + // ... children routes + ]), +]) +``` + +## Virtual Index Route + +The `index` function is used to create a virtual index route. It takes a file name. Here's an example of a virtual index route: + +```tsx +import { index } from '@tanstack/virtual-file-routes' + +const virtualRouteConfig = rootRoute('root.tsx', [index('index.tsx')]) +``` + +## Virtual Layout Route + +The `layout` function is used to create a virtual layout route. It takes a file name, an array of children routes, and an optional layout ID. Here's an example of a virtual layout route: + +```tsx +import { layout } from '@tanstack/virtual-file-routes' + +const virtualRouteConfig = rootRoute('root.tsx', [ + layout('layout.tsx', [ + // ... children routes + ]), +]) +``` + +You can also specify a layout ID to give the layout a unique identifier that is different from the filename: + +```tsx +import { layout } from '@tanstack/virtual-file-routes' + +const virtualRouteConfig = rootRoute('root.tsx', [ + layout('my-layout-id', 'layout.tsx', [ + // ... children routes + ]), +]) +``` + +## Physical Virtual Routes + +Physical virtual routes are a way to "mount" a directory of good ol' TanStack Router File Based routing convention under a specific URL path. This can be useful if you are using virtual routes to customize a small portion of your route tree high up in the hierarchy, but want to use the standard file-based routing convention for sub-routes and directories. + +Consider the following file structure: + +``` +/routes +β”œβ”€β”€ root.tsx +β”œβ”€β”€ index.tsx +β”œβ”€β”€ layout.tsx +β”œβ”€β”€ app +β”‚ β”œβ”€β”€ dashboard.tsx +β”‚ β”œβ”€β”€ dashboard-index.tsx +β”‚ β”œβ”€β”€ dashboard-invoices.tsx +β”‚ β”œβ”€β”€ invoices-index.tsx +β”‚ β”œβ”€β”€ invoice-detail.tsx +└── posts + β”œβ”€β”€ index.tsx + β”œβ”€β”€ $postId.tsx + β”œβ”€β”€ $postId.edit.tsx + β”œβ”€β”€ comments/ + β”‚ β”œβ”€β”€ index.tsx + β”‚ β”œβ”€β”€ $commentId.tsx + └── likes/ + β”œβ”€β”€ index.tsx + β”œβ”€β”€ $likeId.tsx +``` + +Let's use virtual routes to customize our route tree for everything but `posts`, then use physical virtual routes to mount the `posts` directory under the `/posts` path: + +```tsx +const virtualRouteConfig = rootRoute('root.tsx', [ + // Set up your virtual routes as normal + index('index.tsx'), + layout('layout.tsx', [ + route('/dashboard', 'app/dashboard.tsx', [ + index('app/dashboard-index.tsx'), + route('/invoices', 'app/dashboard-invoices.tsx', [ + index('app/invoices-index.tsx'), + route('$id', 'app/invoice-detail.tsx'), + ]), + ]), + // Mount the `posts` directory under the `/posts` path + physical('/posts', 'posts'), + ]), +]) +``` + +## Virtual Routes inside of TanStack Router File Based routing + +The previous section showed you how you can use TanStack Router's File Based routing convention inside of a virtual route configuration. +However, the opposite is possible as well. +You can configure the main part of your app's route tree using TanStack Router's File Based routing convention and opt into virtual route configuration for specific subtrees. + +Consider the following file structure: + +``` +/routes +β”œβ”€β”€ __root.tsx +β”œβ”€β”€ foo +β”‚ β”œβ”€β”€ bar +β”‚ β”‚ β”œβ”€β”€ __virtual.ts +β”‚ β”‚ β”œβ”€β”€ details.tsx +β”‚ β”‚ β”œβ”€β”€ home.tsx +β”‚ β”‚ └── route.ts +β”‚ └── bar.tsx +└── index.tsx +``` + +Let's look at the `bar` directory which contains a special file named `__virtual.ts`. This file instructs the generator to switch over to virtual file route configuration for this directory (and its child directories). + +`__virtual.ts` configures the virtual routes for that particular subtree of the route tree. It uses the same API as explained above, with the only difference being that no `rootRoute` is defined for that subtree: + +```tsx +import { + defineVirtualSubtreeConfig, + index, + route, +} from '@tanstack/virtual-file-routes' + +export default defineVirtualSubtreeConfig([ + index('home.tsx'), + route('$id', 'details.tsx'), +]) +``` + +The helper function `defineVirtualSubtreeConfig` is closely modeled after vite's `defineConfig` and allows you to define a subtree configuration via a default export. The default export can either be + +- a subtree config object +- a function returning a subtree config object +- an async function returning a subtree config object + +## Inception + +You can mix and match TanStack Router's File Based routing convention and virtual route configuration however you like. +Let's go deeper! +Check out the following example that starts off using File Based routing convention, switches over to virtual route configuration for `/posts`, switches back to File Based routing convention for `/posts/lets-go` only to switch over to virtual route configuration again for `/posts/lets-go/deeper`. + +``` +β”œβ”€β”€ __root.tsx +β”œβ”€β”€ index.tsx +β”œβ”€β”€ posts +β”‚ β”œβ”€β”€ __virtual.ts +β”‚ β”œβ”€β”€ details.tsx +β”‚ β”œβ”€β”€ home.tsx +β”‚ └── lets-go +β”‚ β”œβ”€β”€ deeper +β”‚ β”‚ β”œβ”€β”€ __virtual.ts +β”‚ β”‚ └── home.tsx +β”‚ └── index.tsx +└── posts.tsx +``` + +## Configuration via the TanStack Router CLI + +While much less common, you can also configure virtual file routes via the TanStack Router CLI by adding a `virtualRouteConfig` object to your `tsr.config.json` file and defining your virtual routes and passing the resulting JSON that is generated by calling the actual `rootRoute`/`route`/`index`/etc functions from the `@tanstack/virtual-file-routes` package: + +```json +// tsr.config.json +{ + "virtualRouteConfig": { + "type": "root", + "file": "root.tsx", + "children": [ + { + "type": "index", + "file": "home.tsx" + }, + { + "type": "route", + "file": "posts/posts.tsx", + "path": "/posts", + "children": [ + { + "type": "index", + "file": "posts/posts-home.tsx" + }, + { + "type": "route", + "file": "posts/posts-detail.tsx", + "path": "$postId" + } + ] + }, + { + "type": "layout", + "id": "first", + "file": "layout/first-layout.tsx", + "children": [ + { + "type": "layout", + "id": "second", + "file": "layout/second-layout.tsx", + "children": [ + { + "type": "route", + "file": "a.tsx", + "path": "/layout-a" + }, + { + "type": "route", + "file": "b.tsx", + "path": "/layout-b" + } + ] + } + ] + } + ] + } +} +``` diff --git a/docs/framework/react/installation.md b/docs/framework/react/installation.md index 9d477c3932..4da39e2fb6 100644 --- a/docs/framework/react/installation.md +++ b/docs/framework/react/installation.md @@ -20,4 +20,6 @@ TanStack Router is currently only compatible with React and ReactDOM. If you wou - React v18.x.x - ReactDOM v18.x.x -- TypeScript v5.x.x (TypeScript is optional, but recommended) +- TypeScript >= v5.2.x (TypeScript is optional, but recommended) + - We aim to support the last five minor versions of TypeScript. If you are using an older version, you may run into issues. Please upgrade to the latest version of TypeScript to ensure compatibility. + - We may drop support for older versions of TypeScript, outside of the range mentioned above, without warning in a minor or patch release. diff --git a/docs/framework/react/overview.md b/docs/framework/react/overview.md index dcf38f8ebd..ddfd941218 100644 --- a/docs/framework/react/overview.md +++ b/docs/framework/react/overview.md @@ -25,14 +25,14 @@ To get started quickly, head to the next page. For a more lengthy explanation, b Using a router to build applications is widely regarded as a must-have and is usually one of the first choices you’ll make in your tech stack. -**So, why should to choose TanStack Router over another router?** +**So, why should you choose TanStack Router over another router?** To answer this question, we need to look at the other options in the space. There are many if you look hard enough, but in my experience, only a couple are worth exploring seriously: -- **Next.js** - Widely regarded as the de facto framework for starting a new React project, it’s laser focused on performance, workflow, and bleeding edge technology. It’s APIs and abstractions are powerful, but can sometimes come across as non-standard. It's extremely fast growth and adoption in the industry has resulted in a featured packed experience, but not at the expense of feeling overwhelming and sometimes bloated. +- **Next.js** - Widely regarded as the de facto framework for starting a new React project, it’s laser focused on performance, workflow, and bleeding edge technology. Its APIs and abstractions are powerful, but can sometimes come across as non-standard. Its extremely fast growth and adoption in the industry has resulted in a featured packed experience, but not at the expense of feeling overwhelming and sometimes bloated. - **Remix / React Router** - A full-stack framework based on the historically successful React Router offers a similarly powerful developer and user experience, with APIs and vision based firmly on web standards like Request/Response and a focus on running anywhere JS can run. Many of its APIs and abstractions are wonderfully designed and were inspiration for more than a few TanStack Router APIs. That said, its rigid design, bolted-on type safety and sometimes strict over-adherence to platform APIs can leave some developers wanting more. -Both of these frameworks (and their routers) are great, and I can personally attest that both are very good solutions for build React applications. My experience has also taught me that these solutions could also be much better, especially around the actual routing APIs that are available to developers to make their apps faster, easier, and more enjoyable to work with. +Both of these frameworks (and their routers) are great, and I can personally attest that both are very good solutions for building React applications. My experience has also taught me that these solutions could also be much better, especially around the actual routing APIs that are available to developers to make their apps faster, easier, and more enjoyable to work with. It's probably no surprise at this point that picking a router is so important that it is often tied 1-to-1 with your choice of framework, since most frameworks rely on a specific router. @@ -53,7 +53,6 @@ TanStack Router delivers on the same fundamental expectations as other routers t - URL Path Params - Error Boundaries and Handling - SSR -- Prefetching - Route Masking And it also delivers some new features that raise the bar: @@ -127,7 +126,7 @@ TanStack Router is designed with a flexible and powerful data loading API that m ## Inherited Route Context -TanStack Router's router and route context is a powerful feature that allows you to define context that is specific to a route which is then inherited by all child routes. Even the router and root route's themselves can provide context. Context can be built up both synchronously and asynchronously, and can be used to share data, configuration, or even functions between routes and route configurations. This is especially useful for scenarios like: +TanStack Router's router and route context is a powerful feature that allows you to define context that is specific to a route which is then inherited by all child routes. Even the router and root routes themselves can provide context. Context can be built up both synchronously and asynchronously, and can be used to share data, configuration, or even functions between routes and route configurations. This is especially useful for scenarios like: - Authentication and Authorization - Hybrid SSR/CSR data fetching and preloading diff --git a/docs/framework/react/quick-start.md b/docs/framework/react/quick-start.md index 07d08da9dd..3708012086 100644 --- a/docs/framework/react/quick-start.md +++ b/docs/framework/react/quick-start.md @@ -8,7 +8,23 @@ If you're feeling impatient and prefer to skip all of our wonderful documentatio File based route generation (through Vite, and other supported bundlers) is the recommended way to use TanStack Router as it provides the best experience, performance, and ergonomics for the least amount of effort. -### Install the Vite Plugin and the Router Devtools +### Scaffolding Your First TanStack Router Project + +```bash +npm create @tanstack/router@latest +# or +pnpm create @tanstack/router +# or +yarn create @tanstack/router +# or +bun create @tanstack/router +``` + +Follow the prompts to setup the project. + +### Manual Setup + +#### Install the Vite Plugin and the Router Devtools ```bash npm i -D @tanstack/router-plugin @tanstack/router-devtools @@ -20,7 +36,7 @@ yarn add -D @tanstack/router-plugin @tanstack/router-devtools bun add -D @tanstack/router-plugin @tanstack/router-devtools ``` -### Configure the Vite Plugin +#### Configure the Vite Plugin ```tsx // vite.config.ts @@ -50,7 +66,7 @@ Create the following files: > 🧠 Route files with the `.lazy.tsx` extension are lazy loaded via separate bundles to keep the main bundle size as lean as possible. -### `src/routes/__root.tsx` +#### `src/routes/__root.tsx` ```tsx import { createRootRoute, Link, Outlet } from '@tanstack/react-router' @@ -75,7 +91,7 @@ export const Route = createRootRoute({ }) ``` -### `src/routes/index.lazy.tsx` +#### `src/routes/index.lazy.tsx` ```tsx import { createLazyFileRoute } from '@tanstack/react-router' @@ -93,7 +109,7 @@ function Index() { } ``` -### `src/routes/about.lazy.tsx` +#### `src/routes/about.lazy.tsx` ```tsx import { createLazyFileRoute } from '@tanstack/react-router' @@ -107,7 +123,7 @@ function About() { } ``` -### `src/main.tsx` +#### `src/main.tsx` Regardless if you are using the `@tanstack/router-plugin` package or manually running the `tsr watch`/`tsr generate` commands from your package scripts, the following file will be generated for you at `src/routeTree.gen.ts`. diff --git a/docs/framework/react/start/api-routes.md b/docs/framework/react/start/api-routes.md index 85ccf29dc3..7d298b6f2a 100644 --- a/docs/framework/react/start/api-routes.md +++ b/docs/framework/react/start/api-routes.md @@ -193,7 +193,9 @@ export const Route = createAPIFileRoute('/hello')({ // {"message":"Hello, World!"} ``` -Or you can use the `json` helper function to automatically set the `Content-Type` header to `application/json`. +## Using the `json` helper function + +Or you can use the `json` helper function to automatically set the `Content-Type` header to `application/json` and serialize the JSON object for you. ```ts // routes/api/hello.ts @@ -212,46 +214,87 @@ export const Route = createAPIFileRoute('/hello')({ ## Responding with a status code -You can set the status code of the response by passing it as the second argument to the `Response` constructor. - -```ts -// routes/api/hello.ts -import { json } from '@tanstack/start' -import { createAPIFileRoute } from '@tanstack/start/api' - -export const Route = createAPIFileRoute('/users/$id')({ - GET: async ({ request, params }) => { - const user = await findUser(params.id) - if (!user) { - return new Response('User not found', { - status: 404, - }) - } - return json(user) - }, -}) -``` +You can set the status code of the response by either: + +- Passing it as a property of the second argument to the `Response` constructor + + ```ts + // routes/api/hello.ts + import { json } from '@tanstack/start' + import { createAPIFileRoute } from '@tanstack/start/api' + + export const Route = createAPIFileRoute('/users/$id')({ + GET: async ({ request, params }) => { + const user = await findUser(params.id) + if (!user) { + return new Response('User not found', { + status: 404, + }) + } + return json(user) + }, + }) + ``` + +- Using the `setStatus` helper function from `vinxi/http` + + ```ts + // routes/api/hello.ts + import { json } from '@tanstack/start' + import { createAPIFileRoute } from '@tanstack/start/api' + import { setStatus } from 'vinxi/http' + + export const Route = createAPIFileRoute('/users/$id')({ + GET: async ({ request, params }) => { + const user = await findUser(params.id) + if (!user) { + setStatus(404) + return new Response('User not found') + } + return json(user) + }, + }) + ``` In this example, we're returning a `404` status code if the user is not found. You can set any valid HTTP status code using this method. ## Setting headers in the response -Sometimes you may need to set headers in the response. You can do this by passing an object as the second argument to the `Response` constructor. +Sometimes you may need to set headers in the response. You can do this by either: -```ts -// routes/api/hello.ts -import { createAPIFileRoute } from '@tanstack/start/api' +- Passing an object as the second argument to the `Response` constructor. -export const Route = createAPIFileRoute('/hello')({ - GET: async ({ request }) => { - return new Response('Hello, World!', { - headers: { - 'Content-Type': 'text/plain', - }, - }) - }, -}) + ```ts + // routes/api/hello.ts + import { createAPIFileRoute } from '@tanstack/start/api' -// Visit /api/hello to see the response -// Hello, World! -``` + export const Route = createAPIFileRoute('/hello')({ + GET: async ({ request }) => { + return new Response('Hello, World!', { + headers: { + 'Content-Type': 'text/plain', + }, + }) + }, + }) + + // Visit /api/hello to see the response + // Hello, World! + ``` + +- Or using the `setHeaders` helper function from `vinxi/http`. + + ```ts + // routes/api/hello.ts + import { createAPIFileRoute } from '@tanstack/start/api' + import { setHeaders } from 'vinxi/http' + + export const Route = createAPIFileRoute('/hello')({ + GET: async ({ request }) => { + setHeaders({ + 'Content-Type': 'text/plain', + }) + return new Response('Hello, World!') + }, + }) + ``` diff --git a/docs/framework/react/start/authentication.md b/docs/framework/react/start/authentication.md index 3c7d0f6f62..36e3c10df4 100644 --- a/docs/framework/react/start/authentication.md +++ b/docs/framework/react/start/authentication.md @@ -15,7 +15,13 @@ That said, authentication is not something to be taken lightly. After much vetti ## What is Clerk? -[![Clerk Logo](https://github.com/raw/tannerlinsley/files/master/partners/clerk.svg)](https://go.clerk.com/wOwHtuJ) + + + + + Convex logo + + Clerk is a modern authentication platform that provides a full suite of authentication APIs and UI components to help you implement authentication in your application. Clerk is designed to be easy to use and provides a seamless user experience. With Clerk, you can implement authentication in your application in minutes and provide your users with a secure and reliable authentication experience. diff --git a/docs/framework/react/start/databases.md b/docs/framework/react/start/databases.md index 772c1b8efb..1cf048ed94 100644 --- a/docs/framework/react/start/databases.md +++ b/docs/framework/react/start/databases.md @@ -9,15 +9,15 @@ Databases are at the core of any dynamic application, providing the necessary in TanStack Start is **designed to work with any database provider**, so if you already have a preferred database system, you can integrate it with TanStack Start using the provided full-stack APIs. Whether you're working with SQL, NoSQL, or other types of databases, TanStack Start can handle your needs. -That said, the choice of a database is critical to your application's performance, scalability, and reliability, which is we highly recommend using [Convex](https://convex.dev) for the best possible database experience. +That said, the choice of a database is critical to your application's performance, scalability, and reliability, which is we highly recommend using [Convex](https://convex.dev?utm_source=tanstack) for the best possible database experience. ## What is Convex? - + - - - Convex logo + + + Convex logo @@ -25,8 +25,8 @@ Convex is a powerful, serverless database platform that simplifies the process o Convex’s declarative data model and automatic conflict resolution ensure that your application remains consistent and responsive, even at scale. It’s designed to be developer-friendly, with a focus on simplicity and productivity. -- To learn more about Convex, visit the [Convex website](https://convex.dev) -- To sign up, visit the [Convex dashboard](https://dashboard.convex.dev/signup) +- To learn more about Convex, visit the [Convex website](https://convex.dev?utm_source=tanstack) +- To sign up, visit the [Convex dashboard](https://dashboard.convex.dev/signup?utm_source=tanstack) ## Documentation & APIs diff --git a/docs/framework/react/start/getting-started.md b/docs/framework/react/start/getting-started.md index 8b9acae243..9f9c3058ff 100644 --- a/docs/framework/react/start/getting-started.md +++ b/docs/framework/react/start/getting-started.md @@ -32,7 +32,7 @@ Create a `tsconfig.json` file with at least the following settings: "compilerOptions": { "jsx": "react-jsx", "moduleResolution": "Bundler", - "module": "Preserve", + "module": "ESNext", "target": "ES2022", "skipLibCheck": true, }, @@ -285,3 +285,5 @@ function Home() { That's it! 🀯 You've now set up a TanStack Start project and written your first route. πŸŽ‰ You can now run `npm run dev` to start your server and navigate to `http://localhost:3000` to see your route in action. + +You want to deploy your application? Check out the [hosting guide](./hosting.md). diff --git a/docs/framework/react/start/hosting.md b/docs/framework/react/start/hosting.md index ebdecf8eee..ee4ec6658c 100644 --- a/docs/framework/react/start/hosting.md +++ b/docs/framework/react/start/hosting.md @@ -9,17 +9,175 @@ Hosting is the process of deploying your application to the internet so that use TanStack Start is **designed to work with any hosting provider**, so if you already have a hosting provider in mind, you can deploy your application there using the full-stack APIs provided by TanStack Start. -However, since hosting is one of the most crucial aspects of your application's performance, reliability, and scalability, we highly recommend using [Vercel](https://vercel.com) for the best possible hosting experience. +However, since hosting is one of the most crucial aspects of your application's performance, reliability, and scalability, we highly recommend using [Vercel](https://vercel.com?utm_source=tanstack) for the best possible hosting experience. ## What is Vercel? -[![Vercel Logo](https://github.com/raw/tannerlinsley/files/master/partners/vercel.svg)](https://vercel.com) + + + + + Convex logo + + Vercel is a leading hosting platform that provides a fast, secure, and reliable environment for deploying your web applications. With Vercel, you can deploy your TanStack Start application in just a few clicks and benefit from features like a global edge network, automatic scaling, and seamless integrations with GitHub and GitLab. Vercel is designed to make your development process as smooth as possible, from local development to production deployment. -- To learn more about Vercel, visit the [Vercel website](https://vercel.com) -- To sign up, visit the [Vercel dashboard](https://vercel.com/signup) +- To learn more about Vercel, visit the [Vercel website](https://vercel.com?utm_source=tanstack) +- To sign up, visit the [Vercel dashboard](https://vercel.com/signup?utm_source=tanstack) -## Documentation & APIs +## Deployment -Documentation for deploying your application with different hosting providers is coming soon! +> [!WARNING] +> The page is still a work in progress. We'll keep updating this page with guides on deployment to different hosting providers soon! + +When a TanStack Start application is being deployed, the `deployment.preset` value in the `app.config.ts` file determines the deployment target. The deployment target can be set to one of the following values: + +- [`vercel`](#vercel): Deploy to Vercel +- [`cloudflare-pages`](#cloudflare-pages): Deploy to Cloudflare Pages +- [`netlify`](#netlify): Deploy to Netlify +- [`node-server`](#nodejs): Deploy to a Node.js server +- [`bun`](#bun): Deploy to a Bun server +- ... and more to come! + +Once you've chosen a deployment target, you can follow the deployment guidelines below to deploy your TanStack Start application to the hosting provider of your choice. + +### Vercel + +Deploying your TanStack Start application to Vercel is easy and straightforward. Just set the `deployment.preset` value to `vercel` in your `app.config.ts` file, and you're ready to deploy your application to Vercel. + +```ts +// app.config.ts +import { defineConfig } from '@tanstack/start/config' + +export default defineConfig({ + deployment: { + preset: 'vercel', + }, +}) +``` + +Or you can use the `--preset` flag with the `build` command to specify the deployment target when building the application: + +```sh +npm run build --preset vercel +``` + +Deploy you application to Vercel using their one-click deployment process, and you're ready to go! + +### Cloudflare Pages + +Set the `deployment.preset` value to `cloudflare-pages` in your `app.config.ts` file. + +```ts +// app.config.ts +import { defineConfig } from '@tanstack/start/config' + +export default defineConfig({ + deployment: { + preset: 'cloudflare-pages', + }, +}) +``` + +Or you can use the `--preset` flag with the `build` command to specify the deployment target when building the application: + +```sh +npm run build --preset cloudflare-pages +``` + +Deploy you application to Cloudflare Pages using their one-click deployment process, and you're ready to go! + +### Netlify + +Set the `deployment.preset` value to `netlify` in your `app.config.ts` file. + +```ts +// app.config.ts +import { defineConfig } from '@tanstack/start/config' + +export default defineConfig({ + deployment: { + preset: 'netlify', + }, +}) +``` + +Or you can use the `--preset` flag with the `build` command to specify the deployment target when building the application: + +```sh +npm run build --preset netlify +``` + +Deploy you application to Netlify using their one-click deployment process, and you're ready to go! + +### Node.js + +Set the `deployment.preset` value to `node-server` in your `app.config.ts` file. + +```ts +// app.config.ts +import { defineConfig } from '@tanstack/start/config' + +export default defineConfig({ + deployment: { + preset: 'node-server', + }, +}) + +// Or you can use the --preset flag with the build command +// to specify the deployment target when building the application: +// npm run build --preset node-server +``` + +Then you can run the following command to build and start your application: + +```sh +npm run build +``` + +You're now ready to deploy your application to a Node.js server. You can start your application by running: + +```sh +node .output/server/index.mjs +``` + +### Bun + +> [!IMPORTANT] +> Currently, the Bun specific deployment guidelines only work with React 19. If you are using React 18, please refer to the [Node.js](#nodejs) deployment guidelines. + +Make sure that your `react` and `react-dom` packages are set to version 19.0.0 or higher in your `package.json` file. If not, run the following command to upgrade the packages: + +```sh +npm install react@rc react-dom@rc +``` + +Set the `deployment.preset` value to `bun` in your `app.config.ts` file. + +```ts +// app.config.ts +import { defineConfig } from '@tanstack/start/config' + +export default defineConfig({ + deployment: { + preset: 'bun', + }, +}) + +// Or you can use the --preset flag with the build command +// to specify the deployment target when building the application: +// npm run build --preset bun +``` + +Then you can run the following command to build and start your application: + +```sh +bun run build +``` + +You're now ready to deploy your application to a Bun server. You can start your application by running: + +```sh +bun run .output/server/index.mjs +``` diff --git a/docs/framework/react/start/observability.md b/docs/framework/react/start/observability.md index 35077c510b..fb483ba814 100644 --- a/docs/framework/react/start/observability.md +++ b/docs/framework/react/start/observability.md @@ -9,18 +9,24 @@ Observability is a critical aspect of modern web development, enabling you to mo TanStack Start is **designed to work with any observability tool**, so you can integrate your preferred solution using the full-stack APIs provided by TanStack Start. Whether you need logging, tracing, or error monitoring, TanStack Start is flexible enough to meet your observability needs. -However, for the best observability experience, we highly recommend using [Sentry](https://sentry.io). Sentry is a powerful, full-featured observability platform that provides real-time insights into your application's performance and error tracking. +However, for the best observability experience, we highly recommend using [Sentry](https://sentry.io?utm_source=tanstack). Sentry is a powerful, full-featured observability platform that provides real-time insights into your application's performance and error tracking. ## What is Sentry? -[![Sentry Logo](https://github.com/raw/tannerlinsley/files/master/partners/sentry.svg)](https://sentry.io) + + + + + Convex logo + + Sentry is a leading observability platform that helps developers monitor and fix crashes in real-time. With Sentry, you can track errors, performance issues, and trends across your entire stack, from the frontend to the backend. Sentry integrates seamlessly with TanStack Start, enabling you to identify and resolve issues faster, maintain a high level of performance, and deliver a better experience to your users. Sentry’s comprehensive dashboards, alerting capabilities, and in-depth error analysis tools make it an invaluable resource for any development team looking to maintain control over their application’s health in production. -- To learn more about Sentry, visit the [Sentry website](https://sentry.io) -- To sign up, visit the [Sentry dashboard](https://sentry.io/signup) +- To learn more about Sentry, visit the [Sentry website](https://sentry.io?utm_source=tanstack) +- To sign up, visit the [Sentry dashboard](https://sentry.io/signup?utm_source=tanstack) ## Documentation & APIs diff --git a/docs/framework/react/start/overview.md b/docs/framework/react/start/overview.md index 40f066adac..d606a5d461 100644 --- a/docs/framework/react/start/overview.md +++ b/docs/framework/react/start/overview.md @@ -68,18 +68,42 @@ TanStack Start is not for you if: TanStack works closely with our partners to provide the best possible developer experience while also providing solutions that work anywhere and are vetted by industry experts. Each of our partners plays a unique role in the TanStack ecosystem: -- **Vercel** - Vercel - The leading hosting platform for web applications that provides a fast, secure, and reliable environment for deploying your web applications. We work closely with Vercel to ensure that TanStack Start applications not only deploy seamlessly to their platform, but also implement best practices for performance, security, and reliability regardless of where you end up deploying. -- **Clerk** - Clerk - The best possible authentication experience for modern web applications, including TanStack Start applications. Clerk provides TanStack Start users with first-class integrations and solutions to auth and collaborates closely with the TanStack team to ensure that TanStack Start provides APIs that are up to date with the latest in auth best practices. -- **Convex** - Convex - A serverless database platform that integrates seamlessly with TanStack Start. Convex is designed to simplify the process of managing your application's data and provides a real-time, scalable, and transactional data backend that works well with TanStack Start applications. Convex also collaborates closely with the TanStack team to ensure that TanStack Start provides APIs that are up to date with the latest in database best practices. -- **Sentry** - Sentry - A powerful, full-featured observability platform that integrates seamlessly with TanStack Start. Sentry helps developers monitor and fix crashes in real-time and provides insights into your application's performance and error tracking. Sentry collaborates closely with the TanStack team to ensure that TanStack Start provides APIs that are up to date with the latest in observability best practices. +- **Vercel** + + + + + Convex logo + + + The leading hosting platform for web applications that provides a fast, secure, and reliable environment for deploying your web applications. We work closely with Vercel to ensure that TanStack Start applications not only deploy seamlessly to their platform, but also implement best practices for performance, security, and reliability regardless of where you end up deploying. +- **Clerk** + + + + + Convex logo + + + The best possible authentication experience for modern web applications, including TanStack Start applications. Clerk provides TanStack Start users with first-class integrations and solutions to auth and collaborates closely with the TanStack team to ensure that TanStack Start provides APIs that are up to date with the latest in auth best practices. +- **Convex** + + + + + Convex logo + + + A serverless database platform that integrates seamlessly with TanStack Start. Convex is designed to simplify the process of managing your application's data and provides a real-time, scalable, and transactional data backend that works well with TanStack Start applications. Convex also collaborates closely with the TanStack team to ensure that TanStack Start provides APIs that are up to date with the latest in database best practices. +- **Sentry** + + + + + Convex logo + + + A powerful, full-featured observability platform that integrates seamlessly with TanStack Start. Sentry helps developers monitor and fix crashes in real-time and provides insights into your application's performance and error tracking. Sentry collaborates closely with the TanStack team to ensure that TanStack Start provides APIs that are up to date with the latest in observability best practices. ## Ready to get started? diff --git a/docs/framework/react/start/path-aliases.md b/docs/framework/react/start/path-aliases.md new file mode 100644 index 0000000000..c1e74af096 --- /dev/null +++ b/docs/framework/react/start/path-aliases.md @@ -0,0 +1,57 @@ +--- +id: path-aliases +title: Path Aliases +--- + +Path aliases are a useful feature of TypeScript that allows you to define a shortcut for a path that could be distant in your project's directory structure. This can help you avoid long relative imports in your code and make it easier to refactor your project's structure. This is especially useful for avoiding long relative imports in your code. + +By default, TanStack Start does not include path aliases. However, you can easily add them to your project by updating your `tsconfig.json` file in the root of your project and adding the following configuration: + +```json +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "~/*": ["app/*"] + } + } +} +``` + +In this example, we've defined the path alias `~/*` that maps to the `app/*` directory. This means that you can now import files from the `app` directory using the `~` prefix. + +After updating your `tsconfig.json` file, you'll need to install the `vite-tsconfig-paths` plugin to enable path aliases in your TanStack Start project. You can do this by running the following command: + +```sh +npm install -D vite-tsconfig-paths +``` + +Now, you'll need to update your `app.config.ts` file to include the following: + +```ts +// app.config.ts +import { defineConfig } from '@tanstack/start/config' +import viteTsConfigPaths from 'vite-tsconfig-paths' + +export default defineConfig({ + vite: { + plugins: () => [ + // this is the plugin that enables path aliases + viteTsConfigPaths({ + projects: ['./tsconfig.json'], + }), + ], + }, +}) +``` + +Once this configuration has completed, you'll now be able to import files using the path alias like so: + +```ts +// app/routes/posts/$postId/edit.tsx +import { Input } from '~/components/ui/input' + +// instead of + +import { Input } from '../../../components/ui/input' +``` diff --git a/docs/framework/react/start/server-functions.md b/docs/framework/react/start/server-functions.md index cfb7ac4f80..33721e8ff6 100644 --- a/docs/framework/react/start/server-functions.md +++ b/docs/framework/react/start/server-functions.md @@ -3,7 +3,16 @@ id: server-functions title: Server Functions --- -Server functions are functions that run **only** on the server. They are used to perform tasks that should never be directly exposed to the client. Server functions can be defined anywhere in your application, but must be defined at the top level of a file. They can be called from anywhere in your application, including loaders, hooks, etc. They are just asynchronous functions! +## What are Server Functions? + +Server functions allow you to specify specific function to run **only** on the server. They are used to perform tasks that should never be directly exposed to the client. + +## How do they work? + +Server functions can be defined anywhere in your application, but must be defined at the top level of a file. They can be called from anywhere in your application, including loaders, hooks, etc. Traditionally, this pattern is known as a Remote Procedure Call (RPC), but due to the isomorphic nature of these functions, we refer to them as server functions. + +- On the server bundle, server functions are left alone. Nothing needs to be done since they are already in the correct place. +- On the client however, server functions are removed out of the client bundle and replaced with a function that, when called, makes a `fetch` request to the server instructing it to execute the server function in the server bundle and then send the response back to the client. ## Defining Server Functions @@ -21,13 +30,27 @@ export const getServerTime = createServerFn('GET', async () => { }) ``` +## Where can I call server functions? + +- From server-side code +- From client-side code +- From other server functions +- Anywhere, really! + ## Accepting Parameters Server functions accept a single parameter, which can be a variety of types: - Primitives -- JSON-serializable objects + - `string` + - `number` + - `boolean` + - `null` + - `Array` + - `Object` - FormData +- ReadableStream (of any of the above) +- Promise (of any of the above) Here's an example of a server function that accepts a simple string parameter: @@ -112,17 +135,67 @@ function Test() { ## Server Function Context -In addition to the single parameter that server functions accept, they also have access to a special `context` object that contains information about the current request. This object is useful for accessing headers, cookies, and other request-specific information. It contains properties like: +In addition to the single parameter that server functions accept, you can also access server request context from within any server function using many utilites from `vinxi/http`. Under the hood, Vinxi uses `unjs`'s `h3` package to perform cross-platform HTTP requests. -- `method`: The HTTP method of the request -- `request`: The `Request` object +There are many context functions available to you for things like: + +- Accessing the request context +- Accessing/setting headers +- Accessing/setting sessions/cookies +- Setting response status codes and status messages +- Dealing with mulit-part form data +- Reading/Setting custom server context properties + +For a full list of available context functions, see all of the available [h3 Methods](https://h3.unjs.io/utils/request) or inspect the [Vinxi Exports Source Code](https://github.com/nksaraf/vinxi/blob/main/packages/vinxi/runtime/http.js#L232-L320). + +For starters, here are a few examples: + +## Accessing the Request Context + +Let's use Vinxi's `getWebRequest` function to access the request itself from within a server function: ```tsx import { createServerFn } from '@tanstack/start' +import { getWebRequest } from 'vinxi/http' + +export const getServerTime = createServerFn('GET', async () => { + const request = getWebRequest() -export const getServerTime = createServerFn('GET', async (_, context) => { - console.log(context.method) // GET - console.log(context.request.headers.get('User-Agent')) // Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3 + console.log(request.method) // GET + + console.log(request.headers.get('User-Agent')) // Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3 +}) +``` + +## Accessing Headers + +Use Vinxi's `getHeaders` function to access all headers from within a server function: + +```tsx +import { createServerFn } from '@tanstack/start' +import { getHeaders } from 'vinxi/http' + +export const getServerTime = createServerFn('GET', async () => { + console.log(getHeaders()) + // { + // "accept": "*/*", + // "accept-encoding": "gzip, deflate, br", + // "accept-language": "en-US,en;q=0.9", + // "connection": "keep-alive", + // "host": "localhost:3000", + // ... + // } +}) +``` + +You can also access individual headers using the `getHeader` function: + +```tsx +import { createServerFn } from '@tanstack/start' +import { getHeader } from 'vinxi/http' + +export const getServerTime = createServerFn('GET', async () => { + console.log(getHeader('User-Agent')) // Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3 }) ``` @@ -156,19 +229,31 @@ export const getServerData = createServerFn('GET', async () => { By default, server functions assume that any non-Response object returned is either a primitive or JSON-serializable object. -## Returning Primitives and JSON with custom headers +## Responding with Custom Headers -To return a primitive or JSON-serializable object with custom headers, use the `json` function exported from the `@tanstack/start` package: +To respond with custom headers, you can use Vinxi's `setHeader` function: ```tsx -import { createServerFn, json } from '@tanstack/start' +import { createServerFn } from '@tanstack/start' +import { setHeader } from 'vinxi/http' export const getServerTime = createServerFn('GET', async () => { - return json(new Date().toISOString(), { - headers: { - 'X-Custom-Header': 'value', - }, - }) + setHeader('X-Custom-Header', 'value') + return new Date().toISOString() +}) +``` + +## Responding with Custom Status Codes + +To respond with a custom status code, you can use Vinxi's `setStatus` function: + +```tsx +import { createServerFn } from '@tanstack/start' +import { setStatus } from 'vinxi/http' + +export const getServerTime = createServerFn('GET', async () => { + setStatus(201) + return new Date().toISOString() }) ``` @@ -258,10 +343,11 @@ Server functions can throw a `redirect` error to redirect the user to a differen - During SSR, redirects are handled by sending a 302 response to the client with the new location - On the client, redirects are handled by the router automatically from within a route lifecycle or a component that uses the `useServerFn` hook. If you call a server function from anywhere else, redirects will not be handled automatically. -To throw a redirect, you can use the `redirect` function exported from the `@tanstack/start` package: +To throw a redirect, you can use the `redirect` function exported from the `@tanstack/react-router` package: ```tsx -import { createServerFn, redirect } from '@tanstack/start' +import { redirect } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/start' export const doStuff = createServerFn('GET', async () => { // Redirect the user to the home page @@ -280,7 +366,8 @@ Redirects can utilize all of the same options as `router.navigate`, `useNavigate Redirects can also set the status code of the response by passing a `status` option: ```tsx -import { createServerFn, redirect } from '@tanstack/start' +import { redirect } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/start' export const doStuff = createServerFn('GET', async () => { // Redirect the user to the home page with a 301 status code @@ -291,12 +378,15 @@ export const doStuff = createServerFn('GET', async () => { }) ``` +> ⚠️ Do not use Vinxi's `sendRedirect` function to send soft redirects from within server functions. This will send the redirect using the `Location` header and will force a full page hard navigation on the client. + ## Redirect Headers You can also set custom headers on a redirect by passing a `headers` option: ```tsx -import { createServerFn, redirect } from '@tanstack/start' +import { redirect } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/start' export const doStuff = createServerFn('GET', async () => { // Redirect the user to the home page with a custom header @@ -368,23 +458,150 @@ export const Route = createFileRoute('/stuff')({ }) ``` -## Can I simply use the `use server` directive? +## No-JS Server Functions + +Without JavaScript enabled, there's only one way to execute server functions: by submitting a form. -Sure, you can use the `use server` directive instead of the `createServerFn` function, however be aware of some caveats: +This is done by adding a `form` element to the page +with [the HTML attribute `action`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/action). -- All arguments must be JSON-serializable and are passed as is -- You will not have access to the `context` object, and thus will not be able to access request-specific information like method, headers, cookies, etc. +> Notice that we mentioned the **HTML** attribute `action`. This attribute only accepts a string in HTML, just like all +> other attributes. +> +> While React +> 19 [added support for passing a function to `action`](https://react.dev/reference/react-dom/components/form#form), +> it's +> a React-specific feature and not part of the HTML standard. + +The `action` attribute tells the browser where to send the form data when the form is submitted. In this case, we want +to send the form data to the server function. + +To do this, we can utilize the `url` property of the server function: + +```typescript +const yourFn = createServerFn('POST', async () => { + // Server-side code lives here +}) + +console.info(yourFn.url) +``` + +And pass this to the `action` attribute of the form: ```tsx -// getServerTime.ts +function Component() { + return ( +
+ +
+ ) +} +``` + +When the form is submitted, the server function will be executed. + +### No-JS Server Function Arguments + +To pass arguments to a server function when submitting a form, you can use the `input` element with the `name` attribute +to attach the argument to the [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData) passed to your +server function: + +```tsx +const yourFn = createServerFn('POST', async (formData: FormData) => { + // `val` will be '123' + const val = formData.get('val') + // ... +}) + +function Component() { + return ( + // We need to tell the server that our data type is `multipart/form-data` by setting the `encType` attribute on the form. +
+ + +
+ ) +} +``` + +When the form is submitted, the server function will be executed with the form's data as an argument. -function greetUser(greeting: string, name: string) { - 'use server' - return `${greeting}, ${name}!` +### No-JS Server Function Return Value + +Regardless of whether JavaScript is enabled, the server function will return a response to the HTTP request made from +the client. + +When JavaScript is enabled, this response can be accessed as the return value of the server function in the client's +JavaScript code. + +```typescript +const yourFn = createServerFn('POST', async () => { + return 'Hello, world!' +}) + +// `.then` is not available when JavaScript is disabled +yourFn().then(console.log) +``` + +However, when JavaScript is disabled, there is no way to access the return value of the server function in the client's +JavaScript code. + +Instead, the server function can provide a response to the client, telling the browser to navigate in a certain way. + +When combined with a `loader` from TanStack Router, we're able to provide an experience similar to a single-page application, even when +JavaScript is disabled; +all by telling the browser to reload the current page with new data piped through the `loader`: + +```tsx +import * as fs from 'fs' +import { createFileRoute } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/start' + +const filePath = 'count.txt' + +async function readCount() { + return parseInt( + await fs.promises.readFile(filePath, 'utf-8').catch(() => '0'), + ) +} + +const getCount = createServerFn('GET', () => { + return readCount() +}) + +const updateCount = createServerFn('POST', async (formData: FormData) => { + const count = await readCount() + const addBy = Number(formData.get('addBy')) + await fs.promises.writeFile(filePath, `${count + addBy}`) + // Reload the page to trigger the loader again + return new Response('ok', { status: 301, headers: { Location: '/' } }) +}) + +export const Route = createFileRoute('/')({ + component: Home, + loader: async () => await getCount(), +}) + +function Home() { + const state = Route.useLoaderData() + + return ( +
+
+ + +
+
{state}
+
+ ) } ``` -## How do server functions work? +## How are server functions compiled? Under the hood, server functions are extracted out of the client bundle and into a separate server bundle. On the server, they are executed as-is, and the result is sent back to the client. On the client, server functions proxy the request to the server, which executes the function and sends the result back to the client, all via `fetch`. diff --git a/e2e/react-router/basic-file-based-code-splitting/.gitignore b/e2e/react-router/basic-file-based-code-splitting/.gitignore new file mode 100644 index 0000000000..a6ea47e508 --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/.gitignore @@ -0,0 +1,10 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local + +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/e2e/react-router/basic-file-based-code-splitting/index.html b/e2e/react-router/basic-file-based-code-splitting/index.html new file mode 100644 index 0000000000..a4b3349437 --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/index.html @@ -0,0 +1,24 @@ + + + + + + Vite App + + + + +
+ + + diff --git a/e2e/react-router/basic-file-based-code-splitting/package.json b/e2e/react-router/basic-file-based-code-splitting/package.json new file mode 100644 index 0000000000..f6fec0dbc9 --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/package.json @@ -0,0 +1,27 @@ +{ + "name": "tanstack-router-e2e-react-basic-file-based-code-splitting", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port=3001", + "build": "vite build && tsc --noEmit", + "serve": "vite preview", + "start": "vite", + "test:e2e": "playwright test --project=chromium" + }, + "dependencies": { + "@tanstack/react-router": "workspace:^", + "@tanstack/router-devtools": "workspace:^", + "@tanstack/router-plugin": "workspace:^", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "zod": "^3.23.8" + }, + "devDependencies": { + "@playwright/test": "^1.47.1", + "@types/react": "^18.2.47", + "@types/react-dom": "^18.2.18", + "@vitejs/plugin-react": "^4.3.1", + "vite": "^5.4.5" + } +} diff --git a/examples/react/basic-file-based/playwright.config.ts b/e2e/react-router/basic-file-based-code-splitting/playwright.config.ts similarity index 100% rename from examples/react/basic-file-based/playwright.config.ts rename to e2e/react-router/basic-file-based-code-splitting/playwright.config.ts diff --git a/e2e/react-router/basic-file-based-code-splitting/src/main.tsx b/e2e/react-router/basic-file-based-code-splitting/src/main.tsx new file mode 100644 index 0000000000..18b1b603f8 --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/src/main.tsx @@ -0,0 +1,25 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import { RouterProvider, createRouter } from '@tanstack/react-router' +import { routeTree } from './routeTree.gen' + +// Set up a Router instance +const router = createRouter({ + routeTree, + defaultPreload: 'intent', + defaultStaleTime: 5000, +}) + +// Register things for typesafety +declare module '@tanstack/react-router' { + interface Register { + router: typeof router + } +} + +const rootElement = document.getElementById('app')! + +if (!rootElement.innerHTML) { + const root = ReactDOM.createRoot(rootElement) + root.render() +} diff --git a/e2e/react-router/basic-file-based-code-splitting/src/posts.tsx b/e2e/react-router/basic-file-based-code-splitting/src/posts.tsx new file mode 100644 index 0000000000..3ccf1ff421 --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/src/posts.tsx @@ -0,0 +1,32 @@ +import { notFound } from '@tanstack/react-router' +import axios from 'redaxios' + +export type PostType = { + id: string + title: string + body: string +} + +export const fetchPost = async (postId: string) => { + console.info(`Fetching post with id ${postId}...`) + await new Promise((r) => setTimeout(r, 500)) + const post = await axios + .get(`https://jsonplaceholder.typicode.com/posts/${postId}`) + .then((r) => r.data) + .catch((err) => { + if (err.status === 404) { + throw notFound() + } + throw err + }) + + return post +} + +export const fetchPosts = async () => { + console.info('Fetching posts...') + await new Promise((r) => setTimeout(r, 500)) + return axios + .get>('https://jsonplaceholder.typicode.com/posts') + .then((r) => r.data.slice(0, 10)) +} diff --git a/e2e/react-router/basic-file-based-code-splitting/src/routeTree.gen.ts b/e2e/react-router/basic-file-based-code-splitting/src/routeTree.gen.ts new file mode 100644 index 0000000000..b5bbbfc90b --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/src/routeTree.gen.ts @@ -0,0 +1,325 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/__root' +import { Route as WithoutLoaderImport } from './routes/without-loader' +import { Route as PostsImport } from './routes/posts' +import { Route as LayoutImport } from './routes/_layout' +import { Route as IndexImport } from './routes/index' +import { Route as PostsIndexImport } from './routes/posts.index' +import { Route as PostsPostIdImport } from './routes/posts.$postId' +import { Route as LayoutLayout2Import } from './routes/_layout/_layout-2' +import { Route as LayoutLayout2LayoutBImport } from './routes/_layout/_layout-2/layout-b' +import { Route as LayoutLayout2LayoutAImport } from './routes/_layout/_layout-2/layout-a' + +// Create/Update Routes + +const WithoutLoaderRoute = WithoutLoaderImport.update({ + path: '/without-loader', + getParentRoute: () => rootRoute, +} as any) + +const PostsRoute = PostsImport.update({ + path: '/posts', + getParentRoute: () => rootRoute, +} as any) + +const LayoutRoute = LayoutImport.update({ + id: '/_layout', + getParentRoute: () => rootRoute, +} as any) + +const IndexRoute = IndexImport.update({ + path: '/', + getParentRoute: () => rootRoute, +} as any) + +const PostsIndexRoute = PostsIndexImport.update({ + path: '/', + getParentRoute: () => PostsRoute, +} as any) + +const PostsPostIdRoute = PostsPostIdImport.update({ + path: '/$postId', + getParentRoute: () => PostsRoute, +} as any) + +const LayoutLayout2Route = LayoutLayout2Import.update({ + id: '/_layout-2', + getParentRoute: () => LayoutRoute, +} as any) + +const LayoutLayout2LayoutBRoute = LayoutLayout2LayoutBImport.update({ + path: '/layout-b', + getParentRoute: () => LayoutLayout2Route, +} as any) + +const LayoutLayout2LayoutARoute = LayoutLayout2LayoutAImport.update({ + path: '/layout-a', + getParentRoute: () => LayoutLayout2Route, +} as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexImport + parentRoute: typeof rootRoute + } + '/_layout': { + id: '/_layout' + path: '' + fullPath: '' + preLoaderRoute: typeof LayoutImport + parentRoute: typeof rootRoute + } + '/posts': { + id: '/posts' + path: '/posts' + fullPath: '/posts' + preLoaderRoute: typeof PostsImport + parentRoute: typeof rootRoute + } + '/without-loader': { + id: '/without-loader' + path: '/without-loader' + fullPath: '/without-loader' + preLoaderRoute: typeof WithoutLoaderImport + parentRoute: typeof rootRoute + } + '/_layout/_layout-2': { + id: '/_layout/_layout-2' + path: '' + fullPath: '' + preLoaderRoute: typeof LayoutLayout2Import + parentRoute: typeof LayoutImport + } + '/posts/$postId': { + id: '/posts/$postId' + path: '/$postId' + fullPath: '/posts/$postId' + preLoaderRoute: typeof PostsPostIdImport + parentRoute: typeof PostsImport + } + '/posts/': { + id: '/posts/' + path: '/' + fullPath: '/posts/' + preLoaderRoute: typeof PostsIndexImport + parentRoute: typeof PostsImport + } + '/_layout/_layout-2/layout-a': { + id: '/_layout/_layout-2/layout-a' + path: '/layout-a' + fullPath: '/layout-a' + preLoaderRoute: typeof LayoutLayout2LayoutAImport + parentRoute: typeof LayoutLayout2Import + } + '/_layout/_layout-2/layout-b': { + id: '/_layout/_layout-2/layout-b' + path: '/layout-b' + fullPath: '/layout-b' + preLoaderRoute: typeof LayoutLayout2LayoutBImport + parentRoute: typeof LayoutLayout2Import + } + } +} + +// Create and export the route tree + +interface LayoutLayout2RouteChildren { + LayoutLayout2LayoutARoute: typeof LayoutLayout2LayoutARoute + LayoutLayout2LayoutBRoute: typeof LayoutLayout2LayoutBRoute +} + +const LayoutLayout2RouteChildren: LayoutLayout2RouteChildren = { + LayoutLayout2LayoutARoute: LayoutLayout2LayoutARoute, + LayoutLayout2LayoutBRoute: LayoutLayout2LayoutBRoute, +} + +const LayoutLayout2RouteWithChildren = LayoutLayout2Route._addFileChildren( + LayoutLayout2RouteChildren, +) + +interface LayoutRouteChildren { + LayoutLayout2Route: typeof LayoutLayout2RouteWithChildren +} + +const LayoutRouteChildren: LayoutRouteChildren = { + LayoutLayout2Route: LayoutLayout2RouteWithChildren, +} + +const LayoutRouteWithChildren = + LayoutRoute._addFileChildren(LayoutRouteChildren) + +interface PostsRouteChildren { + PostsPostIdRoute: typeof PostsPostIdRoute + PostsIndexRoute: typeof PostsIndexRoute +} + +const PostsRouteChildren: PostsRouteChildren = { + PostsPostIdRoute: PostsPostIdRoute, + PostsIndexRoute: PostsIndexRoute, +} + +const PostsRouteWithChildren = PostsRoute._addFileChildren(PostsRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '': typeof LayoutLayout2RouteWithChildren + '/posts': typeof PostsRouteWithChildren + '/without-loader': typeof WithoutLoaderRoute + '/posts/$postId': typeof PostsPostIdRoute + '/posts/': typeof PostsIndexRoute + '/layout-a': typeof LayoutLayout2LayoutARoute + '/layout-b': typeof LayoutLayout2LayoutBRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '': typeof LayoutLayout2RouteWithChildren + '/without-loader': typeof WithoutLoaderRoute + '/posts/$postId': typeof PostsPostIdRoute + '/posts': typeof PostsIndexRoute + '/layout-a': typeof LayoutLayout2LayoutARoute + '/layout-b': typeof LayoutLayout2LayoutBRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/_layout': typeof LayoutRouteWithChildren + '/posts': typeof PostsRouteWithChildren + '/without-loader': typeof WithoutLoaderRoute + '/_layout/_layout-2': typeof LayoutLayout2RouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/posts/': typeof PostsIndexRoute + '/_layout/_layout-2/layout-a': typeof LayoutLayout2LayoutARoute + '/_layout/_layout-2/layout-b': typeof LayoutLayout2LayoutBRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '' + | '/posts' + | '/without-loader' + | '/posts/$postId' + | '/posts/' + | '/layout-a' + | '/layout-b' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '' + | '/without-loader' + | '/posts/$postId' + | '/posts' + | '/layout-a' + | '/layout-b' + id: + | '__root__' + | '/' + | '/_layout' + | '/posts' + | '/without-loader' + | '/_layout/_layout-2' + | '/posts/$postId' + | '/posts/' + | '/_layout/_layout-2/layout-a' + | '/_layout/_layout-2/layout-b' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + LayoutRoute: typeof LayoutRouteWithChildren + PostsRoute: typeof PostsRouteWithChildren + WithoutLoaderRoute: typeof WithoutLoaderRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + LayoutRoute: LayoutRouteWithChildren, + PostsRoute: PostsRouteWithChildren, + WithoutLoaderRoute: WithoutLoaderRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [ + "/", + "/_layout", + "/posts", + "/without-loader" + ] + }, + "/": { + "filePath": "index.tsx" + }, + "/_layout": { + "filePath": "_layout.tsx", + "children": [ + "/_layout/_layout-2" + ] + }, + "/posts": { + "filePath": "posts.tsx", + "children": [ + "/posts/$postId", + "/posts/" + ] + }, + "/without-loader": { + "filePath": "without-loader.tsx" + }, + "/_layout/_layout-2": { + "filePath": "_layout/_layout-2.tsx", + "parent": "/_layout", + "children": [ + "/_layout/_layout-2/layout-a", + "/_layout/_layout-2/layout-b" + ] + }, + "/posts/$postId": { + "filePath": "posts.$postId.tsx", + "parent": "/posts" + }, + "/posts/": { + "filePath": "posts.index.tsx", + "parent": "/posts" + }, + "/_layout/_layout-2/layout-a": { + "filePath": "_layout/_layout-2/layout-a.tsx", + "parent": "/_layout/_layout-2" + }, + "/_layout/_layout-2/layout-b": { + "filePath": "_layout/_layout-2/layout-b.tsx", + "parent": "/_layout/_layout-2" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/e2e/react-router/basic-file-based-code-splitting/src/routes/__root.tsx b/e2e/react-router/basic-file-based-code-splitting/src/routes/__root.tsx new file mode 100644 index 0000000000..f4dca5da2c --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/src/routes/__root.tsx @@ -0,0 +1,70 @@ +import * as React from 'react' +import { Link, Outlet, createRootRoute } from '@tanstack/react-router' +import { TanStackRouterDevtools } from '@tanstack/router-devtools' + +export const Route = createRootRoute({ + component: RootComponent, + notFoundComponent: () => { + return ( +
+

This is the notFoundComponent configured on root route

+ Start Over +
+ ) + }, +}) + +function RootComponent() { + return ( + <> +
+ + Home + {' '} + + Posts + {' '} + + Layout + {' '} + + without-loader + {' '} + + This Route Does Not Exist + +
+
+ + {/* Start rendering router matches */} + + + ) +} diff --git a/e2e/react-router/basic-file-based-code-splitting/src/routes/_layout.tsx b/e2e/react-router/basic-file-based-code-splitting/src/routes/_layout.tsx new file mode 100644 index 0000000000..02ddbb1cd9 --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/src/routes/_layout.tsx @@ -0,0 +1,16 @@ +import { Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a layout
+
+ +
+
+ ) +} diff --git a/e2e/react-router/basic-file-based-code-splitting/src/routes/_layout/_layout-2.tsx b/e2e/react-router/basic-file-based-code-splitting/src/routes/_layout/_layout-2.tsx new file mode 100644 index 0000000000..3b7dbf2903 --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/src/routes/_layout/_layout-2.tsx @@ -0,0 +1,34 @@ +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a nested layout
+
+ + Layout A + + + Layout B + +
+
+ +
+
+ ) +} diff --git a/e2e/react-router/basic-file-based-code-splitting/src/routes/_layout/_layout-2/layout-a.tsx b/e2e/react-router/basic-file-based-code-splitting/src/routes/_layout/_layout-2/layout-a.tsx new file mode 100644 index 0000000000..61e19b4d9f --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/src/routes/_layout/_layout-2/layout-a.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2/layout-a')({ + component: LayoutAComponent, +}) + +function LayoutAComponent() { + return
I'm layout A!
+} diff --git a/e2e/react-router/basic-file-based-code-splitting/src/routes/_layout/_layout-2/layout-b.tsx b/e2e/react-router/basic-file-based-code-splitting/src/routes/_layout/_layout-2/layout-b.tsx new file mode 100644 index 0000000000..cceed1fb9a --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/src/routes/_layout/_layout-2/layout-b.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2/layout-b')({ + component: LayoutBComponent, +}) + +function LayoutBComponent() { + return
I'm layout B!
+} diff --git a/e2e/react-router/basic-file-based-code-splitting/src/routes/index.tsx b/e2e/react-router/basic-file-based-code-splitting/src/routes/index.tsx new file mode 100644 index 0000000000..eac82a9174 --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/src/routes/index.tsx @@ -0,0 +1,14 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: Home, +}) + +function Home() { + return ( +
+

Welcome Home!

+
+ ) +} diff --git a/e2e/react-router/basic-file-based-code-splitting/src/routes/posts.$postId.tsx b/e2e/react-router/basic-file-based-code-splitting/src/routes/posts.$postId.tsx new file mode 100644 index 0000000000..febb02ab2f --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/src/routes/posts.$postId.tsx @@ -0,0 +1,28 @@ +import * as React from 'react' +import { ErrorComponent, createFileRoute } from '@tanstack/react-router' +import { fetchPost } from '../posts' +import type { ErrorComponentProps } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/$postId')({ + loader: async ({ params: { postId } }) => fetchPost(postId), + errorComponent: PostErrorComponent as any, + notFoundComponent: () => { + return

Post not found

+ }, + component: PostComponent, +}) + +export function PostErrorComponent({ error }: ErrorComponentProps) { + return +} + +function PostComponent() { + const post = Route.useLoaderData() + + return ( +
+

{post.title}

+
{post.body}
+
+ ) +} diff --git a/e2e/react-router/basic-file-based-code-splitting/src/routes/posts.index.tsx b/e2e/react-router/basic-file-based-code-splitting/src/routes/posts.index.tsx new file mode 100644 index 0000000000..056433ca0a --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/src/routes/posts.index.tsx @@ -0,0 +1,10 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/')({ + component: PostsIndexComponent, +}) + +function PostsIndexComponent() { + return
Select a post.
+} diff --git a/e2e/react-router/basic-file-based-code-splitting/src/routes/posts.tsx b/e2e/react-router/basic-file-based-code-splitting/src/routes/posts.tsx new file mode 100644 index 0000000000..c7a09ed7f8 --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/src/routes/posts.tsx @@ -0,0 +1,39 @@ +import * as React from 'react' +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' +import { fetchPosts } from '../posts' + +export const Route = createFileRoute('/posts')({ + loader: fetchPosts, + component: PostsComponent, +}) + +function PostsComponent() { + const posts = Route.useLoaderData() + + return ( +
+
    + {[...posts, { id: 'i-do-not-exist', title: 'Non-existent Post' }].map( + (post) => { + return ( +
  • + +
    {post.title.substring(0, 20)}
    + +
  • + ) + }, + )} +
+
+ +
+ ) +} diff --git a/e2e/react-router/basic-file-based-code-splitting/src/routes/without-loader.tsx b/e2e/react-router/basic-file-based-code-splitting/src/routes/without-loader.tsx new file mode 100644 index 0000000000..9dddcfe5f4 --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/src/routes/without-loader.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/without-loader')({ + component: () =>
Hello /without-loader!
, +}) diff --git a/examples/react/basic-file-based/tests/app.spec.ts b/e2e/react-router/basic-file-based-code-splitting/tests/app.spec.ts similarity index 100% rename from examples/react/basic-file-based/tests/app.spec.ts rename to e2e/react-router/basic-file-based-code-splitting/tests/app.spec.ts diff --git a/e2e/react-router/basic-file-based-code-splitting/tests/preload.test.ts b/e2e/react-router/basic-file-based-code-splitting/tests/preload.test.ts new file mode 100644 index 0000000000..e1334df0d2 --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/tests/preload.test.ts @@ -0,0 +1,21 @@ +import { expect, test } from '@playwright/test' + +test.beforeEach(async ({ page }) => { + await page.goto('/') +}) + +test('hovering a link with preload=intent to a route without a loader should preload route', async ({ + page, +}) => { + await page.waitForLoadState('networkidle') + + const requestPromise = new Promise((resolve) => { + page.on('request', (request) => { + resolve(request.url()) + }) + }) + + await page.getByRole('link', { name: 'without-loader' }).hover() + const url = await requestPromise + expect(url).toContain('without-loader.tsx?tsr-split') +}) diff --git a/e2e/react-router/basic-file-based-code-splitting/tsconfig.json b/e2e/react-router/basic-file-based-code-splitting/tsconfig.json new file mode 100644 index 0000000000..3435721cc4 --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "target": "ESNext", + "moduleResolution": "Bundler", + "noEmit": true, + "skipLibCheck": true + } +} diff --git a/e2e/react-router/basic-file-based-code-splitting/vite.config.ts b/e2e/react-router/basic-file-based-code-splitting/vite.config.ts new file mode 100644 index 0000000000..3cc73e272d --- /dev/null +++ b/e2e/react-router/basic-file-based-code-splitting/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import { TanStackRouterVite } from '@tanstack/router-plugin/vite' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [TanStackRouterVite({ autoCodeSplitting: true }), react()], +}) diff --git a/e2e/react-router/basic-file-based/.gitignore b/e2e/react-router/basic-file-based/.gitignore new file mode 100644 index 0000000000..a6ea47e508 --- /dev/null +++ b/e2e/react-router/basic-file-based/.gitignore @@ -0,0 +1,10 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local + +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/e2e/react-router/basic-file-based/index.html b/e2e/react-router/basic-file-based/index.html new file mode 100644 index 0000000000..a4b3349437 --- /dev/null +++ b/e2e/react-router/basic-file-based/index.html @@ -0,0 +1,24 @@ + + + + + + Vite App + + + + +
+ + + diff --git a/e2e/react-router/basic-file-based/package.json b/e2e/react-router/basic-file-based/package.json new file mode 100644 index 0000000000..76f565d77f --- /dev/null +++ b/e2e/react-router/basic-file-based/package.json @@ -0,0 +1,28 @@ +{ + "name": "tanstack-router-e2e-react-basic-file-based", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port=3001", + "build": "vite build && tsc --noEmit", + "serve": "vite preview", + "start": "vite", + "test:e2e": "playwright test --project=chromium" + }, + "dependencies": { + "@tanstack/react-router": "workspace:^", + "@tanstack/router-devtools": "workspace:^", + "@tanstack/router-plugin": "workspace:^", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "redaxios": "^0.5.1", + "zod": "^3.23.8" + }, + "devDependencies": { + "@playwright/test": "^1.47.1", + "@types/react": "^18.2.47", + "@types/react-dom": "^18.2.18", + "@vitejs/plugin-react": "^4.3.1", + "vite": "^5.4.5" + } +} diff --git a/examples/react/basic-react-query-file-based/playwright.config.ts b/e2e/react-router/basic-file-based/playwright.config.ts similarity index 100% rename from examples/react/basic-react-query-file-based/playwright.config.ts rename to e2e/react-router/basic-file-based/playwright.config.ts diff --git a/e2e/react-router/basic-file-based/src/main.tsx b/e2e/react-router/basic-file-based/src/main.tsx new file mode 100644 index 0000000000..18b1b603f8 --- /dev/null +++ b/e2e/react-router/basic-file-based/src/main.tsx @@ -0,0 +1,25 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import { RouterProvider, createRouter } from '@tanstack/react-router' +import { routeTree } from './routeTree.gen' + +// Set up a Router instance +const router = createRouter({ + routeTree, + defaultPreload: 'intent', + defaultStaleTime: 5000, +}) + +// Register things for typesafety +declare module '@tanstack/react-router' { + interface Register { + router: typeof router + } +} + +const rootElement = document.getElementById('app')! + +if (!rootElement.innerHTML) { + const root = ReactDOM.createRoot(rootElement) + root.render() +} diff --git a/e2e/react-router/basic-file-based/src/posts.tsx b/e2e/react-router/basic-file-based/src/posts.tsx new file mode 100644 index 0000000000..3ccf1ff421 --- /dev/null +++ b/e2e/react-router/basic-file-based/src/posts.tsx @@ -0,0 +1,32 @@ +import { notFound } from '@tanstack/react-router' +import axios from 'redaxios' + +export type PostType = { + id: string + title: string + body: string +} + +export const fetchPost = async (postId: string) => { + console.info(`Fetching post with id ${postId}...`) + await new Promise((r) => setTimeout(r, 500)) + const post = await axios + .get(`https://jsonplaceholder.typicode.com/posts/${postId}`) + .then((r) => r.data) + .catch((err) => { + if (err.status === 404) { + throw notFound() + } + throw err + }) + + return post +} + +export const fetchPosts = async () => { + console.info('Fetching posts...') + await new Promise((r) => setTimeout(r, 500)) + return axios + .get>('https://jsonplaceholder.typicode.com/posts') + .then((r) => r.data.slice(0, 10)) +} diff --git a/e2e/react-router/basic-file-based/src/routeTree.gen.ts b/e2e/react-router/basic-file-based/src/routeTree.gen.ts new file mode 100644 index 0000000000..149df203a2 --- /dev/null +++ b/e2e/react-router/basic-file-based/src/routeTree.gen.ts @@ -0,0 +1,294 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/__root' +import { Route as PostsImport } from './routes/posts' +import { Route as LayoutImport } from './routes/_layout' +import { Route as IndexImport } from './routes/index' +import { Route as PostsIndexImport } from './routes/posts.index' +import { Route as PostsPostIdImport } from './routes/posts.$postId' +import { Route as LayoutLayout2Import } from './routes/_layout/_layout-2' +import { Route as LayoutLayout2LayoutBImport } from './routes/_layout/_layout-2/layout-b' +import { Route as LayoutLayout2LayoutAImport } from './routes/_layout/_layout-2/layout-a' + +// Create/Update Routes + +const PostsRoute = PostsImport.update({ + path: '/posts', + getParentRoute: () => rootRoute, +} as any) + +const LayoutRoute = LayoutImport.update({ + id: '/_layout', + getParentRoute: () => rootRoute, +} as any) + +const IndexRoute = IndexImport.update({ + path: '/', + getParentRoute: () => rootRoute, +} as any) + +const PostsIndexRoute = PostsIndexImport.update({ + path: '/', + getParentRoute: () => PostsRoute, +} as any) + +const PostsPostIdRoute = PostsPostIdImport.update({ + path: '/$postId', + getParentRoute: () => PostsRoute, +} as any) + +const LayoutLayout2Route = LayoutLayout2Import.update({ + id: '/_layout-2', + getParentRoute: () => LayoutRoute, +} as any) + +const LayoutLayout2LayoutBRoute = LayoutLayout2LayoutBImport.update({ + path: '/layout-b', + getParentRoute: () => LayoutLayout2Route, +} as any) + +const LayoutLayout2LayoutARoute = LayoutLayout2LayoutAImport.update({ + path: '/layout-a', + getParentRoute: () => LayoutLayout2Route, +} as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexImport + parentRoute: typeof rootRoute + } + '/_layout': { + id: '/_layout' + path: '' + fullPath: '' + preLoaderRoute: typeof LayoutImport + parentRoute: typeof rootRoute + } + '/posts': { + id: '/posts' + path: '/posts' + fullPath: '/posts' + preLoaderRoute: typeof PostsImport + parentRoute: typeof rootRoute + } + '/_layout/_layout-2': { + id: '/_layout/_layout-2' + path: '' + fullPath: '' + preLoaderRoute: typeof LayoutLayout2Import + parentRoute: typeof LayoutImport + } + '/posts/$postId': { + id: '/posts/$postId' + path: '/$postId' + fullPath: '/posts/$postId' + preLoaderRoute: typeof PostsPostIdImport + parentRoute: typeof PostsImport + } + '/posts/': { + id: '/posts/' + path: '/' + fullPath: '/posts/' + preLoaderRoute: typeof PostsIndexImport + parentRoute: typeof PostsImport + } + '/_layout/_layout-2/layout-a': { + id: '/_layout/_layout-2/layout-a' + path: '/layout-a' + fullPath: '/layout-a' + preLoaderRoute: typeof LayoutLayout2LayoutAImport + parentRoute: typeof LayoutLayout2Import + } + '/_layout/_layout-2/layout-b': { + id: '/_layout/_layout-2/layout-b' + path: '/layout-b' + fullPath: '/layout-b' + preLoaderRoute: typeof LayoutLayout2LayoutBImport + parentRoute: typeof LayoutLayout2Import + } + } +} + +// Create and export the route tree + +interface LayoutLayout2RouteChildren { + LayoutLayout2LayoutARoute: typeof LayoutLayout2LayoutARoute + LayoutLayout2LayoutBRoute: typeof LayoutLayout2LayoutBRoute +} + +const LayoutLayout2RouteChildren: LayoutLayout2RouteChildren = { + LayoutLayout2LayoutARoute: LayoutLayout2LayoutARoute, + LayoutLayout2LayoutBRoute: LayoutLayout2LayoutBRoute, +} + +const LayoutLayout2RouteWithChildren = LayoutLayout2Route._addFileChildren( + LayoutLayout2RouteChildren, +) + +interface LayoutRouteChildren { + LayoutLayout2Route: typeof LayoutLayout2RouteWithChildren +} + +const LayoutRouteChildren: LayoutRouteChildren = { + LayoutLayout2Route: LayoutLayout2RouteWithChildren, +} + +const LayoutRouteWithChildren = + LayoutRoute._addFileChildren(LayoutRouteChildren) + +interface PostsRouteChildren { + PostsPostIdRoute: typeof PostsPostIdRoute + PostsIndexRoute: typeof PostsIndexRoute +} + +const PostsRouteChildren: PostsRouteChildren = { + PostsPostIdRoute: PostsPostIdRoute, + PostsIndexRoute: PostsIndexRoute, +} + +const PostsRouteWithChildren = PostsRoute._addFileChildren(PostsRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '': typeof LayoutLayout2RouteWithChildren + '/posts': typeof PostsRouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/posts/': typeof PostsIndexRoute + '/layout-a': typeof LayoutLayout2LayoutARoute + '/layout-b': typeof LayoutLayout2LayoutBRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '': typeof LayoutLayout2RouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/posts': typeof PostsIndexRoute + '/layout-a': typeof LayoutLayout2LayoutARoute + '/layout-b': typeof LayoutLayout2LayoutBRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/_layout': typeof LayoutRouteWithChildren + '/posts': typeof PostsRouteWithChildren + '/_layout/_layout-2': typeof LayoutLayout2RouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/posts/': typeof PostsIndexRoute + '/_layout/_layout-2/layout-a': typeof LayoutLayout2LayoutARoute + '/_layout/_layout-2/layout-b': typeof LayoutLayout2LayoutBRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '' + | '/posts' + | '/posts/$postId' + | '/posts/' + | '/layout-a' + | '/layout-b' + fileRoutesByTo: FileRoutesByTo + to: '/' | '' | '/posts/$postId' | '/posts' | '/layout-a' | '/layout-b' + id: + | '__root__' + | '/' + | '/_layout' + | '/posts' + | '/_layout/_layout-2' + | '/posts/$postId' + | '/posts/' + | '/_layout/_layout-2/layout-a' + | '/_layout/_layout-2/layout-b' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + LayoutRoute: typeof LayoutRouteWithChildren + PostsRoute: typeof PostsRouteWithChildren +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + LayoutRoute: LayoutRouteWithChildren, + PostsRoute: PostsRouteWithChildren, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [ + "/", + "/_layout", + "/posts" + ] + }, + "/": { + "filePath": "index.tsx" + }, + "/_layout": { + "filePath": "_layout.tsx", + "children": [ + "/_layout/_layout-2" + ] + }, + "/posts": { + "filePath": "posts.tsx", + "children": [ + "/posts/$postId", + "/posts/" + ] + }, + "/_layout/_layout-2": { + "filePath": "_layout/_layout-2.tsx", + "parent": "/_layout", + "children": [ + "/_layout/_layout-2/layout-a", + "/_layout/_layout-2/layout-b" + ] + }, + "/posts/$postId": { + "filePath": "posts.$postId.tsx", + "parent": "/posts" + }, + "/posts/": { + "filePath": "posts.index.tsx", + "parent": "/posts" + }, + "/_layout/_layout-2/layout-a": { + "filePath": "_layout/_layout-2/layout-a.tsx", + "parent": "/_layout/_layout-2" + }, + "/_layout/_layout-2/layout-b": { + "filePath": "_layout/_layout-2/layout-b.tsx", + "parent": "/_layout/_layout-2" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/e2e/react-router/basic-file-based/src/routes/__root.tsx b/e2e/react-router/basic-file-based/src/routes/__root.tsx new file mode 100644 index 0000000000..6b57d1e239 --- /dev/null +++ b/e2e/react-router/basic-file-based/src/routes/__root.tsx @@ -0,0 +1,62 @@ +import * as React from 'react' +import { Link, Outlet, createRootRoute } from '@tanstack/react-router' +import { TanStackRouterDevtools } from '@tanstack/router-devtools' + +export const Route = createRootRoute({ + component: RootComponent, + notFoundComponent: () => { + return ( +
+

This is the notFoundComponent configured on root route

+ Start Over +
+ ) + }, +}) + +function RootComponent() { + return ( + <> +
+ + Home + {' '} + + Posts + {' '} + + Layout + {' '} + + This Route Does Not Exist + +
+
+ + {/* Start rendering router matches */} + + + ) +} diff --git a/e2e/react-router/basic-file-based/src/routes/_layout.tsx b/e2e/react-router/basic-file-based/src/routes/_layout.tsx new file mode 100644 index 0000000000..02ddbb1cd9 --- /dev/null +++ b/e2e/react-router/basic-file-based/src/routes/_layout.tsx @@ -0,0 +1,16 @@ +import { Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a layout
+
+ +
+
+ ) +} diff --git a/e2e/react-router/basic-file-based/src/routes/_layout/_layout-2.tsx b/e2e/react-router/basic-file-based/src/routes/_layout/_layout-2.tsx new file mode 100644 index 0000000000..3b7dbf2903 --- /dev/null +++ b/e2e/react-router/basic-file-based/src/routes/_layout/_layout-2.tsx @@ -0,0 +1,34 @@ +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a nested layout
+
+ + Layout A + + + Layout B + +
+
+ +
+
+ ) +} diff --git a/e2e/react-router/basic-file-based/src/routes/_layout/_layout-2/layout-a.tsx b/e2e/react-router/basic-file-based/src/routes/_layout/_layout-2/layout-a.tsx new file mode 100644 index 0000000000..61e19b4d9f --- /dev/null +++ b/e2e/react-router/basic-file-based/src/routes/_layout/_layout-2/layout-a.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2/layout-a')({ + component: LayoutAComponent, +}) + +function LayoutAComponent() { + return
I'm layout A!
+} diff --git a/e2e/react-router/basic-file-based/src/routes/_layout/_layout-2/layout-b.tsx b/e2e/react-router/basic-file-based/src/routes/_layout/_layout-2/layout-b.tsx new file mode 100644 index 0000000000..cceed1fb9a --- /dev/null +++ b/e2e/react-router/basic-file-based/src/routes/_layout/_layout-2/layout-b.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2/layout-b')({ + component: LayoutBComponent, +}) + +function LayoutBComponent() { + return
I'm layout B!
+} diff --git a/e2e/react-router/basic-file-based/src/routes/index.tsx b/e2e/react-router/basic-file-based/src/routes/index.tsx new file mode 100644 index 0000000000..eac82a9174 --- /dev/null +++ b/e2e/react-router/basic-file-based/src/routes/index.tsx @@ -0,0 +1,14 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: Home, +}) + +function Home() { + return ( +
+

Welcome Home!

+
+ ) +} diff --git a/e2e/react-router/basic-file-based/src/routes/posts.$postId.tsx b/e2e/react-router/basic-file-based/src/routes/posts.$postId.tsx new file mode 100644 index 0000000000..febb02ab2f --- /dev/null +++ b/e2e/react-router/basic-file-based/src/routes/posts.$postId.tsx @@ -0,0 +1,28 @@ +import * as React from 'react' +import { ErrorComponent, createFileRoute } from '@tanstack/react-router' +import { fetchPost } from '../posts' +import type { ErrorComponentProps } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/$postId')({ + loader: async ({ params: { postId } }) => fetchPost(postId), + errorComponent: PostErrorComponent as any, + notFoundComponent: () => { + return

Post not found

+ }, + component: PostComponent, +}) + +export function PostErrorComponent({ error }: ErrorComponentProps) { + return +} + +function PostComponent() { + const post = Route.useLoaderData() + + return ( +
+

{post.title}

+
{post.body}
+
+ ) +} diff --git a/e2e/react-router/basic-file-based/src/routes/posts.index.tsx b/e2e/react-router/basic-file-based/src/routes/posts.index.tsx new file mode 100644 index 0000000000..056433ca0a --- /dev/null +++ b/e2e/react-router/basic-file-based/src/routes/posts.index.tsx @@ -0,0 +1,10 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/')({ + component: PostsIndexComponent, +}) + +function PostsIndexComponent() { + return
Select a post.
+} diff --git a/e2e/react-router/basic-file-based/src/routes/posts.tsx b/e2e/react-router/basic-file-based/src/routes/posts.tsx new file mode 100644 index 0000000000..c7a09ed7f8 --- /dev/null +++ b/e2e/react-router/basic-file-based/src/routes/posts.tsx @@ -0,0 +1,39 @@ +import * as React from 'react' +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' +import { fetchPosts } from '../posts' + +export const Route = createFileRoute('/posts')({ + loader: fetchPosts, + component: PostsComponent, +}) + +function PostsComponent() { + const posts = Route.useLoaderData() + + return ( +
+
    + {[...posts, { id: 'i-do-not-exist', title: 'Non-existent Post' }].map( + (post) => { + return ( +
  • + +
    {post.title.substring(0, 20)}
    + +
  • + ) + }, + )} +
+
+ +
+ ) +} diff --git a/examples/react/basic-react-query-file-based/tests/app.spec.ts b/e2e/react-router/basic-file-based/tests/app.spec.ts similarity index 100% rename from examples/react/basic-react-query-file-based/tests/app.spec.ts rename to e2e/react-router/basic-file-based/tests/app.spec.ts diff --git a/e2e/react-router/basic-file-based/tsconfig.json b/e2e/react-router/basic-file-based/tsconfig.json new file mode 100644 index 0000000000..c9e17e2b68 --- /dev/null +++ b/e2e/react-router/basic-file-based/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx" + } +} diff --git a/e2e/react-router/basic-file-based/vite.config.js b/e2e/react-router/basic-file-based/vite.config.js new file mode 100644 index 0000000000..9cb8cad864 --- /dev/null +++ b/e2e/react-router/basic-file-based/vite.config.js @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import { TanStackRouterVite } from '@tanstack/router-plugin/vite' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [TanStackRouterVite(), react()], +}) diff --git a/e2e/react-router/basic-react-query-file-based/.gitignore b/e2e/react-router/basic-react-query-file-based/.gitignore new file mode 100644 index 0000000000..a6ea47e508 --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/.gitignore @@ -0,0 +1,10 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local + +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/e2e/react-router/basic-react-query-file-based/index.html b/e2e/react-router/basic-react-query-file-based/index.html new file mode 100644 index 0000000000..a4b3349437 --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/index.html @@ -0,0 +1,24 @@ + + + + + + Vite App + + + + +
+ + + diff --git a/e2e/react-router/basic-react-query-file-based/package.json b/e2e/react-router/basic-react-query-file-based/package.json new file mode 100644 index 0000000000..1476b96c28 --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/package.json @@ -0,0 +1,30 @@ +{ + "name": "tanstack-router-e2e-react-basic-react-query-file-based", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port=3001", + "build": "vite build && tsc --noEmit", + "serve": "vite preview", + "start": "vite", + "test:e2e": "playwright test --project=chromium" + }, + "dependencies": { + "@tanstack/react-query": "^5.56.2", + "@tanstack/react-query-devtools": "^5.56.2", + "@tanstack/react-router": "workspace:^", + "@tanstack/router-devtools": "workspace:^", + "@tanstack/router-plugin": "workspace:^", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "redaxios": "^0.5.1", + "zod": "^3.23.8" + }, + "devDependencies": { + "@playwright/test": "^1.47.1", + "@types/react": "^18.2.47", + "@types/react-dom": "^18.2.18", + "@vitejs/plugin-react": "^4.3.1", + "vite": "^5.4.5" + } +} diff --git a/examples/react/basic-react-query/playwright.config.ts b/e2e/react-router/basic-react-query-file-based/playwright.config.ts similarity index 100% rename from examples/react/basic-react-query/playwright.config.ts rename to e2e/react-router/basic-react-query-file-based/playwright.config.ts diff --git a/e2e/react-router/basic-react-query-file-based/src/main.tsx b/e2e/react-router/basic-react-query-file-based/src/main.tsx new file mode 100644 index 0000000000..7f98a1d3d5 --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/src/main.tsx @@ -0,0 +1,37 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import { RouterProvider, createRouter } from '@tanstack/react-router' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { routeTree } from './routeTree.gen' + +const queryClient = new QueryClient() + +// Set up a Router instance +const router = createRouter({ + routeTree, + context: { + queryClient, + }, + defaultPreload: 'intent', + // Since we're using React Query, we don't want loader calls to ever be stale + // This will ensure that the loader is always called when the route is preloaded or visited + defaultPreloadStaleTime: 0, +}) + +// Register things for typesafety +declare module '@tanstack/react-router' { + interface Register { + router: typeof router + } +} + +const rootElement = document.getElementById('app')! + +if (!rootElement.innerHTML) { + const root = ReactDOM.createRoot(rootElement) + root.render( + + + , + ) +} diff --git a/e2e/react-router/basic-react-query-file-based/src/postQueryOptions.tsx b/e2e/react-router/basic-react-query-file-based/src/postQueryOptions.tsx new file mode 100644 index 0000000000..f4dae09458 --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/src/postQueryOptions.tsx @@ -0,0 +1,8 @@ +import { queryOptions } from '@tanstack/react-query' +import { fetchPost } from './posts' + +export const postQueryOptions = (postId: string) => + queryOptions({ + queryKey: ['posts', { postId }], + queryFn: () => fetchPost(postId), + }) diff --git a/e2e/react-router/basic-react-query-file-based/src/posts.tsx b/e2e/react-router/basic-react-query-file-based/src/posts.tsx new file mode 100644 index 0000000000..d551659b92 --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/src/posts.tsx @@ -0,0 +1,33 @@ +import axios from 'redaxios' + +export type PostType = { + id: string + title: string + body: string +} + +export class PostNotFoundError extends Error {} + +export const fetchPost = async (postId: string) => { + console.info(`Fetching post with id ${postId}...`) + await new Promise((r) => setTimeout(r, 500)) + const post = await axios + .get(`https://jsonplaceholder.typicode.com/posts/${postId}`) + .then((r) => r.data) + .catch((err) => { + if (err.status === 404) { + throw new PostNotFoundError(`Post with id "${postId}" not found!`) + } + throw err + }) + + return post +} + +export const fetchPosts = async () => { + console.info('Fetching posts...') + await new Promise((r) => setTimeout(r, 500)) + return axios + .get>('https://jsonplaceholder.typicode.com/posts') + .then((r) => r.data.slice(0, 10)) +} diff --git a/e2e/react-router/basic-react-query-file-based/src/postsQueryOptions.tsx b/e2e/react-router/basic-react-query-file-based/src/postsQueryOptions.tsx new file mode 100644 index 0000000000..6d96d627f3 --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/src/postsQueryOptions.tsx @@ -0,0 +1,7 @@ +import { queryOptions } from '@tanstack/react-query' +import { fetchPosts } from './posts' + +export const postsQueryOptions = queryOptions({ + queryKey: ['posts'], + queryFn: () => fetchPosts(), +}) diff --git a/e2e/react-router/basic-react-query-file-based/src/routeTree.gen.ts b/e2e/react-router/basic-react-query-file-based/src/routeTree.gen.ts new file mode 100644 index 0000000000..149df203a2 --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/src/routeTree.gen.ts @@ -0,0 +1,294 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/__root' +import { Route as PostsImport } from './routes/posts' +import { Route as LayoutImport } from './routes/_layout' +import { Route as IndexImport } from './routes/index' +import { Route as PostsIndexImport } from './routes/posts.index' +import { Route as PostsPostIdImport } from './routes/posts.$postId' +import { Route as LayoutLayout2Import } from './routes/_layout/_layout-2' +import { Route as LayoutLayout2LayoutBImport } from './routes/_layout/_layout-2/layout-b' +import { Route as LayoutLayout2LayoutAImport } from './routes/_layout/_layout-2/layout-a' + +// Create/Update Routes + +const PostsRoute = PostsImport.update({ + path: '/posts', + getParentRoute: () => rootRoute, +} as any) + +const LayoutRoute = LayoutImport.update({ + id: '/_layout', + getParentRoute: () => rootRoute, +} as any) + +const IndexRoute = IndexImport.update({ + path: '/', + getParentRoute: () => rootRoute, +} as any) + +const PostsIndexRoute = PostsIndexImport.update({ + path: '/', + getParentRoute: () => PostsRoute, +} as any) + +const PostsPostIdRoute = PostsPostIdImport.update({ + path: '/$postId', + getParentRoute: () => PostsRoute, +} as any) + +const LayoutLayout2Route = LayoutLayout2Import.update({ + id: '/_layout-2', + getParentRoute: () => LayoutRoute, +} as any) + +const LayoutLayout2LayoutBRoute = LayoutLayout2LayoutBImport.update({ + path: '/layout-b', + getParentRoute: () => LayoutLayout2Route, +} as any) + +const LayoutLayout2LayoutARoute = LayoutLayout2LayoutAImport.update({ + path: '/layout-a', + getParentRoute: () => LayoutLayout2Route, +} as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexImport + parentRoute: typeof rootRoute + } + '/_layout': { + id: '/_layout' + path: '' + fullPath: '' + preLoaderRoute: typeof LayoutImport + parentRoute: typeof rootRoute + } + '/posts': { + id: '/posts' + path: '/posts' + fullPath: '/posts' + preLoaderRoute: typeof PostsImport + parentRoute: typeof rootRoute + } + '/_layout/_layout-2': { + id: '/_layout/_layout-2' + path: '' + fullPath: '' + preLoaderRoute: typeof LayoutLayout2Import + parentRoute: typeof LayoutImport + } + '/posts/$postId': { + id: '/posts/$postId' + path: '/$postId' + fullPath: '/posts/$postId' + preLoaderRoute: typeof PostsPostIdImport + parentRoute: typeof PostsImport + } + '/posts/': { + id: '/posts/' + path: '/' + fullPath: '/posts/' + preLoaderRoute: typeof PostsIndexImport + parentRoute: typeof PostsImport + } + '/_layout/_layout-2/layout-a': { + id: '/_layout/_layout-2/layout-a' + path: '/layout-a' + fullPath: '/layout-a' + preLoaderRoute: typeof LayoutLayout2LayoutAImport + parentRoute: typeof LayoutLayout2Import + } + '/_layout/_layout-2/layout-b': { + id: '/_layout/_layout-2/layout-b' + path: '/layout-b' + fullPath: '/layout-b' + preLoaderRoute: typeof LayoutLayout2LayoutBImport + parentRoute: typeof LayoutLayout2Import + } + } +} + +// Create and export the route tree + +interface LayoutLayout2RouteChildren { + LayoutLayout2LayoutARoute: typeof LayoutLayout2LayoutARoute + LayoutLayout2LayoutBRoute: typeof LayoutLayout2LayoutBRoute +} + +const LayoutLayout2RouteChildren: LayoutLayout2RouteChildren = { + LayoutLayout2LayoutARoute: LayoutLayout2LayoutARoute, + LayoutLayout2LayoutBRoute: LayoutLayout2LayoutBRoute, +} + +const LayoutLayout2RouteWithChildren = LayoutLayout2Route._addFileChildren( + LayoutLayout2RouteChildren, +) + +interface LayoutRouteChildren { + LayoutLayout2Route: typeof LayoutLayout2RouteWithChildren +} + +const LayoutRouteChildren: LayoutRouteChildren = { + LayoutLayout2Route: LayoutLayout2RouteWithChildren, +} + +const LayoutRouteWithChildren = + LayoutRoute._addFileChildren(LayoutRouteChildren) + +interface PostsRouteChildren { + PostsPostIdRoute: typeof PostsPostIdRoute + PostsIndexRoute: typeof PostsIndexRoute +} + +const PostsRouteChildren: PostsRouteChildren = { + PostsPostIdRoute: PostsPostIdRoute, + PostsIndexRoute: PostsIndexRoute, +} + +const PostsRouteWithChildren = PostsRoute._addFileChildren(PostsRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '': typeof LayoutLayout2RouteWithChildren + '/posts': typeof PostsRouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/posts/': typeof PostsIndexRoute + '/layout-a': typeof LayoutLayout2LayoutARoute + '/layout-b': typeof LayoutLayout2LayoutBRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '': typeof LayoutLayout2RouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/posts': typeof PostsIndexRoute + '/layout-a': typeof LayoutLayout2LayoutARoute + '/layout-b': typeof LayoutLayout2LayoutBRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/_layout': typeof LayoutRouteWithChildren + '/posts': typeof PostsRouteWithChildren + '/_layout/_layout-2': typeof LayoutLayout2RouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/posts/': typeof PostsIndexRoute + '/_layout/_layout-2/layout-a': typeof LayoutLayout2LayoutARoute + '/_layout/_layout-2/layout-b': typeof LayoutLayout2LayoutBRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '' + | '/posts' + | '/posts/$postId' + | '/posts/' + | '/layout-a' + | '/layout-b' + fileRoutesByTo: FileRoutesByTo + to: '/' | '' | '/posts/$postId' | '/posts' | '/layout-a' | '/layout-b' + id: + | '__root__' + | '/' + | '/_layout' + | '/posts' + | '/_layout/_layout-2' + | '/posts/$postId' + | '/posts/' + | '/_layout/_layout-2/layout-a' + | '/_layout/_layout-2/layout-b' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + LayoutRoute: typeof LayoutRouteWithChildren + PostsRoute: typeof PostsRouteWithChildren +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + LayoutRoute: LayoutRouteWithChildren, + PostsRoute: PostsRouteWithChildren, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [ + "/", + "/_layout", + "/posts" + ] + }, + "/": { + "filePath": "index.tsx" + }, + "/_layout": { + "filePath": "_layout.tsx", + "children": [ + "/_layout/_layout-2" + ] + }, + "/posts": { + "filePath": "posts.tsx", + "children": [ + "/posts/$postId", + "/posts/" + ] + }, + "/_layout/_layout-2": { + "filePath": "_layout/_layout-2.tsx", + "parent": "/_layout", + "children": [ + "/_layout/_layout-2/layout-a", + "/_layout/_layout-2/layout-b" + ] + }, + "/posts/$postId": { + "filePath": "posts.$postId.tsx", + "parent": "/posts" + }, + "/posts/": { + "filePath": "posts.index.tsx", + "parent": "/posts" + }, + "/_layout/_layout-2/layout-a": { + "filePath": "_layout/_layout-2/layout-a.tsx", + "parent": "/_layout/_layout-2" + }, + "/_layout/_layout-2/layout-b": { + "filePath": "_layout/_layout-2/layout-b.tsx", + "parent": "/_layout/_layout-2" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/e2e/react-router/basic-react-query-file-based/src/routes/__root.tsx b/e2e/react-router/basic-react-query-file-based/src/routes/__root.tsx new file mode 100644 index 0000000000..8f36e2c17b --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/src/routes/__root.tsx @@ -0,0 +1,70 @@ +import * as React from 'react' +import { + Link, + Outlet, + createRootRouteWithContext, +} from '@tanstack/react-router' +import { TanStackRouterDevtools } from '@tanstack/router-devtools' +import { ReactQueryDevtools } from '@tanstack/react-query-devtools' +import type { QueryClient } from '@tanstack/react-query' + +export const Route = createRootRouteWithContext<{ + queryClient: QueryClient +}>()({ + component: RootComponent, + notFoundComponent: () => { + return ( +
+

This is the notFoundComponent configured on root route

+ Start Over +
+ ) + }, +}) + +function RootComponent() { + return ( + <> +
+ + Home + {' '} + + Posts + {' '} + + Layout + {' '} + + This Route Does Not Exist + +
+
+ + + + + ) +} diff --git a/e2e/react-router/basic-react-query-file-based/src/routes/_layout.tsx b/e2e/react-router/basic-react-query-file-based/src/routes/_layout.tsx new file mode 100644 index 0000000000..02ddbb1cd9 --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/src/routes/_layout.tsx @@ -0,0 +1,16 @@ +import { Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a layout
+
+ +
+
+ ) +} diff --git a/e2e/react-router/basic-react-query-file-based/src/routes/_layout/_layout-2.tsx b/e2e/react-router/basic-react-query-file-based/src/routes/_layout/_layout-2.tsx new file mode 100644 index 0000000000..3b7dbf2903 --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/src/routes/_layout/_layout-2.tsx @@ -0,0 +1,34 @@ +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a nested layout
+
+ + Layout A + + + Layout B + +
+
+ +
+
+ ) +} diff --git a/e2e/react-router/basic-react-query-file-based/src/routes/_layout/_layout-2/layout-a.tsx b/e2e/react-router/basic-react-query-file-based/src/routes/_layout/_layout-2/layout-a.tsx new file mode 100644 index 0000000000..61e19b4d9f --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/src/routes/_layout/_layout-2/layout-a.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2/layout-a')({ + component: LayoutAComponent, +}) + +function LayoutAComponent() { + return
I'm layout A!
+} diff --git a/e2e/react-router/basic-react-query-file-based/src/routes/_layout/_layout-2/layout-b.tsx b/e2e/react-router/basic-react-query-file-based/src/routes/_layout/_layout-2/layout-b.tsx new file mode 100644 index 0000000000..cceed1fb9a --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/src/routes/_layout/_layout-2/layout-b.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2/layout-b')({ + component: LayoutBComponent, +}) + +function LayoutBComponent() { + return
I'm layout B!
+} diff --git a/e2e/react-router/basic-react-query-file-based/src/routes/index.tsx b/e2e/react-router/basic-react-query-file-based/src/routes/index.tsx new file mode 100644 index 0000000000..eac82a9174 --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/src/routes/index.tsx @@ -0,0 +1,14 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: Home, +}) + +function Home() { + return ( +
+

Welcome Home!

+
+ ) +} diff --git a/e2e/react-router/basic-react-query-file-based/src/routes/posts.$postId.tsx b/e2e/react-router/basic-react-query-file-based/src/routes/posts.$postId.tsx new file mode 100644 index 0000000000..78455fdcdf --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/src/routes/posts.$postId.tsx @@ -0,0 +1,58 @@ +import * as React from 'react' +import { + ErrorComponent, + createFileRoute, + useRouter, +} from '@tanstack/react-router' +import { + useQueryErrorResetBoundary, + useSuspenseQuery, +} from '@tanstack/react-query' +import { PostNotFoundError } from '../posts' +import { postQueryOptions } from '../postQueryOptions' +import type { ErrorComponentProps } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/$postId')({ + loader: ({ context: { queryClient }, params: { postId } }) => { + return queryClient.ensureQueryData(postQueryOptions(postId)) + }, + errorComponent: PostErrorComponent, + component: PostComponent, +}) + +export function PostErrorComponent({ error, reset }: ErrorComponentProps) { + const router = useRouter() + if (error instanceof PostNotFoundError) { + return
{error.message}
+ } + const queryErrorResetBoundary = useQueryErrorResetBoundary() + + React.useEffect(() => { + queryErrorResetBoundary.reset() + }, [queryErrorResetBoundary]) + + return ( +
+ + +
+ ) +} + +function PostComponent() { + const postId = Route.useParams().postId + const { data: post } = useSuspenseQuery(postQueryOptions(postId)) + + return ( +
+

{post.title}

+
{post.body}
+
+ ) +} diff --git a/e2e/react-router/basic-react-query-file-based/src/routes/posts.index.tsx b/e2e/react-router/basic-react-query-file-based/src/routes/posts.index.tsx new file mode 100644 index 0000000000..056433ca0a --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/src/routes/posts.index.tsx @@ -0,0 +1,10 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/')({ + component: PostsIndexComponent, +}) + +function PostsIndexComponent() { + return
Select a post.
+} diff --git a/e2e/react-router/basic-react-query-file-based/src/routes/posts.tsx b/e2e/react-router/basic-react-query-file-based/src/routes/posts.tsx new file mode 100644 index 0000000000..86701f982c --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/src/routes/posts.tsx @@ -0,0 +1,42 @@ +import * as React from 'react' +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' +import { useSuspenseQuery } from '@tanstack/react-query' +import { postsQueryOptions } from '../postsQueryOptions' + +export const Route = createFileRoute('/posts')({ + loader: ({ context: { queryClient } }) => + queryClient.ensureQueryData(postsQueryOptions), + component: PostsComponent, +}) + +function PostsComponent() { + const postsQuery = useSuspenseQuery(postsQueryOptions) + const posts = postsQuery.data + + return ( +
+
    + {[...posts, { id: 'i-do-not-exist', title: 'Non-existent Post' }].map( + (post) => { + return ( +
  • + +
    {post.title.substring(0, 20)}
    + +
  • + ) + }, + )} +
+
+ +
+ ) +} diff --git a/examples/react/basic-react-query/tests/app.spec.ts b/e2e/react-router/basic-react-query-file-based/tests/app.spec.ts similarity index 100% rename from examples/react/basic-react-query/tests/app.spec.ts rename to e2e/react-router/basic-react-query-file-based/tests/app.spec.ts diff --git a/e2e/react-router/basic-react-query-file-based/tsconfig.json b/e2e/react-router/basic-react-query-file-based/tsconfig.json new file mode 100644 index 0000000000..f5a6cae049 --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "target": "ESNext", + "moduleResolution": "Bundler" + } +} diff --git a/e2e/react-router/basic-react-query-file-based/vite.config.js b/e2e/react-router/basic-react-query-file-based/vite.config.js new file mode 100644 index 0000000000..9cb8cad864 --- /dev/null +++ b/e2e/react-router/basic-react-query-file-based/vite.config.js @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import { TanStackRouterVite } from '@tanstack/router-plugin/vite' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [TanStackRouterVite(), react()], +}) diff --git a/e2e/react-router/basic-react-query/.gitignore b/e2e/react-router/basic-react-query/.gitignore new file mode 100644 index 0000000000..a6ea47e508 --- /dev/null +++ b/e2e/react-router/basic-react-query/.gitignore @@ -0,0 +1,10 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local + +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/e2e/react-router/basic-react-query/index.html b/e2e/react-router/basic-react-query/index.html new file mode 100644 index 0000000000..a4b3349437 --- /dev/null +++ b/e2e/react-router/basic-react-query/index.html @@ -0,0 +1,24 @@ + + + + + + Vite App + + + + +
+ + + diff --git a/e2e/react-router/basic-react-query/package.json b/e2e/react-router/basic-react-query/package.json new file mode 100644 index 0000000000..21aabaa44f --- /dev/null +++ b/e2e/react-router/basic-react-query/package.json @@ -0,0 +1,28 @@ +{ + "name": "tanstack-router-e2e-react-react-query", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port=3001", + "build": "vite build && tsc --noEmit", + "serve": "vite preview", + "start": "vite", + "test:e2e": "playwright test --project=chromium" + }, + "dependencies": { + "@tanstack/react-query": "^5.56.2", + "@tanstack/react-query-devtools": "^5.56.2", + "@tanstack/react-router": "workspace:^", + "@tanstack/router-devtools": "workspace:^", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "redaxios": "^0.5.1" + }, + "devDependencies": { + "@playwright/test": "^1.47.1", + "@types/react": "^18.2.47", + "@types/react-dom": "^18.2.18", + "@vitejs/plugin-react": "^4.3.1", + "vite": "^5.4.5" + } +} diff --git a/examples/react/basic/playwright.config.ts b/e2e/react-router/basic-react-query/playwright.config.ts similarity index 100% rename from examples/react/basic/playwright.config.ts rename to e2e/react-router/basic-react-query/playwright.config.ts diff --git a/e2e/react-router/basic-react-query/src/main.tsx b/e2e/react-router/basic-react-query/src/main.tsx new file mode 100644 index 0000000000..a5455491c0 --- /dev/null +++ b/e2e/react-router/basic-react-query/src/main.tsx @@ -0,0 +1,274 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import { + ErrorComponent, + type ErrorComponentProps, + Link, + Outlet, + RouterProvider, + createRootRouteWithContext, + createRoute, + createRouter, + useRouter, +} from '@tanstack/react-router' +import { TanStackRouterDevtools } from '@tanstack/router-devtools' +import { ReactQueryDevtools } from '@tanstack/react-query-devtools' +import { + QueryClient, + QueryClientProvider, + useQueryErrorResetBoundary, + useSuspenseQuery, +} from '@tanstack/react-query' +import { NotFoundError, postQueryOptions, postsQueryOptions } from './posts' + +const rootRoute = createRootRouteWithContext<{ + queryClient: QueryClient +}>()({ + component: RootComponent, + notFoundComponent: () => { + return ( +
+

This is the notFoundComponent configured on root route

+ Start Over +
+ ) + }, +}) + +function RootComponent() { + return ( + <> +
+ + Home + {' '} + + Posts + {' '} + + Layout + {' '} + + This Route Does Not Exist + +
+
+ + + + + ) +} + +const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: IndexRouteComponent, +}) + +function IndexRouteComponent() { + return ( +
+

Welcome Home!

+
+ ) +} + +const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + loader: ({ context: { queryClient } }) => + queryClient.ensureQueryData(postsQueryOptions), +}).lazy(() => import('./posts.lazy').then((d) => d.Route)) + +const postsIndexRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '/', + component: PostsIndexRouteComponent, +}) + +function PostsIndexRouteComponent() { + return
Select a post.
+} + +const postRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '$postId', + errorComponent: PostErrorComponent, + loader: ({ context: { queryClient }, params: { postId } }) => + queryClient.ensureQueryData(postQueryOptions(postId)), + component: PostRouteComponent, +}) + +function PostErrorComponent({ error, reset }: ErrorComponentProps) { + const router = useRouter() + if (error instanceof NotFoundError) { + return
{error.message}
+ } + const queryErrorResetBoundary = useQueryErrorResetBoundary() + + React.useEffect(() => { + queryErrorResetBoundary.reset() + }, [queryErrorResetBoundary]) + + return ( +
+ + +
+ ) +} + +function PostRouteComponent() { + const { postId } = postRoute.useParams() + const postQuery = useSuspenseQuery(postQueryOptions(postId)) + const post = postQuery.data + + return ( +
+

{post.title}

+
{post.body}
+
+ ) +} + +const layoutRoute = createRoute({ + getParentRoute: () => rootRoute, + id: '_layout', + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a layout
+
+ +
+
+ ) +} + +const layout2Route = createRoute({ + getParentRoute: () => layoutRoute, + id: '_layout-2', + component: Layout2Component, +}) + +function Layout2Component() { + return ( +
+
I'm a nested layout
+
+ + Layout A + + + Layout B + +
+
+ +
+
+ ) +} + +const layoutARoute = createRoute({ + getParentRoute: () => layout2Route, + path: '/layout-a', + component: LayoutAComponent, +}) + +function LayoutAComponent() { + return
I'm layout A!
+} + +const layoutBRoute = createRoute({ + getParentRoute: () => layout2Route, + path: '/layout-b', + component: LayoutBComponent, +}) + +function LayoutBComponent() { + return
I'm layout B!
+} + +const routeTree = rootRoute.addChildren([ + postsRoute.addChildren([postRoute, postsIndexRoute]), + layoutRoute.addChildren([ + layout2Route.addChildren([layoutARoute, layoutBRoute]), + ]), + indexRoute, +]) + +const queryClient = new QueryClient() + +// Set up a Router instance +const router = createRouter({ + routeTree, + defaultPreload: 'intent', + // Since we're using React Query, we don't want loader calls to ever be stale + // This will ensure that the loader is always called when the route is preloaded or visited + defaultPreloadStaleTime: 0, + context: { + queryClient, + }, +}) + +// Register things for typesafety +declare module '@tanstack/react-router' { + interface Register { + router: typeof router + } +} + +const rootElement = document.getElementById('app')! + +if (!rootElement.innerHTML) { + const root = ReactDOM.createRoot(rootElement) + + root.render( + + + , + ) +} diff --git a/e2e/react-router/basic-react-query/src/posts.lazy.tsx b/e2e/react-router/basic-react-query/src/posts.lazy.tsx new file mode 100644 index 0000000000..b5ed92e4ac --- /dev/null +++ b/e2e/react-router/basic-react-query/src/posts.lazy.tsx @@ -0,0 +1,40 @@ +import * as React from 'react' +import { Link, Outlet, createLazyRoute } from '@tanstack/react-router' +import { useSuspenseQuery } from '@tanstack/react-query' +import { postsQueryOptions } from './posts' + +export const Route = createLazyRoute('/posts')({ + component: PostsComponent, +}) + +function PostsComponent() { + const postsQuery = useSuspenseQuery(postsQueryOptions) + + const posts = postsQuery.data + + return ( +
+
    + {[...posts, { id: 'i-do-not-exist', title: 'Non-existent Post' }].map( + (post) => { + return ( +
  • + +
    {post.title.substring(0, 20)}
    + +
  • + ) + }, + )} +
+ +
+ ) +} diff --git a/e2e/react-router/basic-react-query/src/posts.ts b/e2e/react-router/basic-react-query/src/posts.ts new file mode 100644 index 0000000000..54e126683e --- /dev/null +++ b/e2e/react-router/basic-react-query/src/posts.ts @@ -0,0 +1,44 @@ +import axios from 'redaxios' +import { queryOptions } from '@tanstack/react-query' + +export class NotFoundError extends Error {} + +type PostType = { + id: string + title: string + body: string +} + +const fetchPosts = async () => { + console.info('Fetching posts...') + await new Promise((r) => setTimeout(r, 500)) + return axios + .get>('https://jsonplaceholder.typicode.com/posts') + .then((r) => r.data.slice(0, 10)) +} + +const fetchPost = async (postId: string) => { + console.info(`Fetching post with id ${postId}...`) + await new Promise((r) => setTimeout(r, 500)) + const post = await axios + .get(`https://jsonplaceholder.typicode.com/posts/${postId}`) + .then((r) => r.data) + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (!post) { + throw new NotFoundError(`Post with id "${postId}" not found!`) + } + + return post +} + +export const postQueryOptions = (postId: string) => + queryOptions({ + queryKey: ['posts', { postId }], + queryFn: () => fetchPost(postId), + }) + +export const postsQueryOptions = queryOptions({ + queryKey: ['posts'], + queryFn: () => fetchPosts(), +}) diff --git a/examples/react/basic/tests/app.spec.ts b/e2e/react-router/basic-react-query/tests/app.spec.ts similarity index 100% rename from examples/react/basic/tests/app.spec.ts rename to e2e/react-router/basic-react-query/tests/app.spec.ts diff --git a/e2e/react-router/basic-react-query/tsconfig.json b/e2e/react-router/basic-react-query/tsconfig.json new file mode 100644 index 0000000000..0d2a31a7d7 --- /dev/null +++ b/e2e/react-router/basic-react-query/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "target": "ESNext", + "moduleResolution": "Bundler", + "module": "ESNext" + } +} diff --git a/e2e/react-router/basic-react-query/vite.config.js b/e2e/react-router/basic-react-query/vite.config.js new file mode 100644 index 0000000000..5a33944a9b --- /dev/null +++ b/e2e/react-router/basic-react-query/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/e2e/react-router/basic-virtual-file-based/.gitignore b/e2e/react-router/basic-virtual-file-based/.gitignore new file mode 100644 index 0000000000..a6ea47e508 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/.gitignore @@ -0,0 +1,10 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local + +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/e2e/react-router/basic-virtual-file-based/index.html b/e2e/react-router/basic-virtual-file-based/index.html new file mode 100644 index 0000000000..a4b3349437 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/index.html @@ -0,0 +1,24 @@ + + + + + + Vite App + + + + +
+ + + diff --git a/e2e/react-router/basic-virtual-file-based/package.json b/e2e/react-router/basic-virtual-file-based/package.json new file mode 100644 index 0000000000..b05ac20371 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/package.json @@ -0,0 +1,29 @@ +{ + "name": "tanstack-router-e2e-react-basic-virtual-file-based", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port=3001", + "build": "vite build && tsc --noEmit", + "serve": "vite preview", + "start": "vite", + "test:e2e": "playwright test --project=chromium" + }, + "dependencies": { + "@tanstack/react-router": "workspace:^", + "@tanstack/router-devtools": "workspace:^", + "@tanstack/router-plugin": "workspace:^", + "@tanstack/virtual-file-routes": "workspace:^", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "redaxios": "^0.5.1", + "zod": "^3.23.8" + }, + "devDependencies": { + "@playwright/test": "^1.47.1", + "@types/react": "^18.2.47", + "@types/react-dom": "^18.2.18", + "@vitejs/plugin-react": "^4.3.1", + "vite": "^5.4.5" + } +} diff --git a/e2e/react-router/basic-virtual-file-based/playwright.config.ts b/e2e/react-router/basic-virtual-file-based/playwright.config.ts new file mode 100644 index 0000000000..f83eacf129 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/playwright.config.ts @@ -0,0 +1,29 @@ +import { defineConfig, devices } from '@playwright/test' + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + + reporter: [['line']], + + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: 'http://localhost:3001/', + }, + + webServer: { + command: 'pnpm run dev', + url: 'http://localhost:3001', + reuseExistingServer: !process.env.CI, + stdout: 'pipe', + }, + + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], +}) diff --git a/e2e/react-router/basic-virtual-file-based/routes.ts b/e2e/react-router/basic-virtual-file-based/routes.ts new file mode 100644 index 0000000000..6c2c144ec5 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/routes.ts @@ -0,0 +1,22 @@ +import { + index, + layout, + physical, + rootRoute, + route, +} from '@tanstack/virtual-file-routes' + +export const routes = rootRoute('root.tsx', [ + index('home.tsx'), + route('/posts', 'posts/posts.tsx', [ + index('posts/posts-home.tsx'), + route('$postId', 'posts/posts-detail.tsx'), + ]), + layout('first', 'layout/first-layout.tsx', [ + layout('second', 'layout/second-layout.tsx', [ + route('/layout-a', 'a.tsx'), + route('/layout-b', 'b.tsx'), + ]), + ]), + physical('/classic', 'file-based-subtree'), +]) diff --git a/e2e/react-router/basic-virtual-file-based/src/main.tsx b/e2e/react-router/basic-virtual-file-based/src/main.tsx new file mode 100644 index 0000000000..18b1b603f8 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/src/main.tsx @@ -0,0 +1,25 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import { RouterProvider, createRouter } from '@tanstack/react-router' +import { routeTree } from './routeTree.gen' + +// Set up a Router instance +const router = createRouter({ + routeTree, + defaultPreload: 'intent', + defaultStaleTime: 5000, +}) + +// Register things for typesafety +declare module '@tanstack/react-router' { + interface Register { + router: typeof router + } +} + +const rootElement = document.getElementById('app')! + +if (!rootElement.innerHTML) { + const root = ReactDOM.createRoot(rootElement) + root.render() +} diff --git a/e2e/react-router/basic-virtual-file-based/src/posts.tsx b/e2e/react-router/basic-virtual-file-based/src/posts.tsx new file mode 100644 index 0000000000..3ccf1ff421 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/src/posts.tsx @@ -0,0 +1,32 @@ +import { notFound } from '@tanstack/react-router' +import axios from 'redaxios' + +export type PostType = { + id: string + title: string + body: string +} + +export const fetchPost = async (postId: string) => { + console.info(`Fetching post with id ${postId}...`) + await new Promise((r) => setTimeout(r, 500)) + const post = await axios + .get(`https://jsonplaceholder.typicode.com/posts/${postId}`) + .then((r) => r.data) + .catch((err) => { + if (err.status === 404) { + throw notFound() + } + throw err + }) + + return post +} + +export const fetchPosts = async () => { + console.info('Fetching posts...') + await new Promise((r) => setTimeout(r, 500)) + return axios + .get>('https://jsonplaceholder.typicode.com/posts') + .then((r) => r.data.slice(0, 10)) +} diff --git a/e2e/react-router/basic-virtual-file-based/src/routeTree.gen.ts b/e2e/react-router/basic-virtual-file-based/src/routeTree.gen.ts new file mode 100644 index 0000000000..da6e49f4dc --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/src/routeTree.gen.ts @@ -0,0 +1,413 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/root' +import { Route as postsPostsImport } from './routes/posts/posts' +import { Route as layoutFirstLayoutImport } from './routes/layout/first-layout' +import { Route as homeImport } from './routes/home' +import { Route as postsPostsDetailImport } from './routes/posts/posts-detail' +import { Route as layoutSecondLayoutImport } from './routes/layout/second-layout' +import { Route as postsPostsHomeImport } from './routes/posts/posts-home' +import { Route as ClassicHelloRouteImport } from './routes/file-based-subtree/hello/route' +import { Route as ClassicHelloIndexImport } from './routes/file-based-subtree/hello/index' +import { Route as ClassicHelloWorldImport } from './routes/file-based-subtree/hello/world' +import { Route as ClassicHelloUniverseImport } from './routes/file-based-subtree/hello/universe' +import { Route as bImport } from './routes/b' +import { Route as aImport } from './routes/a' + +// Create/Update Routes + +const postsPostsRoute = postsPostsImport.update({ + path: '/posts', + getParentRoute: () => rootRoute, +} as any) + +const layoutFirstLayoutRoute = layoutFirstLayoutImport.update({ + id: '/_first', + getParentRoute: () => rootRoute, +} as any) + +const homeRoute = homeImport.update({ + path: '/', + getParentRoute: () => rootRoute, +} as any) + +const postsPostsDetailRoute = postsPostsDetailImport.update({ + path: '/$postId', + getParentRoute: () => postsPostsRoute, +} as any) + +const layoutSecondLayoutRoute = layoutSecondLayoutImport.update({ + id: '/_second', + getParentRoute: () => layoutFirstLayoutRoute, +} as any) + +const postsPostsHomeRoute = postsPostsHomeImport.update({ + path: '/', + getParentRoute: () => postsPostsRoute, +} as any) + +const ClassicHelloRouteRoute = ClassicHelloRouteImport.update({ + path: '/classic/hello', + getParentRoute: () => rootRoute, +} as any) + +const ClassicHelloIndexRoute = ClassicHelloIndexImport.update({ + path: '/', + getParentRoute: () => ClassicHelloRouteRoute, +} as any) + +const ClassicHelloWorldRoute = ClassicHelloWorldImport.update({ + path: '/world', + getParentRoute: () => ClassicHelloRouteRoute, +} as any) + +const ClassicHelloUniverseRoute = ClassicHelloUniverseImport.update({ + path: '/universe', + getParentRoute: () => ClassicHelloRouteRoute, +} as any) + +const bRoute = bImport.update({ + path: '/layout-b', + getParentRoute: () => layoutSecondLayoutRoute, +} as any) + +const aRoute = aImport.update({ + path: '/layout-a', + getParentRoute: () => layoutSecondLayoutRoute, +} as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof homeImport + parentRoute: typeof rootRoute + } + '/_first': { + id: '/_first' + path: '' + fullPath: '' + preLoaderRoute: typeof layoutFirstLayoutImport + parentRoute: typeof rootRoute + } + '/posts': { + id: '/posts' + path: '/posts' + fullPath: '/posts' + preLoaderRoute: typeof postsPostsImport + parentRoute: typeof rootRoute + } + '/classic/hello': { + id: '/classic/hello' + path: '/classic/hello' + fullPath: '/classic/hello' + preLoaderRoute: typeof ClassicHelloRouteImport + parentRoute: typeof rootRoute + } + '/posts/': { + id: '/posts/' + path: '/' + fullPath: '/posts/' + preLoaderRoute: typeof postsPostsHomeImport + parentRoute: typeof postsPostsImport + } + '/_first/_second': { + id: '/_first/_second' + path: '' + fullPath: '' + preLoaderRoute: typeof layoutSecondLayoutImport + parentRoute: typeof layoutFirstLayoutImport + } + '/posts/$postId': { + id: '/posts/$postId' + path: '/$postId' + fullPath: '/posts/$postId' + preLoaderRoute: typeof postsPostsDetailImport + parentRoute: typeof postsPostsImport + } + '/_first/_second/layout-a': { + id: '/_first/_second/layout-a' + path: '/layout-a' + fullPath: '/layout-a' + preLoaderRoute: typeof aImport + parentRoute: typeof layoutSecondLayoutImport + } + '/_first/_second/layout-b': { + id: '/_first/_second/layout-b' + path: '/layout-b' + fullPath: '/layout-b' + preLoaderRoute: typeof bImport + parentRoute: typeof layoutSecondLayoutImport + } + '/classic/hello/universe': { + id: '/classic/hello/universe' + path: '/universe' + fullPath: '/classic/hello/universe' + preLoaderRoute: typeof ClassicHelloUniverseImport + parentRoute: typeof ClassicHelloRouteImport + } + '/classic/hello/world': { + id: '/classic/hello/world' + path: '/world' + fullPath: '/classic/hello/world' + preLoaderRoute: typeof ClassicHelloWorldImport + parentRoute: typeof ClassicHelloRouteImport + } + '/classic/hello/': { + id: '/classic/hello/' + path: '/' + fullPath: '/classic/hello/' + preLoaderRoute: typeof ClassicHelloIndexImport + parentRoute: typeof ClassicHelloRouteImport + } + } +} + +// Create and export the route tree + +interface layoutSecondLayoutRouteChildren { + aRoute: typeof aRoute + bRoute: typeof bRoute +} + +const layoutSecondLayoutRouteChildren: layoutSecondLayoutRouteChildren = { + aRoute: aRoute, + bRoute: bRoute, +} + +const layoutSecondLayoutRouteWithChildren = + layoutSecondLayoutRoute._addFileChildren(layoutSecondLayoutRouteChildren) + +interface layoutFirstLayoutRouteChildren { + layoutSecondLayoutRoute: typeof layoutSecondLayoutRouteWithChildren +} + +const layoutFirstLayoutRouteChildren: layoutFirstLayoutRouteChildren = { + layoutSecondLayoutRoute: layoutSecondLayoutRouteWithChildren, +} + +const layoutFirstLayoutRouteWithChildren = + layoutFirstLayoutRoute._addFileChildren(layoutFirstLayoutRouteChildren) + +interface postsPostsRouteChildren { + postsPostsHomeRoute: typeof postsPostsHomeRoute + postsPostsDetailRoute: typeof postsPostsDetailRoute +} + +const postsPostsRouteChildren: postsPostsRouteChildren = { + postsPostsHomeRoute: postsPostsHomeRoute, + postsPostsDetailRoute: postsPostsDetailRoute, +} + +const postsPostsRouteWithChildren = postsPostsRoute._addFileChildren( + postsPostsRouteChildren, +) + +interface ClassicHelloRouteRouteChildren { + ClassicHelloUniverseRoute: typeof ClassicHelloUniverseRoute + ClassicHelloWorldRoute: typeof ClassicHelloWorldRoute + ClassicHelloIndexRoute: typeof ClassicHelloIndexRoute +} + +const ClassicHelloRouteRouteChildren: ClassicHelloRouteRouteChildren = { + ClassicHelloUniverseRoute: ClassicHelloUniverseRoute, + ClassicHelloWorldRoute: ClassicHelloWorldRoute, + ClassicHelloIndexRoute: ClassicHelloIndexRoute, +} + +const ClassicHelloRouteRouteWithChildren = + ClassicHelloRouteRoute._addFileChildren(ClassicHelloRouteRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof homeRoute + '': typeof layoutSecondLayoutRouteWithChildren + '/posts': typeof postsPostsRouteWithChildren + '/classic/hello': typeof ClassicHelloRouteRouteWithChildren + '/posts/': typeof postsPostsHomeRoute + '/posts/$postId': typeof postsPostsDetailRoute + '/layout-a': typeof aRoute + '/layout-b': typeof bRoute + '/classic/hello/universe': typeof ClassicHelloUniverseRoute + '/classic/hello/world': typeof ClassicHelloWorldRoute + '/classic/hello/': typeof ClassicHelloIndexRoute +} + +export interface FileRoutesByTo { + '/': typeof homeRoute + '': typeof layoutSecondLayoutRouteWithChildren + '/posts': typeof postsPostsHomeRoute + '/posts/$postId': typeof postsPostsDetailRoute + '/layout-a': typeof aRoute + '/layout-b': typeof bRoute + '/classic/hello/universe': typeof ClassicHelloUniverseRoute + '/classic/hello/world': typeof ClassicHelloWorldRoute + '/classic/hello': typeof ClassicHelloIndexRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof homeRoute + '/_first': typeof layoutFirstLayoutRouteWithChildren + '/posts': typeof postsPostsRouteWithChildren + '/classic/hello': typeof ClassicHelloRouteRouteWithChildren + '/posts/': typeof postsPostsHomeRoute + '/_first/_second': typeof layoutSecondLayoutRouteWithChildren + '/posts/$postId': typeof postsPostsDetailRoute + '/_first/_second/layout-a': typeof aRoute + '/_first/_second/layout-b': typeof bRoute + '/classic/hello/universe': typeof ClassicHelloUniverseRoute + '/classic/hello/world': typeof ClassicHelloWorldRoute + '/classic/hello/': typeof ClassicHelloIndexRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '' + | '/posts' + | '/classic/hello' + | '/posts/' + | '/posts/$postId' + | '/layout-a' + | '/layout-b' + | '/classic/hello/universe' + | '/classic/hello/world' + | '/classic/hello/' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '' + | '/posts' + | '/posts/$postId' + | '/layout-a' + | '/layout-b' + | '/classic/hello/universe' + | '/classic/hello/world' + | '/classic/hello' + id: + | '__root__' + | '/' + | '/_first' + | '/posts' + | '/classic/hello' + | '/posts/' + | '/_first/_second' + | '/posts/$postId' + | '/_first/_second/layout-a' + | '/_first/_second/layout-b' + | '/classic/hello/universe' + | '/classic/hello/world' + | '/classic/hello/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + homeRoute: typeof homeRoute + layoutFirstLayoutRoute: typeof layoutFirstLayoutRouteWithChildren + postsPostsRoute: typeof postsPostsRouteWithChildren + ClassicHelloRouteRoute: typeof ClassicHelloRouteRouteWithChildren +} + +const rootRouteChildren: RootRouteChildren = { + homeRoute: homeRoute, + layoutFirstLayoutRoute: layoutFirstLayoutRouteWithChildren, + postsPostsRoute: postsPostsRouteWithChildren, + ClassicHelloRouteRoute: ClassicHelloRouteRouteWithChildren, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "root.tsx", + "children": [ + "/", + "/_first", + "/posts", + "/classic/hello" + ] + }, + "/": { + "filePath": "home.tsx" + }, + "/_first": { + "filePath": "layout/first-layout.tsx", + "children": [ + "/_first/_second" + ] + }, + "/posts": { + "filePath": "posts/posts.tsx", + "children": [ + "/posts/", + "/posts/$postId" + ] + }, + "/classic/hello": { + "filePath": "file-based-subtree/hello/route.tsx", + "children": [ + "/classic/hello/universe", + "/classic/hello/world", + "/classic/hello/" + ] + }, + "/posts/": { + "filePath": "posts/posts-home.tsx", + "parent": "/posts" + }, + "/_first/_second": { + "filePath": "layout/second-layout.tsx", + "parent": "/_first", + "children": [ + "/_first/_second/layout-a", + "/_first/_second/layout-b" + ] + }, + "/posts/$postId": { + "filePath": "posts/posts-detail.tsx", + "parent": "/posts" + }, + "/_first/_second/layout-a": { + "filePath": "a.tsx", + "parent": "/_first/_second" + }, + "/_first/_second/layout-b": { + "filePath": "b.tsx", + "parent": "/_first/_second" + }, + "/classic/hello/universe": { + "filePath": "file-based-subtree/hello/universe.tsx", + "parent": "/classic/hello" + }, + "/classic/hello/world": { + "filePath": "file-based-subtree/hello/world.tsx", + "parent": "/classic/hello" + }, + "/classic/hello/": { + "filePath": "file-based-subtree/hello/index.tsx", + "parent": "/classic/hello" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/e2e/react-router/basic-virtual-file-based/src/routes/a.tsx b/e2e/react-router/basic-virtual-file-based/src/routes/a.tsx new file mode 100644 index 0000000000..6cccd02950 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/src/routes/a.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_first/_second/layout-a')({ + component: LayoutAComponent, +}) + +function LayoutAComponent() { + return
I'm layout A!
+} diff --git a/e2e/react-router/basic-virtual-file-based/src/routes/b.tsx b/e2e/react-router/basic-virtual-file-based/src/routes/b.tsx new file mode 100644 index 0000000000..98bb842612 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/src/routes/b.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_first/_second/layout-b')({ + component: LayoutBComponent, +}) + +function LayoutBComponent() { + return
I'm layout B!
+} diff --git a/e2e/react-router/basic-virtual-file-based/src/routes/file-based-subtree/hello/index.tsx b/e2e/react-router/basic-virtual-file-based/src/routes/file-based-subtree/hello/index.tsx new file mode 100644 index 0000000000..7a6d5e3bd3 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/src/routes/file-based-subtree/hello/index.tsx @@ -0,0 +1,5 @@ +import { Link, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/classic/hello/')({ + component: () =>
This is the index
, +}) diff --git a/e2e/react-router/basic-virtual-file-based/src/routes/file-based-subtree/hello/route.tsx b/e2e/react-router/basic-virtual-file-based/src/routes/file-based-subtree/hello/route.tsx new file mode 100644 index 0000000000..566efc8777 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/src/routes/file-based-subtree/hello/route.tsx @@ -0,0 +1,27 @@ +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/classic/hello')({ + component: () => ( +
+ Hello! +
{' '} + + say hello to the universe + {' '} + + say hello to the world + + +
+ ), +}) diff --git a/e2e/react-router/basic-virtual-file-based/src/routes/file-based-subtree/hello/universe.tsx b/e2e/react-router/basic-virtual-file-based/src/routes/file-based-subtree/hello/universe.tsx new file mode 100644 index 0000000000..e00c47d74b --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/src/routes/file-based-subtree/hello/universe.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/classic/hello/universe')({ + component: () =>
Hello /classic/hello/universe!
, +}) diff --git a/e2e/react-router/basic-virtual-file-based/src/routes/file-based-subtree/hello/world.tsx b/e2e/react-router/basic-virtual-file-based/src/routes/file-based-subtree/hello/world.tsx new file mode 100644 index 0000000000..9783557342 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/src/routes/file-based-subtree/hello/world.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/classic/hello/world')({ + component: () =>
Hello /classic/hello/world!
, +}) diff --git a/e2e/react-router/basic-virtual-file-based/src/routes/home.tsx b/e2e/react-router/basic-virtual-file-based/src/routes/home.tsx new file mode 100644 index 0000000000..eac82a9174 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/src/routes/home.tsx @@ -0,0 +1,14 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: Home, +}) + +function Home() { + return ( +
+

Welcome Home!

+
+ ) +} diff --git a/e2e/react-router/basic-virtual-file-based/src/routes/layout/first-layout.tsx b/e2e/react-router/basic-virtual-file-based/src/routes/layout/first-layout.tsx new file mode 100644 index 0000000000..d39e206f2d --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/src/routes/layout/first-layout.tsx @@ -0,0 +1,16 @@ +import { Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_first')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a layout
+
+ +
+
+ ) +} diff --git a/e2e/react-router/basic-virtual-file-based/src/routes/layout/second-layout.tsx b/e2e/react-router/basic-virtual-file-based/src/routes/layout/second-layout.tsx new file mode 100644 index 0000000000..ef178a6e16 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/src/routes/layout/second-layout.tsx @@ -0,0 +1,34 @@ +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_first/_second')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a nested layout
+
+ + Layout A + + + Layout B + +
+
+ +
+
+ ) +} diff --git a/e2e/react-router/basic-virtual-file-based/src/routes/posts/posts-detail.tsx b/e2e/react-router/basic-virtual-file-based/src/routes/posts/posts-detail.tsx new file mode 100644 index 0000000000..948d52d6d6 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/src/routes/posts/posts-detail.tsx @@ -0,0 +1,28 @@ +import * as React from 'react' +import { ErrorComponent, createFileRoute } from '@tanstack/react-router' +import { fetchPost } from '../../posts' +import type { ErrorComponentProps } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/$postId')({ + loader: async ({ params: { postId } }) => fetchPost(postId), + errorComponent: PostErrorComponent as any, + notFoundComponent: () => { + return

Post not found

+ }, + component: PostComponent, +}) + +export function PostErrorComponent({ error }: ErrorComponentProps) { + return +} + +function PostComponent() { + const post = Route.useLoaderData() + + return ( +
+

{post.title}

+
{post.body}
+
+ ) +} diff --git a/e2e/react-router/basic-virtual-file-based/src/routes/posts/posts-home.tsx b/e2e/react-router/basic-virtual-file-based/src/routes/posts/posts-home.tsx new file mode 100644 index 0000000000..056433ca0a --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/src/routes/posts/posts-home.tsx @@ -0,0 +1,10 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/')({ + component: PostsIndexComponent, +}) + +function PostsIndexComponent() { + return
Select a post.
+} diff --git a/e2e/react-router/basic-virtual-file-based/src/routes/posts/posts.tsx b/e2e/react-router/basic-virtual-file-based/src/routes/posts/posts.tsx new file mode 100644 index 0000000000..a2ab1ee388 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/src/routes/posts/posts.tsx @@ -0,0 +1,39 @@ +import * as React from 'react' +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' +import { fetchPosts } from '../../posts' + +export const Route = createFileRoute('/posts')({ + loader: fetchPosts, + component: PostsComponent, +}) + +function PostsComponent() { + const posts = Route.useLoaderData() + + return ( +
+
    + {[...posts, { id: 'i-do-not-exist', title: 'Non-existent Post' }].map( + (post) => { + return ( +
  • + +
    {post.title.substring(0, 20)}
    + +
  • + ) + }, + )} +
+
+ +
+ ) +} diff --git a/e2e/react-router/basic-virtual-file-based/src/routes/root.tsx b/e2e/react-router/basic-virtual-file-based/src/routes/root.tsx new file mode 100644 index 0000000000..05ac9527f3 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/src/routes/root.tsx @@ -0,0 +1,70 @@ +import * as React from 'react' +import { Link, Outlet, createRootRoute } from '@tanstack/react-router' +import { TanStackRouterDevtools } from '@tanstack/router-devtools' + +export const Route = createRootRoute({ + component: RootComponent, + notFoundComponent: () => { + return ( +
+

This is the notFoundComponent configured on root route

+ Start Over +
+ ) + }, +}) + +function RootComponent() { + return ( + <> +
+ + Home + {' '} + + Posts + {' '} + + Layout + {' '} + + Subtree + {' '} + + This Route Does Not Exist + +
+
+ + {/* Start rendering router matches */} + + + ) +} diff --git a/e2e/react-router/basic-virtual-file-based/tests/app.spec.ts b/e2e/react-router/basic-virtual-file-based/tests/app.spec.ts new file mode 100644 index 0000000000..f19a88b569 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/tests/app.spec.ts @@ -0,0 +1,34 @@ +import { expect, test } from '@playwright/test' + +test.beforeEach(async ({ page }) => { + await page.goto('/') +}) + +test('Navigating to a post page', async ({ page }) => { + await page.getByRole('link', { name: 'Posts' }).click() + await page.getByRole('link', { name: 'sunt aut facere repe' }).click() + await expect(page.getByRole('heading')).toContainText('sunt aut facere') +}) + +test('Navigating nested layouts', async ({ page }) => { + await page.goto('/') + await page.getByRole('link', { name: 'Layout', exact: true }).click() + + await expect(page.locator('#app')).toContainText("I'm a layout") + await expect(page.locator('#app')).toContainText("I'm a nested layout") + + await page.getByRole('link', { name: 'Layout A' }).click() + await expect(page.locator('#app')).toContainText("I'm layout A!") + + await page.getByRole('link', { name: 'Layout B' }).click() + await expect(page.locator('#app')).toContainText("I'm layout B!") +}) + +test('Navigating to a not-found route', async ({ page }) => { + await page.getByRole('link', { name: 'This Route Does Not Exist' }).click() + await expect(page.getByRole('paragraph')).toContainText( + 'This is the notFoundComponent configured on root route', + ) + await page.getByRole('link', { name: 'Start Over' }).click() + await expect(page.getByRole('heading')).toContainText('Welcome Home!') +}) diff --git a/e2e/react-router/basic-virtual-file-based/tsconfig.json b/e2e/react-router/basic-virtual-file-based/tsconfig.json new file mode 100644 index 0000000000..3c2cd577d6 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "module": "Preserve", + "moduleResolution": "Bundler", + "target": "ESNext" + } +} diff --git a/e2e/react-router/basic-virtual-file-based/vite.config.ts b/e2e/react-router/basic-virtual-file-based/vite.config.ts new file mode 100644 index 0000000000..c1b8574783 --- /dev/null +++ b/e2e/react-router/basic-virtual-file-based/vite.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import { TanStackRouterVite } from '@tanstack/router-plugin/vite' +import { routes } from './routes' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [TanStackRouterVite({ virtualRouteConfig: routes }), react()], +}) diff --git a/e2e/react-router/basic/.gitignore b/e2e/react-router/basic/.gitignore new file mode 100644 index 0000000000..8354e4d50d --- /dev/null +++ b/e2e/react-router/basic/.gitignore @@ -0,0 +1,10 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local + +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ \ No newline at end of file diff --git a/e2e/react-router/basic/index.html b/e2e/react-router/basic/index.html new file mode 100644 index 0000000000..a4b3349437 --- /dev/null +++ b/e2e/react-router/basic/index.html @@ -0,0 +1,24 @@ + + + + + + Vite App + + + + +
+ + + diff --git a/e2e/react-router/basic/package.json b/e2e/react-router/basic/package.json new file mode 100644 index 0000000000..e8f110a69c --- /dev/null +++ b/e2e/react-router/basic/package.json @@ -0,0 +1,26 @@ +{ + "name": "tanstack-router-e2e-react-basic", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port=3001", + "build": "vite build && tsc --noEmit", + "serve": "vite preview", + "start": "vite", + "test:e2e": "playwright test --project=chromium" + }, + "dependencies": { + "@tanstack/react-router": "workspace:^", + "@tanstack/router-devtools": "workspace:^", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "redaxios": "^0.5.1" + }, + "devDependencies": { + "@playwright/test": "^1.47.1", + "@types/react": "^18.2.47", + "@types/react-dom": "^18.2.18", + "@vitejs/plugin-react": "^4.3.1", + "vite": "^5.4.5" + } +} diff --git a/e2e/react-router/basic/playwright.config.ts b/e2e/react-router/basic/playwright.config.ts new file mode 100644 index 0000000000..f83eacf129 --- /dev/null +++ b/e2e/react-router/basic/playwright.config.ts @@ -0,0 +1,29 @@ +import { defineConfig, devices } from '@playwright/test' + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + + reporter: [['line']], + + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: 'http://localhost:3001/', + }, + + webServer: { + command: 'pnpm run dev', + url: 'http://localhost:3001', + reuseExistingServer: !process.env.CI, + stdout: 'pipe', + }, + + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], +}) diff --git a/e2e/react-router/basic/src/main.tsx b/e2e/react-router/basic/src/main.tsx new file mode 100644 index 0000000000..f75bdb8629 --- /dev/null +++ b/e2e/react-router/basic/src/main.tsx @@ -0,0 +1,229 @@ +import ReactDOM from 'react-dom/client' +import { + ErrorComponent, + type ErrorComponentProps, + Link, + Outlet, + RouterProvider, + createRootRoute, + createRoute, + createRouter, +} from '@tanstack/react-router' +import { TanStackRouterDevtools } from '@tanstack/router-devtools' +import { NotFoundError, fetchPost, fetchPosts } from './posts' + +const rootRoute = createRootRoute({ + component: RootComponent, + notFoundComponent: () => { + return ( +
+

This is the notFoundComponent configured on root route

+ Start Over +
+ ) + }, +}) + +function RootComponent() { + return ( + <> +
+ + Home + {' '} + + Posts + {' '} + + Layout + {' '} + + This Route Does Not Exist + +
+ + + + ) +} +const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: IndexComponent, +}) + +function IndexComponent() { + return ( +
+

Welcome Home!

+
+ ) +} + +export const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + loader: () => fetchPosts(), +}).lazy(() => import('./posts.lazy').then((d) => d.Route)) + +const postsIndexRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '/', + component: PostsIndexComponent, +}) + +function PostsIndexComponent() { + return
Select a post.
+} + +const postRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '$postId', + errorComponent: PostErrorComponent, + loader: ({ params }) => fetchPost(params.postId), + component: PostComponent, +}) + +function PostErrorComponent({ error }: ErrorComponentProps) { + if (error instanceof NotFoundError) { + return
{error.message}
+ } + + return +} + +function PostComponent() { + const post = postRoute.useLoaderData() + + return ( +
+

{post.title}

+
+
{post.body}
+
+ ) +} + +const layoutRoute = createRoute({ + getParentRoute: () => rootRoute, + id: '_layout', + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a layout
+
+ +
+
+ ) +} + +const layout2Route = createRoute({ + getParentRoute: () => layoutRoute, + id: '_layout-2', + component: Layout2Component, +}) + +function Layout2Component() { + return ( +
+
I'm a nested layout
+
+ + Layout A + + + Layout B + +
+
+ +
+
+ ) +} + +const layoutARoute = createRoute({ + getParentRoute: () => layout2Route, + path: '/layout-a', + component: LayoutAComponent, +}) + +function LayoutAComponent() { + return
I'm layout A!
+} + +const layoutBRoute = createRoute({ + getParentRoute: () => layout2Route, + path: '/layout-b', + component: LayoutBComponent, +}) + +function LayoutBComponent() { + return
I'm layout B!
+} + +const routeTree = rootRoute.addChildren([ + postsRoute.addChildren([postRoute, postsIndexRoute]), + layoutRoute.addChildren([ + layout2Route.addChildren([layoutARoute, layoutBRoute]), + ]), + indexRoute, +]) + +// Set up a Router instance +const router = createRouter({ + routeTree, + defaultPreload: 'intent', + defaultStaleTime: 5000, +}) + +// Register things for typesafety +declare module '@tanstack/react-router' { + interface Register { + router: typeof router + } +} + +const rootElement = document.getElementById('app')! + +if (!rootElement.innerHTML) { + const root = ReactDOM.createRoot(rootElement) + + root.render() +} diff --git a/e2e/react-router/basic/src/posts.lazy.tsx b/e2e/react-router/basic/src/posts.lazy.tsx new file mode 100644 index 0000000000..dd17e6b7db --- /dev/null +++ b/e2e/react-router/basic/src/posts.lazy.tsx @@ -0,0 +1,36 @@ +import * as React from 'react' +import { Link, Outlet, createLazyRoute } from '@tanstack/react-router' + +export const Route = createLazyRoute('/posts')({ + component: PostsComponent, +}) + +function PostsComponent() { + const posts = Route.useLoaderData() + + return ( +
+
    + {[...posts, { id: 'i-do-not-exist', title: 'Non-existent Post' }].map( + (post) => { + return ( +
  • + +
    {post.title.substring(0, 20)}
    + +
  • + ) + }, + )} +
+ +
+ ) +} diff --git a/e2e/react-router/basic/src/posts.ts b/e2e/react-router/basic/src/posts.ts new file mode 100644 index 0000000000..54d62e5788 --- /dev/null +++ b/e2e/react-router/basic/src/posts.ts @@ -0,0 +1,32 @@ +import axios from 'redaxios' + +export class NotFoundError extends Error {} + +type PostType = { + id: string + title: string + body: string +} + +export const fetchPosts = async () => { + console.info('Fetching posts...') + await new Promise((r) => setTimeout(r, 500)) + return axios + .get>('https://jsonplaceholder.typicode.com/posts') + .then((r) => r.data.slice(0, 10)) +} + +export const fetchPost = async (postId: string) => { + console.info(`Fetching post with id ${postId}...`) + await new Promise((r) => setTimeout(r, 500)) + const post = await axios + .get(`https://jsonplaceholder.typicode.com/posts/${postId}`) + .then((r) => r.data) + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (!post) { + throw new NotFoundError(`Post with id "${postId}" not found!`) + } + + return post +} diff --git a/e2e/react-router/basic/tests/app.spec.ts b/e2e/react-router/basic/tests/app.spec.ts new file mode 100644 index 0000000000..f19a88b569 --- /dev/null +++ b/e2e/react-router/basic/tests/app.spec.ts @@ -0,0 +1,34 @@ +import { expect, test } from '@playwright/test' + +test.beforeEach(async ({ page }) => { + await page.goto('/') +}) + +test('Navigating to a post page', async ({ page }) => { + await page.getByRole('link', { name: 'Posts' }).click() + await page.getByRole('link', { name: 'sunt aut facere repe' }).click() + await expect(page.getByRole('heading')).toContainText('sunt aut facere') +}) + +test('Navigating nested layouts', async ({ page }) => { + await page.goto('/') + await page.getByRole('link', { name: 'Layout', exact: true }).click() + + await expect(page.locator('#app')).toContainText("I'm a layout") + await expect(page.locator('#app')).toContainText("I'm a nested layout") + + await page.getByRole('link', { name: 'Layout A' }).click() + await expect(page.locator('#app')).toContainText("I'm layout A!") + + await page.getByRole('link', { name: 'Layout B' }).click() + await expect(page.locator('#app')).toContainText("I'm layout B!") +}) + +test('Navigating to a not-found route', async ({ page }) => { + await page.getByRole('link', { name: 'This Route Does Not Exist' }).click() + await expect(page.getByRole('paragraph')).toContainText( + 'This is the notFoundComponent configured on root route', + ) + await page.getByRole('link', { name: 'Start Over' }).click() + await expect(page.getByRole('heading')).toContainText('Welcome Home!') +}) diff --git a/e2e/react-router/basic/tsconfig.json b/e2e/react-router/basic/tsconfig.json new file mode 100644 index 0000000000..0d2a31a7d7 --- /dev/null +++ b/e2e/react-router/basic/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "target": "ESNext", + "moduleResolution": "Bundler", + "module": "ESNext" + } +} diff --git a/e2e/react-router/basic/vite.config.js b/e2e/react-router/basic/vite.config.js new file mode 100644 index 0000000000..5a33944a9b --- /dev/null +++ b/e2e/react-router/basic/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/e2e/start/basic-auth/.env b/e2e/start/basic-auth/.env new file mode 100644 index 0000000000..c498ab59bf --- /dev/null +++ b/e2e/start/basic-auth/.env @@ -0,0 +1,7 @@ +# Environment variables declared in this file are automatically made available to Prisma. +# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema + +# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB. +# See the documentation for all the connection string options: https://pris.ly/d/connection-strings + +DATABASE_URL="file:./dev.db" \ No newline at end of file diff --git a/e2e/start/basic-auth/.gitignore b/e2e/start/basic-auth/.gitignore new file mode 100644 index 0000000000..b15fed94e2 --- /dev/null +++ b/e2e/start/basic-auth/.gitignore @@ -0,0 +1,22 @@ +node_modules +package-lock.json +yarn.lock + +!.env +.DS_Store +.cache +.vercel +.output +.vinxi + +/build/ +/api/ +/server/build +/public/build +.vinxi +# Sentry Config File +.env.sentry-build-plugin +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/e2e/start/basic-auth/.prettierignore b/e2e/start/basic-auth/.prettierignore new file mode 100644 index 0000000000..fd1b50a539 --- /dev/null +++ b/e2e/start/basic-auth/.prettierignore @@ -0,0 +1,5 @@ +**/api +**/build +**/public +pnpm-lock.yaml +routeTree.gen.ts \ No newline at end of file diff --git a/e2e/start/basic-auth/.prettierrc b/e2e/start/basic-auth/.prettierrc new file mode 100644 index 0000000000..aaf3357d4a --- /dev/null +++ b/e2e/start/basic-auth/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "semi": false, + "trailingComma": "all" +} diff --git a/e2e/start/basic-auth/app.config.ts b/e2e/start/basic-auth/app.config.ts new file mode 100644 index 0000000000..d1d9b04ded --- /dev/null +++ b/e2e/start/basic-auth/app.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from '@tanstack/start/config' +import tsConfigPaths from 'vite-tsconfig-paths' + +export default defineConfig({ + vite: { + plugins: () => [ + tsConfigPaths({ + projects: ['./tsconfig.json'], + }), + ], + }, +}) diff --git a/e2e/start/basic-auth/app/client.tsx b/e2e/start/basic-auth/app/client.tsx new file mode 100644 index 0000000000..f16ba73f62 --- /dev/null +++ b/e2e/start/basic-auth/app/client.tsx @@ -0,0 +1,7 @@ +import { hydrateRoot } from 'react-dom/client' +import { StartClient } from '@tanstack/start' +import { createRouter } from './router' + +const router = createRouter() + +hydrateRoot(document.getElementById('root')!, ) diff --git a/e2e/start/basic-auth/app/components/Auth.tsx b/e2e/start/basic-auth/app/components/Auth.tsx new file mode 100644 index 0000000000..7504f8649b --- /dev/null +++ b/e2e/start/basic-auth/app/components/Auth.tsx @@ -0,0 +1,57 @@ +export function Auth({ + actionText, + onSubmit, + status, + afterSubmit, +}: { + actionText: string + onSubmit: (e: React.FormEvent) => void + status: 'pending' | 'idle' | 'success' | 'error' + afterSubmit?: React.ReactNode +}) { + return ( +
+
+

{actionText}

+
{ + e.preventDefault() + onSubmit(e) + }} + className="space-y-4" + > +
+ + +
+
+ + +
+ + {afterSubmit ? afterSubmit : null} +
+
+
+ ) +} diff --git a/e2e/start/basic-auth/app/components/DefaultCatchBoundary.tsx b/e2e/start/basic-auth/app/components/DefaultCatchBoundary.tsx new file mode 100644 index 0000000000..f0ce51dc57 --- /dev/null +++ b/e2e/start/basic-auth/app/components/DefaultCatchBoundary.tsx @@ -0,0 +1,53 @@ +import { + ErrorComponent, + ErrorComponentProps, + Link, + rootRouteId, + useMatch, + useRouter, +} from '@tanstack/react-router' + +export function DefaultCatchBoundary({ error }: ErrorComponentProps) { + const router = useRouter() + const isRoot = useMatch({ + strict: false, + select: (state) => state.id === rootRouteId, + }) + + console.error(error) + + return ( +
+ +
+ + {isRoot ? ( + + Home + + ) : ( + { + e.preventDefault() + window.history.back() + }} + > + Go Back + + )} +
+
+ ) +} diff --git a/e2e/start/basic-auth/app/components/Login.tsx b/e2e/start/basic-auth/app/components/Login.tsx new file mode 100644 index 0000000000..6e114612e7 --- /dev/null +++ b/e2e/start/basic-auth/app/components/Login.tsx @@ -0,0 +1,67 @@ +import { useRouter } from '@tanstack/react-router' +import { useServerFn } from '@tanstack/start' +import { useMutation } from '../hooks/useMutation' +import { loginFn } from '../routes/_authed' +import { Auth } from './Auth' +import { signupFn } from '~/routes/signup' + +export function Login() { + const router = useRouter() + + const loginMutation = useMutation({ + fn: loginFn, + onSuccess: async (ctx) => { + if (!ctx.data?.error) { + await router.invalidate() + router.navigate({ to: '/' }) + return + } + }, + }) + + const signupMutation = useMutation({ + fn: useServerFn(signupFn), + }) + + return ( + { + const formData = new FormData(e.target as HTMLFormElement) + + loginMutation.mutate({ + email: formData.get('email') as string, + password: formData.get('password') as string, + }) + }} + afterSubmit={ + loginMutation.data ? ( + <> +
{loginMutation.data.message}
+ {loginMutation.data.userNotFound ? ( +
+ +
+ ) : null} + + ) : null + } + /> + ) +} diff --git a/e2e/start/basic-auth/app/components/NotFound.tsx b/e2e/start/basic-auth/app/components/NotFound.tsx new file mode 100644 index 0000000000..7b54fa5680 --- /dev/null +++ b/e2e/start/basic-auth/app/components/NotFound.tsx @@ -0,0 +1,25 @@ +import { Link } from '@tanstack/react-router' + +export function NotFound({ children }: { children?: any }) { + return ( +
+
+ {children ||

The page you are looking for does not exist.

} +
+

+ + + Start Over + +

+
+ ) +} diff --git a/e2e/start/basic-auth/app/hooks/useMutation.ts b/e2e/start/basic-auth/app/hooks/useMutation.ts new file mode 100644 index 0000000000..1ff7a4653b --- /dev/null +++ b/e2e/start/basic-auth/app/hooks/useMutation.ts @@ -0,0 +1,44 @@ +import * as React from 'react' + +export function useMutation(opts: { + fn: (variables: TVariables) => Promise + onSuccess?: (ctx: { data: TData }) => void | Promise +}) { + const [submittedAt, setSubmittedAt] = React.useState() + const [variables, setVariables] = React.useState() + const [error, setError] = React.useState() + const [data, setData] = React.useState() + const [status, setStatus] = React.useState< + 'idle' | 'pending' | 'success' | 'error' + >('idle') + + const mutate = React.useCallback( + async (variables: TVariables): Promise => { + setStatus('pending') + setSubmittedAt(Date.now()) + setVariables(variables) + // + try { + const data = await opts.fn(variables) + await opts.onSuccess?.({ data }) + setStatus('success') + setError(undefined) + setData(data) + return data + } catch (err: any) { + setStatus('error') + setError(err) + } + }, + [opts.fn], + ) + + return { + status, + variables, + submittedAt, + mutate, + error, + data, + } +} diff --git a/e2e/start/basic-auth/app/routeTree.gen.ts b/e2e/start/basic-auth/app/routeTree.gen.ts new file mode 100644 index 0000000000..5057c1f72b --- /dev/null +++ b/e2e/start/basic-auth/app/routeTree.gen.ts @@ -0,0 +1,285 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/__root' +import { Route as SignupImport } from './routes/signup' +import { Route as LogoutImport } from './routes/logout' +import { Route as LoginImport } from './routes/login' +import { Route as AuthedImport } from './routes/_authed' +import { Route as IndexImport } from './routes/index' +import { Route as AuthedPostsImport } from './routes/_authed/posts' +import { Route as AuthedPostsIndexImport } from './routes/_authed/posts.index' +import { Route as AuthedPostsPostIdImport } from './routes/_authed/posts.$postId' + +// Create/Update Routes + +const SignupRoute = SignupImport.update({ + path: '/signup', + getParentRoute: () => rootRoute, +} as any) + +const LogoutRoute = LogoutImport.update({ + path: '/logout', + getParentRoute: () => rootRoute, +} as any) + +const LoginRoute = LoginImport.update({ + path: '/login', + getParentRoute: () => rootRoute, +} as any) + +const AuthedRoute = AuthedImport.update({ + id: '/_authed', + getParentRoute: () => rootRoute, +} as any) + +const IndexRoute = IndexImport.update({ + path: '/', + getParentRoute: () => rootRoute, +} as any) + +const AuthedPostsRoute = AuthedPostsImport.update({ + path: '/posts', + getParentRoute: () => AuthedRoute, +} as any) + +const AuthedPostsIndexRoute = AuthedPostsIndexImport.update({ + path: '/', + getParentRoute: () => AuthedPostsRoute, +} as any) + +const AuthedPostsPostIdRoute = AuthedPostsPostIdImport.update({ + path: '/$postId', + getParentRoute: () => AuthedPostsRoute, +} as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexImport + parentRoute: typeof rootRoute + } + '/_authed': { + id: '/_authed' + path: '' + fullPath: '' + preLoaderRoute: typeof AuthedImport + parentRoute: typeof rootRoute + } + '/login': { + id: '/login' + path: '/login' + fullPath: '/login' + preLoaderRoute: typeof LoginImport + parentRoute: typeof rootRoute + } + '/logout': { + id: '/logout' + path: '/logout' + fullPath: '/logout' + preLoaderRoute: typeof LogoutImport + parentRoute: typeof rootRoute + } + '/signup': { + id: '/signup' + path: '/signup' + fullPath: '/signup' + preLoaderRoute: typeof SignupImport + parentRoute: typeof rootRoute + } + '/_authed/posts': { + id: '/_authed/posts' + path: '/posts' + fullPath: '/posts' + preLoaderRoute: typeof AuthedPostsImport + parentRoute: typeof AuthedImport + } + '/_authed/posts/$postId': { + id: '/_authed/posts/$postId' + path: '/$postId' + fullPath: '/posts/$postId' + preLoaderRoute: typeof AuthedPostsPostIdImport + parentRoute: typeof AuthedPostsImport + } + '/_authed/posts/': { + id: '/_authed/posts/' + path: '/' + fullPath: '/posts/' + preLoaderRoute: typeof AuthedPostsIndexImport + parentRoute: typeof AuthedPostsImport + } + } +} + +// Create and export the route tree + +interface AuthedPostsRouteChildren { + AuthedPostsPostIdRoute: typeof AuthedPostsPostIdRoute + AuthedPostsIndexRoute: typeof AuthedPostsIndexRoute +} + +const AuthedPostsRouteChildren: AuthedPostsRouteChildren = { + AuthedPostsPostIdRoute: AuthedPostsPostIdRoute, + AuthedPostsIndexRoute: AuthedPostsIndexRoute, +} + +const AuthedPostsRouteWithChildren = AuthedPostsRoute._addFileChildren( + AuthedPostsRouteChildren, +) + +interface AuthedRouteChildren { + AuthedPostsRoute: typeof AuthedPostsRouteWithChildren +} + +const AuthedRouteChildren: AuthedRouteChildren = { + AuthedPostsRoute: AuthedPostsRouteWithChildren, +} + +const AuthedRouteWithChildren = + AuthedRoute._addFileChildren(AuthedRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '': typeof AuthedRouteWithChildren + '/login': typeof LoginRoute + '/logout': typeof LogoutRoute + '/signup': typeof SignupRoute + '/posts': typeof AuthedPostsRouteWithChildren + '/posts/$postId': typeof AuthedPostsPostIdRoute + '/posts/': typeof AuthedPostsIndexRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '': typeof AuthedRouteWithChildren + '/login': typeof LoginRoute + '/logout': typeof LogoutRoute + '/signup': typeof SignupRoute + '/posts/$postId': typeof AuthedPostsPostIdRoute + '/posts': typeof AuthedPostsIndexRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/_authed': typeof AuthedRouteWithChildren + '/login': typeof LoginRoute + '/logout': typeof LogoutRoute + '/signup': typeof SignupRoute + '/_authed/posts': typeof AuthedPostsRouteWithChildren + '/_authed/posts/$postId': typeof AuthedPostsPostIdRoute + '/_authed/posts/': typeof AuthedPostsIndexRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '' + | '/login' + | '/logout' + | '/signup' + | '/posts' + | '/posts/$postId' + | '/posts/' + fileRoutesByTo: FileRoutesByTo + to: '/' | '' | '/login' | '/logout' | '/signup' | '/posts/$postId' | '/posts' + id: + | '__root__' + | '/' + | '/_authed' + | '/login' + | '/logout' + | '/signup' + | '/_authed/posts' + | '/_authed/posts/$postId' + | '/_authed/posts/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + AuthedRoute: typeof AuthedRouteWithChildren + LoginRoute: typeof LoginRoute + LogoutRoute: typeof LogoutRoute + SignupRoute: typeof SignupRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + AuthedRoute: AuthedRouteWithChildren, + LoginRoute: LoginRoute, + LogoutRoute: LogoutRoute, + SignupRoute: SignupRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [ + "/", + "/_authed", + "/login", + "/logout", + "/signup" + ] + }, + "/": { + "filePath": "index.tsx" + }, + "/_authed": { + "filePath": "_authed.tsx", + "children": [ + "/_authed/posts" + ] + }, + "/login": { + "filePath": "login.tsx" + }, + "/logout": { + "filePath": "logout.tsx" + }, + "/signup": { + "filePath": "signup.tsx" + }, + "/_authed/posts": { + "filePath": "_authed/posts.tsx", + "parent": "/_authed", + "children": [ + "/_authed/posts/$postId", + "/_authed/posts/" + ] + }, + "/_authed/posts/$postId": { + "filePath": "_authed/posts.$postId.tsx", + "parent": "/_authed/posts" + }, + "/_authed/posts/": { + "filePath": "_authed/posts.index.tsx", + "parent": "/_authed/posts" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/e2e/start/basic-auth/app/router.tsx b/e2e/start/basic-auth/app/router.tsx new file mode 100644 index 0000000000..0886de701f --- /dev/null +++ b/e2e/start/basic-auth/app/router.tsx @@ -0,0 +1,21 @@ +import { createRouter as createTanStackRouter } from '@tanstack/react-router' +import { routeTree } from './routeTree.gen' +import { DefaultCatchBoundary } from './components/DefaultCatchBoundary' +import { NotFound } from './components/NotFound' + +export function createRouter() { + const router = createTanStackRouter({ + routeTree, + defaultPreload: 'intent', + defaultErrorComponent: DefaultCatchBoundary, + defaultNotFoundComponent: () => , + }) + + return router +} + +declare module '@tanstack/react-router' { + interface Register { + router: ReturnType + } +} diff --git a/e2e/start/basic-auth/app/routes/__root.tsx b/e2e/start/basic-auth/app/routes/__root.tsx new file mode 100644 index 0000000000..6f5fc33295 --- /dev/null +++ b/e2e/start/basic-auth/app/routes/__root.tsx @@ -0,0 +1,145 @@ +import { + Link, + Outlet, + ScrollRestoration, + createRootRoute, +} from '@tanstack/react-router' +import { TanStackRouterDevtools } from '@tanstack/router-devtools' +import { + Body, + Head, + Html, + Meta, + Scripts, + createServerFn, +} from '@tanstack/start' +import * as React from 'react' +import { DefaultCatchBoundary } from '~/components/DefaultCatchBoundary.js' +import { NotFound } from '~/components/NotFound.js' +import appCss from '~/styles/app.css?url' +import { seo } from '~/utils/seo.js' +import { useAppSession } from '~/utils/session.js' + +const fetchUser = createServerFn('GET', async () => { + // We need to auth on the server so we have access to secure cookies + const session = await useAppSession() + + if (!session.data.userEmail) { + return null + } + + return { + email: session.data.userEmail, + } +}) + +export const Route = createRootRoute({ + meta: () => [ + { + charSet: 'utf-8', + }, + { + name: 'viewport', + content: 'width=device-width, initial-scale=1', + }, + ...seo({ + title: + 'TanStack Start | Type-Safe, Client-First, Full-Stack React Framework', + description: `TanStack Start is a type-safe, client-first, full-stack React framework. `, + }), + ], + links: () => [ + { rel: 'stylesheet', href: appCss }, + { + rel: 'apple-touch-icon', + sizes: '180x180', + href: '/apple-touch-icon.png', + }, + { + rel: 'icon', + type: 'image/png', + sizes: '32x32', + href: '/favicon-32x32.png', + }, + { + rel: 'icon', + type: 'image/png', + sizes: '16x16', + href: '/favicon-16x16.png', + }, + { rel: 'manifest', href: '/site.webmanifest', color: '#fffff' }, + { rel: 'icon', href: '/favicon.ico' }, + ], + beforeLoad: async () => { + const user = await fetchUser() + + return { + user, + } + }, + errorComponent: (props) => { + return ( + + + + ) + }, + notFoundComponent: () => , + component: RootComponent, +}) + +function RootComponent() { + return ( + + + + ) +} + +function RootDocument({ children }: { children: React.ReactNode }) { + const { user } = Route.useRouteContext() + + return ( + + + + + +
+ + Home + {' '} + + Posts + +
+ {user ? ( + <> + {user.email} + Logout + + ) : ( + Login + )} +
+
+
+ {children} + + + + + + ) +} diff --git a/e2e/start/basic-auth/app/routes/_authed.tsx b/e2e/start/basic-auth/app/routes/_authed.tsx new file mode 100644 index 0000000000..bcd6beaed0 --- /dev/null +++ b/e2e/start/basic-auth/app/routes/_authed.tsx @@ -0,0 +1,66 @@ +import { createFileRoute } from '@tanstack/react-router' +import { createServerFn, json } from '@tanstack/start' +import { Auth } from '../components/Auth' +import { hashPassword, prismaClient } from '~/utils/prisma' +import { Login } from '~/components/Login' +import { useAppSession } from '~/utils/session' + +export const loginFn = createServerFn( + 'POST', + async ( + payload: { + email: string + password: string + }, + { request }, + ) => { + // Find the user + const user = await prismaClient.user.findUnique({ + where: { + email: payload.email, + }, + }) + + // Check if the user exists + if (!user) { + return { + error: true, + userNotFound: true, + message: 'User not found', + } + } + + // Check if the password is correct + const hashedPassword = await hashPassword(payload.password) + + if (user.password !== hashedPassword) { + return { + error: true, + message: 'Incorrect password', + } + } + + // Create a session + const session = await useAppSession() + + // Store the user's email in the session + await session.update({ + userEmail: user.email, + }) + }, +) + +export const Route = createFileRoute('/_authed')({ + beforeLoad: ({ context }) => { + if (!context.user) { + throw new Error('Not authenticated') + } + }, + errorComponent: ({ error }) => { + if (error.message === 'Not authenticated') { + return + } + + throw error + }, +}) diff --git a/e2e/start/basic-auth/app/routes/_authed/posts.$postId.tsx b/e2e/start/basic-auth/app/routes/_authed/posts.$postId.tsx new file mode 100644 index 0000000000..d6d12b3702 --- /dev/null +++ b/e2e/start/basic-auth/app/routes/_authed/posts.$postId.tsx @@ -0,0 +1,28 @@ +import { ErrorComponent, createFileRoute } from '@tanstack/react-router' +import type { ErrorComponentProps } from '@tanstack/react-router' +import { NotFound } from '~/components/NotFound.js' +import { fetchPost } from '~/utils/posts.js' + +export const Route = createFileRoute('/_authed/posts/$postId')({ + loader: ({ params: { postId } }) => fetchPost(postId), + errorComponent: PostErrorComponent as any, + component: PostComponent, + notFoundComponent: () => { + return Post not found + }, +}) + +export function PostErrorComponent({ error }: ErrorComponentProps) { + return +} + +function PostComponent() { + const post = Route.useLoaderData() + + return ( +
+

{post.title}

+
{post.body}
+
+ ) +} diff --git a/e2e/start/basic-auth/app/routes/_authed/posts.index.tsx b/e2e/start/basic-auth/app/routes/_authed/posts.index.tsx new file mode 100644 index 0000000000..ea9e667e54 --- /dev/null +++ b/e2e/start/basic-auth/app/routes/_authed/posts.index.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_authed/posts/')({ + component: PostsIndexComponent, +}) + +function PostsIndexComponent() { + return
Select a post.
+} diff --git a/e2e/start/basic-auth/app/routes/_authed/posts.tsx b/e2e/start/basic-auth/app/routes/_authed/posts.tsx new file mode 100644 index 0000000000..86c8ef4138 --- /dev/null +++ b/e2e/start/basic-auth/app/routes/_authed/posts.tsx @@ -0,0 +1,38 @@ +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' +import { fetchPosts } from '~/utils/posts.js' + +export const Route = createFileRoute('/_authed/posts')({ + loader: () => fetchPosts(), + component: PostsComponent, +}) + +function PostsComponent() { + const posts = Route.useLoaderData() + + return ( +
+
    + {[...posts, { id: 'i-do-not-exist', title: 'Non-existent Post' }].map( + (post) => { + return ( +
  • + +
    {post.title.substring(0, 20)}
    + +
  • + ) + }, + )} +
+
+ +
+ ) +} diff --git a/e2e/start/basic-auth/app/routes/index.tsx b/e2e/start/basic-auth/app/routes/index.tsx new file mode 100644 index 0000000000..09a907cb18 --- /dev/null +++ b/e2e/start/basic-auth/app/routes/index.tsx @@ -0,0 +1,13 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: Home, +}) + +function Home() { + return ( +
+

Welcome Home!!!

+
+ ) +} diff --git a/e2e/start/basic-auth/app/routes/login.tsx b/e2e/start/basic-auth/app/routes/login.tsx new file mode 100644 index 0000000000..03ced20832 --- /dev/null +++ b/e2e/start/basic-auth/app/routes/login.tsx @@ -0,0 +1,10 @@ +import { createFileRoute } from '@tanstack/react-router' +import { Login } from '~/components/Login' + +export const Route = createFileRoute('/login')({ + component: LoginComp, +}) + +function LoginComp() { + return +} diff --git a/e2e/start/basic-auth/app/routes/logout.tsx b/e2e/start/basic-auth/app/routes/logout.tsx new file mode 100644 index 0000000000..f78aa7d8ec --- /dev/null +++ b/e2e/start/basic-auth/app/routes/logout.tsx @@ -0,0 +1,18 @@ +import { createFileRoute, redirect } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/start' +import { useAppSession } from '~/utils/session' + +const logoutFn = createServerFn('POST', async () => { + const session = await useAppSession() + + session.clear() + + throw redirect({ + href: '/', + }) +}) + +export const Route = createFileRoute('/logout')({ + preload: false, + loader: () => logoutFn(), +}) diff --git a/e2e/start/basic-auth/app/routes/signup.tsx b/e2e/start/basic-auth/app/routes/signup.tsx new file mode 100644 index 0000000000..5148372826 --- /dev/null +++ b/e2e/start/basic-auth/app/routes/signup.tsx @@ -0,0 +1,99 @@ +import { createFileRoute, redirect } from '@tanstack/react-router' +import { createServerFn, useServerFn } from '@tanstack/start' +import { updateSession } from 'vinxi/http' +import { hashPassword, prismaClient } from '~/utils/prisma' +import { useMutation } from '~/hooks/useMutation' +import { Auth } from '~/components/Auth' +import { useAppSession } from '~/utils/session' + +export const signupFn = createServerFn( + 'POST', + async (payload: { + email: string + password: string + redirectUrl?: string + }) => { + // Check if the user already exists + const found = await prismaClient.user.findUnique({ + where: { + email: payload.email, + }, + }) + + // Encrypt the password using Sha256 into plaintext + const password = await hashPassword(payload.password) + + // Create a session + const session = await useAppSession() + + if (found) { + if (found.password !== password) { + return { + error: true, + userExists: true, + message: 'User already exists', + } + } + + // Store the user's email in the session + await session.update({ + userEmail: found.email, + }) + + // Redirect to the prev page stored in the "redirect" search param + throw redirect({ + href: payload.redirectUrl || '/', + }) + } + + // Create the user + const user = await prismaClient.user.create({ + data: { + email: payload.email, + password, + }, + }) + + // Store the user's email in the session + await session.update({ + userEmail: user.email, + }) + + // Redirect to the prev page stored in the "redirect" search param + throw redirect({ + href: payload.redirectUrl || '/', + }) + }, +) + +export const Route = createFileRoute('/signup')({ + component: SignupComp, +}) + +function SignupComp() { + const signupMutation = useMutation({ + fn: useServerFn(signupFn), + }) + + return ( + { + const formData = new FormData(e.target as HTMLFormElement) + + signupMutation.mutate({ + email: formData.get('email') as string, + password: formData.get('password') as string, + }) + }} + afterSubmit={ + signupMutation.data?.error ? ( + <> +
{signupMutation.data.message}
+ + ) : null + } + /> + ) +} diff --git a/e2e/start/basic-auth/app/ssr.tsx b/e2e/start/basic-auth/app/ssr.tsx new file mode 100644 index 0000000000..62572579ac --- /dev/null +++ b/e2e/start/basic-auth/app/ssr.tsx @@ -0,0 +1,12 @@ +import { + createStartHandler, + defaultStreamHandler, +} from '@tanstack/start/server' +import { getRouterManifest } from '@tanstack/start/router-manifest' + +import { createRouter } from './router' + +export default createStartHandler({ + createRouter, + getRouterManifest, +})(defaultStreamHandler) diff --git a/e2e/start/basic-auth/app/styles/app.css b/e2e/start/basic-auth/app/styles/app.css new file mode 100644 index 0000000000..d6426ccb72 --- /dev/null +++ b/e2e/start/basic-auth/app/styles/app.css @@ -0,0 +1,14 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + html, + body { + @apply text-gray-900 bg-gray-50 dark:bg-gray-950 dark:text-gray-200; + } + + .using-mouse * { + outline: none !important; + } +} diff --git a/e2e/start/basic-auth/app/utils/posts.ts b/e2e/start/basic-auth/app/utils/posts.ts new file mode 100644 index 0000000000..00fc9ae143 --- /dev/null +++ b/e2e/start/basic-auth/app/utils/posts.ts @@ -0,0 +1,33 @@ +import { notFound } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/start' +import axios from 'redaxios' + +export type PostType = { + id: string + title: string + body: string +} + +export const fetchPost = createServerFn('GET', async (postId: string) => { + console.info(`Fetching post with id ${postId}...`) + const post = await axios + .get(`https://jsonplaceholder.typicode.com/posts/${postId}`) + .then((r) => r.data) + .catch((err) => { + console.error(err) + if (err.status === 404) { + throw notFound() + } + throw err + }) + + return post +}) + +export const fetchPosts = createServerFn('GET', async () => { + console.info('Fetching posts...') + await new Promise((r) => setTimeout(r, 1000)) + return axios + .get>('https://jsonplaceholder.typicode.com/posts') + .then((r) => r.data.slice(0, 10)) +}) diff --git a/e2e/start/basic-auth/app/utils/prisma.ts b/e2e/start/basic-auth/app/utils/prisma.ts new file mode 100644 index 0000000000..74f5137b46 --- /dev/null +++ b/e2e/start/basic-auth/app/utils/prisma.ts @@ -0,0 +1,16 @@ +import crypto from 'node:crypto' +import { PrismaClient } from '@prisma/client' + +export const prismaClient = new PrismaClient() + +export function hashPassword(password: string) { + return new Promise((resolve, reject) => { + crypto.pbkdf2(password, 'salt', 100000, 64, 'sha256', (err, derivedKey) => { + if (err) { + reject(err) + } else { + resolve(derivedKey.toString('hex')) + } + }) + }) +} diff --git a/e2e/start/basic-auth/app/utils/seo.ts b/e2e/start/basic-auth/app/utils/seo.ts new file mode 100644 index 0000000000..d18ad84b74 --- /dev/null +++ b/e2e/start/basic-auth/app/utils/seo.ts @@ -0,0 +1,33 @@ +export const seo = ({ + title, + description, + keywords, + image, +}: { + title: string + description?: string + image?: string + keywords?: string +}) => { + const tags = [ + { title }, + { name: 'description', content: description }, + { name: 'keywords', content: keywords }, + { name: 'twitter:title', content: title }, + { name: 'twitter:description', content: description }, + { name: 'twitter:creator', content: '@tannerlinsley' }, + { name: 'twitter:site', content: '@tannerlinsley' }, + { name: 'og:type', content: 'website' }, + { name: 'og:title', content: title }, + { name: 'og:description', content: description }, + ...(image + ? [ + { name: 'twitter:image', content: image }, + { name: 'twitter:card', content: 'summary_large_image' }, + { name: 'og:image', content: image }, + ] + : []), + ] + + return tags +} diff --git a/e2e/start/basic-auth/app/utils/session.ts b/e2e/start/basic-auth/app/utils/session.ts new file mode 100644 index 0000000000..08d28177cb --- /dev/null +++ b/e2e/start/basic-auth/app/utils/session.ts @@ -0,0 +1,13 @@ +// app/services/session.server.ts +import { useSession } from 'vinxi/http' +import type { User } from '@prisma/client' + +type SessionUser = { + userEmail: User['email'] +} + +export function useAppSession() { + return useSession({ + password: 'ChangeThisBeforeShippingToProdOrYouWillBeFired', + }) +} diff --git a/e2e/start/basic-auth/package.json b/e2e/start/basic-auth/package.json new file mode 100644 index 0000000000..3fe1190a80 --- /dev/null +++ b/e2e/start/basic-auth/package.json @@ -0,0 +1,45 @@ +{ + "name": "tanstack-start-e2e-basic-auth", + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "dev": "vinxi dev", + "build": "vinxi build", + "start": "vinxi start", + "lint": "prettier --check '**/*' --ignore-unknown && eslint --ext .ts,.tsx ./app", + "format": "prettier --write '**/*' --ignore-unknown", + "prisma-generate": "prisma generate", + "test:e2e": "pnpm run prisma-generate && playwright test --project=chromium" + }, + "dependencies": { + "@prisma/client": "5.19.1", + "@tanstack/react-router": "^1.57.15", + "@tanstack/router-devtools": "^1.57.15", + "@tanstack/router-plugin": "^1.57.15", + "@tanstack/start": "^1.57.15", + "dotenv": "^16.4.5", + "isbot": "^5.1.17", + "prisma": "^5.19.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "redaxios": "^0.5.1", + "remix-auth-form": "^1.5.0", + "tailwind-merge": "^2.5.2", + "vinxi": "0.4.3" + }, + "devDependencies": { + "@playwright/test": "^1.47.1", + "@types/node": "^22.5.4", + "@types/react": "^18.2.65", + "@types/react-dom": "^18.2.21", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.47", + "prettier": "^3.3.3", + "tailwindcss": "^3.4.11", + "typescript": "^5.6.2", + "vite": "^5.4.5", + "vite-tsconfig-paths": "^5.0.1" + } +} diff --git a/examples/react/start-basic-auth/playwright.config.ts b/e2e/start/basic-auth/playwright.config.ts similarity index 100% rename from examples/react/start-basic-auth/playwright.config.ts rename to e2e/start/basic-auth/playwright.config.ts diff --git a/e2e/start/basic-auth/postcss.config.cjs b/e2e/start/basic-auth/postcss.config.cjs new file mode 100644 index 0000000000..8e638a6bcd --- /dev/null +++ b/e2e/start/basic-auth/postcss.config.cjs @@ -0,0 +1,7 @@ +module.exports = { + plugins: [ + require('tailwindcss/nesting'), + require('tailwindcss'), + require('autoprefixer'), + ], +} diff --git a/e2e/start/basic-auth/prisma/dev.db b/e2e/start/basic-auth/prisma/dev.db new file mode 100644 index 0000000000..5f4ab51a02 Binary files /dev/null and b/e2e/start/basic-auth/prisma/dev.db differ diff --git a/e2e/start/basic-auth/prisma/migrations/20240811183753_init/migration.sql b/e2e/start/basic-auth/prisma/migrations/20240811183753_init/migration.sql new file mode 100644 index 0000000000..4512a8f782 --- /dev/null +++ b/e2e/start/basic-auth/prisma/migrations/20240811183753_init/migration.sql @@ -0,0 +1,8 @@ +-- CreateTable +CREATE TABLE "User" ( + "email" TEXT NOT NULL PRIMARY KEY, + "password" TEXT NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); diff --git a/e2e/start/basic-auth/prisma/migrations/migration_lock.toml b/e2e/start/basic-auth/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000000..e5e5c4705a --- /dev/null +++ b/e2e/start/basic-auth/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "sqlite" \ No newline at end of file diff --git a/e2e/start/basic-auth/prisma/schema.prisma b/e2e/start/basic-auth/prisma/schema.prisma new file mode 100644 index 0000000000..3544834310 --- /dev/null +++ b/e2e/start/basic-auth/prisma/schema.prisma @@ -0,0 +1,16 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "sqlite" + url = env("DATABASE_URL") +} + +model User { + email String @id @unique + password String +} \ No newline at end of file diff --git a/e2e/start/basic-auth/public/android-chrome-192x192.png b/e2e/start/basic-auth/public/android-chrome-192x192.png new file mode 100644 index 0000000000..09c8324f8c Binary files /dev/null and b/e2e/start/basic-auth/public/android-chrome-192x192.png differ diff --git a/e2e/start/basic-auth/public/android-chrome-512x512.png b/e2e/start/basic-auth/public/android-chrome-512x512.png new file mode 100644 index 0000000000..11d626ea3d Binary files /dev/null and b/e2e/start/basic-auth/public/android-chrome-512x512.png differ diff --git a/e2e/start/basic-auth/public/apple-touch-icon.png b/e2e/start/basic-auth/public/apple-touch-icon.png new file mode 100644 index 0000000000..5a9423cc02 Binary files /dev/null and b/e2e/start/basic-auth/public/apple-touch-icon.png differ diff --git a/e2e/start/basic-auth/public/favicon-16x16.png b/e2e/start/basic-auth/public/favicon-16x16.png new file mode 100644 index 0000000000..e3389b0044 Binary files /dev/null and b/e2e/start/basic-auth/public/favicon-16x16.png differ diff --git a/e2e/start/basic-auth/public/favicon-32x32.png b/e2e/start/basic-auth/public/favicon-32x32.png new file mode 100644 index 0000000000..900c77d444 Binary files /dev/null and b/e2e/start/basic-auth/public/favicon-32x32.png differ diff --git a/e2e/start/basic-auth/public/favicon.ico b/e2e/start/basic-auth/public/favicon.ico new file mode 100644 index 0000000000..1a1751676f Binary files /dev/null and b/e2e/start/basic-auth/public/favicon.ico differ diff --git a/e2e/start/basic-auth/public/favicon.png b/e2e/start/basic-auth/public/favicon.png new file mode 100644 index 0000000000..1e77bc0609 Binary files /dev/null and b/e2e/start/basic-auth/public/favicon.png differ diff --git a/e2e/start/basic-auth/public/site.webmanifest b/e2e/start/basic-auth/public/site.webmanifest new file mode 100644 index 0000000000..fa99de77db --- /dev/null +++ b/e2e/start/basic-auth/public/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/e2e/start/basic-auth/tailwind.config.cjs b/e2e/start/basic-auth/tailwind.config.cjs new file mode 100644 index 0000000000..75fe25dbf7 --- /dev/null +++ b/e2e/start/basic-auth/tailwind.config.cjs @@ -0,0 +1,4 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./app/**/*.{js,ts,jsx,tsx}'], +} diff --git a/examples/react/start-basic-auth/tests/app.spec.ts b/e2e/start/basic-auth/tests/app.spec.ts similarity index 100% rename from examples/react/start-basic-auth/tests/app.spec.ts rename to e2e/start/basic-auth/tests/app.spec.ts diff --git a/examples/react/start-basic-auth/tests/mock-db-setup.test.ts b/e2e/start/basic-auth/tests/mock-db-setup.test.ts similarity index 100% rename from examples/react/start-basic-auth/tests/mock-db-setup.test.ts rename to e2e/start/basic-auth/tests/mock-db-setup.test.ts diff --git a/examples/react/start-basic-auth/tests/mock-db-teardown.test.ts b/e2e/start/basic-auth/tests/mock-db-teardown.test.ts similarity index 100% rename from examples/react/start-basic-auth/tests/mock-db-teardown.test.ts rename to e2e/start/basic-auth/tests/mock-db-teardown.test.ts diff --git a/e2e/start/basic-auth/tsconfig.json b/e2e/start/basic-auth/tsconfig.json new file mode 100644 index 0000000000..d1b5b77660 --- /dev/null +++ b/e2e/start/basic-auth/tsconfig.json @@ -0,0 +1,22 @@ +{ + "include": ["**/*.ts", "**/*.tsx"], + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "isolatedModules": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "target": "ES2022", + "allowJs": true, + "forceConsistentCasingInFileNames": true, + "baseUrl": ".", + "paths": { + "~/*": ["./app/*"] + }, + "noEmit": true + } +} diff --git a/e2e/start/basic-react-query/.gitignore b/e2e/start/basic-react-query/.gitignore new file mode 100644 index 0000000000..be342025da --- /dev/null +++ b/e2e/start/basic-react-query/.gitignore @@ -0,0 +1,22 @@ +node_modules +package-lock.json +yarn.lock + +.DS_Store +.cache +.env +.vercel +.output +.vinxi + +/build/ +/api/ +/server/build +/public/build +.vinxi +# Sentry Config File +.env.sentry-build-plugin +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/e2e/start/basic-react-query/.prettierignore b/e2e/start/basic-react-query/.prettierignore new file mode 100644 index 0000000000..fd1b50a539 --- /dev/null +++ b/e2e/start/basic-react-query/.prettierignore @@ -0,0 +1,5 @@ +**/api +**/build +**/public +pnpm-lock.yaml +routeTree.gen.ts \ No newline at end of file diff --git a/e2e/start/basic-react-query/.prettierrc b/e2e/start/basic-react-query/.prettierrc new file mode 100644 index 0000000000..aaf3357d4a --- /dev/null +++ b/e2e/start/basic-react-query/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "semi": false, + "trailingComma": "all" +} diff --git a/e2e/start/basic-react-query/app.config.ts b/e2e/start/basic-react-query/app.config.ts new file mode 100644 index 0000000000..d1d9b04ded --- /dev/null +++ b/e2e/start/basic-react-query/app.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from '@tanstack/start/config' +import tsConfigPaths from 'vite-tsconfig-paths' + +export default defineConfig({ + vite: { + plugins: () => [ + tsConfigPaths({ + projects: ['./tsconfig.json'], + }), + ], + }, +}) diff --git a/e2e/start/basic-react-query/app/api.ts b/e2e/start/basic-react-query/app/api.ts new file mode 100644 index 0000000000..0caf78bb9d --- /dev/null +++ b/e2e/start/basic-react-query/app/api.ts @@ -0,0 +1,6 @@ +import { + createStartAPIHandler, + defaultAPIFileRouteHandler, +} from '@tanstack/start/api' + +export default createStartAPIHandler(defaultAPIFileRouteHandler) diff --git a/e2e/start/basic-react-query/app/client.tsx b/e2e/start/basic-react-query/app/client.tsx new file mode 100644 index 0000000000..f16ba73f62 --- /dev/null +++ b/e2e/start/basic-react-query/app/client.tsx @@ -0,0 +1,7 @@ +import { hydrateRoot } from 'react-dom/client' +import { StartClient } from '@tanstack/start' +import { createRouter } from './router' + +const router = createRouter() + +hydrateRoot(document.getElementById('root')!, ) diff --git a/e2e/start/basic-react-query/app/components/DefaultCatchBoundary.tsx b/e2e/start/basic-react-query/app/components/DefaultCatchBoundary.tsx new file mode 100644 index 0000000000..f0ce51dc57 --- /dev/null +++ b/e2e/start/basic-react-query/app/components/DefaultCatchBoundary.tsx @@ -0,0 +1,53 @@ +import { + ErrorComponent, + ErrorComponentProps, + Link, + rootRouteId, + useMatch, + useRouter, +} from '@tanstack/react-router' + +export function DefaultCatchBoundary({ error }: ErrorComponentProps) { + const router = useRouter() + const isRoot = useMatch({ + strict: false, + select: (state) => state.id === rootRouteId, + }) + + console.error(error) + + return ( +
+ +
+ + {isRoot ? ( + + Home + + ) : ( + { + e.preventDefault() + window.history.back() + }} + > + Go Back + + )} +
+
+ ) +} diff --git a/e2e/start/basic-react-query/app/components/NotFound.tsx b/e2e/start/basic-react-query/app/components/NotFound.tsx new file mode 100644 index 0000000000..7b54fa5680 --- /dev/null +++ b/e2e/start/basic-react-query/app/components/NotFound.tsx @@ -0,0 +1,25 @@ +import { Link } from '@tanstack/react-router' + +export function NotFound({ children }: { children?: any }) { + return ( +
+
+ {children ||

The page you are looking for does not exist.

} +
+

+ + + Start Over + +

+
+ ) +} diff --git a/e2e/start/basic-react-query/app/routeTree.gen.ts b/e2e/start/basic-react-query/app/routeTree.gen.ts new file mode 100644 index 0000000000..d6df38d1bf --- /dev/null +++ b/e2e/start/basic-react-query/app/routeTree.gen.ts @@ -0,0 +1,460 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/__root' +import { Route as UsersImport } from './routes/users' +import { Route as RedirectImport } from './routes/redirect' +import { Route as PostsImport } from './routes/posts' +import { Route as DeferredImport } from './routes/deferred' +import { Route as LayoutImport } from './routes/_layout' +import { Route as IndexImport } from './routes/index' +import { Route as UsersIndexImport } from './routes/users.index' +import { Route as PostsIndexImport } from './routes/posts.index' +import { Route as UsersUserIdImport } from './routes/users.$userId' +import { Route as PostsPostIdImport } from './routes/posts.$postId' +import { Route as LayoutLayout2Import } from './routes/_layout/_layout-2' +import { Route as PostsPostIdDeepImport } from './routes/posts_.$postId.deep' +import { Route as LayoutLayout2LayoutBImport } from './routes/_layout/_layout-2/layout-b' +import { Route as LayoutLayout2LayoutAImport } from './routes/_layout/_layout-2/layout-a' + +// Create/Update Routes + +const UsersRoute = UsersImport.update({ + path: '/users', + getParentRoute: () => rootRoute, +} as any) + +const RedirectRoute = RedirectImport.update({ + path: '/redirect', + getParentRoute: () => rootRoute, +} as any) + +const PostsRoute = PostsImport.update({ + path: '/posts', + getParentRoute: () => rootRoute, +} as any) + +const DeferredRoute = DeferredImport.update({ + path: '/deferred', + getParentRoute: () => rootRoute, +} as any) + +const LayoutRoute = LayoutImport.update({ + id: '/_layout', + getParentRoute: () => rootRoute, +} as any) + +const IndexRoute = IndexImport.update({ + path: '/', + getParentRoute: () => rootRoute, +} as any) + +const UsersIndexRoute = UsersIndexImport.update({ + path: '/', + getParentRoute: () => UsersRoute, +} as any) + +const PostsIndexRoute = PostsIndexImport.update({ + path: '/', + getParentRoute: () => PostsRoute, +} as any) + +const UsersUserIdRoute = UsersUserIdImport.update({ + path: '/$userId', + getParentRoute: () => UsersRoute, +} as any) + +const PostsPostIdRoute = PostsPostIdImport.update({ + path: '/$postId', + getParentRoute: () => PostsRoute, +} as any) + +const LayoutLayout2Route = LayoutLayout2Import.update({ + id: '/_layout-2', + getParentRoute: () => LayoutRoute, +} as any) + +const PostsPostIdDeepRoute = PostsPostIdDeepImport.update({ + path: '/posts/$postId/deep', + getParentRoute: () => rootRoute, +} as any) + +const LayoutLayout2LayoutBRoute = LayoutLayout2LayoutBImport.update({ + path: '/layout-b', + getParentRoute: () => LayoutLayout2Route, +} as any) + +const LayoutLayout2LayoutARoute = LayoutLayout2LayoutAImport.update({ + path: '/layout-a', + getParentRoute: () => LayoutLayout2Route, +} as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexImport + parentRoute: typeof rootRoute + } + '/_layout': { + id: '/_layout' + path: '' + fullPath: '' + preLoaderRoute: typeof LayoutImport + parentRoute: typeof rootRoute + } + '/deferred': { + id: '/deferred' + path: '/deferred' + fullPath: '/deferred' + preLoaderRoute: typeof DeferredImport + parentRoute: typeof rootRoute + } + '/posts': { + id: '/posts' + path: '/posts' + fullPath: '/posts' + preLoaderRoute: typeof PostsImport + parentRoute: typeof rootRoute + } + '/redirect': { + id: '/redirect' + path: '/redirect' + fullPath: '/redirect' + preLoaderRoute: typeof RedirectImport + parentRoute: typeof rootRoute + } + '/users': { + id: '/users' + path: '/users' + fullPath: '/users' + preLoaderRoute: typeof UsersImport + parentRoute: typeof rootRoute + } + '/_layout/_layout-2': { + id: '/_layout/_layout-2' + path: '' + fullPath: '' + preLoaderRoute: typeof LayoutLayout2Import + parentRoute: typeof LayoutImport + } + '/posts/$postId': { + id: '/posts/$postId' + path: '/$postId' + fullPath: '/posts/$postId' + preLoaderRoute: typeof PostsPostIdImport + parentRoute: typeof PostsImport + } + '/users/$userId': { + id: '/users/$userId' + path: '/$userId' + fullPath: '/users/$userId' + preLoaderRoute: typeof UsersUserIdImport + parentRoute: typeof UsersImport + } + '/posts/': { + id: '/posts/' + path: '/' + fullPath: '/posts/' + preLoaderRoute: typeof PostsIndexImport + parentRoute: typeof PostsImport + } + '/users/': { + id: '/users/' + path: '/' + fullPath: '/users/' + preLoaderRoute: typeof UsersIndexImport + parentRoute: typeof UsersImport + } + '/_layout/_layout-2/layout-a': { + id: '/_layout/_layout-2/layout-a' + path: '/layout-a' + fullPath: '/layout-a' + preLoaderRoute: typeof LayoutLayout2LayoutAImport + parentRoute: typeof LayoutLayout2Import + } + '/_layout/_layout-2/layout-b': { + id: '/_layout/_layout-2/layout-b' + path: '/layout-b' + fullPath: '/layout-b' + preLoaderRoute: typeof LayoutLayout2LayoutBImport + parentRoute: typeof LayoutLayout2Import + } + '/posts/$postId/deep': { + id: '/posts/$postId/deep' + path: '/posts/$postId/deep' + fullPath: '/posts/$postId/deep' + preLoaderRoute: typeof PostsPostIdDeepImport + parentRoute: typeof rootRoute + } + } +} + +// Create and export the route tree + +interface LayoutLayout2RouteChildren { + LayoutLayout2LayoutARoute: typeof LayoutLayout2LayoutARoute + LayoutLayout2LayoutBRoute: typeof LayoutLayout2LayoutBRoute +} + +const LayoutLayout2RouteChildren: LayoutLayout2RouteChildren = { + LayoutLayout2LayoutARoute: LayoutLayout2LayoutARoute, + LayoutLayout2LayoutBRoute: LayoutLayout2LayoutBRoute, +} + +const LayoutLayout2RouteWithChildren = LayoutLayout2Route._addFileChildren( + LayoutLayout2RouteChildren, +) + +interface LayoutRouteChildren { + LayoutLayout2Route: typeof LayoutLayout2RouteWithChildren +} + +const LayoutRouteChildren: LayoutRouteChildren = { + LayoutLayout2Route: LayoutLayout2RouteWithChildren, +} + +const LayoutRouteWithChildren = + LayoutRoute._addFileChildren(LayoutRouteChildren) + +interface PostsRouteChildren { + PostsPostIdRoute: typeof PostsPostIdRoute + PostsIndexRoute: typeof PostsIndexRoute +} + +const PostsRouteChildren: PostsRouteChildren = { + PostsPostIdRoute: PostsPostIdRoute, + PostsIndexRoute: PostsIndexRoute, +} + +const PostsRouteWithChildren = PostsRoute._addFileChildren(PostsRouteChildren) + +interface UsersRouteChildren { + UsersUserIdRoute: typeof UsersUserIdRoute + UsersIndexRoute: typeof UsersIndexRoute +} + +const UsersRouteChildren: UsersRouteChildren = { + UsersUserIdRoute: UsersUserIdRoute, + UsersIndexRoute: UsersIndexRoute, +} + +const UsersRouteWithChildren = UsersRoute._addFileChildren(UsersRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '': typeof LayoutLayout2RouteWithChildren + '/deferred': typeof DeferredRoute + '/posts': typeof PostsRouteWithChildren + '/redirect': typeof RedirectRoute + '/users': typeof UsersRouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/users/$userId': typeof UsersUserIdRoute + '/posts/': typeof PostsIndexRoute + '/users/': typeof UsersIndexRoute + '/layout-a': typeof LayoutLayout2LayoutARoute + '/layout-b': typeof LayoutLayout2LayoutBRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '': typeof LayoutLayout2RouteWithChildren + '/deferred': typeof DeferredRoute + '/redirect': typeof RedirectRoute + '/posts/$postId': typeof PostsPostIdRoute + '/users/$userId': typeof UsersUserIdRoute + '/posts': typeof PostsIndexRoute + '/users': typeof UsersIndexRoute + '/layout-a': typeof LayoutLayout2LayoutARoute + '/layout-b': typeof LayoutLayout2LayoutBRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/_layout': typeof LayoutRouteWithChildren + '/deferred': typeof DeferredRoute + '/posts': typeof PostsRouteWithChildren + '/redirect': typeof RedirectRoute + '/users': typeof UsersRouteWithChildren + '/_layout/_layout-2': typeof LayoutLayout2RouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/users/$userId': typeof UsersUserIdRoute + '/posts/': typeof PostsIndexRoute + '/users/': typeof UsersIndexRoute + '/_layout/_layout-2/layout-a': typeof LayoutLayout2LayoutARoute + '/_layout/_layout-2/layout-b': typeof LayoutLayout2LayoutBRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '' + | '/deferred' + | '/posts' + | '/redirect' + | '/users' + | '/posts/$postId' + | '/users/$userId' + | '/posts/' + | '/users/' + | '/layout-a' + | '/layout-b' + | '/posts/$postId/deep' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '' + | '/deferred' + | '/redirect' + | '/posts/$postId' + | '/users/$userId' + | '/posts' + | '/users' + | '/layout-a' + | '/layout-b' + | '/posts/$postId/deep' + id: + | '__root__' + | '/' + | '/_layout' + | '/deferred' + | '/posts' + | '/redirect' + | '/users' + | '/_layout/_layout-2' + | '/posts/$postId' + | '/users/$userId' + | '/posts/' + | '/users/' + | '/_layout/_layout-2/layout-a' + | '/_layout/_layout-2/layout-b' + | '/posts/$postId/deep' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + LayoutRoute: typeof LayoutRouteWithChildren + DeferredRoute: typeof DeferredRoute + PostsRoute: typeof PostsRouteWithChildren + RedirectRoute: typeof RedirectRoute + UsersRoute: typeof UsersRouteWithChildren + PostsPostIdDeepRoute: typeof PostsPostIdDeepRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + LayoutRoute: LayoutRouteWithChildren, + DeferredRoute: DeferredRoute, + PostsRoute: PostsRouteWithChildren, + RedirectRoute: RedirectRoute, + UsersRoute: UsersRouteWithChildren, + PostsPostIdDeepRoute: PostsPostIdDeepRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [ + "/", + "/_layout", + "/deferred", + "/posts", + "/redirect", + "/users", + "/posts/$postId/deep" + ] + }, + "/": { + "filePath": "index.tsx" + }, + "/_layout": { + "filePath": "_layout.tsx", + "children": [ + "/_layout/_layout-2" + ] + }, + "/deferred": { + "filePath": "deferred.tsx" + }, + "/posts": { + "filePath": "posts.tsx", + "children": [ + "/posts/$postId", + "/posts/" + ] + }, + "/redirect": { + "filePath": "redirect.tsx" + }, + "/users": { + "filePath": "users.tsx", + "children": [ + "/users/$userId", + "/users/" + ] + }, + "/_layout/_layout-2": { + "filePath": "_layout/_layout-2.tsx", + "parent": "/_layout", + "children": [ + "/_layout/_layout-2/layout-a", + "/_layout/_layout-2/layout-b" + ] + }, + "/posts/$postId": { + "filePath": "posts.$postId.tsx", + "parent": "/posts" + }, + "/users/$userId": { + "filePath": "users.$userId.tsx", + "parent": "/users" + }, + "/posts/": { + "filePath": "posts.index.tsx", + "parent": "/posts" + }, + "/users/": { + "filePath": "users.index.tsx", + "parent": "/users" + }, + "/_layout/_layout-2/layout-a": { + "filePath": "_layout/_layout-2/layout-a.tsx", + "parent": "/_layout/_layout-2" + }, + "/_layout/_layout-2/layout-b": { + "filePath": "_layout/_layout-2/layout-b.tsx", + "parent": "/_layout/_layout-2" + }, + "/posts/$postId/deep": { + "filePath": "posts_.$postId.deep.tsx" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/e2e/start/basic-react-query/app/router.tsx b/e2e/start/basic-react-query/app/router.tsx new file mode 100644 index 0000000000..ee35b01cbf --- /dev/null +++ b/e2e/start/basic-react-query/app/router.tsx @@ -0,0 +1,31 @@ +import { QueryClient } from '@tanstack/react-query' +import { createRouter as createTanStackRouter } from '@tanstack/react-router' +import { routerWithQueryClient } from '@tanstack/react-router-with-query' +import { routeTree } from './routeTree.gen' +import { DefaultCatchBoundary } from './components/DefaultCatchBoundary' +import { NotFound } from './components/NotFound' + +// NOTE: Most of the integration code found here is experimental and will +// definitely end up in a more streamlined API in the future. This is just +// to show what's possible with the current APIs. + +export function createRouter() { + const queryClient = new QueryClient() + + return routerWithQueryClient( + createTanStackRouter({ + routeTree, + context: { queryClient }, + defaultPreload: 'intent', + defaultErrorComponent: DefaultCatchBoundary, + defaultNotFoundComponent: () => , + }), + queryClient, + ) +} + +declare module '@tanstack/react-router' { + interface Register { + router: ReturnType + } +} diff --git a/e2e/start/basic-react-query/app/routes/__root.tsx b/e2e/start/basic-react-query/app/routes/__root.tsx new file mode 100644 index 0000000000..87f26f02ef --- /dev/null +++ b/e2e/start/basic-react-query/app/routes/__root.tsx @@ -0,0 +1,144 @@ +import { + Link, + Outlet, + ScrollRestoration, + createRootRouteWithContext, +} from '@tanstack/react-router' +import { ReactQueryDevtools } from '@tanstack/react-query-devtools' +import { TanStackRouterDevtools } from '@tanstack/router-devtools' +import { Body, Head, Html, Meta, Scripts } from '@tanstack/start' +import * as React from 'react' +import type { QueryClient } from '@tanstack/react-query' +import { DefaultCatchBoundary } from '~/components/DefaultCatchBoundary' +import { NotFound } from '~/components/NotFound' +// @ts-expect-error +import appCss from '~/styles/app.css?url' +import { seo } from '~/utils/seo' + +export const Route = createRootRouteWithContext<{ + queryClient: QueryClient +}>()({ + meta: () => [ + { + charSet: 'utf-8', + }, + { + name: 'viewport', + content: 'width=device-width, initial-scale=1', + }, + ...seo({ + title: + 'TanStack Start | Type-Safe, Client-First, Full-Stack React Framework', + description: `TanStack Start is a type-safe, client-first, full-stack React framework. `, + }), + ], + links: () => [ + { rel: 'stylesheet', href: appCss }, + { + rel: 'apple-touch-icon', + sizes: '180x180', + href: '/apple-touch-icon.png', + }, + { + rel: 'icon', + type: 'image/png', + sizes: '32x32', + href: '/favicon-32x32.png', + }, + { + rel: 'icon', + type: 'image/png', + sizes: '16x16', + href: '/favicon-16x16.png', + }, + { rel: 'manifest', href: '/site.webmanifest', color: '#fffff' }, + { rel: 'icon', href: '/favicon.ico' }, + ], + errorComponent: (props) => { + return ( + + + + ) + }, + notFoundComponent: () => , + component: RootComponent, +}) + +function RootComponent() { + return ( + + + + ) +} + +function RootDocument({ children }: { children: React.ReactNode }) { + return ( + + + + + +
+ + Home + {' '} + + Posts + {' '} + + Users + {' '} + + Layout + {' '} + + Deferred + {' '} + + This Route Does Not Exist + +
+
+ {children} + + + + + + + ) +} diff --git a/e2e/start/basic-react-query/app/routes/_layout.tsx b/e2e/start/basic-react-query/app/routes/_layout.tsx new file mode 100644 index 0000000000..af5585728e --- /dev/null +++ b/e2e/start/basic-react-query/app/routes/_layout.tsx @@ -0,0 +1,16 @@ +import { Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a layout
+
+ +
+
+ ) +} diff --git a/e2e/start/basic-react-query/app/routes/_layout/_layout-2.tsx b/e2e/start/basic-react-query/app/routes/_layout/_layout-2.tsx new file mode 100644 index 0000000000..2167ce27ce --- /dev/null +++ b/e2e/start/basic-react-query/app/routes/_layout/_layout-2.tsx @@ -0,0 +1,34 @@ +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a nested layout
+
+ + Layout A + + + Layout B + +
+
+ +
+
+ ) +} diff --git a/e2e/start/basic-react-query/app/routes/_layout/_layout-2/layout-a.tsx b/e2e/start/basic-react-query/app/routes/_layout/_layout-2/layout-a.tsx new file mode 100644 index 0000000000..bb8d3d277d --- /dev/null +++ b/e2e/start/basic-react-query/app/routes/_layout/_layout-2/layout-a.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2/layout-a')({ + component: LayoutAComponent, +}) + +function LayoutAComponent() { + return
I'm A!
+} diff --git a/e2e/start/basic-react-query/app/routes/_layout/_layout-2/layout-b.tsx b/e2e/start/basic-react-query/app/routes/_layout/_layout-2/layout-b.tsx new file mode 100644 index 0000000000..69f6158958 --- /dev/null +++ b/e2e/start/basic-react-query/app/routes/_layout/_layout-2/layout-b.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2/layout-b')({ + component: LayoutBComponent, +}) + +function LayoutBComponent() { + return
I'm B!
+} diff --git a/e2e/start/basic-react-query/app/routes/api.users.ts b/e2e/start/basic-react-query/app/routes/api.users.ts new file mode 100644 index 0000000000..3b11af9b9d --- /dev/null +++ b/e2e/start/basic-react-query/app/routes/api.users.ts @@ -0,0 +1,17 @@ +import { json } from '@tanstack/start' +import { createAPIFileRoute } from '@tanstack/start/api' +import axios from 'redaxios' +import type { User } from '../utils/users' + +export const Route = createAPIFileRoute('/api/users')({ + GET: async ({ request }) => { + console.info('Fetching users... @', request.url) + const res = await axios.get>( + 'https://jsonplaceholder.typicode.com/users', + ) + + const list = res.data.slice(0, 10) + + return json(list.map((u) => ({ id: u.id, name: u.name, email: u.email }))) + }, +}) diff --git a/e2e/start/basic-react-query/app/routes/api/users.$id.ts b/e2e/start/basic-react-query/app/routes/api/users.$id.ts new file mode 100644 index 0000000000..849d45e8d0 --- /dev/null +++ b/e2e/start/basic-react-query/app/routes/api/users.$id.ts @@ -0,0 +1,24 @@ +import { json } from '@tanstack/start' +import { createAPIFileRoute } from '@tanstack/start/api' +import axios from 'redaxios' +import type { User } from '../../utils/users' + +export const Route = createAPIFileRoute('/api/users/$id')({ + GET: async ({ request, params }) => { + console.info(`Fetching users by id=${params.id}... @`, request.url) + try { + const res = await axios.get( + 'https://jsonplaceholder.typicode.com/users/' + params.id, + ) + + return json({ + id: res.data.id, + name: res.data.name, + email: res.data.email, + }) + } catch (e) { + console.error(e) + return json({ error: 'User not found' }, { status: 404 }) + } + }, +}) diff --git a/e2e/start/basic-react-query/app/routes/deferred.tsx b/e2e/start/basic-react-query/app/routes/deferred.tsx new file mode 100644 index 0000000000..666ae26e49 --- /dev/null +++ b/e2e/start/basic-react-query/app/routes/deferred.tsx @@ -0,0 +1,53 @@ +import { queryOptions, useSuspenseQuery } from '@tanstack/react-query' +import { createFileRoute } from '@tanstack/react-router' +import { Suspense, useState } from 'react' + +const deferredQueryOptions = () => + queryOptions({ + queryKey: ['deferred'], + queryFn: async () => { + await new Promise((r) => setTimeout(r, 3000)) + return { + message: `Hello deferred from the server!`, + status: 'success', + time: new Date(), + } + }, + }) + +export const Route = createFileRoute('/deferred')({ + loader: ({ context }) => { + // Kick off loading as early as possible! + context.queryClient.prefetchQuery(deferredQueryOptions()) + }, + component: Deferred, +}) + +function Deferred() { + const [count, setCount] = useState(0) + + return ( +
+ + + +
Count: {count}
+
+ +
+
+ ) +} + +function DeferredQuery() { + const deferredQuery = useSuspenseQuery(deferredQueryOptions()) + + return ( +
+

Deferred Query

+
Status: {deferredQuery.data.status}
+
Message: {deferredQuery.data.message}
+
Time: {deferredQuery.data.time.toISOString()}
+
+ ) +} diff --git a/e2e/start/basic-react-query/app/routes/index.tsx b/e2e/start/basic-react-query/app/routes/index.tsx new file mode 100644 index 0000000000..09a907cb18 --- /dev/null +++ b/e2e/start/basic-react-query/app/routes/index.tsx @@ -0,0 +1,13 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: Home, +}) + +function Home() { + return ( +
+

Welcome Home!!!

+
+ ) +} diff --git a/e2e/start/basic-react-query/app/routes/posts.$postId.tsx b/e2e/start/basic-react-query/app/routes/posts.$postId.tsx new file mode 100644 index 0000000000..546e3d2795 --- /dev/null +++ b/e2e/start/basic-react-query/app/routes/posts.$postId.tsx @@ -0,0 +1,53 @@ +import { ErrorComponent, Link, createFileRoute } from '@tanstack/react-router' +import { useSuspenseQuery } from '@tanstack/react-query' +import { postQueryOptions } from '../utils/posts' +import type { ErrorComponentProps } from '@tanstack/react-router' +import { NotFound } from '~/components/NotFound' + +export const Route = createFileRoute('/posts/$postId')({ + loader: async ({ params: { postId }, context }) => { + const data = await context.queryClient.ensureQueryData( + postQueryOptions(postId), + ) + + return { + title: data.title, + } + }, + meta: ({ loaderData }) => [ + { + title: loaderData.title, + }, + ], + errorComponent: PostErrorComponent as any, + notFoundComponent: () => { + return Post not found + }, + component: PostComponent, +}) + +export function PostErrorComponent({ error }: ErrorComponentProps) { + return +} + +function PostComponent() { + const { postId } = Route.useParams() + const postQuery = useSuspenseQuery(postQueryOptions(postId)) + + return ( +
+

{postQuery.data.title}

+
{postQuery.data.body}
+ + Deep View + +
+ ) +} diff --git a/e2e/start/basic-react-query/app/routes/posts.index.tsx b/e2e/start/basic-react-query/app/routes/posts.index.tsx new file mode 100644 index 0000000000..5b5f08f95b --- /dev/null +++ b/e2e/start/basic-react-query/app/routes/posts.index.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/')({ + component: PostsIndexComponent, +}) + +function PostsIndexComponent() { + return
Select a post.
+} diff --git a/e2e/start/basic-react-query/app/routes/posts.tsx b/e2e/start/basic-react-query/app/routes/posts.tsx new file mode 100644 index 0000000000..64600d15c4 --- /dev/null +++ b/e2e/start/basic-react-query/app/routes/posts.tsx @@ -0,0 +1,43 @@ +import { useSuspenseQuery } from '@tanstack/react-query' +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' +import { postsQueryOptions } from '../utils/posts' + +export const Route = createFileRoute('/posts')({ + loader: async ({ context }) => { + await context.queryClient.ensureQueryData(postsQueryOptions()) + }, + meta: () => [{ title: 'Posts' }], + component: PostsComponent, +}) + +function PostsComponent() { + const postsQuery = useSuspenseQuery(postsQueryOptions()) + + return ( +
+
    + {[ + ...postsQuery.data, + { id: 'i-do-not-exist', title: 'Non-existent Post' }, + ].map((post) => { + return ( +
  • + +
    {post.title.substring(0, 20)}
    + +
  • + ) + })} +
+
+ +
+ ) +} diff --git a/e2e/start/basic-react-query/app/routes/posts_.$postId.deep.tsx b/e2e/start/basic-react-query/app/routes/posts_.$postId.deep.tsx new file mode 100644 index 0000000000..0561ae6ccd --- /dev/null +++ b/e2e/start/basic-react-query/app/routes/posts_.$postId.deep.tsx @@ -0,0 +1,41 @@ +import { Link, createFileRoute } from '@tanstack/react-router' +import { useSuspenseQuery } from '@tanstack/react-query' +import { postQueryOptions } from '../utils/posts' +import { PostErrorComponent } from './posts.$postId' + +export const Route = createFileRoute('/posts/$postId/deep')({ + loader: async ({ params: { postId }, context }) => { + const data = await context.queryClient.ensureQueryData( + postQueryOptions(postId), + ) + + return { + title: data.title, + } + }, + meta: ({ loaderData }) => [ + { + title: loaderData.title, + }, + ], + errorComponent: PostErrorComponent as any, + component: PostDeepComponent, +}) + +function PostDeepComponent() { + const { postId } = Route.useParams() + const postQuery = useSuspenseQuery(postQueryOptions(postId)) + + return ( +
+ + ← All Posts + +

{postQuery.data.title}

+
{postQuery.data.body}
+
+ ) +} diff --git a/e2e/start/basic-react-query/app/routes/redirect.tsx b/e2e/start/basic-react-query/app/routes/redirect.tsx new file mode 100644 index 0000000000..c9286de13d --- /dev/null +++ b/e2e/start/basic-react-query/app/routes/redirect.tsx @@ -0,0 +1,9 @@ +import { createFileRoute, redirect } from '@tanstack/react-router' + +export const Route = createFileRoute('/redirect')({ + beforeLoad: async () => { + throw redirect({ + to: '/posts', + }) + }, +}) diff --git a/e2e/start/basic-react-query/app/routes/users.$userId.tsx b/e2e/start/basic-react-query/app/routes/users.$userId.tsx new file mode 100644 index 0000000000..0750a01568 --- /dev/null +++ b/e2e/start/basic-react-query/app/routes/users.$userId.tsx @@ -0,0 +1,33 @@ +import { useSuspenseQuery } from '@tanstack/react-query' +import { ErrorComponent, createFileRoute } from '@tanstack/react-router' +import type { ErrorComponentProps } from '@tanstack/react-router' +import { NotFound } from '~/components/NotFound' +import { userQueryOptions } from '~/utils/users' + +export const Route = createFileRoute('/users/$userId')({ + loader: async ({ context, params: { userId } }) => { + await context.queryClient.ensureQueryData(userQueryOptions(userId)) + }, + errorComponent: UserErrorComponent, + component: UserComponent, + notFoundComponent: () => { + return User not found + }, +}) + +export function UserErrorComponent({ error }: ErrorComponentProps) { + return +} + +function UserComponent() { + const params = Route.useParams() + const userQuery = useSuspenseQuery(userQueryOptions(params.userId)) + const user = userQuery.data + + return ( +
+

{user.name}

+
{user.email}
+
+ ) +} diff --git a/e2e/start/basic-react-query/app/routes/users.index.tsx b/e2e/start/basic-react-query/app/routes/users.index.tsx new file mode 100644 index 0000000000..b6b0ee67fb --- /dev/null +++ b/e2e/start/basic-react-query/app/routes/users.index.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/users/')({ + component: UsersIndexComponent, +}) + +function UsersIndexComponent() { + return
Select a user.
+} diff --git a/e2e/start/basic-react-query/app/routes/users.tsx b/e2e/start/basic-react-query/app/routes/users.tsx new file mode 100644 index 0000000000..2f3c72cb7b --- /dev/null +++ b/e2e/start/basic-react-query/app/routes/users.tsx @@ -0,0 +1,42 @@ +import { useSuspenseQuery } from '@tanstack/react-query' +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' +import { usersQueryOptions } from '../utils/users' + +export const Route = createFileRoute('/users')({ + loader: async ({ context }) => { + await context.queryClient.ensureQueryData(usersQueryOptions()) + }, + component: UsersComponent, +}) + +function UsersComponent() { + const usersQuery = useSuspenseQuery(usersQueryOptions()) + + return ( +
+
    + {[ + ...usersQuery.data, + { id: 'i-do-not-exist', name: 'Non-existent User', email: '' }, + ].map((user) => { + return ( +
  • + +
    {user.name}
    + +
  • + ) + })} +
+
+ +
+ ) +} diff --git a/e2e/start/basic-react-query/app/ssr.tsx b/e2e/start/basic-react-query/app/ssr.tsx new file mode 100644 index 0000000000..62572579ac --- /dev/null +++ b/e2e/start/basic-react-query/app/ssr.tsx @@ -0,0 +1,12 @@ +import { + createStartHandler, + defaultStreamHandler, +} from '@tanstack/start/server' +import { getRouterManifest } from '@tanstack/start/router-manifest' + +import { createRouter } from './router' + +export default createStartHandler({ + createRouter, + getRouterManifest, +})(defaultStreamHandler) diff --git a/e2e/start/basic-react-query/app/styles/app.css b/e2e/start/basic-react-query/app/styles/app.css new file mode 100644 index 0000000000..d6426ccb72 --- /dev/null +++ b/e2e/start/basic-react-query/app/styles/app.css @@ -0,0 +1,14 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + html, + body { + @apply text-gray-900 bg-gray-50 dark:bg-gray-950 dark:text-gray-200; + } + + .using-mouse * { + outline: none !important; + } +} diff --git a/e2e/start/basic-react-query/app/utils/posts.tsx b/e2e/start/basic-react-query/app/utils/posts.tsx new file mode 100644 index 0000000000..bca6d45082 --- /dev/null +++ b/e2e/start/basic-react-query/app/utils/posts.tsx @@ -0,0 +1,45 @@ +import { queryOptions } from '@tanstack/react-query' +import { notFound } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/start' +import axios from 'redaxios' + +export type PostType = { + id: string + title: string + body: string +} + +export const fetchPosts = createServerFn('GET', async () => { + console.info('Fetching posts...') + return axios + .get>('https://jsonplaceholder.typicode.com/posts') + .then((r) => r.data.slice(0, 10)) +}) + +export const postsQueryOptions = () => + queryOptions({ + queryKey: ['posts'], + queryFn: () => fetchPosts(), + }) + +export const fetchPost = createServerFn('GET', async (postId: string) => { + console.info(`Fetching post with id ${postId}...`) + const post = await axios + .get(`https://jsonplaceholder.typicode.com/posts/${postId}`) + .then((r) => r.data) + .catch((err) => { + console.error(err) + if (err.status === 404) { + throw notFound() + } + throw err + }) + + return post +}) + +export const postQueryOptions = (postId: string) => + queryOptions({ + queryKey: ['post', postId], + queryFn: () => fetchPost(postId), + }) diff --git a/e2e/start/basic-react-query/app/utils/seo.ts b/e2e/start/basic-react-query/app/utils/seo.ts new file mode 100644 index 0000000000..d18ad84b74 --- /dev/null +++ b/e2e/start/basic-react-query/app/utils/seo.ts @@ -0,0 +1,33 @@ +export const seo = ({ + title, + description, + keywords, + image, +}: { + title: string + description?: string + image?: string + keywords?: string +}) => { + const tags = [ + { title }, + { name: 'description', content: description }, + { name: 'keywords', content: keywords }, + { name: 'twitter:title', content: title }, + { name: 'twitter:description', content: description }, + { name: 'twitter:creator', content: '@tannerlinsley' }, + { name: 'twitter:site', content: '@tannerlinsley' }, + { name: 'og:type', content: 'website' }, + { name: 'og:title', content: title }, + { name: 'og:description', content: description }, + ...(image + ? [ + { name: 'twitter:image', content: image }, + { name: 'twitter:card', content: 'summary_large_image' }, + { name: 'og:image', content: image }, + ] + : []), + ] + + return tags +} diff --git a/e2e/start/basic-react-query/app/utils/users.tsx b/e2e/start/basic-react-query/app/utils/users.tsx new file mode 100644 index 0000000000..9b6760bfa7 --- /dev/null +++ b/e2e/start/basic-react-query/app/utils/users.tsx @@ -0,0 +1,34 @@ +import { queryOptions } from '@tanstack/react-query' +import axios from 'redaxios' + +export type User = { + id: number + name: string + email: string +} + +export const DEPLOY_URL = 'http://localhost:3000' + +export const usersQueryOptions = () => + queryOptions({ + queryKey: ['users'], + queryFn: () => + axios + .get>(DEPLOY_URL + '/api/users') + .then((r) => r.data) + .catch(() => { + throw new Error('Failed to fetch users') + }), + }) + +export const userQueryOptions = (id: string) => + queryOptions({ + queryKey: ['users', id], + queryFn: () => + axios + .get(DEPLOY_URL + '/api/users/' + id) + .then((r) => r.data) + .catch(() => { + throw new Error('Failed to fetch user') + }), + }) diff --git a/e2e/start/basic-react-query/package.json b/e2e/start/basic-react-query/package.json new file mode 100644 index 0000000000..f4eab453c5 --- /dev/null +++ b/e2e/start/basic-react-query/package.json @@ -0,0 +1,43 @@ +{ + "name": "tanstack-start-e2e-basic-react-query", + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "dev": "vinxi dev", + "build": "vinxi build", + "start": "vinxi start", + "lint": "prettier --check '**/*' --ignore-unknown && eslint --ext .ts,.tsx ./app", + "format": "prettier --write '**/*' --ignore-unknown", + "test:e2e": "playwright test --project=chromium" + }, + "dependencies": { + "@tanstack/react-query": "^5.56.2", + "@tanstack/react-query-devtools": "^5.56.2", + "@tanstack/react-router": "^1.57.15", + "@tanstack/react-router-with-query": "^1.57.15", + "@tanstack/router-devtools": "^1.57.15", + "@tanstack/router-plugin": "^1.57.15", + "@tanstack/start": "^1.57.15", + "isbot": "^5.1.17", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "redaxios": "^0.5.1", + "tailwind-merge": "^2.5.2", + "vinxi": "0.4.3" + }, + "devDependencies": { + "@playwright/test": "^1.47.1", + "@types/node": "^22.5.4", + "@types/react": "^18.2.65", + "@types/react-dom": "^18.2.21", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.47", + "prettier": "^3.3.3", + "tailwindcss": "^3.4.11", + "typescript": "^5.6.2", + "vite": "^5.4.5", + "vite-tsconfig-paths": "^5.0.1" + } +} diff --git a/examples/react/start-basic-react-query/playwright.config.ts b/e2e/start/basic-react-query/playwright.config.ts similarity index 100% rename from examples/react/start-basic-react-query/playwright.config.ts rename to e2e/start/basic-react-query/playwright.config.ts diff --git a/e2e/start/basic-react-query/postcss.config.cjs b/e2e/start/basic-react-query/postcss.config.cjs new file mode 100644 index 0000000000..8e638a6bcd --- /dev/null +++ b/e2e/start/basic-react-query/postcss.config.cjs @@ -0,0 +1,7 @@ +module.exports = { + plugins: [ + require('tailwindcss/nesting'), + require('tailwindcss'), + require('autoprefixer'), + ], +} diff --git a/e2e/start/basic-react-query/public/android-chrome-192x192.png b/e2e/start/basic-react-query/public/android-chrome-192x192.png new file mode 100644 index 0000000000..09c8324f8c Binary files /dev/null and b/e2e/start/basic-react-query/public/android-chrome-192x192.png differ diff --git a/e2e/start/basic-react-query/public/android-chrome-512x512.png b/e2e/start/basic-react-query/public/android-chrome-512x512.png new file mode 100644 index 0000000000..11d626ea3d Binary files /dev/null and b/e2e/start/basic-react-query/public/android-chrome-512x512.png differ diff --git a/e2e/start/basic-react-query/public/apple-touch-icon.png b/e2e/start/basic-react-query/public/apple-touch-icon.png new file mode 100644 index 0000000000..5a9423cc02 Binary files /dev/null and b/e2e/start/basic-react-query/public/apple-touch-icon.png differ diff --git a/e2e/start/basic-react-query/public/favicon-16x16.png b/e2e/start/basic-react-query/public/favicon-16x16.png new file mode 100644 index 0000000000..e3389b0044 Binary files /dev/null and b/e2e/start/basic-react-query/public/favicon-16x16.png differ diff --git a/e2e/start/basic-react-query/public/favicon-32x32.png b/e2e/start/basic-react-query/public/favicon-32x32.png new file mode 100644 index 0000000000..900c77d444 Binary files /dev/null and b/e2e/start/basic-react-query/public/favicon-32x32.png differ diff --git a/e2e/start/basic-react-query/public/favicon.ico b/e2e/start/basic-react-query/public/favicon.ico new file mode 100644 index 0000000000..1a1751676f Binary files /dev/null and b/e2e/start/basic-react-query/public/favicon.ico differ diff --git a/e2e/start/basic-react-query/public/favicon.png b/e2e/start/basic-react-query/public/favicon.png new file mode 100644 index 0000000000..1e77bc0609 Binary files /dev/null and b/e2e/start/basic-react-query/public/favicon.png differ diff --git a/e2e/start/basic-react-query/public/site.webmanifest b/e2e/start/basic-react-query/public/site.webmanifest new file mode 100644 index 0000000000..fa99de77db --- /dev/null +++ b/e2e/start/basic-react-query/public/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/e2e/start/basic-react-query/tailwind.config.cjs b/e2e/start/basic-react-query/tailwind.config.cjs new file mode 100644 index 0000000000..75fe25dbf7 --- /dev/null +++ b/e2e/start/basic-react-query/tailwind.config.cjs @@ -0,0 +1,4 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./app/**/*.{js,ts,jsx,tsx}'], +} diff --git a/examples/react/start-basic-react-query/tests/app.spec.ts b/e2e/start/basic-react-query/tests/app.spec.ts similarity index 100% rename from examples/react/start-basic-react-query/tests/app.spec.ts rename to e2e/start/basic-react-query/tests/app.spec.ts diff --git a/e2e/start/basic-react-query/tsconfig.json b/e2e/start/basic-react-query/tsconfig.json new file mode 100644 index 0000000000..d1b5b77660 --- /dev/null +++ b/e2e/start/basic-react-query/tsconfig.json @@ -0,0 +1,22 @@ +{ + "include": ["**/*.ts", "**/*.tsx"], + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "isolatedModules": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "target": "ES2022", + "allowJs": true, + "forceConsistentCasingInFileNames": true, + "baseUrl": ".", + "paths": { + "~/*": ["./app/*"] + }, + "noEmit": true + } +} diff --git a/e2e/start/basic-rsc/.gitignore b/e2e/start/basic-rsc/.gitignore new file mode 100644 index 0000000000..d3387e00cd --- /dev/null +++ b/e2e/start/basic-rsc/.gitignore @@ -0,0 +1,18 @@ +node_modules +package-lock.json +yarn.lock + +.DS_Store +.cache +.env +.vercel +.output +.vinxi + +/build/ +/api/ +/server/build +/public/build +.vinxi +# Sentry Config File +.env.sentry-build-plugin diff --git a/e2e/start/basic-rsc/.prettierignore b/e2e/start/basic-rsc/.prettierignore new file mode 100644 index 0000000000..fd1b50a539 --- /dev/null +++ b/e2e/start/basic-rsc/.prettierignore @@ -0,0 +1,5 @@ +**/api +**/build +**/public +pnpm-lock.yaml +routeTree.gen.ts \ No newline at end of file diff --git a/e2e/start/basic-rsc/.prettierrc b/e2e/start/basic-rsc/.prettierrc new file mode 100644 index 0000000000..aaf3357d4a --- /dev/null +++ b/e2e/start/basic-rsc/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "semi": false, + "trailingComma": "all" +} diff --git a/e2e/start/basic-rsc/app.config.ts b/e2e/start/basic-rsc/app.config.ts new file mode 100644 index 0000000000..d1d9b04ded --- /dev/null +++ b/e2e/start/basic-rsc/app.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from '@tanstack/start/config' +import tsConfigPaths from 'vite-tsconfig-paths' + +export default defineConfig({ + vite: { + plugins: () => [ + tsConfigPaths({ + projects: ['./tsconfig.json'], + }), + ], + }, +}) diff --git a/e2e/start/basic-rsc/app/client.tsx b/e2e/start/basic-rsc/app/client.tsx new file mode 100644 index 0000000000..f16ba73f62 --- /dev/null +++ b/e2e/start/basic-rsc/app/client.tsx @@ -0,0 +1,7 @@ +import { hydrateRoot } from 'react-dom/client' +import { StartClient } from '@tanstack/start' +import { createRouter } from './router' + +const router = createRouter() + +hydrateRoot(document.getElementById('root')!, ) diff --git a/e2e/start/basic-rsc/app/components/DefaultCatchBoundary.tsx b/e2e/start/basic-rsc/app/components/DefaultCatchBoundary.tsx new file mode 100644 index 0000000000..f0ce51dc57 --- /dev/null +++ b/e2e/start/basic-rsc/app/components/DefaultCatchBoundary.tsx @@ -0,0 +1,53 @@ +import { + ErrorComponent, + ErrorComponentProps, + Link, + rootRouteId, + useMatch, + useRouter, +} from '@tanstack/react-router' + +export function DefaultCatchBoundary({ error }: ErrorComponentProps) { + const router = useRouter() + const isRoot = useMatch({ + strict: false, + select: (state) => state.id === rootRouteId, + }) + + console.error(error) + + return ( +
+ +
+ + {isRoot ? ( + + Home + + ) : ( + { + e.preventDefault() + window.history.back() + }} + > + Go Back + + )} +
+
+ ) +} diff --git a/e2e/start/basic-rsc/app/components/NotFound.tsx b/e2e/start/basic-rsc/app/components/NotFound.tsx new file mode 100644 index 0000000000..7b54fa5680 --- /dev/null +++ b/e2e/start/basic-rsc/app/components/NotFound.tsx @@ -0,0 +1,25 @@ +import { Link } from '@tanstack/react-router' + +export function NotFound({ children }: { children?: any }) { + return ( +
+
+ {children ||

The page you are looking for does not exist.

} +
+

+ + + Start Over + +

+
+ ) +} diff --git a/e2e/start/basic-rsc/app/routeTree.gen.ts b/e2e/start/basic-rsc/app/routeTree.gen.ts new file mode 100644 index 0000000000..55380487d0 --- /dev/null +++ b/e2e/start/basic-rsc/app/routeTree.gen.ts @@ -0,0 +1,325 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/__root' +import { Route as PostsImport } from './routes/posts' +import { Route as LayoutImport } from './routes/_layout' +import { Route as IndexImport } from './routes/index' +import { Route as PostsIndexImport } from './routes/posts.index' +import { Route as PostsPostIdImport } from './routes/posts.$postId' +import { Route as LayoutLayout2Import } from './routes/_layout/_layout-2' +import { Route as PostsPostIdDeepImport } from './routes/posts_.$postId.deep' +import { Route as LayoutLayout2LayoutBImport } from './routes/_layout/_layout-2/layout-b' +import { Route as LayoutLayout2LayoutAImport } from './routes/_layout/_layout-2/layout-a' + +// Create/Update Routes + +const PostsRoute = PostsImport.update({ + path: '/posts', + getParentRoute: () => rootRoute, +} as any) + +const LayoutRoute = LayoutImport.update({ + id: '/_layout', + getParentRoute: () => rootRoute, +} as any) + +const IndexRoute = IndexImport.update({ + path: '/', + getParentRoute: () => rootRoute, +} as any) + +const PostsIndexRoute = PostsIndexImport.update({ + path: '/', + getParentRoute: () => PostsRoute, +} as any) + +const PostsPostIdRoute = PostsPostIdImport.update({ + path: '/$postId', + getParentRoute: () => PostsRoute, +} as any) + +const LayoutLayout2Route = LayoutLayout2Import.update({ + id: '/_layout-2', + getParentRoute: () => LayoutRoute, +} as any) + +const PostsPostIdDeepRoute = PostsPostIdDeepImport.update({ + path: '/posts/$postId/deep', + getParentRoute: () => rootRoute, +} as any) + +const LayoutLayout2LayoutBRoute = LayoutLayout2LayoutBImport.update({ + path: '/layout-b', + getParentRoute: () => LayoutLayout2Route, +} as any) + +const LayoutLayout2LayoutARoute = LayoutLayout2LayoutAImport.update({ + path: '/layout-a', + getParentRoute: () => LayoutLayout2Route, +} as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexImport + parentRoute: typeof rootRoute + } + '/_layout': { + id: '/_layout' + path: '' + fullPath: '' + preLoaderRoute: typeof LayoutImport + parentRoute: typeof rootRoute + } + '/posts': { + id: '/posts' + path: '/posts' + fullPath: '/posts' + preLoaderRoute: typeof PostsImport + parentRoute: typeof rootRoute + } + '/_layout/_layout-2': { + id: '/_layout/_layout-2' + path: '' + fullPath: '' + preLoaderRoute: typeof LayoutLayout2Import + parentRoute: typeof LayoutImport + } + '/posts/$postId': { + id: '/posts/$postId' + path: '/$postId' + fullPath: '/posts/$postId' + preLoaderRoute: typeof PostsPostIdImport + parentRoute: typeof PostsImport + } + '/posts/': { + id: '/posts/' + path: '/' + fullPath: '/posts/' + preLoaderRoute: typeof PostsIndexImport + parentRoute: typeof PostsImport + } + '/_layout/_layout-2/layout-a': { + id: '/_layout/_layout-2/layout-a' + path: '/layout-a' + fullPath: '/layout-a' + preLoaderRoute: typeof LayoutLayout2LayoutAImport + parentRoute: typeof LayoutLayout2Import + } + '/_layout/_layout-2/layout-b': { + id: '/_layout/_layout-2/layout-b' + path: '/layout-b' + fullPath: '/layout-b' + preLoaderRoute: typeof LayoutLayout2LayoutBImport + parentRoute: typeof LayoutLayout2Import + } + '/posts/$postId/deep': { + id: '/posts/$postId/deep' + path: '/posts/$postId/deep' + fullPath: '/posts/$postId/deep' + preLoaderRoute: typeof PostsPostIdDeepImport + parentRoute: typeof rootRoute + } + } +} + +// Create and export the route tree + +interface LayoutLayout2RouteChildren { + LayoutLayout2LayoutARoute: typeof LayoutLayout2LayoutARoute + LayoutLayout2LayoutBRoute: typeof LayoutLayout2LayoutBRoute +} + +const LayoutLayout2RouteChildren: LayoutLayout2RouteChildren = { + LayoutLayout2LayoutARoute: LayoutLayout2LayoutARoute, + LayoutLayout2LayoutBRoute: LayoutLayout2LayoutBRoute, +} + +const LayoutLayout2RouteWithChildren = LayoutLayout2Route._addFileChildren( + LayoutLayout2RouteChildren, +) + +interface LayoutRouteChildren { + LayoutLayout2Route: typeof LayoutLayout2RouteWithChildren +} + +const LayoutRouteChildren: LayoutRouteChildren = { + LayoutLayout2Route: LayoutLayout2RouteWithChildren, +} + +const LayoutRouteWithChildren = + LayoutRoute._addFileChildren(LayoutRouteChildren) + +interface PostsRouteChildren { + PostsPostIdRoute: typeof PostsPostIdRoute + PostsIndexRoute: typeof PostsIndexRoute +} + +const PostsRouteChildren: PostsRouteChildren = { + PostsPostIdRoute: PostsPostIdRoute, + PostsIndexRoute: PostsIndexRoute, +} + +const PostsRouteWithChildren = PostsRoute._addFileChildren(PostsRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '': typeof LayoutLayout2RouteWithChildren + '/posts': typeof PostsRouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/posts/': typeof PostsIndexRoute + '/layout-a': typeof LayoutLayout2LayoutARoute + '/layout-b': typeof LayoutLayout2LayoutBRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '': typeof LayoutLayout2RouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/posts': typeof PostsIndexRoute + '/layout-a': typeof LayoutLayout2LayoutARoute + '/layout-b': typeof LayoutLayout2LayoutBRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/_layout': typeof LayoutRouteWithChildren + '/posts': typeof PostsRouteWithChildren + '/_layout/_layout-2': typeof LayoutLayout2RouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/posts/': typeof PostsIndexRoute + '/_layout/_layout-2/layout-a': typeof LayoutLayout2LayoutARoute + '/_layout/_layout-2/layout-b': typeof LayoutLayout2LayoutBRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '' + | '/posts' + | '/posts/$postId' + | '/posts/' + | '/layout-a' + | '/layout-b' + | '/posts/$postId/deep' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '' + | '/posts/$postId' + | '/posts' + | '/layout-a' + | '/layout-b' + | '/posts/$postId/deep' + id: + | '__root__' + | '/' + | '/_layout' + | '/posts' + | '/_layout/_layout-2' + | '/posts/$postId' + | '/posts/' + | '/_layout/_layout-2/layout-a' + | '/_layout/_layout-2/layout-b' + | '/posts/$postId/deep' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + LayoutRoute: typeof LayoutRouteWithChildren + PostsRoute: typeof PostsRouteWithChildren + PostsPostIdDeepRoute: typeof PostsPostIdDeepRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + LayoutRoute: LayoutRouteWithChildren, + PostsRoute: PostsRouteWithChildren, + PostsPostIdDeepRoute: PostsPostIdDeepRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [ + "/", + "/_layout", + "/posts", + "/posts/$postId/deep" + ] + }, + "/": { + "filePath": "index.tsx" + }, + "/_layout": { + "filePath": "_layout.tsx", + "children": [ + "/_layout/_layout-2" + ] + }, + "/posts": { + "filePath": "posts.tsx", + "children": [ + "/posts/$postId", + "/posts/" + ] + }, + "/_layout/_layout-2": { + "filePath": "_layout/_layout-2.tsx", + "parent": "/_layout", + "children": [ + "/_layout/_layout-2/layout-a", + "/_layout/_layout-2/layout-b" + ] + }, + "/posts/$postId": { + "filePath": "posts.$postId.tsx", + "parent": "/posts" + }, + "/posts/": { + "filePath": "posts.index.tsx", + "parent": "/posts" + }, + "/_layout/_layout-2/layout-a": { + "filePath": "_layout/_layout-2/layout-a.tsx", + "parent": "/_layout/_layout-2" + }, + "/_layout/_layout-2/layout-b": { + "filePath": "_layout/_layout-2/layout-b.tsx", + "parent": "/_layout/_layout-2" + }, + "/posts/$postId/deep": { + "filePath": "posts_.$postId.deep.tsx" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/e2e/start/basic-rsc/app/router.tsx b/e2e/start/basic-rsc/app/router.tsx new file mode 100644 index 0000000000..0886de701f --- /dev/null +++ b/e2e/start/basic-rsc/app/router.tsx @@ -0,0 +1,21 @@ +import { createRouter as createTanStackRouter } from '@tanstack/react-router' +import { routeTree } from './routeTree.gen' +import { DefaultCatchBoundary } from './components/DefaultCatchBoundary' +import { NotFound } from './components/NotFound' + +export function createRouter() { + const router = createTanStackRouter({ + routeTree, + defaultPreload: 'intent', + defaultErrorComponent: DefaultCatchBoundary, + defaultNotFoundComponent: () => , + }) + + return router +} + +declare module '@tanstack/react-router' { + interface Register { + router: ReturnType + } +} diff --git a/e2e/start/basic-rsc/app/routes/__root.tsx b/e2e/start/basic-rsc/app/routes/__root.tsx new file mode 100644 index 0000000000..b973394ac6 --- /dev/null +++ b/e2e/start/basic-rsc/app/routes/__root.tsx @@ -0,0 +1,123 @@ +import { + Link, + Outlet, + ScrollRestoration, + createRootRoute, +} from '@tanstack/react-router' +import { TanStackRouterDevtools } from '@tanstack/router-devtools' +import { Body, Head, Html, Meta, Scripts } from '@tanstack/start' +import * as React from 'react' +import { DefaultCatchBoundary } from '~/components/DefaultCatchBoundary' +import { NotFound } from '~/components/NotFound' +import appCss from '~/styles/app.css?url' +import { seo } from '~/utils/seo' + +export const Route = createRootRoute({ + meta: () => [ + { + charSet: 'utf-8', + }, + { + name: 'viewport', + content: 'width=device-width, initial-scale=1', + }, + ...seo({ + title: + 'TanStack Start | Type-Safe, Client-First, Full-Stack React Framework', + description: `TanStack Start is a type-safe, client-first, full-stack React framework. `, + }), + ], + links: () => [ + { rel: 'stylesheet', href: appCss }, + { + rel: 'apple-touch-icon', + sizes: '180x180', + href: '/apple-touch-icon.png', + }, + { + rel: 'icon', + type: 'image/png', + sizes: '32x32', + href: '/favicon-32x32.png', + }, + { + rel: 'icon', + type: 'image/png', + sizes: '16x16', + href: '/favicon-16x16.png', + }, + { rel: 'manifest', href: '/site.webmanifest', color: '#fffff' }, + { rel: 'icon', href: '/favicon.ico' }, + ], + errorComponent: (props) => { + return ( + + + + ) + }, + notFoundComponent: () => , + component: RootComponent, +}) + +function RootComponent() { + return ( + + + + ) +} + +function RootDocument({ children }: { children: React.ReactNode }) { + return ( + + + + + +
+ + Home + {' '} + + Posts + + + Layout + + + This Route Does Not Exist + +
+
+ {/* {children} */} + {children} + + + + + + ) +} diff --git a/e2e/start/basic-rsc/app/routes/_layout.tsx b/e2e/start/basic-rsc/app/routes/_layout.tsx new file mode 100644 index 0000000000..02ddbb1cd9 --- /dev/null +++ b/e2e/start/basic-rsc/app/routes/_layout.tsx @@ -0,0 +1,16 @@ +import { Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a layout
+
+ +
+
+ ) +} diff --git a/e2e/start/basic-rsc/app/routes/_layout/_layout-2.tsx b/e2e/start/basic-rsc/app/routes/_layout/_layout-2.tsx new file mode 100644 index 0000000000..3b7dbf2903 --- /dev/null +++ b/e2e/start/basic-rsc/app/routes/_layout/_layout-2.tsx @@ -0,0 +1,34 @@ +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a nested layout
+
+ + Layout A + + + Layout B + +
+
+ +
+
+ ) +} diff --git a/e2e/start/basic-rsc/app/routes/_layout/_layout-2/layout-a.tsx b/e2e/start/basic-rsc/app/routes/_layout/_layout-2/layout-a.tsx new file mode 100644 index 0000000000..61e19b4d9f --- /dev/null +++ b/e2e/start/basic-rsc/app/routes/_layout/_layout-2/layout-a.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2/layout-a')({ + component: LayoutAComponent, +}) + +function LayoutAComponent() { + return
I'm layout A!
+} diff --git a/e2e/start/basic-rsc/app/routes/_layout/_layout-2/layout-b.tsx b/e2e/start/basic-rsc/app/routes/_layout/_layout-2/layout-b.tsx new file mode 100644 index 0000000000..cceed1fb9a --- /dev/null +++ b/e2e/start/basic-rsc/app/routes/_layout/_layout-2/layout-b.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2/layout-b')({ + component: LayoutBComponent, +}) + +function LayoutBComponent() { + return
I'm layout B!
+} diff --git a/e2e/start/basic-rsc/app/routes/index.tsx b/e2e/start/basic-rsc/app/routes/index.tsx new file mode 100644 index 0000000000..b7b6138529 --- /dev/null +++ b/e2e/start/basic-rsc/app/routes/index.tsx @@ -0,0 +1,13 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: Home, +}) + +function Home() { + return ( +
+

Welcome Home!

+
+ ) +} diff --git a/e2e/start/basic-rsc/app/routes/posts.$postId.tsx b/e2e/start/basic-rsc/app/routes/posts.$postId.tsx new file mode 100644 index 0000000000..53c416e9f5 --- /dev/null +++ b/e2e/start/basic-rsc/app/routes/posts.$postId.tsx @@ -0,0 +1,47 @@ +import { + ErrorComponent, + ErrorComponentProps, + Link, + createFileRoute, +} from '@tanstack/react-router' +import { fetchPost } from '../utils/posts' +import { NotFound } from '~/components/NotFound' +import { createServerFn } from '@tanstack/start' + +const renderPost = createServerFn('GET', async (postId: string) => { + const post = await fetchPost(postId) + + return ( +
+

{post.title}

+
{post.body}
+ + Deep View + +
+ ) +}) + +export const Route = createFileRoute('/posts/$postId')({ + loader: async ({ params: { postId } }) => renderPost(postId), + errorComponent: PostErrorComponent as any, + component: PostComponent, + notFoundComponent: () => { + return Post not found + }, +}) + +export function PostErrorComponent({ error }: ErrorComponentProps) { + return +} + +function PostComponent() { + return Route.useLoaderData() +} diff --git a/e2e/start/basic-rsc/app/routes/posts.index.tsx b/e2e/start/basic-rsc/app/routes/posts.index.tsx new file mode 100644 index 0000000000..1b491e46be --- /dev/null +++ b/e2e/start/basic-rsc/app/routes/posts.index.tsx @@ -0,0 +1,10 @@ +import { createFileRoute } from '@tanstack/react-router' + +// @ts-ignore +export const Route = createFileRoute('/posts/')({ + component: PostsIndexComponent, +}) + +function PostsIndexComponent() { + return
Select a post.
+} diff --git a/e2e/start/basic-rsc/app/routes/posts.tsx b/e2e/start/basic-rsc/app/routes/posts.tsx new file mode 100644 index 0000000000..02682eaa42 --- /dev/null +++ b/e2e/start/basic-rsc/app/routes/posts.tsx @@ -0,0 +1,15 @@ +// import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' +import { createServerFn, renderRsc } from '@tanstack/start' +import { renderPosts } from '~/utils/renderPosts' + +export const serverRenderPosts = createServerFn('GET', renderPosts) + +export const Route = createFileRoute('/posts')({ + loader: async () => serverRenderPosts(), + component: PostsComponent, +}) + +function PostsComponent() { + return renderRsc(Route.useLoaderData()) +} diff --git a/e2e/start/basic-rsc/app/routes/posts_.$postId.deep.tsx b/e2e/start/basic-rsc/app/routes/posts_.$postId.deep.tsx new file mode 100644 index 0000000000..dd9bcd1d34 --- /dev/null +++ b/e2e/start/basic-rsc/app/routes/posts_.$postId.deep.tsx @@ -0,0 +1,26 @@ +import { createFileRoute, Link } from '@tanstack/react-router' +import { PostErrorComponent } from './posts.$postId' +import { fetchPost } from '../utils/posts' + +export const Route = createFileRoute('/posts/$postId/deep')({ + loader: async ({ params: { postId } }) => fetchPost(postId), + errorComponent: PostErrorComponent as any, + component: PostDeepComponent, +}) + +function PostDeepComponent() { + const post = Route.useLoaderData() + + return ( +
+ + ← All Posts + +

{post.title}

+
{post.body}
+
+ ) +} diff --git a/e2e/start/basic-rsc/app/ssr.tsx b/e2e/start/basic-rsc/app/ssr.tsx new file mode 100644 index 0000000000..62572579ac --- /dev/null +++ b/e2e/start/basic-rsc/app/ssr.tsx @@ -0,0 +1,12 @@ +import { + createStartHandler, + defaultStreamHandler, +} from '@tanstack/start/server' +import { getRouterManifest } from '@tanstack/start/router-manifest' + +import { createRouter } from './router' + +export default createStartHandler({ + createRouter, + getRouterManifest, +})(defaultStreamHandler) diff --git a/e2e/start/basic-rsc/app/styles/app.css b/e2e/start/basic-rsc/app/styles/app.css new file mode 100644 index 0000000000..d6426ccb72 --- /dev/null +++ b/e2e/start/basic-rsc/app/styles/app.css @@ -0,0 +1,14 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + html, + body { + @apply text-gray-900 bg-gray-50 dark:bg-gray-950 dark:text-gray-200; + } + + .using-mouse * { + outline: none !important; + } +} diff --git a/e2e/start/basic-rsc/app/utils/posts.tsx b/e2e/start/basic-rsc/app/utils/posts.tsx new file mode 100644 index 0000000000..b2a8acc634 --- /dev/null +++ b/e2e/start/basic-rsc/app/utils/posts.tsx @@ -0,0 +1,35 @@ +// import { notFound } from '@tanstack/react-router' +// import { createServerFn } from '@tanstack/start' +import axios from 'redaxios' + +export type PostType = { + id: string + title: string + body: string +} + +export const fetchPost = async (postId: string) => { + 'use server' + console.info(`Fetching post with id ${postId}...`) + await new Promise((r) => setTimeout(r, 500)) + const post = await axios + .get(`https://jsonplaceholder.typicode.com/posts/${postId}`) + .then((r) => r.data) + .catch((err) => { + if (err.status === 404) { + // throw notFound() + } + throw err + }) + + return post +} + +export const fetchPosts = async () => { + 'use server' + console.info('Fetching posts...') + await new Promise((r) => setTimeout(r, 500)) + return axios + .get>('https://jsonplaceholder.typicode.com/posts') + .then((r) => r.data.slice(0, 10)) +} diff --git a/e2e/start/basic-rsc/app/utils/renderPosts.tsx b/e2e/start/basic-rsc/app/utils/renderPosts.tsx new file mode 100644 index 0000000000..37c0661217 --- /dev/null +++ b/e2e/start/basic-rsc/app/utils/renderPosts.tsx @@ -0,0 +1,63 @@ +'use server' + +import React from 'react' +import { fetchPosts } from './posts' + +export async function renderPosts() { + const posts = await fetchPosts() + + posts.state = posts.state || { + status: 'pending', + promise: Promise.resolve(), + } + + return ( +
+
    + {[...posts, { id: 'i-do-not-exist', title: 'Non-existent Post' }]?.map( + (post) => { + return ( +
  • + {post.title.substring(0, 20)} + {/* +
    {post.title.substring(0, 20)}
    + */} +
  • + ) + }, + )} +
+
+ Loading...
}> + + + + ) +} + +function DelayedDateViaSuspense({ state }) { + // a component that will suspend for 1 second and then show the current date + if (state.status === 'pending') { + state.promise = new Promise((resolve) => { + setTimeout(() => { + state.status = 'success' + resolve() + }, 5000) + }) + throw state.promise + } + + return
{new Date().toISOString().replace('T', ' ').split('.')[0]}
+} + +// ...fetchPosts +// posts +// ...5000 +// timestamp diff --git a/e2e/start/basic-rsc/app/utils/seo.ts b/e2e/start/basic-rsc/app/utils/seo.ts new file mode 100644 index 0000000000..d18ad84b74 --- /dev/null +++ b/e2e/start/basic-rsc/app/utils/seo.ts @@ -0,0 +1,33 @@ +export const seo = ({ + title, + description, + keywords, + image, +}: { + title: string + description?: string + image?: string + keywords?: string +}) => { + const tags = [ + { title }, + { name: 'description', content: description }, + { name: 'keywords', content: keywords }, + { name: 'twitter:title', content: title }, + { name: 'twitter:description', content: description }, + { name: 'twitter:creator', content: '@tannerlinsley' }, + { name: 'twitter:site', content: '@tannerlinsley' }, + { name: 'og:type', content: 'website' }, + { name: 'og:title', content: title }, + { name: 'og:description', content: description }, + ...(image + ? [ + { name: 'twitter:image', content: image }, + { name: 'twitter:card', content: 'summary_large_image' }, + { name: 'og:image', content: image }, + ] + : []), + ] + + return tags +} diff --git a/e2e/start/basic-rsc/package.json b/e2e/start/basic-rsc/package.json new file mode 100644 index 0000000000..53378b7df3 --- /dev/null +++ b/e2e/start/basic-rsc/package.json @@ -0,0 +1,39 @@ +{ + "name": "tanstack-start-e2e-basic-rsc", + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "dev": "vinxi dev", + "build": "vinxi build", + "start": "vinxi start", + "lint": "prettier --check '**/*' --ignore-unknown && eslint --ext .ts,.tsx ./app", + "format": "prettier --write '**/*' --ignore-unknown" + }, + "dependencies": { + "@babel/plugin-syntax-typescript": "^7.25.4", + "@tanstack/react-router": "^1.57.15", + "@tanstack/router-devtools": "^1.57.15", + "@tanstack/router-plugin": "^1.57.15", + "@tanstack/start": "^1.57.15", + "redaxios": "^0.5.1", + "tailwind-merge": "^2.5.2", + "vinxi": "0.4.3" + }, + "devDependencies": { + "@types/react": "^18.2.65", + "@types/react-dom": "^18.2.21", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.47", + "prettier": "^3.3.3", + "tailwindcss": "^3.4.11", + "typescript": "^5.6.2", + "vite": "^5.4.5", + "vite-tsconfig-paths": "^5.0.1" + }, + "overrides": { + "react": "0.0.0-experimental-035a41c4e-20230704", + "react-dom": "0.0.0-experimental-035a41c4e-20230704" + } +} diff --git a/e2e/start/basic-rsc/postcss.config.cjs b/e2e/start/basic-rsc/postcss.config.cjs new file mode 100644 index 0000000000..8e638a6bcd --- /dev/null +++ b/e2e/start/basic-rsc/postcss.config.cjs @@ -0,0 +1,7 @@ +module.exports = { + plugins: [ + require('tailwindcss/nesting'), + require('tailwindcss'), + require('autoprefixer'), + ], +} diff --git a/e2e/start/basic-rsc/public/android-chrome-192x192.png b/e2e/start/basic-rsc/public/android-chrome-192x192.png new file mode 100644 index 0000000000..09c8324f8c Binary files /dev/null and b/e2e/start/basic-rsc/public/android-chrome-192x192.png differ diff --git a/e2e/start/basic-rsc/public/android-chrome-512x512.png b/e2e/start/basic-rsc/public/android-chrome-512x512.png new file mode 100644 index 0000000000..11d626ea3d Binary files /dev/null and b/e2e/start/basic-rsc/public/android-chrome-512x512.png differ diff --git a/e2e/start/basic-rsc/public/apple-touch-icon.png b/e2e/start/basic-rsc/public/apple-touch-icon.png new file mode 100644 index 0000000000..5a9423cc02 Binary files /dev/null and b/e2e/start/basic-rsc/public/apple-touch-icon.png differ diff --git a/e2e/start/basic-rsc/public/favicon-16x16.png b/e2e/start/basic-rsc/public/favicon-16x16.png new file mode 100644 index 0000000000..e3389b0044 Binary files /dev/null and b/e2e/start/basic-rsc/public/favicon-16x16.png differ diff --git a/e2e/start/basic-rsc/public/favicon-32x32.png b/e2e/start/basic-rsc/public/favicon-32x32.png new file mode 100644 index 0000000000..900c77d444 Binary files /dev/null and b/e2e/start/basic-rsc/public/favicon-32x32.png differ diff --git a/e2e/start/basic-rsc/public/favicon.ico b/e2e/start/basic-rsc/public/favicon.ico new file mode 100644 index 0000000000..1a1751676f Binary files /dev/null and b/e2e/start/basic-rsc/public/favicon.ico differ diff --git a/e2e/start/basic-rsc/public/favicon.png b/e2e/start/basic-rsc/public/favicon.png new file mode 100644 index 0000000000..1e77bc0609 Binary files /dev/null and b/e2e/start/basic-rsc/public/favicon.png differ diff --git a/e2e/start/basic-rsc/public/site.webmanifest b/e2e/start/basic-rsc/public/site.webmanifest new file mode 100644 index 0000000000..fa99de77db --- /dev/null +++ b/e2e/start/basic-rsc/public/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/e2e/start/basic-rsc/tailwind.config.cjs b/e2e/start/basic-rsc/tailwind.config.cjs new file mode 100644 index 0000000000..75fe25dbf7 --- /dev/null +++ b/e2e/start/basic-rsc/tailwind.config.cjs @@ -0,0 +1,4 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./app/**/*.{js,ts,jsx,tsx}'], +} diff --git a/e2e/start/basic-rsc/tsconfig.json b/e2e/start/basic-rsc/tsconfig.json new file mode 100644 index 0000000000..d1b5b77660 --- /dev/null +++ b/e2e/start/basic-rsc/tsconfig.json @@ -0,0 +1,22 @@ +{ + "include": ["**/*.ts", "**/*.tsx"], + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "isolatedModules": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "target": "ES2022", + "allowJs": true, + "forceConsistentCasingInFileNames": true, + "baseUrl": ".", + "paths": { + "~/*": ["./app/*"] + }, + "noEmit": true + } +} diff --git a/e2e/start/basic/.gitignore b/e2e/start/basic/.gitignore new file mode 100644 index 0000000000..be342025da --- /dev/null +++ b/e2e/start/basic/.gitignore @@ -0,0 +1,22 @@ +node_modules +package-lock.json +yarn.lock + +.DS_Store +.cache +.env +.vercel +.output +.vinxi + +/build/ +/api/ +/server/build +/public/build +.vinxi +# Sentry Config File +.env.sentry-build-plugin +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/e2e/start/basic/.prettierignore b/e2e/start/basic/.prettierignore new file mode 100644 index 0000000000..fd1b50a539 --- /dev/null +++ b/e2e/start/basic/.prettierignore @@ -0,0 +1,5 @@ +**/api +**/build +**/public +pnpm-lock.yaml +routeTree.gen.ts \ No newline at end of file diff --git a/e2e/start/basic/.prettierrc b/e2e/start/basic/.prettierrc new file mode 100644 index 0000000000..aaf3357d4a --- /dev/null +++ b/e2e/start/basic/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "semi": false, + "trailingComma": "all" +} diff --git a/e2e/start/basic/app.config.ts b/e2e/start/basic/app.config.ts new file mode 100644 index 0000000000..d1d9b04ded --- /dev/null +++ b/e2e/start/basic/app.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from '@tanstack/start/config' +import tsConfigPaths from 'vite-tsconfig-paths' + +export default defineConfig({ + vite: { + plugins: () => [ + tsConfigPaths({ + projects: ['./tsconfig.json'], + }), + ], + }, +}) diff --git a/e2e/start/basic/app/api.ts b/e2e/start/basic/app/api.ts new file mode 100644 index 0000000000..0caf78bb9d --- /dev/null +++ b/e2e/start/basic/app/api.ts @@ -0,0 +1,6 @@ +import { + createStartAPIHandler, + defaultAPIFileRouteHandler, +} from '@tanstack/start/api' + +export default createStartAPIHandler(defaultAPIFileRouteHandler) diff --git a/e2e/start/basic/app/client.tsx b/e2e/start/basic/app/client.tsx new file mode 100644 index 0000000000..f16ba73f62 --- /dev/null +++ b/e2e/start/basic/app/client.tsx @@ -0,0 +1,7 @@ +import { hydrateRoot } from 'react-dom/client' +import { StartClient } from '@tanstack/start' +import { createRouter } from './router' + +const router = createRouter() + +hydrateRoot(document.getElementById('root')!, ) diff --git a/e2e/start/basic/app/components/DefaultCatchBoundary.tsx b/e2e/start/basic/app/components/DefaultCatchBoundary.tsx new file mode 100644 index 0000000000..f0ce51dc57 --- /dev/null +++ b/e2e/start/basic/app/components/DefaultCatchBoundary.tsx @@ -0,0 +1,53 @@ +import { + ErrorComponent, + ErrorComponentProps, + Link, + rootRouteId, + useMatch, + useRouter, +} from '@tanstack/react-router' + +export function DefaultCatchBoundary({ error }: ErrorComponentProps) { + const router = useRouter() + const isRoot = useMatch({ + strict: false, + select: (state) => state.id === rootRouteId, + }) + + console.error(error) + + return ( +
+ +
+ + {isRoot ? ( + + Home + + ) : ( + { + e.preventDefault() + window.history.back() + }} + > + Go Back + + )} +
+
+ ) +} diff --git a/e2e/start/basic/app/components/NotFound.tsx b/e2e/start/basic/app/components/NotFound.tsx new file mode 100644 index 0000000000..7b54fa5680 --- /dev/null +++ b/e2e/start/basic/app/components/NotFound.tsx @@ -0,0 +1,25 @@ +import { Link } from '@tanstack/react-router' + +export function NotFound({ children }: { children?: any }) { + return ( +
+
+ {children ||

The page you are looking for does not exist.

} +
+

+ + + Start Over + +

+
+ ) +} diff --git a/e2e/start/basic/app/routeTree.gen.ts b/e2e/start/basic/app/routeTree.gen.ts new file mode 100644 index 0000000000..cebc80abed --- /dev/null +++ b/e2e/start/basic/app/routeTree.gen.ts @@ -0,0 +1,485 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/__root' +import { Route as UsersImport } from './routes/users' +import { Route as SearchParamsImport } from './routes/search-params' +import { Route as RedirectImport } from './routes/redirect' +import { Route as PostsImport } from './routes/posts' +import { Route as DeferredImport } from './routes/deferred' +import { Route as LayoutImport } from './routes/_layout' +import { Route as IndexImport } from './routes/index' +import { Route as UsersIndexImport } from './routes/users.index' +import { Route as PostsIndexImport } from './routes/posts.index' +import { Route as UsersUserIdImport } from './routes/users.$userId' +import { Route as PostsPostIdImport } from './routes/posts.$postId' +import { Route as LayoutLayout2Import } from './routes/_layout/_layout-2' +import { Route as PostsPostIdDeepImport } from './routes/posts_.$postId.deep' +import { Route as LayoutLayout2LayoutBImport } from './routes/_layout/_layout-2/layout-b' +import { Route as LayoutLayout2LayoutAImport } from './routes/_layout/_layout-2/layout-a' + +// Create/Update Routes + +const UsersRoute = UsersImport.update({ + path: '/users', + getParentRoute: () => rootRoute, +} as any) + +const SearchParamsRoute = SearchParamsImport.update({ + path: '/search-params', + getParentRoute: () => rootRoute, +} as any) + +const RedirectRoute = RedirectImport.update({ + path: '/redirect', + getParentRoute: () => rootRoute, +} as any) + +const PostsRoute = PostsImport.update({ + path: '/posts', + getParentRoute: () => rootRoute, +} as any) + +const DeferredRoute = DeferredImport.update({ + path: '/deferred', + getParentRoute: () => rootRoute, +} as any) + +const LayoutRoute = LayoutImport.update({ + id: '/_layout', + getParentRoute: () => rootRoute, +} as any) + +const IndexRoute = IndexImport.update({ + path: '/', + getParentRoute: () => rootRoute, +} as any) + +const UsersIndexRoute = UsersIndexImport.update({ + path: '/', + getParentRoute: () => UsersRoute, +} as any) + +const PostsIndexRoute = PostsIndexImport.update({ + path: '/', + getParentRoute: () => PostsRoute, +} as any) + +const UsersUserIdRoute = UsersUserIdImport.update({ + path: '/$userId', + getParentRoute: () => UsersRoute, +} as any) + +const PostsPostIdRoute = PostsPostIdImport.update({ + path: '/$postId', + getParentRoute: () => PostsRoute, +} as any) + +const LayoutLayout2Route = LayoutLayout2Import.update({ + id: '/_layout-2', + getParentRoute: () => LayoutRoute, +} as any) + +const PostsPostIdDeepRoute = PostsPostIdDeepImport.update({ + path: '/posts/$postId/deep', + getParentRoute: () => rootRoute, +} as any) + +const LayoutLayout2LayoutBRoute = LayoutLayout2LayoutBImport.update({ + path: '/layout-b', + getParentRoute: () => LayoutLayout2Route, +} as any) + +const LayoutLayout2LayoutARoute = LayoutLayout2LayoutAImport.update({ + path: '/layout-a', + getParentRoute: () => LayoutLayout2Route, +} as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexImport + parentRoute: typeof rootRoute + } + '/_layout': { + id: '/_layout' + path: '' + fullPath: '' + preLoaderRoute: typeof LayoutImport + parentRoute: typeof rootRoute + } + '/deferred': { + id: '/deferred' + path: '/deferred' + fullPath: '/deferred' + preLoaderRoute: typeof DeferredImport + parentRoute: typeof rootRoute + } + '/posts': { + id: '/posts' + path: '/posts' + fullPath: '/posts' + preLoaderRoute: typeof PostsImport + parentRoute: typeof rootRoute + } + '/redirect': { + id: '/redirect' + path: '/redirect' + fullPath: '/redirect' + preLoaderRoute: typeof RedirectImport + parentRoute: typeof rootRoute + } + '/search-params': { + id: '/search-params' + path: '/search-params' + fullPath: '/search-params' + preLoaderRoute: typeof SearchParamsImport + parentRoute: typeof rootRoute + } + '/users': { + id: '/users' + path: '/users' + fullPath: '/users' + preLoaderRoute: typeof UsersImport + parentRoute: typeof rootRoute + } + '/_layout/_layout-2': { + id: '/_layout/_layout-2' + path: '' + fullPath: '' + preLoaderRoute: typeof LayoutLayout2Import + parentRoute: typeof LayoutImport + } + '/posts/$postId': { + id: '/posts/$postId' + path: '/$postId' + fullPath: '/posts/$postId' + preLoaderRoute: typeof PostsPostIdImport + parentRoute: typeof PostsImport + } + '/users/$userId': { + id: '/users/$userId' + path: '/$userId' + fullPath: '/users/$userId' + preLoaderRoute: typeof UsersUserIdImport + parentRoute: typeof UsersImport + } + '/posts/': { + id: '/posts/' + path: '/' + fullPath: '/posts/' + preLoaderRoute: typeof PostsIndexImport + parentRoute: typeof PostsImport + } + '/users/': { + id: '/users/' + path: '/' + fullPath: '/users/' + preLoaderRoute: typeof UsersIndexImport + parentRoute: typeof UsersImport + } + '/_layout/_layout-2/layout-a': { + id: '/_layout/_layout-2/layout-a' + path: '/layout-a' + fullPath: '/layout-a' + preLoaderRoute: typeof LayoutLayout2LayoutAImport + parentRoute: typeof LayoutLayout2Import + } + '/_layout/_layout-2/layout-b': { + id: '/_layout/_layout-2/layout-b' + path: '/layout-b' + fullPath: '/layout-b' + preLoaderRoute: typeof LayoutLayout2LayoutBImport + parentRoute: typeof LayoutLayout2Import + } + '/posts/$postId/deep': { + id: '/posts/$postId/deep' + path: '/posts/$postId/deep' + fullPath: '/posts/$postId/deep' + preLoaderRoute: typeof PostsPostIdDeepImport + parentRoute: typeof rootRoute + } + } +} + +// Create and export the route tree + +interface LayoutLayout2RouteChildren { + LayoutLayout2LayoutARoute: typeof LayoutLayout2LayoutARoute + LayoutLayout2LayoutBRoute: typeof LayoutLayout2LayoutBRoute +} + +const LayoutLayout2RouteChildren: LayoutLayout2RouteChildren = { + LayoutLayout2LayoutARoute: LayoutLayout2LayoutARoute, + LayoutLayout2LayoutBRoute: LayoutLayout2LayoutBRoute, +} + +const LayoutLayout2RouteWithChildren = LayoutLayout2Route._addFileChildren( + LayoutLayout2RouteChildren, +) + +interface LayoutRouteChildren { + LayoutLayout2Route: typeof LayoutLayout2RouteWithChildren +} + +const LayoutRouteChildren: LayoutRouteChildren = { + LayoutLayout2Route: LayoutLayout2RouteWithChildren, +} + +const LayoutRouteWithChildren = + LayoutRoute._addFileChildren(LayoutRouteChildren) + +interface PostsRouteChildren { + PostsPostIdRoute: typeof PostsPostIdRoute + PostsIndexRoute: typeof PostsIndexRoute +} + +const PostsRouteChildren: PostsRouteChildren = { + PostsPostIdRoute: PostsPostIdRoute, + PostsIndexRoute: PostsIndexRoute, +} + +const PostsRouteWithChildren = PostsRoute._addFileChildren(PostsRouteChildren) + +interface UsersRouteChildren { + UsersUserIdRoute: typeof UsersUserIdRoute + UsersIndexRoute: typeof UsersIndexRoute +} + +const UsersRouteChildren: UsersRouteChildren = { + UsersUserIdRoute: UsersUserIdRoute, + UsersIndexRoute: UsersIndexRoute, +} + +const UsersRouteWithChildren = UsersRoute._addFileChildren(UsersRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '': typeof LayoutLayout2RouteWithChildren + '/deferred': typeof DeferredRoute + '/posts': typeof PostsRouteWithChildren + '/redirect': typeof RedirectRoute + '/search-params': typeof SearchParamsRoute + '/users': typeof UsersRouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/users/$userId': typeof UsersUserIdRoute + '/posts/': typeof PostsIndexRoute + '/users/': typeof UsersIndexRoute + '/layout-a': typeof LayoutLayout2LayoutARoute + '/layout-b': typeof LayoutLayout2LayoutBRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '': typeof LayoutLayout2RouteWithChildren + '/deferred': typeof DeferredRoute + '/redirect': typeof RedirectRoute + '/search-params': typeof SearchParamsRoute + '/posts/$postId': typeof PostsPostIdRoute + '/users/$userId': typeof UsersUserIdRoute + '/posts': typeof PostsIndexRoute + '/users': typeof UsersIndexRoute + '/layout-a': typeof LayoutLayout2LayoutARoute + '/layout-b': typeof LayoutLayout2LayoutBRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/_layout': typeof LayoutRouteWithChildren + '/deferred': typeof DeferredRoute + '/posts': typeof PostsRouteWithChildren + '/redirect': typeof RedirectRoute + '/search-params': typeof SearchParamsRoute + '/users': typeof UsersRouteWithChildren + '/_layout/_layout-2': typeof LayoutLayout2RouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/users/$userId': typeof UsersUserIdRoute + '/posts/': typeof PostsIndexRoute + '/users/': typeof UsersIndexRoute + '/_layout/_layout-2/layout-a': typeof LayoutLayout2LayoutARoute + '/_layout/_layout-2/layout-b': typeof LayoutLayout2LayoutBRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '' + | '/deferred' + | '/posts' + | '/redirect' + | '/search-params' + | '/users' + | '/posts/$postId' + | '/users/$userId' + | '/posts/' + | '/users/' + | '/layout-a' + | '/layout-b' + | '/posts/$postId/deep' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '' + | '/deferred' + | '/redirect' + | '/search-params' + | '/posts/$postId' + | '/users/$userId' + | '/posts' + | '/users' + | '/layout-a' + | '/layout-b' + | '/posts/$postId/deep' + id: + | '__root__' + | '/' + | '/_layout' + | '/deferred' + | '/posts' + | '/redirect' + | '/search-params' + | '/users' + | '/_layout/_layout-2' + | '/posts/$postId' + | '/users/$userId' + | '/posts/' + | '/users/' + | '/_layout/_layout-2/layout-a' + | '/_layout/_layout-2/layout-b' + | '/posts/$postId/deep' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + LayoutRoute: typeof LayoutRouteWithChildren + DeferredRoute: typeof DeferredRoute + PostsRoute: typeof PostsRouteWithChildren + RedirectRoute: typeof RedirectRoute + SearchParamsRoute: typeof SearchParamsRoute + UsersRoute: typeof UsersRouteWithChildren + PostsPostIdDeepRoute: typeof PostsPostIdDeepRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + LayoutRoute: LayoutRouteWithChildren, + DeferredRoute: DeferredRoute, + PostsRoute: PostsRouteWithChildren, + RedirectRoute: RedirectRoute, + SearchParamsRoute: SearchParamsRoute, + UsersRoute: UsersRouteWithChildren, + PostsPostIdDeepRoute: PostsPostIdDeepRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [ + "/", + "/_layout", + "/deferred", + "/posts", + "/redirect", + "/search-params", + "/users", + "/posts/$postId/deep" + ] + }, + "/": { + "filePath": "index.tsx" + }, + "/_layout": { + "filePath": "_layout.tsx", + "children": [ + "/_layout/_layout-2" + ] + }, + "/deferred": { + "filePath": "deferred.tsx" + }, + "/posts": { + "filePath": "posts.tsx", + "children": [ + "/posts/$postId", + "/posts/" + ] + }, + "/redirect": { + "filePath": "redirect.tsx" + }, + "/search-params": { + "filePath": "search-params.tsx" + }, + "/users": { + "filePath": "users.tsx", + "children": [ + "/users/$userId", + "/users/" + ] + }, + "/_layout/_layout-2": { + "filePath": "_layout/_layout-2.tsx", + "parent": "/_layout", + "children": [ + "/_layout/_layout-2/layout-a", + "/_layout/_layout-2/layout-b" + ] + }, + "/posts/$postId": { + "filePath": "posts.$postId.tsx", + "parent": "/posts" + }, + "/users/$userId": { + "filePath": "users.$userId.tsx", + "parent": "/users" + }, + "/posts/": { + "filePath": "posts.index.tsx", + "parent": "/posts" + }, + "/users/": { + "filePath": "users.index.tsx", + "parent": "/users" + }, + "/_layout/_layout-2/layout-a": { + "filePath": "_layout/_layout-2/layout-a.tsx", + "parent": "/_layout/_layout-2" + }, + "/_layout/_layout-2/layout-b": { + "filePath": "_layout/_layout-2/layout-b.tsx", + "parent": "/_layout/_layout-2" + }, + "/posts/$postId/deep": { + "filePath": "posts_.$postId.deep.tsx" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/e2e/start/basic/app/router.tsx b/e2e/start/basic/app/router.tsx new file mode 100644 index 0000000000..0886de701f --- /dev/null +++ b/e2e/start/basic/app/router.tsx @@ -0,0 +1,21 @@ +import { createRouter as createTanStackRouter } from '@tanstack/react-router' +import { routeTree } from './routeTree.gen' +import { DefaultCatchBoundary } from './components/DefaultCatchBoundary' +import { NotFound } from './components/NotFound' + +export function createRouter() { + const router = createTanStackRouter({ + routeTree, + defaultPreload: 'intent', + defaultErrorComponent: DefaultCatchBoundary, + defaultNotFoundComponent: () => , + }) + + return router +} + +declare module '@tanstack/react-router' { + interface Register { + router: ReturnType + } +} diff --git a/e2e/start/basic/app/routes/__root.tsx b/e2e/start/basic/app/routes/__root.tsx new file mode 100644 index 0000000000..4ef88cfb27 --- /dev/null +++ b/e2e/start/basic/app/routes/__root.tsx @@ -0,0 +1,139 @@ +import { + Link, + Outlet, + ScrollRestoration, + createRootRoute, +} from '@tanstack/react-router' +import { TanStackRouterDevtools } from '@tanstack/router-devtools' +import { Body, Head, Html, Meta, Scripts } from '@tanstack/start' +import * as React from 'react' +import { DefaultCatchBoundary } from '~/components/DefaultCatchBoundary' +import { NotFound } from '~/components/NotFound' +// @ts-expect-error +import appCss from '~/styles/app.css?url' +import { seo } from '~/utils/seo' + +export const Route = createRootRoute({ + meta: () => [ + { + charSet: 'utf-8', + }, + { + name: 'viewport', + content: 'width=device-width, initial-scale=1', + }, + ...seo({ + title: + 'TanStack Start | Type-Safe, Client-First, Full-Stack React Framework', + description: `TanStack Start is a type-safe, client-first, full-stack React framework. `, + }), + ], + links: () => [ + { rel: 'stylesheet', href: appCss }, + { + rel: 'apple-touch-icon', + sizes: '180x180', + href: '/apple-touch-icon.png', + }, + { + rel: 'icon', + type: 'image/png', + sizes: '32x32', + href: '/favicon-32x32.png', + }, + { + rel: 'icon', + type: 'image/png', + sizes: '16x16', + href: '/favicon-16x16.png', + }, + { rel: 'manifest', href: '/site.webmanifest', color: '#fffff' }, + { rel: 'icon', href: '/favicon.ico' }, + ], + errorComponent: (props) => { + return ( + + + + ) + }, + notFoundComponent: () => , + component: RootComponent, +}) + +function RootComponent() { + return ( + + + + ) +} + +function RootDocument({ children }: { children: React.ReactNode }) { + return ( + + + + + +
+ + Home + {' '} + + Posts + {' '} + + Users + {' '} + + Layout + {' '} + + Deferred + {' '} + + This Route Does Not Exist + +
+
+ {children} + + + + + + ) +} diff --git a/e2e/start/basic/app/routes/_layout.tsx b/e2e/start/basic/app/routes/_layout.tsx new file mode 100644 index 0000000000..02ddbb1cd9 --- /dev/null +++ b/e2e/start/basic/app/routes/_layout.tsx @@ -0,0 +1,16 @@ +import { Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a layout
+
+ +
+
+ ) +} diff --git a/e2e/start/basic/app/routes/_layout/_layout-2.tsx b/e2e/start/basic/app/routes/_layout/_layout-2.tsx new file mode 100644 index 0000000000..3b7dbf2903 --- /dev/null +++ b/e2e/start/basic/app/routes/_layout/_layout-2.tsx @@ -0,0 +1,34 @@ +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a nested layout
+
+ + Layout A + + + Layout B + +
+
+ +
+
+ ) +} diff --git a/e2e/start/basic/app/routes/_layout/_layout-2/layout-a.tsx b/e2e/start/basic/app/routes/_layout/_layout-2/layout-a.tsx new file mode 100644 index 0000000000..61e19b4d9f --- /dev/null +++ b/e2e/start/basic/app/routes/_layout/_layout-2/layout-a.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2/layout-a')({ + component: LayoutAComponent, +}) + +function LayoutAComponent() { + return
I'm layout A!
+} diff --git a/e2e/start/basic/app/routes/_layout/_layout-2/layout-b.tsx b/e2e/start/basic/app/routes/_layout/_layout-2/layout-b.tsx new file mode 100644 index 0000000000..cceed1fb9a --- /dev/null +++ b/e2e/start/basic/app/routes/_layout/_layout-2/layout-b.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2/layout-b')({ + component: LayoutBComponent, +}) + +function LayoutBComponent() { + return
I'm layout B!
+} diff --git a/e2e/start/basic/app/routes/api.users.ts b/e2e/start/basic/app/routes/api.users.ts new file mode 100644 index 0000000000..3b11af9b9d --- /dev/null +++ b/e2e/start/basic/app/routes/api.users.ts @@ -0,0 +1,17 @@ +import { json } from '@tanstack/start' +import { createAPIFileRoute } from '@tanstack/start/api' +import axios from 'redaxios' +import type { User } from '../utils/users' + +export const Route = createAPIFileRoute('/api/users')({ + GET: async ({ request }) => { + console.info('Fetching users... @', request.url) + const res = await axios.get>( + 'https://jsonplaceholder.typicode.com/users', + ) + + const list = res.data.slice(0, 10) + + return json(list.map((u) => ({ id: u.id, name: u.name, email: u.email }))) + }, +}) diff --git a/e2e/start/basic/app/routes/api/users.$id.ts b/e2e/start/basic/app/routes/api/users.$id.ts new file mode 100644 index 0000000000..849d45e8d0 --- /dev/null +++ b/e2e/start/basic/app/routes/api/users.$id.ts @@ -0,0 +1,24 @@ +import { json } from '@tanstack/start' +import { createAPIFileRoute } from '@tanstack/start/api' +import axios from 'redaxios' +import type { User } from '../../utils/users' + +export const Route = createAPIFileRoute('/api/users/$id')({ + GET: async ({ request, params }) => { + console.info(`Fetching users by id=${params.id}... @`, request.url) + try { + const res = await axios.get( + 'https://jsonplaceholder.typicode.com/users/' + params.id, + ) + + return json({ + id: res.data.id, + name: res.data.name, + email: res.data.email, + }) + } catch (e) { + console.error(e) + return json({ error: 'User not found' }, { status: 404 }) + } + }, +}) diff --git a/e2e/start/basic/app/routes/deferred.tsx b/e2e/start/basic/app/routes/deferred.tsx new file mode 100644 index 0000000000..8627bc6ba6 --- /dev/null +++ b/e2e/start/basic/app/routes/deferred.tsx @@ -0,0 +1,60 @@ +import { Await, createFileRoute, defer } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/start' +import { Suspense, useState } from 'react' + +const personServerFn = createServerFn('GET', (name: string) => { + return { name, randomNumber: Math.floor(Math.random() * 100) } +}) + +const slowServerFn = createServerFn('GET', async (name: string) => { + await new Promise((r) => setTimeout(r, 1000)) + return { name, randomNumber: Math.floor(Math.random() * 100) } +}) + +export const Route = createFileRoute('/deferred')({ + loader: async () => { + return { + deferredStuff: defer( + new Promise((r) => + setTimeout(() => r('Hello deferred!'), 2000), + ), + ), + deferredPerson: defer(slowServerFn('Tanner Linsley')), + person: await personServerFn('John Doe'), + } + }, + component: Deferred, +}) + +function Deferred() { + const [count, setCount] = useState(0) + const { deferredStuff, deferredPerson, person } = Route.useLoaderData() + + return ( +
+
+ {person.name} - {person.randomNumber} +
+ Loading person...
}> + ( +
+ {data.name} - {data.randomNumber} +
+ )} + /> + + Loading stuff...}> +

{data}

} + /> +
+
Count: {count}
+
+ +
+ + ) +} diff --git a/e2e/start/basic/app/routes/index.tsx b/e2e/start/basic/app/routes/index.tsx new file mode 100644 index 0000000000..09a907cb18 --- /dev/null +++ b/e2e/start/basic/app/routes/index.tsx @@ -0,0 +1,13 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: Home, +}) + +function Home() { + return ( +
+

Welcome Home!!!

+
+ ) +} diff --git a/packages/router-generator/tests/generator/file-modification/snapshot/empty.tsx b/e2e/start/basic/app/routes/posts.$postId.tsx similarity index 64% rename from packages/router-generator/tests/generator/file-modification/snapshot/empty.tsx rename to e2e/start/basic/app/routes/posts.$postId.tsx index fe317a8ef6..ad8e267703 100644 --- a/packages/router-generator/tests/generator/file-modification/snapshot/empty.tsx +++ b/e2e/start/basic/app/routes/posts.$postId.tsx @@ -1,18 +1,15 @@ -import * as React from 'react' -import { - ErrorComponent, - ErrorComponentProps, - Link, - createFileRoute, -} from '@tanstack/react-router' +import { ErrorComponent, Link, createFileRoute } from '@tanstack/react-router' +import { fetchPost } from '../utils/posts' +import type { ErrorComponentProps } from '@tanstack/react-router' +import { NotFound } from '~/components/NotFound' -export const Route = createFileRoute('/(test)/foo')({ - loader: async ({ params: { postId } }) => ({ postId }), +export const Route = createFileRoute('/posts/$postId')({ + loader: async ({ params: { postId } }) => fetchPost(postId), errorComponent: PostErrorComponent as any, + component: PostComponent, notFoundComponent: () => { - return

Post not found

+ return Post not found }, - component: PostComponent, }) export function PostErrorComponent({ error }: ErrorComponentProps) { diff --git a/e2e/start/basic/app/routes/posts.index.tsx b/e2e/start/basic/app/routes/posts.index.tsx new file mode 100644 index 0000000000..5b5f08f95b --- /dev/null +++ b/e2e/start/basic/app/routes/posts.index.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/')({ + component: PostsIndexComponent, +}) + +function PostsIndexComponent() { + return
Select a post.
+} diff --git a/e2e/start/basic/app/routes/posts.tsx b/e2e/start/basic/app/routes/posts.tsx new file mode 100644 index 0000000000..ae49032459 --- /dev/null +++ b/e2e/start/basic/app/routes/posts.tsx @@ -0,0 +1,38 @@ +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' +import { fetchPosts } from '../utils/posts' + +export const Route = createFileRoute('/posts')({ + loader: async () => fetchPosts(), + component: PostsComponent, +}) + +function PostsComponent() { + const posts = Route.useLoaderData() + + return ( +
+
    + {[...posts, { id: 'i-do-not-exist', title: 'Non-existent Post' }].map( + (post) => { + return ( +
  • + +
    {post.title.substring(0, 20)}
    + +
  • + ) + }, + )} +
+
+ +
+ ) +} diff --git a/e2e/start/basic/app/routes/posts_.$postId.deep.tsx b/e2e/start/basic/app/routes/posts_.$postId.deep.tsx new file mode 100644 index 0000000000..992a354d22 --- /dev/null +++ b/e2e/start/basic/app/routes/posts_.$postId.deep.tsx @@ -0,0 +1,26 @@ +import { Link, createFileRoute } from '@tanstack/react-router' +import { fetchPost } from '../utils/posts' +import { PostErrorComponent } from './posts.$postId' + +export const Route = createFileRoute('/posts/$postId/deep')({ + loader: async ({ params: { postId } }) => fetchPost(postId), + errorComponent: PostErrorComponent as any, + component: PostDeepComponent, +}) + +function PostDeepComponent() { + const post = Route.useLoaderData() + + return ( +
+ + ← All Posts + +

{post.title}

+
{post.body}
+
+ ) +} diff --git a/e2e/start/basic/app/routes/redirect.tsx b/e2e/start/basic/app/routes/redirect.tsx new file mode 100644 index 0000000000..c9286de13d --- /dev/null +++ b/e2e/start/basic/app/routes/redirect.tsx @@ -0,0 +1,9 @@ +import { createFileRoute, redirect } from '@tanstack/react-router' + +export const Route = createFileRoute('/redirect')({ + beforeLoad: async () => { + throw redirect({ + to: '/posts', + }) + }, +}) diff --git a/e2e/start/basic/app/routes/search-params.tsx b/e2e/start/basic/app/routes/search-params.tsx new file mode 100644 index 0000000000..8ebe45bc34 --- /dev/null +++ b/e2e/start/basic/app/routes/search-params.tsx @@ -0,0 +1,27 @@ +import { createFileRoute, redirect } from '@tanstack/react-router' +import { z } from 'zod' + +export const Route = createFileRoute('/search-params')({ + component: () => { + const search = Route.useSearch() + return ( +
+

SearchParams

+
{search.step}
+
+ ) + }, + validateSearch: z.object({ + step: z.enum(['a', 'b', 'c']).optional(), + }), + loaderDeps: ({ search: { step } }) => ({ step }), + loader: ({ deps: { step } }) => { + if (step === undefined) { + throw redirect({ + to: '/search-params', + from: '/search-params', + search: { step: 'a' }, + }) + } + }, +}) diff --git a/e2e/start/basic/app/routes/users.$userId.tsx b/e2e/start/basic/app/routes/users.$userId.tsx new file mode 100644 index 0000000000..573377c758 --- /dev/null +++ b/e2e/start/basic/app/routes/users.$userId.tsx @@ -0,0 +1,36 @@ +import { ErrorComponent, createFileRoute } from '@tanstack/react-router' +import axios from 'redaxios' +import type { ErrorComponentProps } from '@tanstack/react-router' +import { DEPLOY_URL, type User } from '~/utils/users' +import { NotFound } from '~/components/NotFound' + +export const Route = createFileRoute('/users/$userId')({ + loader: async ({ params: { userId } }) => { + return await axios + .get(DEPLOY_URL + '/api/users/' + userId) + .then((r) => r.data) + .catch(() => { + throw new Error('Failed to fetch user') + }) + }, + errorComponent: UserErrorComponent, + component: UserComponent, + notFoundComponent: () => { + return User not found + }, +}) + +export function UserErrorComponent({ error }: ErrorComponentProps) { + return +} + +function UserComponent() { + const user = Route.useLoaderData() + + return ( +
+

{user.name}

+
{user.email}
+
+ ) +} diff --git a/e2e/start/basic/app/routes/users.index.tsx b/e2e/start/basic/app/routes/users.index.tsx new file mode 100644 index 0000000000..b6b0ee67fb --- /dev/null +++ b/e2e/start/basic/app/routes/users.index.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/users/')({ + component: UsersIndexComponent, +}) + +function UsersIndexComponent() { + return
Select a user.
+} diff --git a/e2e/start/basic/app/routes/users.tsx b/e2e/start/basic/app/routes/users.tsx new file mode 100644 index 0000000000..77a6fbe864 --- /dev/null +++ b/e2e/start/basic/app/routes/users.tsx @@ -0,0 +1,47 @@ +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' +import axios from 'redaxios' +import { DEPLOY_URL, type User } from '../utils/users' + +export const Route = createFileRoute('/users')({ + loader: async () => { + return await axios + .get>(DEPLOY_URL + '/api/users') + .then((r) => r.data) + .catch(() => { + throw new Error('Failed to fetch users') + }) + }, + component: UsersComponent, +}) + +function UsersComponent() { + const users = Route.useLoaderData() + + return ( +
+
    + {[ + ...users, + { id: 'i-do-not-exist', name: 'Non-existent User', email: '' }, + ].map((user) => { + return ( +
  • + +
    {user.name}
    + +
  • + ) + })} +
+
+ +
+ ) +} diff --git a/e2e/start/basic/app/ssr.tsx b/e2e/start/basic/app/ssr.tsx new file mode 100644 index 0000000000..62572579ac --- /dev/null +++ b/e2e/start/basic/app/ssr.tsx @@ -0,0 +1,12 @@ +import { + createStartHandler, + defaultStreamHandler, +} from '@tanstack/start/server' +import { getRouterManifest } from '@tanstack/start/router-manifest' + +import { createRouter } from './router' + +export default createStartHandler({ + createRouter, + getRouterManifest, +})(defaultStreamHandler) diff --git a/e2e/start/basic/app/styles/app.css b/e2e/start/basic/app/styles/app.css new file mode 100644 index 0000000000..d6426ccb72 --- /dev/null +++ b/e2e/start/basic/app/styles/app.css @@ -0,0 +1,14 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + html, + body { + @apply text-gray-900 bg-gray-50 dark:bg-gray-950 dark:text-gray-200; + } + + .using-mouse * { + outline: none !important; + } +} diff --git a/e2e/start/basic/app/utils/posts.tsx b/e2e/start/basic/app/utils/posts.tsx new file mode 100644 index 0000000000..4bf4b8c564 --- /dev/null +++ b/e2e/start/basic/app/utils/posts.tsx @@ -0,0 +1,32 @@ +import { notFound } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/start' +import axios from 'redaxios' + +export type PostType = { + id: string + title: string + body: string +} + +export const fetchPost = createServerFn('GET', async (postId: string) => { + console.info(`Fetching post with id ${postId}...`) + const post = await axios + .get(`https://jsonplaceholder.typicode.com/posts/${postId}`) + .then((r) => r.data) + .catch((err) => { + console.error(err) + if (err.status === 404) { + throw notFound() + } + throw err + }) + + return post +}) + +export const fetchPosts = createServerFn('GET', async () => { + console.info('Fetching posts...') + return axios + .get>('https://jsonplaceholder.typicode.com/posts') + .then((r) => r.data.slice(0, 10)) +}) diff --git a/e2e/start/basic/app/utils/seo.ts b/e2e/start/basic/app/utils/seo.ts new file mode 100644 index 0000000000..d18ad84b74 --- /dev/null +++ b/e2e/start/basic/app/utils/seo.ts @@ -0,0 +1,33 @@ +export const seo = ({ + title, + description, + keywords, + image, +}: { + title: string + description?: string + image?: string + keywords?: string +}) => { + const tags = [ + { title }, + { name: 'description', content: description }, + { name: 'keywords', content: keywords }, + { name: 'twitter:title', content: title }, + { name: 'twitter:description', content: description }, + { name: 'twitter:creator', content: '@tannerlinsley' }, + { name: 'twitter:site', content: '@tannerlinsley' }, + { name: 'og:type', content: 'website' }, + { name: 'og:title', content: title }, + { name: 'og:description', content: description }, + ...(image + ? [ + { name: 'twitter:image', content: image }, + { name: 'twitter:card', content: 'summary_large_image' }, + { name: 'og:image', content: image }, + ] + : []), + ] + + return tags +} diff --git a/e2e/start/basic/app/utils/users.tsx b/e2e/start/basic/app/utils/users.tsx new file mode 100644 index 0000000000..b810f455fe --- /dev/null +++ b/e2e/start/basic/app/utils/users.tsx @@ -0,0 +1,7 @@ +export type User = { + id: number + name: string + email: string +} + +export const DEPLOY_URL = 'http://localhost:3000' diff --git a/e2e/start/basic/package.json b/e2e/start/basic/package.json new file mode 100644 index 0000000000..45893f3d14 --- /dev/null +++ b/e2e/start/basic/package.json @@ -0,0 +1,41 @@ +{ + "name": "tanstack-start-e2e-basic", + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "dev": "vinxi dev", + "build": "vinxi build", + "start": "vinxi start", + "lint": "prettier --check '**/*' --ignore-unknown && eslint --ext .ts,.tsx ./app", + "format": "prettier --write '**/*' --ignore-unknown", + "test:e2e": "playwright test --project=chromium" + }, + "dependencies": { + "@tanstack/react-router": "^1.57.15", + "@tanstack/router-devtools": "^1.57.15", + "@tanstack/router-plugin": "^1.57.15", + "@tanstack/start": "^1.57.15", + "isbot": "^5.1.17", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "redaxios": "^0.5.1", + "tailwind-merge": "^2.5.2", + "vinxi": "0.4.3", + "zod": "^3.23.8" + }, + "devDependencies": { + "@playwright/test": "^1.47.1", + "@types/node": "^22.5.4", + "@types/react": "^18.2.65", + "@types/react-dom": "^18.2.21", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.47", + "prettier": "^3.3.3", + "tailwindcss": "^3.4.11", + "typescript": "^5.6.2", + "vite": "^5.4.5", + "vite-tsconfig-paths": "^5.0.1" + } +} diff --git a/examples/react/start-basic/playwright.config.ts b/e2e/start/basic/playwright.config.ts similarity index 100% rename from examples/react/start-basic/playwright.config.ts rename to e2e/start/basic/playwright.config.ts diff --git a/e2e/start/basic/postcss.config.cjs b/e2e/start/basic/postcss.config.cjs new file mode 100644 index 0000000000..8e638a6bcd --- /dev/null +++ b/e2e/start/basic/postcss.config.cjs @@ -0,0 +1,7 @@ +module.exports = { + plugins: [ + require('tailwindcss/nesting'), + require('tailwindcss'), + require('autoprefixer'), + ], +} diff --git a/e2e/start/basic/public/android-chrome-192x192.png b/e2e/start/basic/public/android-chrome-192x192.png new file mode 100644 index 0000000000..09c8324f8c Binary files /dev/null and b/e2e/start/basic/public/android-chrome-192x192.png differ diff --git a/e2e/start/basic/public/android-chrome-512x512.png b/e2e/start/basic/public/android-chrome-512x512.png new file mode 100644 index 0000000000..11d626ea3d Binary files /dev/null and b/e2e/start/basic/public/android-chrome-512x512.png differ diff --git a/e2e/start/basic/public/apple-touch-icon.png b/e2e/start/basic/public/apple-touch-icon.png new file mode 100644 index 0000000000..5a9423cc02 Binary files /dev/null and b/e2e/start/basic/public/apple-touch-icon.png differ diff --git a/e2e/start/basic/public/favicon-16x16.png b/e2e/start/basic/public/favicon-16x16.png new file mode 100644 index 0000000000..e3389b0044 Binary files /dev/null and b/e2e/start/basic/public/favicon-16x16.png differ diff --git a/e2e/start/basic/public/favicon-32x32.png b/e2e/start/basic/public/favicon-32x32.png new file mode 100644 index 0000000000..900c77d444 Binary files /dev/null and b/e2e/start/basic/public/favicon-32x32.png differ diff --git a/e2e/start/basic/public/favicon.ico b/e2e/start/basic/public/favicon.ico new file mode 100644 index 0000000000..1a1751676f Binary files /dev/null and b/e2e/start/basic/public/favicon.ico differ diff --git a/e2e/start/basic/public/favicon.png b/e2e/start/basic/public/favicon.png new file mode 100644 index 0000000000..1e77bc0609 Binary files /dev/null and b/e2e/start/basic/public/favicon.png differ diff --git a/e2e/start/basic/public/site.webmanifest b/e2e/start/basic/public/site.webmanifest new file mode 100644 index 0000000000..fa99de77db --- /dev/null +++ b/e2e/start/basic/public/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/e2e/start/basic/tailwind.config.cjs b/e2e/start/basic/tailwind.config.cjs new file mode 100644 index 0000000000..75fe25dbf7 --- /dev/null +++ b/e2e/start/basic/tailwind.config.cjs @@ -0,0 +1,4 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./app/**/*.{js,ts,jsx,tsx}'], +} diff --git a/examples/react/start-basic/tests/app.spec.ts b/e2e/start/basic/tests/app.spec.ts similarity index 78% rename from examples/react/start-basic/tests/app.spec.ts rename to e2e/start/basic/tests/app.spec.ts index 381255a8d8..225205b4ba 100644 --- a/examples/react/start-basic/tests/app.spec.ts +++ b/e2e/start/basic/tests/app.spec.ts @@ -60,3 +60,21 @@ test('Directly visiting the deferred route', async ({ page }) => { 'Hello deferred!', ) }) + +test('Directly visiting the search-params route without search param set', async ({ + page, +}) => { + await page.goto('/search-params') + await new Promise((r) => setTimeout(r, 500)) + await expect(page.getByTestId('search-param')).toContainText('a') + expect(page.url().endsWith('/search-params?step=a')) +}) + +test('Directly visiting the search-params route with search param set', async ({ + page, +}) => { + await page.goto('/search-params?step=b') + await new Promise((r) => setTimeout(r, 500)) + await expect(page.getByTestId('search-param')).toContainText('b') + expect(page.url().endsWith('/search-params?step=b')) +}) diff --git a/e2e/start/basic/tsconfig.json b/e2e/start/basic/tsconfig.json new file mode 100644 index 0000000000..d1b5b77660 --- /dev/null +++ b/e2e/start/basic/tsconfig.json @@ -0,0 +1,22 @@ +{ + "include": ["**/*.ts", "**/*.tsx"], + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "isolatedModules": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "target": "ES2022", + "allowJs": true, + "forceConsistentCasingInFileNames": true, + "baseUrl": ".", + "paths": { + "~/*": ["./app/*"] + }, + "noEmit": true + } +} diff --git a/e2e/start/clerk-basic/.env b/e2e/start/clerk-basic/.env new file mode 100644 index 0000000000..952a04d217 --- /dev/null +++ b/e2e/start/clerk-basic/.env @@ -0,0 +1,2 @@ +CLERK_PUBLISHABLE_KEY=[YOUR_CLERK_PUBLISHABLE_KEY] +CLERK_SECRET_KEY=[YOUR_CLERK_SECRET_KEY] \ No newline at end of file diff --git a/e2e/start/clerk-basic/.gitignore b/e2e/start/clerk-basic/.gitignore new file mode 100644 index 0000000000..b15fed94e2 --- /dev/null +++ b/e2e/start/clerk-basic/.gitignore @@ -0,0 +1,22 @@ +node_modules +package-lock.json +yarn.lock + +!.env +.DS_Store +.cache +.vercel +.output +.vinxi + +/build/ +/api/ +/server/build +/public/build +.vinxi +# Sentry Config File +.env.sentry-build-plugin +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/e2e/start/clerk-basic/.prettierignore b/e2e/start/clerk-basic/.prettierignore new file mode 100644 index 0000000000..fd1b50a539 --- /dev/null +++ b/e2e/start/clerk-basic/.prettierignore @@ -0,0 +1,5 @@ +**/api +**/build +**/public +pnpm-lock.yaml +routeTree.gen.ts \ No newline at end of file diff --git a/e2e/start/clerk-basic/.prettierrc b/e2e/start/clerk-basic/.prettierrc new file mode 100644 index 0000000000..aaf3357d4a --- /dev/null +++ b/e2e/start/clerk-basic/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "semi": false, + "trailingComma": "all" +} diff --git a/e2e/start/clerk-basic/app.config.ts b/e2e/start/clerk-basic/app.config.ts new file mode 100644 index 0000000000..d1d9b04ded --- /dev/null +++ b/e2e/start/clerk-basic/app.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from '@tanstack/start/config' +import tsConfigPaths from 'vite-tsconfig-paths' + +export default defineConfig({ + vite: { + plugins: () => [ + tsConfigPaths({ + projects: ['./tsconfig.json'], + }), + ], + }, +}) diff --git a/e2e/start/clerk-basic/app/client.tsx b/e2e/start/clerk-basic/app/client.tsx new file mode 100644 index 0000000000..f16ba73f62 --- /dev/null +++ b/e2e/start/clerk-basic/app/client.tsx @@ -0,0 +1,7 @@ +import { hydrateRoot } from 'react-dom/client' +import { StartClient } from '@tanstack/start' +import { createRouter } from './router' + +const router = createRouter() + +hydrateRoot(document.getElementById('root')!, ) diff --git a/e2e/start/clerk-basic/app/components/DefaultCatchBoundary.tsx b/e2e/start/clerk-basic/app/components/DefaultCatchBoundary.tsx new file mode 100644 index 0000000000..15f316681c --- /dev/null +++ b/e2e/start/clerk-basic/app/components/DefaultCatchBoundary.tsx @@ -0,0 +1,53 @@ +import { + ErrorComponent, + Link, + rootRouteId, + useMatch, + useRouter, +} from '@tanstack/react-router' +import type { ErrorComponentProps } from '@tanstack/react-router' + +export function DefaultCatchBoundary({ error }: ErrorComponentProps) { + const router = useRouter() + const isRoot = useMatch({ + strict: false, + select: (state) => state.id === rootRouteId, + }) + + console.error(error) + + return ( +
+ +
+ + {isRoot ? ( + + Home + + ) : ( + { + e.preventDefault() + window.history.back() + }} + > + Go Back + + )} +
+
+ ) +} diff --git a/e2e/start/clerk-basic/app/components/NotFound.tsx b/e2e/start/clerk-basic/app/components/NotFound.tsx new file mode 100644 index 0000000000..7b54fa5680 --- /dev/null +++ b/e2e/start/clerk-basic/app/components/NotFound.tsx @@ -0,0 +1,25 @@ +import { Link } from '@tanstack/react-router' + +export function NotFound({ children }: { children?: any }) { + return ( +
+
+ {children ||

The page you are looking for does not exist.

} +
+

+ + + Start Over + +

+
+ ) +} diff --git a/e2e/start/clerk-basic/app/routeTree.gen.ts b/e2e/start/clerk-basic/app/routeTree.gen.ts new file mode 100644 index 0000000000..833f1e4bc9 --- /dev/null +++ b/e2e/start/clerk-basic/app/routeTree.gen.ts @@ -0,0 +1,232 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/__root' +import { Route as AuthedImport } from './routes/_authed' +import { Route as IndexImport } from './routes/index' +import { Route as AuthedPostsImport } from './routes/_authed/posts' +import { Route as AuthedPostsIndexImport } from './routes/_authed/posts.index' +import { Route as AuthedProfileSplatImport } from './routes/_authed/profile.$' +import { Route as AuthedPostsPostIdImport } from './routes/_authed/posts.$postId' + +// Create/Update Routes + +const AuthedRoute = AuthedImport.update({ + id: '/_authed', + getParentRoute: () => rootRoute, +} as any) + +const IndexRoute = IndexImport.update({ + path: '/', + getParentRoute: () => rootRoute, +} as any) + +const AuthedPostsRoute = AuthedPostsImport.update({ + path: '/posts', + getParentRoute: () => AuthedRoute, +} as any) + +const AuthedPostsIndexRoute = AuthedPostsIndexImport.update({ + path: '/', + getParentRoute: () => AuthedPostsRoute, +} as any) + +const AuthedProfileSplatRoute = AuthedProfileSplatImport.update({ + path: '/profile/$', + getParentRoute: () => AuthedRoute, +} as any) + +const AuthedPostsPostIdRoute = AuthedPostsPostIdImport.update({ + path: '/$postId', + getParentRoute: () => AuthedPostsRoute, +} as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexImport + parentRoute: typeof rootRoute + } + '/_authed': { + id: '/_authed' + path: '' + fullPath: '' + preLoaderRoute: typeof AuthedImport + parentRoute: typeof rootRoute + } + '/_authed/posts': { + id: '/_authed/posts' + path: '/posts' + fullPath: '/posts' + preLoaderRoute: typeof AuthedPostsImport + parentRoute: typeof AuthedImport + } + '/_authed/posts/$postId': { + id: '/_authed/posts/$postId' + path: '/$postId' + fullPath: '/posts/$postId' + preLoaderRoute: typeof AuthedPostsPostIdImport + parentRoute: typeof AuthedPostsImport + } + '/_authed/profile/$': { + id: '/_authed/profile/$' + path: '/profile/$' + fullPath: '/profile/$' + preLoaderRoute: typeof AuthedProfileSplatImport + parentRoute: typeof AuthedImport + } + '/_authed/posts/': { + id: '/_authed/posts/' + path: '/' + fullPath: '/posts/' + preLoaderRoute: typeof AuthedPostsIndexImport + parentRoute: typeof AuthedPostsImport + } + } +} + +// Create and export the route tree + +interface AuthedPostsRouteChildren { + AuthedPostsPostIdRoute: typeof AuthedPostsPostIdRoute + AuthedPostsIndexRoute: typeof AuthedPostsIndexRoute +} + +const AuthedPostsRouteChildren: AuthedPostsRouteChildren = { + AuthedPostsPostIdRoute: AuthedPostsPostIdRoute, + AuthedPostsIndexRoute: AuthedPostsIndexRoute, +} + +const AuthedPostsRouteWithChildren = AuthedPostsRoute._addFileChildren( + AuthedPostsRouteChildren, +) + +interface AuthedRouteChildren { + AuthedPostsRoute: typeof AuthedPostsRouteWithChildren + AuthedProfileSplatRoute: typeof AuthedProfileSplatRoute +} + +const AuthedRouteChildren: AuthedRouteChildren = { + AuthedPostsRoute: AuthedPostsRouteWithChildren, + AuthedProfileSplatRoute: AuthedProfileSplatRoute, +} + +const AuthedRouteWithChildren = + AuthedRoute._addFileChildren(AuthedRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '': typeof AuthedRouteWithChildren + '/posts': typeof AuthedPostsRouteWithChildren + '/posts/$postId': typeof AuthedPostsPostIdRoute + '/profile/$': typeof AuthedProfileSplatRoute + '/posts/': typeof AuthedPostsIndexRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '': typeof AuthedRouteWithChildren + '/posts/$postId': typeof AuthedPostsPostIdRoute + '/profile/$': typeof AuthedProfileSplatRoute + '/posts': typeof AuthedPostsIndexRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/_authed': typeof AuthedRouteWithChildren + '/_authed/posts': typeof AuthedPostsRouteWithChildren + '/_authed/posts/$postId': typeof AuthedPostsPostIdRoute + '/_authed/profile/$': typeof AuthedProfileSplatRoute + '/_authed/posts/': typeof AuthedPostsIndexRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '' | '/posts' | '/posts/$postId' | '/profile/$' | '/posts/' + fileRoutesByTo: FileRoutesByTo + to: '/' | '' | '/posts/$postId' | '/profile/$' | '/posts' + id: + | '__root__' + | '/' + | '/_authed' + | '/_authed/posts' + | '/_authed/posts/$postId' + | '/_authed/profile/$' + | '/_authed/posts/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + AuthedRoute: typeof AuthedRouteWithChildren +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + AuthedRoute: AuthedRouteWithChildren, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [ + "/", + "/_authed" + ] + }, + "/": { + "filePath": "index.tsx" + }, + "/_authed": { + "filePath": "_authed.tsx", + "children": [ + "/_authed/posts", + "/_authed/profile/$" + ] + }, + "/_authed/posts": { + "filePath": "_authed/posts.tsx", + "parent": "/_authed", + "children": [ + "/_authed/posts/$postId", + "/_authed/posts/" + ] + }, + "/_authed/posts/$postId": { + "filePath": "_authed/posts.$postId.tsx", + "parent": "/_authed/posts" + }, + "/_authed/profile/$": { + "filePath": "_authed/profile.$.tsx", + "parent": "/_authed" + }, + "/_authed/posts/": { + "filePath": "_authed/posts.index.tsx", + "parent": "/_authed/posts" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/e2e/start/clerk-basic/app/router.tsx b/e2e/start/clerk-basic/app/router.tsx new file mode 100644 index 0000000000..0886de701f --- /dev/null +++ b/e2e/start/clerk-basic/app/router.tsx @@ -0,0 +1,21 @@ +import { createRouter as createTanStackRouter } from '@tanstack/react-router' +import { routeTree } from './routeTree.gen' +import { DefaultCatchBoundary } from './components/DefaultCatchBoundary' +import { NotFound } from './components/NotFound' + +export function createRouter() { + const router = createTanStackRouter({ + routeTree, + defaultPreload: 'intent', + defaultErrorComponent: DefaultCatchBoundary, + defaultNotFoundComponent: () => , + }) + + return router +} + +declare module '@tanstack/react-router' { + interface Register { + router: ReturnType + } +} diff --git a/e2e/start/clerk-basic/app/routes/__root.tsx b/e2e/start/clerk-basic/app/routes/__root.tsx new file mode 100644 index 0000000000..faf5f22ab7 --- /dev/null +++ b/e2e/start/clerk-basic/app/routes/__root.tsx @@ -0,0 +1,140 @@ +/// +import { + Link, + Outlet, + ScrollRestoration, + createRootRoute, +} from '@tanstack/react-router' +import { + ClerkProvider, + SignInButton, + SignedIn, + SignedOut, + UserButton, +} from '@clerk/tanstack-start' +import { TanStackRouterDevtools } from '@tanstack/router-devtools' +import { + Body, + Head, + Html, + Meta, + Scripts, + createServerFn, +} from '@tanstack/start' +import * as React from 'react' +import { getAuth } from '@clerk/tanstack-start/server' +import { DefaultCatchBoundary } from '~/components/DefaultCatchBoundary.js' +import { NotFound } from '~/components/NotFound.js' +import appCss from '~/styles/app.css?url' + +const fetchClerkAuth = createServerFn('GET', async (_, ctx) => { + const user = await getAuth(ctx.request) + + return { + user, + } +}) + +export const Route = createRootRoute({ + meta: () => [ + { + charSet: 'utf-8', + }, + { + name: 'viewport', + content: 'width=device-width, initial-scale=1', + }, + ], + links: () => [ + { rel: 'stylesheet', href: appCss }, + { + rel: 'apple-touch-icon', + sizes: '180x180', + href: '/apple-touch-icon.png', + }, + { + rel: 'icon', + type: 'image/png', + sizes: '32x32', + href: '/favicon-32x32.png', + }, + { + rel: 'icon', + type: 'image/png', + sizes: '16x16', + href: '/favicon-16x16.png', + }, + { rel: 'manifest', href: '/site.webmanifest', color: '#fffff' }, + { rel: 'icon', href: '/favicon.ico' }, + ], + beforeLoad: async () => { + const { user } = await fetchClerkAuth() + + return { + user, + } + }, + errorComponent: (props) => { + return ( + + + + ) + }, + notFoundComponent: () => , + component: RootComponent, +}) + +function RootComponent() { + return ( + + + + + + ) +} + +function RootDocument({ children }: { children: React.ReactNode }) { + return ( + + + + + +
+ + Home + {' '} + + Posts + +
+ + + + + + +
+
+
+ {children} + + + + + + ) +} diff --git a/e2e/start/clerk-basic/app/routes/_authed.tsx b/e2e/start/clerk-basic/app/routes/_authed.tsx new file mode 100644 index 0000000000..9f133c47a0 --- /dev/null +++ b/e2e/start/clerk-basic/app/routes/_authed.tsx @@ -0,0 +1,21 @@ +import { createFileRoute } from '@tanstack/react-router' +import { SignIn } from '@clerk/tanstack-start' + +export const Route = createFileRoute('/_authed')({ + beforeLoad: ({ context }) => { + if (!context.user.userId) { + throw new Error('Not authenticated') + } + }, + errorComponent: ({ error }) => { + if (error.message === 'Not authenticated') { + return ( +
+ +
+ ) + } + + throw error + }, +}) diff --git a/e2e/start/clerk-basic/app/routes/_authed/posts.$postId.tsx b/e2e/start/clerk-basic/app/routes/_authed/posts.$postId.tsx new file mode 100644 index 0000000000..d6d12b3702 --- /dev/null +++ b/e2e/start/clerk-basic/app/routes/_authed/posts.$postId.tsx @@ -0,0 +1,28 @@ +import { ErrorComponent, createFileRoute } from '@tanstack/react-router' +import type { ErrorComponentProps } from '@tanstack/react-router' +import { NotFound } from '~/components/NotFound.js' +import { fetchPost } from '~/utils/posts.js' + +export const Route = createFileRoute('/_authed/posts/$postId')({ + loader: ({ params: { postId } }) => fetchPost(postId), + errorComponent: PostErrorComponent as any, + component: PostComponent, + notFoundComponent: () => { + return Post not found + }, +}) + +export function PostErrorComponent({ error }: ErrorComponentProps) { + return +} + +function PostComponent() { + const post = Route.useLoaderData() + + return ( +
+

{post.title}

+
{post.body}
+
+ ) +} diff --git a/e2e/start/clerk-basic/app/routes/_authed/posts.index.tsx b/e2e/start/clerk-basic/app/routes/_authed/posts.index.tsx new file mode 100644 index 0000000000..ea9e667e54 --- /dev/null +++ b/e2e/start/clerk-basic/app/routes/_authed/posts.index.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_authed/posts/')({ + component: PostsIndexComponent, +}) + +function PostsIndexComponent() { + return
Select a post.
+} diff --git a/e2e/start/clerk-basic/app/routes/_authed/posts.tsx b/e2e/start/clerk-basic/app/routes/_authed/posts.tsx new file mode 100644 index 0000000000..86c8ef4138 --- /dev/null +++ b/e2e/start/clerk-basic/app/routes/_authed/posts.tsx @@ -0,0 +1,38 @@ +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' +import { fetchPosts } from '~/utils/posts.js' + +export const Route = createFileRoute('/_authed/posts')({ + loader: () => fetchPosts(), + component: PostsComponent, +}) + +function PostsComponent() { + const posts = Route.useLoaderData() + + return ( +
+
    + {[...posts, { id: 'i-do-not-exist', title: 'Non-existent Post' }].map( + (post) => { + return ( +
  • + +
    {post.title.substring(0, 20)}
    + +
  • + ) + }, + )} +
+
+ +
+ ) +} diff --git a/e2e/start/clerk-basic/app/routes/_authed/profile.$.tsx b/e2e/start/clerk-basic/app/routes/_authed/profile.$.tsx new file mode 100644 index 0000000000..208a38e230 --- /dev/null +++ b/e2e/start/clerk-basic/app/routes/_authed/profile.$.tsx @@ -0,0 +1,38 @@ +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' +import { fetchPosts } from '~/utils/posts.js' + +export const Route = createFileRoute('/_authed/profile/$')({ + loader: () => fetchPosts(), + component: PostsComponent, +}) + +function PostsComponent() { + const posts = Route.useLoaderData() + + return ( +
+
    + {[...posts, { id: 'i-do-not-exist', title: 'Non-existent Post' }].map( + (post) => { + return ( +
  • + +
    {post.title.substring(0, 20)}
    + +
  • + ) + }, + )} +
+
+ +
+ ) +} diff --git a/e2e/start/clerk-basic/app/routes/index.tsx b/e2e/start/clerk-basic/app/routes/index.tsx new file mode 100644 index 0000000000..6ae388a178 --- /dev/null +++ b/e2e/start/clerk-basic/app/routes/index.tsx @@ -0,0 +1,13 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: Home, +}) + +function Home() { + return ( +
+

Hello Clerk!

+
+ ) +} diff --git a/e2e/start/clerk-basic/app/ssr.tsx b/e2e/start/clerk-basic/app/ssr.tsx new file mode 100644 index 0000000000..73d185feed --- /dev/null +++ b/e2e/start/clerk-basic/app/ssr.tsx @@ -0,0 +1,16 @@ +import { + createStartHandler, + defaultStreamHandler, +} from '@tanstack/start/server' +import { getRouterManifest } from '@tanstack/start/router-manifest' +import { createClerkHandler } from '@clerk/tanstack-start/server' +import { createRouter } from './router' + +const handler = createStartHandler({ + createRouter, + getRouterManifest, +}) + +const clerkHandler = createClerkHandler(handler) + +export default clerkHandler(defaultStreamHandler) diff --git a/e2e/start/clerk-basic/app/styles/app.css b/e2e/start/clerk-basic/app/styles/app.css new file mode 100644 index 0000000000..d6426ccb72 --- /dev/null +++ b/e2e/start/clerk-basic/app/styles/app.css @@ -0,0 +1,14 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + html, + body { + @apply text-gray-900 bg-gray-50 dark:bg-gray-950 dark:text-gray-200; + } + + .using-mouse * { + outline: none !important; + } +} diff --git a/e2e/start/clerk-basic/app/utils/posts.ts b/e2e/start/clerk-basic/app/utils/posts.ts new file mode 100644 index 0000000000..00fc9ae143 --- /dev/null +++ b/e2e/start/clerk-basic/app/utils/posts.ts @@ -0,0 +1,33 @@ +import { notFound } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/start' +import axios from 'redaxios' + +export type PostType = { + id: string + title: string + body: string +} + +export const fetchPost = createServerFn('GET', async (postId: string) => { + console.info(`Fetching post with id ${postId}...`) + const post = await axios + .get(`https://jsonplaceholder.typicode.com/posts/${postId}`) + .then((r) => r.data) + .catch((err) => { + console.error(err) + if (err.status === 404) { + throw notFound() + } + throw err + }) + + return post +}) + +export const fetchPosts = createServerFn('GET', async () => { + console.info('Fetching posts...') + await new Promise((r) => setTimeout(r, 1000)) + return axios + .get>('https://jsonplaceholder.typicode.com/posts') + .then((r) => r.data.slice(0, 10)) +}) diff --git a/e2e/start/clerk-basic/app/utils/seo.ts b/e2e/start/clerk-basic/app/utils/seo.ts new file mode 100644 index 0000000000..d18ad84b74 --- /dev/null +++ b/e2e/start/clerk-basic/app/utils/seo.ts @@ -0,0 +1,33 @@ +export const seo = ({ + title, + description, + keywords, + image, +}: { + title: string + description?: string + image?: string + keywords?: string +}) => { + const tags = [ + { title }, + { name: 'description', content: description }, + { name: 'keywords', content: keywords }, + { name: 'twitter:title', content: title }, + { name: 'twitter:description', content: description }, + { name: 'twitter:creator', content: '@tannerlinsley' }, + { name: 'twitter:site', content: '@tannerlinsley' }, + { name: 'og:type', content: 'website' }, + { name: 'og:title', content: title }, + { name: 'og:description', content: description }, + ...(image + ? [ + { name: 'twitter:image', content: image }, + { name: 'twitter:card', content: 'summary_large_image' }, + { name: 'og:image', content: image }, + ] + : []), + ] + + return tags +} diff --git a/e2e/start/clerk-basic/package.json b/e2e/start/clerk-basic/package.json new file mode 100644 index 0000000000..6049e30f99 --- /dev/null +++ b/e2e/start/clerk-basic/package.json @@ -0,0 +1,43 @@ +{ + "name": "tanstack-start-e2e-clerk-basic", + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "dev": "vinxi dev", + "build": "vinxi build", + "start": "vinxi start", + "lint": "prettier --check '**/*' --ignore-unknown && eslint --ext .ts,.tsx ./app", + "format": "prettier --write '**/*' --ignore-unknown", + "test:e2e": "exit 0; playwright test --project=chromium" + }, + "dependencies": { + "@clerk/tanstack-start": "0.4.1", + "@tanstack/react-router": "^1.57.15", + "@tanstack/router-devtools": "^1.57.15", + "@tanstack/router-plugin": "^1.57.15", + "@tanstack/start": "^1.57.15", + "dotenv": "^16.4.5", + "isbot": "^5.1.17", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "redaxios": "^0.5.1", + "remix-auth-form": "^1.5.0", + "tailwind-merge": "^2.5.2", + "vinxi": "0.4.3" + }, + "devDependencies": { + "@playwright/test": "^1.47.1", + "@types/node": "^22.5.4", + "@types/react": "^18.2.65", + "@types/react-dom": "^18.2.21", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.47", + "prettier": "^3.3.3", + "tailwindcss": "^3.4.11", + "typescript": "^5.6.2", + "vite": "^5.4.5", + "vite-tsconfig-paths": "^5.0.1" + } +} diff --git a/examples/react/start-clerk-basic/playwright.config.ts b/e2e/start/clerk-basic/playwright.config.ts similarity index 100% rename from examples/react/start-clerk-basic/playwright.config.ts rename to e2e/start/clerk-basic/playwright.config.ts diff --git a/e2e/start/clerk-basic/postcss.config.cjs b/e2e/start/clerk-basic/postcss.config.cjs new file mode 100644 index 0000000000..8e638a6bcd --- /dev/null +++ b/e2e/start/clerk-basic/postcss.config.cjs @@ -0,0 +1,7 @@ +module.exports = { + plugins: [ + require('tailwindcss/nesting'), + require('tailwindcss'), + require('autoprefixer'), + ], +} diff --git a/e2e/start/clerk-basic/public/android-chrome-192x192.png b/e2e/start/clerk-basic/public/android-chrome-192x192.png new file mode 100644 index 0000000000..09c8324f8c Binary files /dev/null and b/e2e/start/clerk-basic/public/android-chrome-192x192.png differ diff --git a/e2e/start/clerk-basic/public/android-chrome-512x512.png b/e2e/start/clerk-basic/public/android-chrome-512x512.png new file mode 100644 index 0000000000..11d626ea3d Binary files /dev/null and b/e2e/start/clerk-basic/public/android-chrome-512x512.png differ diff --git a/e2e/start/clerk-basic/public/apple-touch-icon.png b/e2e/start/clerk-basic/public/apple-touch-icon.png new file mode 100644 index 0000000000..5a9423cc02 Binary files /dev/null and b/e2e/start/clerk-basic/public/apple-touch-icon.png differ diff --git a/e2e/start/clerk-basic/public/favicon-16x16.png b/e2e/start/clerk-basic/public/favicon-16x16.png new file mode 100644 index 0000000000..e3389b0044 Binary files /dev/null and b/e2e/start/clerk-basic/public/favicon-16x16.png differ diff --git a/e2e/start/clerk-basic/public/favicon-32x32.png b/e2e/start/clerk-basic/public/favicon-32x32.png new file mode 100644 index 0000000000..900c77d444 Binary files /dev/null and b/e2e/start/clerk-basic/public/favicon-32x32.png differ diff --git a/e2e/start/clerk-basic/public/favicon.ico b/e2e/start/clerk-basic/public/favicon.ico new file mode 100644 index 0000000000..1a1751676f Binary files /dev/null and b/e2e/start/clerk-basic/public/favicon.ico differ diff --git a/e2e/start/clerk-basic/public/favicon.png b/e2e/start/clerk-basic/public/favicon.png new file mode 100644 index 0000000000..1e77bc0609 Binary files /dev/null and b/e2e/start/clerk-basic/public/favicon.png differ diff --git a/e2e/start/clerk-basic/public/site.webmanifest b/e2e/start/clerk-basic/public/site.webmanifest new file mode 100644 index 0000000000..fa99de77db --- /dev/null +++ b/e2e/start/clerk-basic/public/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/e2e/start/clerk-basic/tailwind.config.cjs b/e2e/start/clerk-basic/tailwind.config.cjs new file mode 100644 index 0000000000..75fe25dbf7 --- /dev/null +++ b/e2e/start/clerk-basic/tailwind.config.cjs @@ -0,0 +1,4 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./app/**/*.{js,ts,jsx,tsx}'], +} diff --git a/examples/react/start-clerk-basic/tests/app.spec.ts b/e2e/start/clerk-basic/tests/app.spec.ts similarity index 100% rename from examples/react/start-clerk-basic/tests/app.spec.ts rename to e2e/start/clerk-basic/tests/app.spec.ts diff --git a/e2e/start/clerk-basic/tsconfig.json b/e2e/start/clerk-basic/tsconfig.json new file mode 100644 index 0000000000..d1b5b77660 --- /dev/null +++ b/e2e/start/clerk-basic/tsconfig.json @@ -0,0 +1,22 @@ +{ + "include": ["**/*.ts", "**/*.tsx"], + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "isolatedModules": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "target": "ES2022", + "allowJs": true, + "forceConsistentCasingInFileNames": true, + "baseUrl": ".", + "paths": { + "~/*": ["./app/*"] + }, + "noEmit": true + } +} diff --git a/eslint.config.js b/eslint.config.js index a4bea79d26..7315113009 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -8,7 +8,7 @@ export default [ { name: 'tanstack/temp', rules: { - '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/no-unsafe-function-type': 'off', 'no-shadow': 'off', }, }, diff --git a/examples/react/authenticated-routes/package.json b/examples/react/authenticated-routes/package.json index 1af527a82c..7644d760c9 100644 --- a/examples/react/authenticated-routes/package.json +++ b/examples/react/authenticated-routes/package.json @@ -4,15 +4,14 @@ "type": "module", "scripts": { "dev": "vite --port=3001", - "build": "vite build", + "build": "vite build && tsc --noEmit", "serve": "vite preview", "start": "vite" }, "dependencies": { - "@tanstack/react-router": "^1.51.2", - "@tanstack/router-devtools": "^1.51.2", - "@tanstack/router-plugin": "^1.51.0", - "immer": "^10.1.1", + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", + "@tanstack/router-plugin": "^1.58.4", "react": "^18.2.0", "react-dom": "^18.2.0", "redaxios": "^0.5.1", @@ -22,6 +21,6 @@ "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", "@vitejs/plugin-react": "^4.3.1", - "vite": "^5.3.5" + "vite": "^5.4.5" } } diff --git a/examples/react/authenticated-routes/src/routeTree.gen.ts b/examples/react/authenticated-routes/src/routeTree.gen.ts index 4201d90da2..2dd5bd56a6 100644 --- a/examples/react/authenticated-routes/src/routeTree.gen.ts +++ b/examples/react/authenticated-routes/src/routeTree.gen.ts @@ -114,17 +114,101 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ - IndexRoute, - AuthRoute: AuthRoute.addChildren({ - AuthDashboardRoute, - AuthInvoicesRoute: AuthInvoicesRoute.addChildren({ - AuthInvoicesInvoiceIdRoute, - AuthInvoicesIndexRoute, - }), - }), - LoginRoute, -}) +interface AuthInvoicesRouteChildren { + AuthInvoicesInvoiceIdRoute: typeof AuthInvoicesInvoiceIdRoute + AuthInvoicesIndexRoute: typeof AuthInvoicesIndexRoute +} + +const AuthInvoicesRouteChildren: AuthInvoicesRouteChildren = { + AuthInvoicesInvoiceIdRoute: AuthInvoicesInvoiceIdRoute, + AuthInvoicesIndexRoute: AuthInvoicesIndexRoute, +} + +const AuthInvoicesRouteWithChildren = AuthInvoicesRoute._addFileChildren( + AuthInvoicesRouteChildren, +) + +interface AuthRouteChildren { + AuthDashboardRoute: typeof AuthDashboardRoute + AuthInvoicesRoute: typeof AuthInvoicesRouteWithChildren +} + +const AuthRouteChildren: AuthRouteChildren = { + AuthDashboardRoute: AuthDashboardRoute, + AuthInvoicesRoute: AuthInvoicesRouteWithChildren, +} + +const AuthRouteWithChildren = AuthRoute._addFileChildren(AuthRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '': typeof AuthRouteWithChildren + '/login': typeof LoginRoute + '/dashboard': typeof AuthDashboardRoute + '/invoices': typeof AuthInvoicesRouteWithChildren + '/invoices/$invoiceId': typeof AuthInvoicesInvoiceIdRoute + '/invoices/': typeof AuthInvoicesIndexRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '': typeof AuthRouteWithChildren + '/login': typeof LoginRoute + '/dashboard': typeof AuthDashboardRoute + '/invoices/$invoiceId': typeof AuthInvoicesInvoiceIdRoute + '/invoices': typeof AuthInvoicesIndexRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/_auth': typeof AuthRouteWithChildren + '/login': typeof LoginRoute + '/_auth/dashboard': typeof AuthDashboardRoute + '/_auth/invoices': typeof AuthInvoicesRouteWithChildren + '/_auth/invoices/$invoiceId': typeof AuthInvoicesInvoiceIdRoute + '/_auth/invoices/': typeof AuthInvoicesIndexRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '' + | '/login' + | '/dashboard' + | '/invoices' + | '/invoices/$invoiceId' + | '/invoices/' + fileRoutesByTo: FileRoutesByTo + to: '/' | '' | '/login' | '/dashboard' | '/invoices/$invoiceId' | '/invoices' + id: + | '__root__' + | '/' + | '/_auth' + | '/login' + | '/_auth/dashboard' + | '/_auth/invoices' + | '/_auth/invoices/$invoiceId' + | '/_auth/invoices/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + AuthRoute: typeof AuthRouteWithChildren + LoginRoute: typeof LoginRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + AuthRoute: AuthRouteWithChildren, + LoginRoute: LoginRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ diff --git a/examples/react/authenticated-routes/tsconfig.json b/examples/react/authenticated-routes/tsconfig.json index c9e17e2b68..f5a6cae049 100644 --- a/examples/react/authenticated-routes/tsconfig.json +++ b/examples/react/authenticated-routes/tsconfig.json @@ -2,6 +2,8 @@ "compilerOptions": { "strict": true, "esModuleInterop": true, - "jsx": "react-jsx" + "jsx": "react-jsx", + "target": "ESNext", + "moduleResolution": "Bundler" } } diff --git a/examples/react/basic-default-search-params/package.json b/examples/react/basic-default-search-params/package.json index 8891f9f1f2..6db624ecf4 100644 --- a/examples/react/basic-default-search-params/package.json +++ b/examples/react/basic-default-search-params/package.json @@ -4,14 +4,14 @@ "type": "module", "scripts": { "dev": "vite --port=3001", - "build": "vite build", + "build": "vite build && tsc --noEmit", "serve": "vite preview", "start": "vite" }, "dependencies": { - "@tanstack/react-query": "^5.51.21", - "@tanstack/react-router": "^1.51.2", - "@tanstack/router-devtools": "^1.51.2", + "@tanstack/react-query": "^5.56.2", + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", "redaxios": "^0.5.1", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -21,6 +21,6 @@ "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", "@vitejs/plugin-react": "^4.3.1", - "vite": "^5.3.5" + "vite": "^5.4.5" } } diff --git a/examples/react/basic-default-search-params/src/main.tsx b/examples/react/basic-default-search-params/src/main.tsx index d2173d4047..e2331794c3 100644 --- a/examples/react/basic-default-search-params/src/main.tsx +++ b/examples/react/basic-default-search-params/src/main.tsx @@ -68,7 +68,7 @@ function RootComponent() { Home {' '} () /* prettier-ignore-end */ diff --git a/examples/react/basic-file-based-codesplitting/src/routes/__root.tsx b/examples/react/basic-file-based-codesplitting/src/routes/__root.tsx index d479a709ae..7547611929 100644 --- a/examples/react/basic-file-based-codesplitting/src/routes/__root.tsx +++ b/examples/react/basic-file-based-codesplitting/src/routes/__root.tsx @@ -20,7 +20,7 @@ function RootComponent() { Home {' '} () /* prettier-ignore-end */ diff --git a/examples/react/basic-file-based/src/routes/__root.tsx b/examples/react/basic-file-based/src/routes/__root.tsx index 52c5059f55..6b57d1e239 100644 --- a/examples/react/basic-file-based/src/routes/__root.tsx +++ b/examples/react/basic-file-based/src/routes/__root.tsx @@ -28,7 +28,7 @@ function RootComponent() { Home {' '} () /* prettier-ignore-end */ diff --git a/examples/react/basic-react-query-file-based/src/routes/__root.tsx b/examples/react/basic-react-query-file-based/src/routes/__root.tsx index f59f183ce8..8f36e2c17b 100644 --- a/examples/react/basic-react-query-file-based/src/routes/__root.tsx +++ b/examples/react/basic-react-query-file-based/src/routes/__root.tsx @@ -36,7 +36,7 @@ function RootComponent() { Home {' '} {' '} () /* prettier-ignore-end */ diff --git a/examples/react/basic-ssr-streaming-file-based/package.json b/examples/react/basic-ssr-streaming-file-based/package.json index 000e386989..e2092dd389 100644 --- a/examples/react/basic-ssr-streaming-file-based/package.json +++ b/examples/react/basic-ssr-streaming-file-based/package.json @@ -11,10 +11,10 @@ "debug": "node --inspect-brk server" }, "dependencies": { - "@tanstack/react-router": "^1.51.2", - "@tanstack/router-devtools": "^1.51.2", - "@tanstack/router-plugin": "^1.51.0", - "@tanstack/start": "^1.51.2", + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", + "@tanstack/router-plugin": "^1.58.4", + "@tanstack/start": "^1.58.5", "get-port": "^7.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -23,16 +23,16 @@ }, "devDependencies": { "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", + "@babel/generator": "^7.25.6", "@rollup/plugin-babel": "^6.0.4", "@types/express": "^4.17.21", "@vitejs/plugin-react": "^4.3.1", "compression": "^1.7.4", - "express": "^4.19.2", - "isbot": "^5.1.14", + "express": "^4.21.0", + "isbot": "^5.1.17", "node-fetch": "^3.3.2", - "serve-static": "^1.15.0", - "vite": "^5.3.5", + "serve-static": "^1.16.2", + "vite": "^5.4.5", "vite-plugin-babel": "^1.2.0" } } diff --git a/examples/react/basic-ssr-streaming-file-based/src/routeTree.gen.ts b/examples/react/basic-ssr-streaming-file-based/src/routeTree.gen.ts index 5eac4ed42c..b1fe712511 100644 --- a/examples/react/basic-ssr-streaming-file-based/src/routeTree.gen.ts +++ b/examples/react/basic-ssr-streaming-file-based/src/routeTree.gen.ts @@ -88,11 +88,66 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ - IndexRoute, - ErrorRoute, - PostsRoute: PostsRoute.addChildren({ PostsPostIdRoute, PostsIndexRoute }), -}) +interface PostsRouteChildren { + PostsPostIdRoute: typeof PostsPostIdRoute + PostsIndexRoute: typeof PostsIndexRoute +} + +const PostsRouteChildren: PostsRouteChildren = { + PostsPostIdRoute: PostsPostIdRoute, + PostsIndexRoute: PostsIndexRoute, +} + +const PostsRouteWithChildren = PostsRoute._addFileChildren(PostsRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/error': typeof ErrorRoute + '/posts': typeof PostsRouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/posts/': typeof PostsIndexRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/error': typeof ErrorRoute + '/posts/$postId': typeof PostsPostIdRoute + '/posts': typeof PostsIndexRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/error': typeof ErrorRoute + '/posts': typeof PostsRouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/posts/': typeof PostsIndexRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '/error' | '/posts' | '/posts/$postId' | '/posts/' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/error' | '/posts/$postId' | '/posts' + id: '__root__' | '/' | '/error' | '/posts' | '/posts/$postId' | '/posts/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + ErrorRoute: typeof ErrorRoute + PostsRoute: typeof PostsRouteWithChildren +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + ErrorRoute: ErrorRoute, + PostsRoute: PostsRouteWithChildren, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ diff --git a/examples/react/basic-ssr-streaming-file-based/src/routes/index.tsx b/examples/react/basic-ssr-streaming-file-based/src/routes/index.tsx index b65debee30..50c2706a26 100644 --- a/examples/react/basic-ssr-streaming-file-based/src/routes/index.tsx +++ b/examples/react/basic-ssr-streaming-file-based/src/routes/index.tsx @@ -18,7 +18,7 @@ function IndexComponent() {

Welcome Home!

Data: {data.date.getDate()}

- + {(data) =>

Deferred: {data.date.getDate()}

}
diff --git a/examples/react/basic-virtual-file-based/.gitignore b/examples/react/basic-virtual-file-based/.gitignore new file mode 100644 index 0000000000..a6ea47e508 --- /dev/null +++ b/examples/react/basic-virtual-file-based/.gitignore @@ -0,0 +1,10 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local + +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/examples/react/basic-virtual-file-based/README.md b/examples/react/basic-virtual-file-based/README.md new file mode 100644 index 0000000000..115199d292 --- /dev/null +++ b/examples/react/basic-virtual-file-based/README.md @@ -0,0 +1,6 @@ +# Example + +To run this example: + +- `npm install` or `yarn` +- `npm start` or `yarn start` diff --git a/examples/react/basic-virtual-file-based/index.html b/examples/react/basic-virtual-file-based/index.html new file mode 100644 index 0000000000..a4b3349437 --- /dev/null +++ b/examples/react/basic-virtual-file-based/index.html @@ -0,0 +1,24 @@ + + + + + + Vite App + + + + +
+ + + diff --git a/examples/react/basic-virtual-file-based/package.json b/examples/react/basic-virtual-file-based/package.json new file mode 100644 index 0000000000..e1fa3ec352 --- /dev/null +++ b/examples/react/basic-virtual-file-based/package.json @@ -0,0 +1,28 @@ +{ + "name": "tanstack-router-react-example-basic-virtual-file-based", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port=3001", + "build": "vite build && tsc --noEmit", + "serve": "vite preview", + "start": "vite" + }, + "dependencies": { + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", + "@tanstack/router-plugin": "^1.58.4", + "@tanstack/virtual-file-routes": "^1.56.0", + "immer": "^10.1.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "redaxios": "^0.5.1", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/react": "^18.2.47", + "@types/react-dom": "^18.2.18", + "@vitejs/plugin-react": "^4.3.1", + "vite": "^5.4.5" + } +} diff --git a/examples/react/basic-virtual-file-based/routes.ts b/examples/react/basic-virtual-file-based/routes.ts new file mode 100644 index 0000000000..6c2c144ec5 --- /dev/null +++ b/examples/react/basic-virtual-file-based/routes.ts @@ -0,0 +1,22 @@ +import { + index, + layout, + physical, + rootRoute, + route, +} from '@tanstack/virtual-file-routes' + +export const routes = rootRoute('root.tsx', [ + index('home.tsx'), + route('/posts', 'posts/posts.tsx', [ + index('posts/posts-home.tsx'), + route('$postId', 'posts/posts-detail.tsx'), + ]), + layout('first', 'layout/first-layout.tsx', [ + layout('second', 'layout/second-layout.tsx', [ + route('/layout-a', 'a.tsx'), + route('/layout-b', 'b.tsx'), + ]), + ]), + physical('/classic', 'file-based-subtree'), +]) diff --git a/examples/react/basic-virtual-file-based/src/main.tsx b/examples/react/basic-virtual-file-based/src/main.tsx new file mode 100644 index 0000000000..18b1b603f8 --- /dev/null +++ b/examples/react/basic-virtual-file-based/src/main.tsx @@ -0,0 +1,25 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import { RouterProvider, createRouter } from '@tanstack/react-router' +import { routeTree } from './routeTree.gen' + +// Set up a Router instance +const router = createRouter({ + routeTree, + defaultPreload: 'intent', + defaultStaleTime: 5000, +}) + +// Register things for typesafety +declare module '@tanstack/react-router' { + interface Register { + router: typeof router + } +} + +const rootElement = document.getElementById('app')! + +if (!rootElement.innerHTML) { + const root = ReactDOM.createRoot(rootElement) + root.render() +} diff --git a/examples/react/basic-virtual-file-based/src/posts.tsx b/examples/react/basic-virtual-file-based/src/posts.tsx new file mode 100644 index 0000000000..3ccf1ff421 --- /dev/null +++ b/examples/react/basic-virtual-file-based/src/posts.tsx @@ -0,0 +1,32 @@ +import { notFound } from '@tanstack/react-router' +import axios from 'redaxios' + +export type PostType = { + id: string + title: string + body: string +} + +export const fetchPost = async (postId: string) => { + console.info(`Fetching post with id ${postId}...`) + await new Promise((r) => setTimeout(r, 500)) + const post = await axios + .get(`https://jsonplaceholder.typicode.com/posts/${postId}`) + .then((r) => r.data) + .catch((err) => { + if (err.status === 404) { + throw notFound() + } + throw err + }) + + return post +} + +export const fetchPosts = async () => { + console.info('Fetching posts...') + await new Promise((r) => setTimeout(r, 500)) + return axios + .get>('https://jsonplaceholder.typicode.com/posts') + .then((r) => r.data.slice(0, 10)) +} diff --git a/examples/react/basic-virtual-file-based/src/routeTree.gen.ts b/examples/react/basic-virtual-file-based/src/routeTree.gen.ts new file mode 100644 index 0000000000..da6e49f4dc --- /dev/null +++ b/examples/react/basic-virtual-file-based/src/routeTree.gen.ts @@ -0,0 +1,413 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/root' +import { Route as postsPostsImport } from './routes/posts/posts' +import { Route as layoutFirstLayoutImport } from './routes/layout/first-layout' +import { Route as homeImport } from './routes/home' +import { Route as postsPostsDetailImport } from './routes/posts/posts-detail' +import { Route as layoutSecondLayoutImport } from './routes/layout/second-layout' +import { Route as postsPostsHomeImport } from './routes/posts/posts-home' +import { Route as ClassicHelloRouteImport } from './routes/file-based-subtree/hello/route' +import { Route as ClassicHelloIndexImport } from './routes/file-based-subtree/hello/index' +import { Route as ClassicHelloWorldImport } from './routes/file-based-subtree/hello/world' +import { Route as ClassicHelloUniverseImport } from './routes/file-based-subtree/hello/universe' +import { Route as bImport } from './routes/b' +import { Route as aImport } from './routes/a' + +// Create/Update Routes + +const postsPostsRoute = postsPostsImport.update({ + path: '/posts', + getParentRoute: () => rootRoute, +} as any) + +const layoutFirstLayoutRoute = layoutFirstLayoutImport.update({ + id: '/_first', + getParentRoute: () => rootRoute, +} as any) + +const homeRoute = homeImport.update({ + path: '/', + getParentRoute: () => rootRoute, +} as any) + +const postsPostsDetailRoute = postsPostsDetailImport.update({ + path: '/$postId', + getParentRoute: () => postsPostsRoute, +} as any) + +const layoutSecondLayoutRoute = layoutSecondLayoutImport.update({ + id: '/_second', + getParentRoute: () => layoutFirstLayoutRoute, +} as any) + +const postsPostsHomeRoute = postsPostsHomeImport.update({ + path: '/', + getParentRoute: () => postsPostsRoute, +} as any) + +const ClassicHelloRouteRoute = ClassicHelloRouteImport.update({ + path: '/classic/hello', + getParentRoute: () => rootRoute, +} as any) + +const ClassicHelloIndexRoute = ClassicHelloIndexImport.update({ + path: '/', + getParentRoute: () => ClassicHelloRouteRoute, +} as any) + +const ClassicHelloWorldRoute = ClassicHelloWorldImport.update({ + path: '/world', + getParentRoute: () => ClassicHelloRouteRoute, +} as any) + +const ClassicHelloUniverseRoute = ClassicHelloUniverseImport.update({ + path: '/universe', + getParentRoute: () => ClassicHelloRouteRoute, +} as any) + +const bRoute = bImport.update({ + path: '/layout-b', + getParentRoute: () => layoutSecondLayoutRoute, +} as any) + +const aRoute = aImport.update({ + path: '/layout-a', + getParentRoute: () => layoutSecondLayoutRoute, +} as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof homeImport + parentRoute: typeof rootRoute + } + '/_first': { + id: '/_first' + path: '' + fullPath: '' + preLoaderRoute: typeof layoutFirstLayoutImport + parentRoute: typeof rootRoute + } + '/posts': { + id: '/posts' + path: '/posts' + fullPath: '/posts' + preLoaderRoute: typeof postsPostsImport + parentRoute: typeof rootRoute + } + '/classic/hello': { + id: '/classic/hello' + path: '/classic/hello' + fullPath: '/classic/hello' + preLoaderRoute: typeof ClassicHelloRouteImport + parentRoute: typeof rootRoute + } + '/posts/': { + id: '/posts/' + path: '/' + fullPath: '/posts/' + preLoaderRoute: typeof postsPostsHomeImport + parentRoute: typeof postsPostsImport + } + '/_first/_second': { + id: '/_first/_second' + path: '' + fullPath: '' + preLoaderRoute: typeof layoutSecondLayoutImport + parentRoute: typeof layoutFirstLayoutImport + } + '/posts/$postId': { + id: '/posts/$postId' + path: '/$postId' + fullPath: '/posts/$postId' + preLoaderRoute: typeof postsPostsDetailImport + parentRoute: typeof postsPostsImport + } + '/_first/_second/layout-a': { + id: '/_first/_second/layout-a' + path: '/layout-a' + fullPath: '/layout-a' + preLoaderRoute: typeof aImport + parentRoute: typeof layoutSecondLayoutImport + } + '/_first/_second/layout-b': { + id: '/_first/_second/layout-b' + path: '/layout-b' + fullPath: '/layout-b' + preLoaderRoute: typeof bImport + parentRoute: typeof layoutSecondLayoutImport + } + '/classic/hello/universe': { + id: '/classic/hello/universe' + path: '/universe' + fullPath: '/classic/hello/universe' + preLoaderRoute: typeof ClassicHelloUniverseImport + parentRoute: typeof ClassicHelloRouteImport + } + '/classic/hello/world': { + id: '/classic/hello/world' + path: '/world' + fullPath: '/classic/hello/world' + preLoaderRoute: typeof ClassicHelloWorldImport + parentRoute: typeof ClassicHelloRouteImport + } + '/classic/hello/': { + id: '/classic/hello/' + path: '/' + fullPath: '/classic/hello/' + preLoaderRoute: typeof ClassicHelloIndexImport + parentRoute: typeof ClassicHelloRouteImport + } + } +} + +// Create and export the route tree + +interface layoutSecondLayoutRouteChildren { + aRoute: typeof aRoute + bRoute: typeof bRoute +} + +const layoutSecondLayoutRouteChildren: layoutSecondLayoutRouteChildren = { + aRoute: aRoute, + bRoute: bRoute, +} + +const layoutSecondLayoutRouteWithChildren = + layoutSecondLayoutRoute._addFileChildren(layoutSecondLayoutRouteChildren) + +interface layoutFirstLayoutRouteChildren { + layoutSecondLayoutRoute: typeof layoutSecondLayoutRouteWithChildren +} + +const layoutFirstLayoutRouteChildren: layoutFirstLayoutRouteChildren = { + layoutSecondLayoutRoute: layoutSecondLayoutRouteWithChildren, +} + +const layoutFirstLayoutRouteWithChildren = + layoutFirstLayoutRoute._addFileChildren(layoutFirstLayoutRouteChildren) + +interface postsPostsRouteChildren { + postsPostsHomeRoute: typeof postsPostsHomeRoute + postsPostsDetailRoute: typeof postsPostsDetailRoute +} + +const postsPostsRouteChildren: postsPostsRouteChildren = { + postsPostsHomeRoute: postsPostsHomeRoute, + postsPostsDetailRoute: postsPostsDetailRoute, +} + +const postsPostsRouteWithChildren = postsPostsRoute._addFileChildren( + postsPostsRouteChildren, +) + +interface ClassicHelloRouteRouteChildren { + ClassicHelloUniverseRoute: typeof ClassicHelloUniverseRoute + ClassicHelloWorldRoute: typeof ClassicHelloWorldRoute + ClassicHelloIndexRoute: typeof ClassicHelloIndexRoute +} + +const ClassicHelloRouteRouteChildren: ClassicHelloRouteRouteChildren = { + ClassicHelloUniverseRoute: ClassicHelloUniverseRoute, + ClassicHelloWorldRoute: ClassicHelloWorldRoute, + ClassicHelloIndexRoute: ClassicHelloIndexRoute, +} + +const ClassicHelloRouteRouteWithChildren = + ClassicHelloRouteRoute._addFileChildren(ClassicHelloRouteRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof homeRoute + '': typeof layoutSecondLayoutRouteWithChildren + '/posts': typeof postsPostsRouteWithChildren + '/classic/hello': typeof ClassicHelloRouteRouteWithChildren + '/posts/': typeof postsPostsHomeRoute + '/posts/$postId': typeof postsPostsDetailRoute + '/layout-a': typeof aRoute + '/layout-b': typeof bRoute + '/classic/hello/universe': typeof ClassicHelloUniverseRoute + '/classic/hello/world': typeof ClassicHelloWorldRoute + '/classic/hello/': typeof ClassicHelloIndexRoute +} + +export interface FileRoutesByTo { + '/': typeof homeRoute + '': typeof layoutSecondLayoutRouteWithChildren + '/posts': typeof postsPostsHomeRoute + '/posts/$postId': typeof postsPostsDetailRoute + '/layout-a': typeof aRoute + '/layout-b': typeof bRoute + '/classic/hello/universe': typeof ClassicHelloUniverseRoute + '/classic/hello/world': typeof ClassicHelloWorldRoute + '/classic/hello': typeof ClassicHelloIndexRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof homeRoute + '/_first': typeof layoutFirstLayoutRouteWithChildren + '/posts': typeof postsPostsRouteWithChildren + '/classic/hello': typeof ClassicHelloRouteRouteWithChildren + '/posts/': typeof postsPostsHomeRoute + '/_first/_second': typeof layoutSecondLayoutRouteWithChildren + '/posts/$postId': typeof postsPostsDetailRoute + '/_first/_second/layout-a': typeof aRoute + '/_first/_second/layout-b': typeof bRoute + '/classic/hello/universe': typeof ClassicHelloUniverseRoute + '/classic/hello/world': typeof ClassicHelloWorldRoute + '/classic/hello/': typeof ClassicHelloIndexRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '' + | '/posts' + | '/classic/hello' + | '/posts/' + | '/posts/$postId' + | '/layout-a' + | '/layout-b' + | '/classic/hello/universe' + | '/classic/hello/world' + | '/classic/hello/' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '' + | '/posts' + | '/posts/$postId' + | '/layout-a' + | '/layout-b' + | '/classic/hello/universe' + | '/classic/hello/world' + | '/classic/hello' + id: + | '__root__' + | '/' + | '/_first' + | '/posts' + | '/classic/hello' + | '/posts/' + | '/_first/_second' + | '/posts/$postId' + | '/_first/_second/layout-a' + | '/_first/_second/layout-b' + | '/classic/hello/universe' + | '/classic/hello/world' + | '/classic/hello/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + homeRoute: typeof homeRoute + layoutFirstLayoutRoute: typeof layoutFirstLayoutRouteWithChildren + postsPostsRoute: typeof postsPostsRouteWithChildren + ClassicHelloRouteRoute: typeof ClassicHelloRouteRouteWithChildren +} + +const rootRouteChildren: RootRouteChildren = { + homeRoute: homeRoute, + layoutFirstLayoutRoute: layoutFirstLayoutRouteWithChildren, + postsPostsRoute: postsPostsRouteWithChildren, + ClassicHelloRouteRoute: ClassicHelloRouteRouteWithChildren, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "root.tsx", + "children": [ + "/", + "/_first", + "/posts", + "/classic/hello" + ] + }, + "/": { + "filePath": "home.tsx" + }, + "/_first": { + "filePath": "layout/first-layout.tsx", + "children": [ + "/_first/_second" + ] + }, + "/posts": { + "filePath": "posts/posts.tsx", + "children": [ + "/posts/", + "/posts/$postId" + ] + }, + "/classic/hello": { + "filePath": "file-based-subtree/hello/route.tsx", + "children": [ + "/classic/hello/universe", + "/classic/hello/world", + "/classic/hello/" + ] + }, + "/posts/": { + "filePath": "posts/posts-home.tsx", + "parent": "/posts" + }, + "/_first/_second": { + "filePath": "layout/second-layout.tsx", + "parent": "/_first", + "children": [ + "/_first/_second/layout-a", + "/_first/_second/layout-b" + ] + }, + "/posts/$postId": { + "filePath": "posts/posts-detail.tsx", + "parent": "/posts" + }, + "/_first/_second/layout-a": { + "filePath": "a.tsx", + "parent": "/_first/_second" + }, + "/_first/_second/layout-b": { + "filePath": "b.tsx", + "parent": "/_first/_second" + }, + "/classic/hello/universe": { + "filePath": "file-based-subtree/hello/universe.tsx", + "parent": "/classic/hello" + }, + "/classic/hello/world": { + "filePath": "file-based-subtree/hello/world.tsx", + "parent": "/classic/hello" + }, + "/classic/hello/": { + "filePath": "file-based-subtree/hello/index.tsx", + "parent": "/classic/hello" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/examples/react/basic-virtual-file-based/src/routes/a.tsx b/examples/react/basic-virtual-file-based/src/routes/a.tsx new file mode 100644 index 0000000000..6cccd02950 --- /dev/null +++ b/examples/react/basic-virtual-file-based/src/routes/a.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_first/_second/layout-a')({ + component: LayoutAComponent, +}) + +function LayoutAComponent() { + return
I'm layout A!
+} diff --git a/examples/react/basic-virtual-file-based/src/routes/b.tsx b/examples/react/basic-virtual-file-based/src/routes/b.tsx new file mode 100644 index 0000000000..98bb842612 --- /dev/null +++ b/examples/react/basic-virtual-file-based/src/routes/b.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_first/_second/layout-b')({ + component: LayoutBComponent, +}) + +function LayoutBComponent() { + return
I'm layout B!
+} diff --git a/examples/react/basic-virtual-file-based/src/routes/file-based-subtree/hello/index.tsx b/examples/react/basic-virtual-file-based/src/routes/file-based-subtree/hello/index.tsx new file mode 100644 index 0000000000..7a6d5e3bd3 --- /dev/null +++ b/examples/react/basic-virtual-file-based/src/routes/file-based-subtree/hello/index.tsx @@ -0,0 +1,5 @@ +import { Link, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/classic/hello/')({ + component: () =>
This is the index
, +}) diff --git a/examples/react/basic-virtual-file-based/src/routes/file-based-subtree/hello/route.tsx b/examples/react/basic-virtual-file-based/src/routes/file-based-subtree/hello/route.tsx new file mode 100644 index 0000000000..566efc8777 --- /dev/null +++ b/examples/react/basic-virtual-file-based/src/routes/file-based-subtree/hello/route.tsx @@ -0,0 +1,27 @@ +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/classic/hello')({ + component: () => ( +
+ Hello! +
{' '} + + say hello to the universe + {' '} + + say hello to the world + + +
+ ), +}) diff --git a/examples/react/basic-virtual-file-based/src/routes/file-based-subtree/hello/universe.tsx b/examples/react/basic-virtual-file-based/src/routes/file-based-subtree/hello/universe.tsx new file mode 100644 index 0000000000..e00c47d74b --- /dev/null +++ b/examples/react/basic-virtual-file-based/src/routes/file-based-subtree/hello/universe.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/classic/hello/universe')({ + component: () =>
Hello /classic/hello/universe!
, +}) diff --git a/examples/react/basic-virtual-file-based/src/routes/file-based-subtree/hello/world.tsx b/examples/react/basic-virtual-file-based/src/routes/file-based-subtree/hello/world.tsx new file mode 100644 index 0000000000..9783557342 --- /dev/null +++ b/examples/react/basic-virtual-file-based/src/routes/file-based-subtree/hello/world.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/classic/hello/world')({ + component: () =>
Hello /classic/hello/world!
, +}) diff --git a/examples/react/basic-virtual-file-based/src/routes/home.tsx b/examples/react/basic-virtual-file-based/src/routes/home.tsx new file mode 100644 index 0000000000..eac82a9174 --- /dev/null +++ b/examples/react/basic-virtual-file-based/src/routes/home.tsx @@ -0,0 +1,14 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: Home, +}) + +function Home() { + return ( +
+

Welcome Home!

+
+ ) +} diff --git a/examples/react/basic-virtual-file-based/src/routes/layout/first-layout.tsx b/examples/react/basic-virtual-file-based/src/routes/layout/first-layout.tsx new file mode 100644 index 0000000000..d39e206f2d --- /dev/null +++ b/examples/react/basic-virtual-file-based/src/routes/layout/first-layout.tsx @@ -0,0 +1,16 @@ +import { Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_first')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a layout
+
+ +
+
+ ) +} diff --git a/examples/react/basic-virtual-file-based/src/routes/layout/second-layout.tsx b/examples/react/basic-virtual-file-based/src/routes/layout/second-layout.tsx new file mode 100644 index 0000000000..ef178a6e16 --- /dev/null +++ b/examples/react/basic-virtual-file-based/src/routes/layout/second-layout.tsx @@ -0,0 +1,34 @@ +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_first/_second')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a nested layout
+
+ + Layout A + + + Layout B + +
+
+ +
+
+ ) +} diff --git a/examples/react/basic-virtual-file-based/src/routes/posts/posts-detail.tsx b/examples/react/basic-virtual-file-based/src/routes/posts/posts-detail.tsx new file mode 100644 index 0000000000..948d52d6d6 --- /dev/null +++ b/examples/react/basic-virtual-file-based/src/routes/posts/posts-detail.tsx @@ -0,0 +1,28 @@ +import * as React from 'react' +import { ErrorComponent, createFileRoute } from '@tanstack/react-router' +import { fetchPost } from '../../posts' +import type { ErrorComponentProps } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/$postId')({ + loader: async ({ params: { postId } }) => fetchPost(postId), + errorComponent: PostErrorComponent as any, + notFoundComponent: () => { + return

Post not found

+ }, + component: PostComponent, +}) + +export function PostErrorComponent({ error }: ErrorComponentProps) { + return +} + +function PostComponent() { + const post = Route.useLoaderData() + + return ( +
+

{post.title}

+
{post.body}
+
+ ) +} diff --git a/examples/react/basic-virtual-file-based/src/routes/posts/posts-home.tsx b/examples/react/basic-virtual-file-based/src/routes/posts/posts-home.tsx new file mode 100644 index 0000000000..056433ca0a --- /dev/null +++ b/examples/react/basic-virtual-file-based/src/routes/posts/posts-home.tsx @@ -0,0 +1,10 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/')({ + component: PostsIndexComponent, +}) + +function PostsIndexComponent() { + return
Select a post.
+} diff --git a/examples/react/basic-virtual-file-based/src/routes/posts/posts.tsx b/examples/react/basic-virtual-file-based/src/routes/posts/posts.tsx new file mode 100644 index 0000000000..a2ab1ee388 --- /dev/null +++ b/examples/react/basic-virtual-file-based/src/routes/posts/posts.tsx @@ -0,0 +1,39 @@ +import * as React from 'react' +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' +import { fetchPosts } from '../../posts' + +export const Route = createFileRoute('/posts')({ + loader: fetchPosts, + component: PostsComponent, +}) + +function PostsComponent() { + const posts = Route.useLoaderData() + + return ( +
+
    + {[...posts, { id: 'i-do-not-exist', title: 'Non-existent Post' }].map( + (post) => { + return ( +
  • + +
    {post.title.substring(0, 20)}
    + +
  • + ) + }, + )} +
+
+ +
+ ) +} diff --git a/examples/react/basic-virtual-file-based/src/routes/root.tsx b/examples/react/basic-virtual-file-based/src/routes/root.tsx new file mode 100644 index 0000000000..05ac9527f3 --- /dev/null +++ b/examples/react/basic-virtual-file-based/src/routes/root.tsx @@ -0,0 +1,70 @@ +import * as React from 'react' +import { Link, Outlet, createRootRoute } from '@tanstack/react-router' +import { TanStackRouterDevtools } from '@tanstack/router-devtools' + +export const Route = createRootRoute({ + component: RootComponent, + notFoundComponent: () => { + return ( +
+

This is the notFoundComponent configured on root route

+ Start Over +
+ ) + }, +}) + +function RootComponent() { + return ( + <> +
+ + Home + {' '} + + Posts + {' '} + + Layout + {' '} + + Subtree + {' '} + + This Route Does Not Exist + +
+
+ + {/* Start rendering router matches */} + + + ) +} diff --git a/examples/react/basic-virtual-file-based/tsconfig.dev.json b/examples/react/basic-virtual-file-based/tsconfig.dev.json new file mode 100644 index 0000000000..285a09b0dc --- /dev/null +++ b/examples/react/basic-virtual-file-based/tsconfig.dev.json @@ -0,0 +1,10 @@ +{ + "composite": true, + "extends": "../../../tsconfig.base.json", + + "files": ["src/main.tsx"], + "include": [ + "src" + // "__tests__/**/*.test.*" + ] +} diff --git a/examples/react/basic-virtual-file-based/tsconfig.json b/examples/react/basic-virtual-file-based/tsconfig.json new file mode 100644 index 0000000000..3c2cd577d6 --- /dev/null +++ b/examples/react/basic-virtual-file-based/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "module": "Preserve", + "moduleResolution": "Bundler", + "target": "ESNext" + } +} diff --git a/examples/react/basic-virtual-file-based/vite.config.ts b/examples/react/basic-virtual-file-based/vite.config.ts new file mode 100644 index 0000000000..c1b8574783 --- /dev/null +++ b/examples/react/basic-virtual-file-based/vite.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import { TanStackRouterVite } from '@tanstack/router-plugin/vite' +import { routes } from './routes' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [TanStackRouterVite({ virtualRouteConfig: routes }), react()], +}) diff --git a/examples/react/basic-virtual-inside-file-based/.gitignore b/examples/react/basic-virtual-inside-file-based/.gitignore new file mode 100644 index 0000000000..a6ea47e508 --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/.gitignore @@ -0,0 +1,10 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local + +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/examples/react/basic-virtual-inside-file-based/README.md b/examples/react/basic-virtual-inside-file-based/README.md new file mode 100644 index 0000000000..115199d292 --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/README.md @@ -0,0 +1,6 @@ +# Example + +To run this example: + +- `npm install` or `yarn` +- `npm start` or `yarn start` diff --git a/examples/react/basic-virtual-inside-file-based/index.html b/examples/react/basic-virtual-inside-file-based/index.html new file mode 100644 index 0000000000..a4b3349437 --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/index.html @@ -0,0 +1,24 @@ + + + + + + Vite App + + + + +
+ + + diff --git a/examples/react/basic-virtual-inside-file-based/package.json b/examples/react/basic-virtual-inside-file-based/package.json new file mode 100644 index 0000000000..4ce76abd94 --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/package.json @@ -0,0 +1,28 @@ +{ + "name": "tanstack-router-react-example-basic-virtual-inside-file-based", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port=3001", + "build": "vite build && tsc --noEmit", + "serve": "vite preview", + "start": "vite" + }, + "dependencies": { + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", + "@tanstack/router-plugin": "^1.58.4", + "@tanstack/virtual-file-routes": "^1.56.0", + "immer": "^10.1.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "redaxios": "^0.5.1", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/react": "^18.2.47", + "@types/react-dom": "^18.2.18", + "@vitejs/plugin-react": "^4.3.1", + "vite": "^5.4.5" + } +} diff --git a/examples/react/basic-virtual-inside-file-based/src/main.tsx b/examples/react/basic-virtual-inside-file-based/src/main.tsx new file mode 100644 index 0000000000..18b1b603f8 --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/src/main.tsx @@ -0,0 +1,25 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import { RouterProvider, createRouter } from '@tanstack/react-router' +import { routeTree } from './routeTree.gen' + +// Set up a Router instance +const router = createRouter({ + routeTree, + defaultPreload: 'intent', + defaultStaleTime: 5000, +}) + +// Register things for typesafety +declare module '@tanstack/react-router' { + interface Register { + router: typeof router + } +} + +const rootElement = document.getElementById('app')! + +if (!rootElement.innerHTML) { + const root = ReactDOM.createRoot(rootElement) + root.render() +} diff --git a/examples/react/basic-virtual-inside-file-based/src/posts.tsx b/examples/react/basic-virtual-inside-file-based/src/posts.tsx new file mode 100644 index 0000000000..3ccf1ff421 --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/src/posts.tsx @@ -0,0 +1,32 @@ +import { notFound } from '@tanstack/react-router' +import axios from 'redaxios' + +export type PostType = { + id: string + title: string + body: string +} + +export const fetchPost = async (postId: string) => { + console.info(`Fetching post with id ${postId}...`) + await new Promise((r) => setTimeout(r, 500)) + const post = await axios + .get(`https://jsonplaceholder.typicode.com/posts/${postId}`) + .then((r) => r.data) + .catch((err) => { + if (err.status === 404) { + throw notFound() + } + throw err + }) + + return post +} + +export const fetchPosts = async () => { + console.info('Fetching posts...') + await new Promise((r) => setTimeout(r, 500)) + return axios + .get>('https://jsonplaceholder.typicode.com/posts') + .then((r) => r.data.slice(0, 10)) +} diff --git a/examples/react/basic-virtual-inside-file-based/src/routeTree.gen.ts b/examples/react/basic-virtual-inside-file-based/src/routeTree.gen.ts new file mode 100644 index 0000000000..d54a36a3be --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/src/routeTree.gen.ts @@ -0,0 +1,352 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/__root' +import { Route as PostsImport } from './routes/posts' +import { Route as LayoutImport } from './routes/_layout' +import { Route as IndexImport } from './routes/index' +import { Route as postsDetailsImport } from './routes/posts/details' +import { Route as LayoutLayout2Import } from './routes/_layout/_layout-2' +import { Route as postsHomeImport } from './routes/posts/home' +import { Route as postsLetsGoIndexImport } from './routes/posts/lets-go/index' +import { Route as LayoutLayout2LayoutBImport } from './routes/_layout/_layout-2/layout-b' +import { Route as LayoutLayout2LayoutAImport } from './routes/_layout/_layout-2/layout-a' +import { Route as postsLetsGoDeeperHomeImport } from './routes/posts/lets-go/deeper/home' + +// Create/Update Routes + +const PostsRoute = PostsImport.update({ + path: '/posts', + getParentRoute: () => rootRoute, +} as any) + +const LayoutRoute = LayoutImport.update({ + id: '/_layout', + getParentRoute: () => rootRoute, +} as any) + +const IndexRoute = IndexImport.update({ + path: '/', + getParentRoute: () => rootRoute, +} as any) + +const postsDetailsRoute = postsDetailsImport.update({ + path: '/$postId', + getParentRoute: () => PostsRoute, +} as any) + +const LayoutLayout2Route = LayoutLayout2Import.update({ + id: '/_layout-2', + getParentRoute: () => LayoutRoute, +} as any) + +const postsHomeRoute = postsHomeImport.update({ + path: '/', + getParentRoute: () => PostsRoute, +} as any) + +const postsLetsGoIndexRoute = postsLetsGoIndexImport.update({ + path: '/inception/', + getParentRoute: () => PostsRoute, +} as any) + +const LayoutLayout2LayoutBRoute = LayoutLayout2LayoutBImport.update({ + path: '/layout-b', + getParentRoute: () => LayoutLayout2Route, +} as any) + +const LayoutLayout2LayoutARoute = LayoutLayout2LayoutAImport.update({ + path: '/layout-a', + getParentRoute: () => LayoutLayout2Route, +} as any) + +const postsLetsGoDeeperHomeRoute = postsLetsGoDeeperHomeImport.update({ + path: '/inception/deeper/', + getParentRoute: () => PostsRoute, +} as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexImport + parentRoute: typeof rootRoute + } + '/_layout': { + id: '/_layout' + path: '' + fullPath: '' + preLoaderRoute: typeof LayoutImport + parentRoute: typeof rootRoute + } + '/posts': { + id: '/posts' + path: '/posts' + fullPath: '/posts' + preLoaderRoute: typeof PostsImport + parentRoute: typeof rootRoute + } + '/posts/': { + id: '/posts/' + path: '/' + fullPath: '/posts/' + preLoaderRoute: typeof postsHomeImport + parentRoute: typeof PostsImport + } + '/_layout/_layout-2': { + id: '/_layout/_layout-2' + path: '' + fullPath: '' + preLoaderRoute: typeof LayoutLayout2Import + parentRoute: typeof LayoutImport + } + '/posts/$postId': { + id: '/posts/$postId' + path: '/$postId' + fullPath: '/posts/$postId' + preLoaderRoute: typeof postsDetailsImport + parentRoute: typeof PostsImport + } + '/_layout/_layout-2/layout-a': { + id: '/_layout/_layout-2/layout-a' + path: '/layout-a' + fullPath: '/layout-a' + preLoaderRoute: typeof LayoutLayout2LayoutAImport + parentRoute: typeof LayoutLayout2Import + } + '/_layout/_layout-2/layout-b': { + id: '/_layout/_layout-2/layout-b' + path: '/layout-b' + fullPath: '/layout-b' + preLoaderRoute: typeof LayoutLayout2LayoutBImport + parentRoute: typeof LayoutLayout2Import + } + '/posts/inception/': { + id: '/posts/inception/' + path: '/inception' + fullPath: '/posts/inception' + preLoaderRoute: typeof postsLetsGoIndexImport + parentRoute: typeof PostsImport + } + '/posts/inception/deeper/': { + id: '/posts/inception/deeper/' + path: '/inception/deeper' + fullPath: '/posts/inception/deeper' + preLoaderRoute: typeof postsLetsGoDeeperHomeImport + parentRoute: typeof PostsImport + } + } +} + +// Create and export the route tree + +interface LayoutLayout2RouteChildren { + LayoutLayout2LayoutARoute: typeof LayoutLayout2LayoutARoute + LayoutLayout2LayoutBRoute: typeof LayoutLayout2LayoutBRoute +} + +const LayoutLayout2RouteChildren: LayoutLayout2RouteChildren = { + LayoutLayout2LayoutARoute: LayoutLayout2LayoutARoute, + LayoutLayout2LayoutBRoute: LayoutLayout2LayoutBRoute, +} + +const LayoutLayout2RouteWithChildren = LayoutLayout2Route._addFileChildren( + LayoutLayout2RouteChildren, +) + +interface LayoutRouteChildren { + LayoutLayout2Route: typeof LayoutLayout2RouteWithChildren +} + +const LayoutRouteChildren: LayoutRouteChildren = { + LayoutLayout2Route: LayoutLayout2RouteWithChildren, +} + +const LayoutRouteWithChildren = + LayoutRoute._addFileChildren(LayoutRouteChildren) + +interface PostsRouteChildren { + postsHomeRoute: typeof postsHomeRoute + postsDetailsRoute: typeof postsDetailsRoute + postsLetsGoIndexRoute: typeof postsLetsGoIndexRoute + postsLetsGoDeeperHomeRoute: typeof postsLetsGoDeeperHomeRoute +} + +const PostsRouteChildren: PostsRouteChildren = { + postsHomeRoute: postsHomeRoute, + postsDetailsRoute: postsDetailsRoute, + postsLetsGoIndexRoute: postsLetsGoIndexRoute, + postsLetsGoDeeperHomeRoute: postsLetsGoDeeperHomeRoute, +} + +const PostsRouteWithChildren = PostsRoute._addFileChildren(PostsRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '': typeof LayoutLayout2RouteWithChildren + '/posts': typeof PostsRouteWithChildren + '/posts/': typeof postsHomeRoute + '/posts/$postId': typeof postsDetailsRoute + '/layout-a': typeof LayoutLayout2LayoutARoute + '/layout-b': typeof LayoutLayout2LayoutBRoute + '/posts/inception': typeof postsLetsGoIndexRoute + '/posts/inception/deeper': typeof postsLetsGoDeeperHomeRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '': typeof LayoutLayout2RouteWithChildren + '/posts': typeof postsHomeRoute + '/posts/$postId': typeof postsDetailsRoute + '/layout-a': typeof LayoutLayout2LayoutARoute + '/layout-b': typeof LayoutLayout2LayoutBRoute + '/posts/inception': typeof postsLetsGoIndexRoute + '/posts/inception/deeper': typeof postsLetsGoDeeperHomeRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/_layout': typeof LayoutRouteWithChildren + '/posts': typeof PostsRouteWithChildren + '/posts/': typeof postsHomeRoute + '/_layout/_layout-2': typeof LayoutLayout2RouteWithChildren + '/posts/$postId': typeof postsDetailsRoute + '/_layout/_layout-2/layout-a': typeof LayoutLayout2LayoutARoute + '/_layout/_layout-2/layout-b': typeof LayoutLayout2LayoutBRoute + '/posts/inception/': typeof postsLetsGoIndexRoute + '/posts/inception/deeper/': typeof postsLetsGoDeeperHomeRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '' + | '/posts' + | '/posts/' + | '/posts/$postId' + | '/layout-a' + | '/layout-b' + | '/posts/inception' + | '/posts/inception/deeper' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '' + | '/posts' + | '/posts/$postId' + | '/layout-a' + | '/layout-b' + | '/posts/inception' + | '/posts/inception/deeper' + id: + | '__root__' + | '/' + | '/_layout' + | '/posts' + | '/posts/' + | '/_layout/_layout-2' + | '/posts/$postId' + | '/_layout/_layout-2/layout-a' + | '/_layout/_layout-2/layout-b' + | '/posts/inception/' + | '/posts/inception/deeper/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + LayoutRoute: typeof LayoutRouteWithChildren + PostsRoute: typeof PostsRouteWithChildren +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + LayoutRoute: LayoutRouteWithChildren, + PostsRoute: PostsRouteWithChildren, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [ + "/", + "/_layout", + "/posts" + ] + }, + "/": { + "filePath": "index.tsx" + }, + "/_layout": { + "filePath": "_layout.tsx", + "children": [ + "/_layout/_layout-2" + ] + }, + "/posts": { + "filePath": "posts.tsx", + "children": [ + "/posts/", + "/posts/$postId", + "/posts/inception/", + "/posts/inception/deeper/" + ] + }, + "/posts/": { + "filePath": "posts/home.tsx", + "parent": "/posts" + }, + "/_layout/_layout-2": { + "filePath": "_layout/_layout-2.tsx", + "parent": "/_layout", + "children": [ + "/_layout/_layout-2/layout-a", + "/_layout/_layout-2/layout-b" + ] + }, + "/posts/$postId": { + "filePath": "posts/details.tsx", + "parent": "/posts" + }, + "/_layout/_layout-2/layout-a": { + "filePath": "_layout/_layout-2/layout-a.tsx", + "parent": "/_layout/_layout-2" + }, + "/_layout/_layout-2/layout-b": { + "filePath": "_layout/_layout-2/layout-b.tsx", + "parent": "/_layout/_layout-2" + }, + "/posts/inception/": { + "filePath": "posts/lets-go/index.tsx", + "parent": "/posts" + }, + "/posts/inception/deeper/": { + "filePath": "posts/lets-go/deeper/home.tsx", + "parent": "/posts" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/examples/react/basic-virtual-inside-file-based/src/routes/__root.tsx b/examples/react/basic-virtual-inside-file-based/src/routes/__root.tsx new file mode 100644 index 0000000000..6b57d1e239 --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/src/routes/__root.tsx @@ -0,0 +1,62 @@ +import * as React from 'react' +import { Link, Outlet, createRootRoute } from '@tanstack/react-router' +import { TanStackRouterDevtools } from '@tanstack/router-devtools' + +export const Route = createRootRoute({ + component: RootComponent, + notFoundComponent: () => { + return ( +
+

This is the notFoundComponent configured on root route

+ Start Over +
+ ) + }, +}) + +function RootComponent() { + return ( + <> +
+ + Home + {' '} + + Posts + {' '} + + Layout + {' '} + + This Route Does Not Exist + +
+
+ + {/* Start rendering router matches */} + + + ) +} diff --git a/examples/react/basic-virtual-inside-file-based/src/routes/_layout.tsx b/examples/react/basic-virtual-inside-file-based/src/routes/_layout.tsx new file mode 100644 index 0000000000..02ddbb1cd9 --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/src/routes/_layout.tsx @@ -0,0 +1,16 @@ +import { Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a layout
+
+ +
+
+ ) +} diff --git a/examples/react/basic-virtual-inside-file-based/src/routes/_layout/_layout-2.tsx b/examples/react/basic-virtual-inside-file-based/src/routes/_layout/_layout-2.tsx new file mode 100644 index 0000000000..3b7dbf2903 --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/src/routes/_layout/_layout-2.tsx @@ -0,0 +1,34 @@ +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a nested layout
+
+ + Layout A + + + Layout B + +
+
+ +
+
+ ) +} diff --git a/examples/react/basic-virtual-inside-file-based/src/routes/_layout/_layout-2/layout-a.tsx b/examples/react/basic-virtual-inside-file-based/src/routes/_layout/_layout-2/layout-a.tsx new file mode 100644 index 0000000000..61e19b4d9f --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/src/routes/_layout/_layout-2/layout-a.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2/layout-a')({ + component: LayoutAComponent, +}) + +function LayoutAComponent() { + return
I'm layout A!
+} diff --git a/examples/react/basic-virtual-inside-file-based/src/routes/_layout/_layout-2/layout-b.tsx b/examples/react/basic-virtual-inside-file-based/src/routes/_layout/_layout-2/layout-b.tsx new file mode 100644 index 0000000000..cceed1fb9a --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/src/routes/_layout/_layout-2/layout-b.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/_layout-2/layout-b')({ + component: LayoutBComponent, +}) + +function LayoutBComponent() { + return
I'm layout B!
+} diff --git a/examples/react/basic-virtual-inside-file-based/src/routes/index.tsx b/examples/react/basic-virtual-inside-file-based/src/routes/index.tsx new file mode 100644 index 0000000000..eac82a9174 --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/src/routes/index.tsx @@ -0,0 +1,14 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: Home, +}) + +function Home() { + return ( +
+

Welcome Home!

+
+ ) +} diff --git a/examples/react/basic-virtual-inside-file-based/src/routes/posts.tsx b/examples/react/basic-virtual-inside-file-based/src/routes/posts.tsx new file mode 100644 index 0000000000..c7a09ed7f8 --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/src/routes/posts.tsx @@ -0,0 +1,39 @@ +import * as React from 'react' +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' +import { fetchPosts } from '../posts' + +export const Route = createFileRoute('/posts')({ + loader: fetchPosts, + component: PostsComponent, +}) + +function PostsComponent() { + const posts = Route.useLoaderData() + + return ( +
+
    + {[...posts, { id: 'i-do-not-exist', title: 'Non-existent Post' }].map( + (post) => { + return ( +
  • + +
    {post.title.substring(0, 20)}
    + +
  • + ) + }, + )} +
+
+ +
+ ) +} diff --git a/examples/react/basic-virtual-inside-file-based/src/routes/posts/__virtual.ts b/examples/react/basic-virtual-inside-file-based/src/routes/posts/__virtual.ts new file mode 100644 index 0000000000..afecfb2f97 --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/src/routes/posts/__virtual.ts @@ -0,0 +1,13 @@ +import { + defineVirtualSubtreeConfig, + index, + physical, + route, +} from '@tanstack/virtual-file-routes' + +// this just shows that you can use an async function to define your virtual routes +export default defineVirtualSubtreeConfig(async () => [ + index('home.tsx'), + route('$postId', 'details.tsx'), + physical('/inception', 'lets-go'), +]) diff --git a/examples/react/basic-virtual-inside-file-based/src/routes/posts/details.tsx b/examples/react/basic-virtual-inside-file-based/src/routes/posts/details.tsx new file mode 100644 index 0000000000..948d52d6d6 --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/src/routes/posts/details.tsx @@ -0,0 +1,28 @@ +import * as React from 'react' +import { ErrorComponent, createFileRoute } from '@tanstack/react-router' +import { fetchPost } from '../../posts' +import type { ErrorComponentProps } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/$postId')({ + loader: async ({ params: { postId } }) => fetchPost(postId), + errorComponent: PostErrorComponent as any, + notFoundComponent: () => { + return

Post not found

+ }, + component: PostComponent, +}) + +export function PostErrorComponent({ error }: ErrorComponentProps) { + return +} + +function PostComponent() { + const post = Route.useLoaderData() + + return ( +
+

{post.title}

+
{post.body}
+
+ ) +} diff --git a/examples/react/basic-virtual-inside-file-based/src/routes/posts/home.tsx b/examples/react/basic-virtual-inside-file-based/src/routes/posts/home.tsx new file mode 100644 index 0000000000..056433ca0a --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/src/routes/posts/home.tsx @@ -0,0 +1,10 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/')({ + component: PostsIndexComponent, +}) + +function PostsIndexComponent() { + return
Select a post.
+} diff --git a/examples/react/basic-virtual-inside-file-based/src/routes/posts/lets-go/deeper/__virtual.ts b/examples/react/basic-virtual-inside-file-based/src/routes/posts/lets-go/deeper/__virtual.ts new file mode 100644 index 0000000000..1c82ce7a2c --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/src/routes/posts/lets-go/deeper/__virtual.ts @@ -0,0 +1,6 @@ +import { + defineVirtualSubtreeConfig, + index, +} from '@tanstack/virtual-file-routes' + +export default defineVirtualSubtreeConfig([index('home.tsx')]) diff --git a/examples/react/basic-virtual-inside-file-based/src/routes/posts/lets-go/deeper/home.tsx b/examples/react/basic-virtual-inside-file-based/src/routes/posts/lets-go/deeper/home.tsx new file mode 100644 index 0000000000..11f7fa95ca --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/src/routes/posts/lets-go/deeper/home.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/inception/deeper/')({ + component: () =>
Hello /posts/inception/deeper/!
, +}) diff --git a/examples/react/basic-virtual-inside-file-based/src/routes/posts/lets-go/index.tsx b/examples/react/basic-virtual-inside-file-based/src/routes/posts/lets-go/index.tsx new file mode 100644 index 0000000000..964ab3c900 --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/src/routes/posts/lets-go/index.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/inception/')({ + component: () =>
Hello /posts/inception/!
, +}) diff --git a/examples/react/basic-virtual-inside-file-based/tsconfig.dev.json b/examples/react/basic-virtual-inside-file-based/tsconfig.dev.json new file mode 100644 index 0000000000..285a09b0dc --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/tsconfig.dev.json @@ -0,0 +1,10 @@ +{ + "composite": true, + "extends": "../../../tsconfig.base.json", + + "files": ["src/main.tsx"], + "include": [ + "src" + // "__tests__/**/*.test.*" + ] +} diff --git a/examples/react/basic-virtual-inside-file-based/tsconfig.json b/examples/react/basic-virtual-inside-file-based/tsconfig.json new file mode 100644 index 0000000000..4c7f4aeb83 --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "target": "ESNext", + "module": "Preserve", + "moduleResolution": "Bundler" + } +} diff --git a/examples/react/basic-virtual-inside-file-based/vite.config.ts b/examples/react/basic-virtual-inside-file-based/vite.config.ts new file mode 100644 index 0000000000..9cb8cad864 --- /dev/null +++ b/examples/react/basic-virtual-inside-file-based/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import { TanStackRouterVite } from '@tanstack/router-plugin/vite' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [TanStackRouterVite(), react()], +}) diff --git a/examples/react/basic/package.json b/examples/react/basic/package.json index ce409469e5..c0262b9af4 100644 --- a/examples/react/basic/package.json +++ b/examples/react/basic/package.json @@ -4,23 +4,21 @@ "type": "module", "scripts": { "dev": "vite --port=3001", - "build": "vite build", + "build": "vite build && tsc --noEmit", "serve": "vite preview", - "start": "vite", - "test:e2e": "playwright test --project=chromium" + "start": "vite" }, "dependencies": { - "@tanstack/react-router": "^1.51.2", - "@tanstack/router-devtools": "^1.51.2", + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", "react": "^18.2.0", "react-dom": "^18.2.0", "redaxios": "^0.5.1" }, "devDependencies": { - "@playwright/test": "^1.45.3", "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", "@vitejs/plugin-react": "^4.3.1", - "vite": "^5.3.5" + "vite": "^5.4.5" } } diff --git a/examples/react/basic/src/main.tsx b/examples/react/basic/src/main.tsx index dc0fa2b3c6..f75bdb8629 100644 --- a/examples/react/basic/src/main.tsx +++ b/examples/react/basic/src/main.tsx @@ -38,7 +38,7 @@ function RootComponent() { Home {' '} {' '} () /* prettier-ignore-end */ diff --git a/examples/react/kitchen-sink-file-based/src/routes/dashboard.users.tsx b/examples/react/kitchen-sink-file-based/src/routes/dashboard.users.tsx index 9a0d2e32f8..1de6c892f1 100644 --- a/examples/react/kitchen-sink-file-based/src/routes/dashboard.users.tsx +++ b/examples/react/kitchen-sink-file-based/src/routes/dashboard.users.tsx @@ -124,10 +124,9 @@ function UsersComponent() { {user.name}{' '} ({ - ...d, + search={{ userId: user.id, - })} + }} pending > {(match) => } diff --git a/examples/react/kitchen-sink-file-based/tsconfig.json b/examples/react/kitchen-sink-file-based/tsconfig.json index c9e17e2b68..0d2a31a7d7 100644 --- a/examples/react/kitchen-sink-file-based/tsconfig.json +++ b/examples/react/kitchen-sink-file-based/tsconfig.json @@ -2,6 +2,9 @@ "compilerOptions": { "strict": true, "esModuleInterop": true, - "jsx": "react-jsx" + "jsx": "react-jsx", + "target": "ESNext", + "moduleResolution": "Bundler", + "module": "ESNext" } } diff --git a/examples/react/kitchen-sink-react-query-file-based/package.json b/examples/react/kitchen-sink-react-query-file-based/package.json index b16a14380e..f7098eb21e 100644 --- a/examples/react/kitchen-sink-react-query-file-based/package.json +++ b/examples/react/kitchen-sink-react-query-file-based/package.json @@ -9,11 +9,11 @@ "start": "vite" }, "dependencies": { - "@tanstack/react-query": "^5.51.21", - "@tanstack/react-query-devtools": "^5.51.21", - "@tanstack/react-router": "^1.51.2", - "@tanstack/router-devtools": "^1.51.2", - "@tanstack/router-plugin": "^1.51.0", + "@tanstack/react-query": "^5.56.2", + "@tanstack/react-query-devtools": "^5.56.2", + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", + "@tanstack/router-plugin": "^1.58.4", "immer": "^10.1.1", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -24,6 +24,6 @@ "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", "@vitejs/plugin-react": "^4.3.1", - "vite": "^5.3.5" + "vite": "^5.4.5" } } diff --git a/examples/react/kitchen-sink-react-query-file-based/src/routeTree.gen.ts b/examples/react/kitchen-sink-react-query-file-based/src/routeTree.gen.ts index 2e8620e3f0..e7c0895a6c 100644 --- a/examples/react/kitchen-sink-react-query-file-based/src/routeTree.gen.ts +++ b/examples/react/kitchen-sink-react-query-file-based/src/routeTree.gen.ts @@ -19,6 +19,7 @@ import { Route as LayoutImport } from './routes/_layout' import { Route as AuthImport } from './routes/_auth' import { Route as IndexImport } from './routes/index' import { Route as DashboardIndexImport } from './routes/dashboard.index' +import { Route as FooBarImport } from './routes/foo/bar' import { Route as DashboardUsersImport } from './routes/dashboard.users' import { Route as DashboardInvoicesImport } from './routes/dashboard.invoices' import { Route as LayoutLayoutBImport } from './routes/_layout.layout-b' @@ -72,6 +73,11 @@ const DashboardIndexRoute = DashboardIndexImport.update({ getParentRoute: () => DashboardRoute, } as any) +const FooBarRoute = FooBarImport.update({ + path: '/foo/bar', + getParentRoute: () => rootRoute, +} as any) + const DashboardUsersRoute = DashboardUsersImport.update({ path: '/users', getParentRoute: () => DashboardRoute, @@ -193,6 +199,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof DashboardUsersImport parentRoute: typeof DashboardImport } + '/foo/bar': { + id: '/foo/bar' + path: '/foo/bar' + fullPath: '/foo/bar' + preLoaderRoute: typeof FooBarImport + parentRoute: typeof rootRoute + } '/dashboard/': { id: '/dashboard/' path: '/' @@ -240,27 +253,207 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ - IndexRoute, - AuthRoute: AuthRoute.addChildren({ AuthProfileRoute }), - LayoutRoute: LayoutRoute.addChildren({ - LayoutLayoutARoute, - LayoutLayoutBRoute, - }), - DashboardRoute: DashboardRoute.addChildren({ - DashboardInvoicesRoute: DashboardInvoicesRoute.addChildren({ - DashboardInvoicesInvoiceIdRoute, - DashboardInvoicesIndexRoute, - }), - DashboardUsersRoute: DashboardUsersRoute.addChildren({ - DashboardUsersUserRoute, - DashboardUsersIndexRoute, - }), - DashboardIndexRoute, - }), - LoginRoute, - ExpensiveIndexLazyRoute, -}) +interface AuthRouteChildren { + AuthProfileRoute: typeof AuthProfileRoute +} + +const AuthRouteChildren: AuthRouteChildren = { + AuthProfileRoute: AuthProfileRoute, +} + +const AuthRouteWithChildren = AuthRoute._addFileChildren(AuthRouteChildren) + +interface LayoutRouteChildren { + LayoutLayoutARoute: typeof LayoutLayoutARoute + LayoutLayoutBRoute: typeof LayoutLayoutBRoute +} + +const LayoutRouteChildren: LayoutRouteChildren = { + LayoutLayoutARoute: LayoutLayoutARoute, + LayoutLayoutBRoute: LayoutLayoutBRoute, +} + +const LayoutRouteWithChildren = + LayoutRoute._addFileChildren(LayoutRouteChildren) + +interface DashboardInvoicesRouteChildren { + DashboardInvoicesInvoiceIdRoute: typeof DashboardInvoicesInvoiceIdRoute + DashboardInvoicesIndexRoute: typeof DashboardInvoicesIndexRoute +} + +const DashboardInvoicesRouteChildren: DashboardInvoicesRouteChildren = { + DashboardInvoicesInvoiceIdRoute: DashboardInvoicesInvoiceIdRoute, + DashboardInvoicesIndexRoute: DashboardInvoicesIndexRoute, +} + +const DashboardInvoicesRouteWithChildren = + DashboardInvoicesRoute._addFileChildren(DashboardInvoicesRouteChildren) + +interface DashboardUsersRouteChildren { + DashboardUsersUserRoute: typeof DashboardUsersUserRoute + DashboardUsersIndexRoute: typeof DashboardUsersIndexRoute +} + +const DashboardUsersRouteChildren: DashboardUsersRouteChildren = { + DashboardUsersUserRoute: DashboardUsersUserRoute, + DashboardUsersIndexRoute: DashboardUsersIndexRoute, +} + +const DashboardUsersRouteWithChildren = DashboardUsersRoute._addFileChildren( + DashboardUsersRouteChildren, +) + +interface DashboardRouteChildren { + DashboardInvoicesRoute: typeof DashboardInvoicesRouteWithChildren + DashboardUsersRoute: typeof DashboardUsersRouteWithChildren + DashboardIndexRoute: typeof DashboardIndexRoute +} + +const DashboardRouteChildren: DashboardRouteChildren = { + DashboardInvoicesRoute: DashboardInvoicesRouteWithChildren, + DashboardUsersRoute: DashboardUsersRouteWithChildren, + DashboardIndexRoute: DashboardIndexRoute, +} + +const DashboardRouteWithChildren = DashboardRoute._addFileChildren( + DashboardRouteChildren, +) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '': typeof LayoutRouteWithChildren + '/dashboard': typeof DashboardRouteWithChildren + '/login': typeof LoginRoute + '/profile': typeof AuthProfileRoute + '/layout-a': typeof LayoutLayoutARoute + '/layout-b': typeof LayoutLayoutBRoute + '/dashboard/invoices': typeof DashboardInvoicesRouteWithChildren + '/dashboard/users': typeof DashboardUsersRouteWithChildren + '/foo/bar': typeof FooBarRoute + '/dashboard/': typeof DashboardIndexRoute + '/expensive': typeof ExpensiveIndexLazyRoute + '/dashboard/invoices/$invoiceId': typeof DashboardInvoicesInvoiceIdRoute + '/dashboard/users/user': typeof DashboardUsersUserRoute + '/dashboard/invoices/': typeof DashboardInvoicesIndexRoute + '/dashboard/users/': typeof DashboardUsersIndexRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '': typeof LayoutRouteWithChildren + '/login': typeof LoginRoute + '/profile': typeof AuthProfileRoute + '/layout-a': typeof LayoutLayoutARoute + '/layout-b': typeof LayoutLayoutBRoute + '/foo/bar': typeof FooBarRoute + '/dashboard': typeof DashboardIndexRoute + '/expensive': typeof ExpensiveIndexLazyRoute + '/dashboard/invoices/$invoiceId': typeof DashboardInvoicesInvoiceIdRoute + '/dashboard/users/user': typeof DashboardUsersUserRoute + '/dashboard/invoices': typeof DashboardInvoicesIndexRoute + '/dashboard/users': typeof DashboardUsersIndexRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/_auth': typeof AuthRouteWithChildren + '/_layout': typeof LayoutRouteWithChildren + '/dashboard': typeof DashboardRouteWithChildren + '/login': typeof LoginRoute + '/_auth/profile': typeof AuthProfileRoute + '/_layout/layout-a': typeof LayoutLayoutARoute + '/_layout/layout-b': typeof LayoutLayoutBRoute + '/dashboard/invoices': typeof DashboardInvoicesRouteWithChildren + '/dashboard/users': typeof DashboardUsersRouteWithChildren + '/foo/bar': typeof FooBarRoute + '/dashboard/': typeof DashboardIndexRoute + '/expensive/': typeof ExpensiveIndexLazyRoute + '/dashboard/invoices/$invoiceId': typeof DashboardInvoicesInvoiceIdRoute + '/dashboard/users/user': typeof DashboardUsersUserRoute + '/dashboard/invoices/': typeof DashboardInvoicesIndexRoute + '/dashboard/users/': typeof DashboardUsersIndexRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '' + | '/dashboard' + | '/login' + | '/profile' + | '/layout-a' + | '/layout-b' + | '/dashboard/invoices' + | '/dashboard/users' + | '/foo/bar' + | '/dashboard/' + | '/expensive' + | '/dashboard/invoices/$invoiceId' + | '/dashboard/users/user' + | '/dashboard/invoices/' + | '/dashboard/users/' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '' + | '/login' + | '/profile' + | '/layout-a' + | '/layout-b' + | '/foo/bar' + | '/dashboard' + | '/expensive' + | '/dashboard/invoices/$invoiceId' + | '/dashboard/users/user' + | '/dashboard/invoices' + | '/dashboard/users' + id: + | '__root__' + | '/' + | '/_auth' + | '/_layout' + | '/dashboard' + | '/login' + | '/_auth/profile' + | '/_layout/layout-a' + | '/_layout/layout-b' + | '/dashboard/invoices' + | '/dashboard/users' + | '/foo/bar' + | '/dashboard/' + | '/expensive/' + | '/dashboard/invoices/$invoiceId' + | '/dashboard/users/user' + | '/dashboard/invoices/' + | '/dashboard/users/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + AuthRoute: typeof AuthRouteWithChildren + LayoutRoute: typeof LayoutRouteWithChildren + DashboardRoute: typeof DashboardRouteWithChildren + LoginRoute: typeof LoginRoute + FooBarRoute: typeof FooBarRoute + ExpensiveIndexLazyRoute: typeof ExpensiveIndexLazyRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + AuthRoute: AuthRouteWithChildren, + LayoutRoute: LayoutRouteWithChildren, + DashboardRoute: DashboardRouteWithChildren, + LoginRoute: LoginRoute, + FooBarRoute: FooBarRoute, + ExpensiveIndexLazyRoute: ExpensiveIndexLazyRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ @@ -275,6 +468,7 @@ export const routeTree = rootRoute.addChildren({ "/_layout", "/dashboard", "/login", + "/foo/bar", "/expensive/" ] }, @@ -333,6 +527,9 @@ export const routeTree = rootRoute.addChildren({ "/dashboard/users/" ] }, + "/foo/bar": { + "filePath": "foo/bar.tsx" + }, "/dashboard/": { "filePath": "dashboard.index.tsx", "parent": "/dashboard" diff --git a/examples/react/kitchen-sink-react-query-file-based/src/routes/dashboard.users.tsx b/examples/react/kitchen-sink-react-query-file-based/src/routes/dashboard.users.tsx index 3c41d5c3b6..6814d5b93f 100644 --- a/examples/react/kitchen-sink-react-query-file-based/src/routes/dashboard.users.tsx +++ b/examples/react/kitchen-sink-react-query-file-based/src/routes/dashboard.users.tsx @@ -139,10 +139,9 @@ function UsersComponent() { {user.name}{' '} ({ - ...d, + search={{ userId: user.id, - })} + }} pending > {(match) => } diff --git a/examples/react/kitchen-sink-react-query-file-based/src/routes/foo/bar.tsx b/examples/react/kitchen-sink-react-query-file-based/src/routes/foo/bar.tsx new file mode 100644 index 0000000000..aa5920563e --- /dev/null +++ b/examples/react/kitchen-sink-react-query-file-based/src/routes/foo/bar.tsx @@ -0,0 +1,7 @@ +import { createFileRoute } from '@tanstack/react-router' +import { z } from 'zod' + +export const Route = createFileRoute('/foo/bar')({ + component: () =>
{JSON.stringify(Route.useSearch())}
, + validateSearch: z.object({ asdf: z.string() }), +}) diff --git a/examples/react/kitchen-sink-react-query/package.json b/examples/react/kitchen-sink-react-query/package.json index 697ec027cc..22332d37b5 100644 --- a/examples/react/kitchen-sink-react-query/package.json +++ b/examples/react/kitchen-sink-react-query/package.json @@ -4,15 +4,15 @@ "type": "module", "scripts": { "dev": "vite --port=3001", - "build": "vite build", + "build": "vite build && tsc --noEmit", "serve": "vite preview", "start": "vite" }, "dependencies": { - "@tanstack/react-query": "^5.51.21", - "@tanstack/react-query-devtools": "^5.51.21", - "@tanstack/react-router": "^1.51.2", - "@tanstack/router-devtools": "^1.51.2", + "@tanstack/react-query": "^5.56.2", + "@tanstack/react-query-devtools": "^5.56.2", + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", "redaxios": "^0.5.1", "immer": "^10.1.1", "react": "^18.2.0", @@ -23,6 +23,6 @@ "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", "@vitejs/plugin-react": "^4.3.1", - "vite": "^5.3.5" + "vite": "^5.4.5" } } diff --git a/examples/react/kitchen-sink-react-query/src/main.tsx b/examples/react/kitchen-sink-react-query/src/main.tsx index 808a071fb7..d0895cfce6 100644 --- a/examples/react/kitchen-sink-react-query/src/main.tsx +++ b/examples/react/kitchen-sink-react-query/src/main.tsx @@ -72,7 +72,13 @@ const usersQueryOptions = ({ const userQueryOptions = (userId: number) => queryOptions({ queryKey: ['users', userId], - queryFn: () => fetchUserById(userId), + queryFn: async () => { + const user = await fetchUserById(userId) + if (!user) { + throw new Error('User not found.') + } + return user + }, }) const useCreateInvoiceMutation = () => { @@ -648,10 +654,9 @@ function UsersComponent() { {user.name}{' '} ({ - ...d, + search={{ userId: user.id, - })} + }} pending > {(match) => } diff --git a/examples/react/kitchen-sink-react-query/tsconfig.json b/examples/react/kitchen-sink-react-query/tsconfig.json index c9e17e2b68..0d2a31a7d7 100644 --- a/examples/react/kitchen-sink-react-query/tsconfig.json +++ b/examples/react/kitchen-sink-react-query/tsconfig.json @@ -2,6 +2,9 @@ "compilerOptions": { "strict": true, "esModuleInterop": true, - "jsx": "react-jsx" + "jsx": "react-jsx", + "target": "ESNext", + "moduleResolution": "Bundler", + "module": "ESNext" } } diff --git a/examples/react/kitchen-sink/package.json b/examples/react/kitchen-sink/package.json index 76a70828d9..2869e9e43a 100644 --- a/examples/react/kitchen-sink/package.json +++ b/examples/react/kitchen-sink/package.json @@ -4,13 +4,13 @@ "type": "module", "scripts": { "dev": "vite --port=3001", - "build": "vite build", + "build": "vite build && tsc --noEmit", "serve": "vite preview", "start": "vite" }, "dependencies": { - "@tanstack/react-router": "^1.51.2", - "@tanstack/router-devtools": "^1.51.2", + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", "redaxios": "^0.5.1", "immer": "^10.1.1", "react": "^18.2.0", @@ -21,6 +21,6 @@ "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", "@vitejs/plugin-react": "^4.3.1", - "vite": "^5.3.5" + "vite": "^5.4.5" } } diff --git a/examples/react/kitchen-sink/src/main.tsx b/examples/react/kitchen-sink/src/main.tsx index 5655916701..ee8cc5a259 100644 --- a/examples/react/kitchen-sink/src/main.tsx +++ b/examples/react/kitchen-sink/src/main.tsx @@ -555,10 +555,9 @@ function UsersComponent() { {user.name}{' '} ({ - ...d, + search={{ userId: user.id, - })} + }} pending > {(match) => } diff --git a/examples/react/kitchen-sink/tsconfig.json b/examples/react/kitchen-sink/tsconfig.json index c9e17e2b68..0d2a31a7d7 100644 --- a/examples/react/kitchen-sink/tsconfig.json +++ b/examples/react/kitchen-sink/tsconfig.json @@ -2,6 +2,9 @@ "compilerOptions": { "strict": true, "esModuleInterop": true, - "jsx": "react-jsx" + "jsx": "react-jsx", + "target": "ESNext", + "moduleResolution": "Bundler", + "module": "ESNext" } } diff --git a/examples/react/large-file-based/package.json b/examples/react/large-file-based/package.json index e9d78c0f7d..91e1ce2eb8 100644 --- a/examples/react/large-file-based/package.json +++ b/examples/react/large-file-based/package.json @@ -4,18 +4,17 @@ "type": "module", "scripts": { "dev": "vite --port=3001", - "build": "vite build", + "build": "vite build && tsc --noEmit", "serve": "vite preview", "start": "vite", "gen": "node ./src/createRoutes.mjs", "test:types": "tsc --extendedDiagnostics" }, "dependencies": { - "@tanstack/react-query": "^5.51.21", - "@tanstack/react-router": "^1.51.2", - "@tanstack/router-devtools": "^1.51.2", - "@tanstack/router-plugin": "^1.51.0", - "immer": "^10.1.1", + "@tanstack/react-query": "^5.56.2", + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", + "@tanstack/router-plugin": "^1.58.4", "react": "^18.2.0", "react-dom": "^18.2.0", "redaxios": "^0.5.1", @@ -25,6 +24,6 @@ "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", "@vitejs/plugin-react": "^4.3.1", - "vite": "^5.3.5" + "vite": "^5.4.5" } } diff --git a/examples/react/large-file-based/src/routeTree.gen.ts b/examples/react/large-file-based/src/routeTree.gen.ts index 2205993a25..77c0460a15 100644 --- a/examples/react/large-file-based/src/routeTree.gen.ts +++ b/examples/react/large-file-based/src/routeTree.gen.ts @@ -19,6 +19,408 @@ import { Route as ParamsRouteImport } from './routes/params/route' import { Route as IndexImport } from './routes/index' import { Route as SearchSearchPlaceholderImport } from './routes/search/searchPlaceholder' import { Route as ParamsParamsPlaceholderImport } from './routes/params/$paramsPlaceholder' +import { Route as genRelative99Import } from './routes/(gen)/relative99' +import { Route as genRelative98Import } from './routes/(gen)/relative98' +import { Route as genRelative97Import } from './routes/(gen)/relative97' +import { Route as genRelative96Import } from './routes/(gen)/relative96' +import { Route as genRelative95Import } from './routes/(gen)/relative95' +import { Route as genRelative94Import } from './routes/(gen)/relative94' +import { Route as genRelative93Import } from './routes/(gen)/relative93' +import { Route as genRelative92Import } from './routes/(gen)/relative92' +import { Route as genRelative91Import } from './routes/(gen)/relative91' +import { Route as genRelative90Import } from './routes/(gen)/relative90' +import { Route as genRelative9Import } from './routes/(gen)/relative9' +import { Route as genRelative89Import } from './routes/(gen)/relative89' +import { Route as genRelative88Import } from './routes/(gen)/relative88' +import { Route as genRelative87Import } from './routes/(gen)/relative87' +import { Route as genRelative86Import } from './routes/(gen)/relative86' +import { Route as genRelative85Import } from './routes/(gen)/relative85' +import { Route as genRelative84Import } from './routes/(gen)/relative84' +import { Route as genRelative83Import } from './routes/(gen)/relative83' +import { Route as genRelative82Import } from './routes/(gen)/relative82' +import { Route as genRelative81Import } from './routes/(gen)/relative81' +import { Route as genRelative80Import } from './routes/(gen)/relative80' +import { Route as genRelative8Import } from './routes/(gen)/relative8' +import { Route as genRelative79Import } from './routes/(gen)/relative79' +import { Route as genRelative78Import } from './routes/(gen)/relative78' +import { Route as genRelative77Import } from './routes/(gen)/relative77' +import { Route as genRelative76Import } from './routes/(gen)/relative76' +import { Route as genRelative75Import } from './routes/(gen)/relative75' +import { Route as genRelative74Import } from './routes/(gen)/relative74' +import { Route as genRelative73Import } from './routes/(gen)/relative73' +import { Route as genRelative72Import } from './routes/(gen)/relative72' +import { Route as genRelative71Import } from './routes/(gen)/relative71' +import { Route as genRelative70Import } from './routes/(gen)/relative70' +import { Route as genRelative7Import } from './routes/(gen)/relative7' +import { Route as genRelative69Import } from './routes/(gen)/relative69' +import { Route as genRelative68Import } from './routes/(gen)/relative68' +import { Route as genRelative67Import } from './routes/(gen)/relative67' +import { Route as genRelative66Import } from './routes/(gen)/relative66' +import { Route as genRelative65Import } from './routes/(gen)/relative65' +import { Route as genRelative64Import } from './routes/(gen)/relative64' +import { Route as genRelative63Import } from './routes/(gen)/relative63' +import { Route as genRelative62Import } from './routes/(gen)/relative62' +import { Route as genRelative61Import } from './routes/(gen)/relative61' +import { Route as genRelative60Import } from './routes/(gen)/relative60' +import { Route as genRelative6Import } from './routes/(gen)/relative6' +import { Route as genRelative59Import } from './routes/(gen)/relative59' +import { Route as genRelative58Import } from './routes/(gen)/relative58' +import { Route as genRelative57Import } from './routes/(gen)/relative57' +import { Route as genRelative56Import } from './routes/(gen)/relative56' +import { Route as genRelative55Import } from './routes/(gen)/relative55' +import { Route as genRelative54Import } from './routes/(gen)/relative54' +import { Route as genRelative53Import } from './routes/(gen)/relative53' +import { Route as genRelative52Import } from './routes/(gen)/relative52' +import { Route as genRelative51Import } from './routes/(gen)/relative51' +import { Route as genRelative50Import } from './routes/(gen)/relative50' +import { Route as genRelative5Import } from './routes/(gen)/relative5' +import { Route as genRelative49Import } from './routes/(gen)/relative49' +import { Route as genRelative48Import } from './routes/(gen)/relative48' +import { Route as genRelative47Import } from './routes/(gen)/relative47' +import { Route as genRelative46Import } from './routes/(gen)/relative46' +import { Route as genRelative45Import } from './routes/(gen)/relative45' +import { Route as genRelative44Import } from './routes/(gen)/relative44' +import { Route as genRelative43Import } from './routes/(gen)/relative43' +import { Route as genRelative42Import } from './routes/(gen)/relative42' +import { Route as genRelative41Import } from './routes/(gen)/relative41' +import { Route as genRelative40Import } from './routes/(gen)/relative40' +import { Route as genRelative4Import } from './routes/(gen)/relative4' +import { Route as genRelative39Import } from './routes/(gen)/relative39' +import { Route as genRelative38Import } from './routes/(gen)/relative38' +import { Route as genRelative37Import } from './routes/(gen)/relative37' +import { Route as genRelative36Import } from './routes/(gen)/relative36' +import { Route as genRelative35Import } from './routes/(gen)/relative35' +import { Route as genRelative34Import } from './routes/(gen)/relative34' +import { Route as genRelative33Import } from './routes/(gen)/relative33' +import { Route as genRelative32Import } from './routes/(gen)/relative32' +import { Route as genRelative31Import } from './routes/(gen)/relative31' +import { Route as genRelative30Import } from './routes/(gen)/relative30' +import { Route as genRelative3Import } from './routes/(gen)/relative3' +import { Route as genRelative29Import } from './routes/(gen)/relative29' +import { Route as genRelative28Import } from './routes/(gen)/relative28' +import { Route as genRelative27Import } from './routes/(gen)/relative27' +import { Route as genRelative26Import } from './routes/(gen)/relative26' +import { Route as genRelative25Import } from './routes/(gen)/relative25' +import { Route as genRelative24Import } from './routes/(gen)/relative24' +import { Route as genRelative23Import } from './routes/(gen)/relative23' +import { Route as genRelative22Import } from './routes/(gen)/relative22' +import { Route as genRelative21Import } from './routes/(gen)/relative21' +import { Route as genRelative20Import } from './routes/(gen)/relative20' +import { Route as genRelative2Import } from './routes/(gen)/relative2' +import { Route as genRelative19Import } from './routes/(gen)/relative19' +import { Route as genRelative18Import } from './routes/(gen)/relative18' +import { Route as genRelative17Import } from './routes/(gen)/relative17' +import { Route as genRelative16Import } from './routes/(gen)/relative16' +import { Route as genRelative15Import } from './routes/(gen)/relative15' +import { Route as genRelative14Import } from './routes/(gen)/relative14' +import { Route as genRelative13Import } from './routes/(gen)/relative13' +import { Route as genRelative12Import } from './routes/(gen)/relative12' +import { Route as genRelative11Import } from './routes/(gen)/relative11' +import { Route as genRelative10Import } from './routes/(gen)/relative10' +import { Route as genRelative1Import } from './routes/(gen)/relative1' +import { Route as genRelative0Import } from './routes/(gen)/relative0' +import { Route as genAbsolute99Import } from './routes/(gen)/absolute99' +import { Route as genAbsolute98Import } from './routes/(gen)/absolute98' +import { Route as genAbsolute97Import } from './routes/(gen)/absolute97' +import { Route as genAbsolute96Import } from './routes/(gen)/absolute96' +import { Route as genAbsolute95Import } from './routes/(gen)/absolute95' +import { Route as genAbsolute94Import } from './routes/(gen)/absolute94' +import { Route as genAbsolute93Import } from './routes/(gen)/absolute93' +import { Route as genAbsolute92Import } from './routes/(gen)/absolute92' +import { Route as genAbsolute91Import } from './routes/(gen)/absolute91' +import { Route as genAbsolute90Import } from './routes/(gen)/absolute90' +import { Route as genAbsolute9Import } from './routes/(gen)/absolute9' +import { Route as genAbsolute89Import } from './routes/(gen)/absolute89' +import { Route as genAbsolute88Import } from './routes/(gen)/absolute88' +import { Route as genAbsolute87Import } from './routes/(gen)/absolute87' +import { Route as genAbsolute86Import } from './routes/(gen)/absolute86' +import { Route as genAbsolute85Import } from './routes/(gen)/absolute85' +import { Route as genAbsolute84Import } from './routes/(gen)/absolute84' +import { Route as genAbsolute83Import } from './routes/(gen)/absolute83' +import { Route as genAbsolute82Import } from './routes/(gen)/absolute82' +import { Route as genAbsolute81Import } from './routes/(gen)/absolute81' +import { Route as genAbsolute80Import } from './routes/(gen)/absolute80' +import { Route as genAbsolute8Import } from './routes/(gen)/absolute8' +import { Route as genAbsolute79Import } from './routes/(gen)/absolute79' +import { Route as genAbsolute78Import } from './routes/(gen)/absolute78' +import { Route as genAbsolute77Import } from './routes/(gen)/absolute77' +import { Route as genAbsolute76Import } from './routes/(gen)/absolute76' +import { Route as genAbsolute75Import } from './routes/(gen)/absolute75' +import { Route as genAbsolute74Import } from './routes/(gen)/absolute74' +import { Route as genAbsolute73Import } from './routes/(gen)/absolute73' +import { Route as genAbsolute72Import } from './routes/(gen)/absolute72' +import { Route as genAbsolute71Import } from './routes/(gen)/absolute71' +import { Route as genAbsolute70Import } from './routes/(gen)/absolute70' +import { Route as genAbsolute7Import } from './routes/(gen)/absolute7' +import { Route as genAbsolute69Import } from './routes/(gen)/absolute69' +import { Route as genAbsolute68Import } from './routes/(gen)/absolute68' +import { Route as genAbsolute67Import } from './routes/(gen)/absolute67' +import { Route as genAbsolute66Import } from './routes/(gen)/absolute66' +import { Route as genAbsolute65Import } from './routes/(gen)/absolute65' +import { Route as genAbsolute64Import } from './routes/(gen)/absolute64' +import { Route as genAbsolute63Import } from './routes/(gen)/absolute63' +import { Route as genAbsolute62Import } from './routes/(gen)/absolute62' +import { Route as genAbsolute61Import } from './routes/(gen)/absolute61' +import { Route as genAbsolute60Import } from './routes/(gen)/absolute60' +import { Route as genAbsolute6Import } from './routes/(gen)/absolute6' +import { Route as genAbsolute59Import } from './routes/(gen)/absolute59' +import { Route as genAbsolute58Import } from './routes/(gen)/absolute58' +import { Route as genAbsolute57Import } from './routes/(gen)/absolute57' +import { Route as genAbsolute56Import } from './routes/(gen)/absolute56' +import { Route as genAbsolute55Import } from './routes/(gen)/absolute55' +import { Route as genAbsolute54Import } from './routes/(gen)/absolute54' +import { Route as genAbsolute53Import } from './routes/(gen)/absolute53' +import { Route as genAbsolute52Import } from './routes/(gen)/absolute52' +import { Route as genAbsolute51Import } from './routes/(gen)/absolute51' +import { Route as genAbsolute50Import } from './routes/(gen)/absolute50' +import { Route as genAbsolute5Import } from './routes/(gen)/absolute5' +import { Route as genAbsolute49Import } from './routes/(gen)/absolute49' +import { Route as genAbsolute48Import } from './routes/(gen)/absolute48' +import { Route as genAbsolute47Import } from './routes/(gen)/absolute47' +import { Route as genAbsolute46Import } from './routes/(gen)/absolute46' +import { Route as genAbsolute45Import } from './routes/(gen)/absolute45' +import { Route as genAbsolute44Import } from './routes/(gen)/absolute44' +import { Route as genAbsolute43Import } from './routes/(gen)/absolute43' +import { Route as genAbsolute42Import } from './routes/(gen)/absolute42' +import { Route as genAbsolute41Import } from './routes/(gen)/absolute41' +import { Route as genAbsolute40Import } from './routes/(gen)/absolute40' +import { Route as genAbsolute4Import } from './routes/(gen)/absolute4' +import { Route as genAbsolute39Import } from './routes/(gen)/absolute39' +import { Route as genAbsolute38Import } from './routes/(gen)/absolute38' +import { Route as genAbsolute37Import } from './routes/(gen)/absolute37' +import { Route as genAbsolute36Import } from './routes/(gen)/absolute36' +import { Route as genAbsolute35Import } from './routes/(gen)/absolute35' +import { Route as genAbsolute34Import } from './routes/(gen)/absolute34' +import { Route as genAbsolute33Import } from './routes/(gen)/absolute33' +import { Route as genAbsolute32Import } from './routes/(gen)/absolute32' +import { Route as genAbsolute31Import } from './routes/(gen)/absolute31' +import { Route as genAbsolute30Import } from './routes/(gen)/absolute30' +import { Route as genAbsolute3Import } from './routes/(gen)/absolute3' +import { Route as genAbsolute29Import } from './routes/(gen)/absolute29' +import { Route as genAbsolute28Import } from './routes/(gen)/absolute28' +import { Route as genAbsolute27Import } from './routes/(gen)/absolute27' +import { Route as genAbsolute26Import } from './routes/(gen)/absolute26' +import { Route as genAbsolute25Import } from './routes/(gen)/absolute25' +import { Route as genAbsolute24Import } from './routes/(gen)/absolute24' +import { Route as genAbsolute23Import } from './routes/(gen)/absolute23' +import { Route as genAbsolute22Import } from './routes/(gen)/absolute22' +import { Route as genAbsolute21Import } from './routes/(gen)/absolute21' +import { Route as genAbsolute20Import } from './routes/(gen)/absolute20' +import { Route as genAbsolute2Import } from './routes/(gen)/absolute2' +import { Route as genAbsolute19Import } from './routes/(gen)/absolute19' +import { Route as genAbsolute18Import } from './routes/(gen)/absolute18' +import { Route as genAbsolute17Import } from './routes/(gen)/absolute17' +import { Route as genAbsolute16Import } from './routes/(gen)/absolute16' +import { Route as genAbsolute15Import } from './routes/(gen)/absolute15' +import { Route as genAbsolute14Import } from './routes/(gen)/absolute14' +import { Route as genAbsolute13Import } from './routes/(gen)/absolute13' +import { Route as genAbsolute12Import } from './routes/(gen)/absolute12' +import { Route as genAbsolute11Import } from './routes/(gen)/absolute11' +import { Route as genAbsolute10Import } from './routes/(gen)/absolute10' +import { Route as genAbsolute1Import } from './routes/(gen)/absolute1' +import { Route as genAbsolute0Import } from './routes/(gen)/absolute0' +import { Route as genSearchRouteImport } from './routes/(gen)/search/route' +import { Route as genParamsRouteImport } from './routes/(gen)/params/route' +import { Route as genSearchSearch99Import } from './routes/(gen)/search/search99' +import { Route as genSearchSearch98Import } from './routes/(gen)/search/search98' +import { Route as genSearchSearch97Import } from './routes/(gen)/search/search97' +import { Route as genSearchSearch96Import } from './routes/(gen)/search/search96' +import { Route as genSearchSearch95Import } from './routes/(gen)/search/search95' +import { Route as genSearchSearch94Import } from './routes/(gen)/search/search94' +import { Route as genSearchSearch93Import } from './routes/(gen)/search/search93' +import { Route as genSearchSearch92Import } from './routes/(gen)/search/search92' +import { Route as genSearchSearch91Import } from './routes/(gen)/search/search91' +import { Route as genSearchSearch90Import } from './routes/(gen)/search/search90' +import { Route as genSearchSearch9Import } from './routes/(gen)/search/search9' +import { Route as genSearchSearch89Import } from './routes/(gen)/search/search89' +import { Route as genSearchSearch88Import } from './routes/(gen)/search/search88' +import { Route as genSearchSearch87Import } from './routes/(gen)/search/search87' +import { Route as genSearchSearch86Import } from './routes/(gen)/search/search86' +import { Route as genSearchSearch85Import } from './routes/(gen)/search/search85' +import { Route as genSearchSearch84Import } from './routes/(gen)/search/search84' +import { Route as genSearchSearch83Import } from './routes/(gen)/search/search83' +import { Route as genSearchSearch82Import } from './routes/(gen)/search/search82' +import { Route as genSearchSearch81Import } from './routes/(gen)/search/search81' +import { Route as genSearchSearch80Import } from './routes/(gen)/search/search80' +import { Route as genSearchSearch8Import } from './routes/(gen)/search/search8' +import { Route as genSearchSearch79Import } from './routes/(gen)/search/search79' +import { Route as genSearchSearch78Import } from './routes/(gen)/search/search78' +import { Route as genSearchSearch77Import } from './routes/(gen)/search/search77' +import { Route as genSearchSearch76Import } from './routes/(gen)/search/search76' +import { Route as genSearchSearch75Import } from './routes/(gen)/search/search75' +import { Route as genSearchSearch74Import } from './routes/(gen)/search/search74' +import { Route as genSearchSearch73Import } from './routes/(gen)/search/search73' +import { Route as genSearchSearch72Import } from './routes/(gen)/search/search72' +import { Route as genSearchSearch71Import } from './routes/(gen)/search/search71' +import { Route as genSearchSearch70Import } from './routes/(gen)/search/search70' +import { Route as genSearchSearch7Import } from './routes/(gen)/search/search7' +import { Route as genSearchSearch69Import } from './routes/(gen)/search/search69' +import { Route as genSearchSearch68Import } from './routes/(gen)/search/search68' +import { Route as genSearchSearch67Import } from './routes/(gen)/search/search67' +import { Route as genSearchSearch66Import } from './routes/(gen)/search/search66' +import { Route as genSearchSearch65Import } from './routes/(gen)/search/search65' +import { Route as genSearchSearch64Import } from './routes/(gen)/search/search64' +import { Route as genSearchSearch63Import } from './routes/(gen)/search/search63' +import { Route as genSearchSearch62Import } from './routes/(gen)/search/search62' +import { Route as genSearchSearch61Import } from './routes/(gen)/search/search61' +import { Route as genSearchSearch60Import } from './routes/(gen)/search/search60' +import { Route as genSearchSearch6Import } from './routes/(gen)/search/search6' +import { Route as genSearchSearch59Import } from './routes/(gen)/search/search59' +import { Route as genSearchSearch58Import } from './routes/(gen)/search/search58' +import { Route as genSearchSearch57Import } from './routes/(gen)/search/search57' +import { Route as genSearchSearch56Import } from './routes/(gen)/search/search56' +import { Route as genSearchSearch55Import } from './routes/(gen)/search/search55' +import { Route as genSearchSearch54Import } from './routes/(gen)/search/search54' +import { Route as genSearchSearch53Import } from './routes/(gen)/search/search53' +import { Route as genSearchSearch52Import } from './routes/(gen)/search/search52' +import { Route as genSearchSearch51Import } from './routes/(gen)/search/search51' +import { Route as genSearchSearch50Import } from './routes/(gen)/search/search50' +import { Route as genSearchSearch5Import } from './routes/(gen)/search/search5' +import { Route as genSearchSearch49Import } from './routes/(gen)/search/search49' +import { Route as genSearchSearch48Import } from './routes/(gen)/search/search48' +import { Route as genSearchSearch47Import } from './routes/(gen)/search/search47' +import { Route as genSearchSearch46Import } from './routes/(gen)/search/search46' +import { Route as genSearchSearch45Import } from './routes/(gen)/search/search45' +import { Route as genSearchSearch44Import } from './routes/(gen)/search/search44' +import { Route as genSearchSearch43Import } from './routes/(gen)/search/search43' +import { Route as genSearchSearch42Import } from './routes/(gen)/search/search42' +import { Route as genSearchSearch41Import } from './routes/(gen)/search/search41' +import { Route as genSearchSearch40Import } from './routes/(gen)/search/search40' +import { Route as genSearchSearch4Import } from './routes/(gen)/search/search4' +import { Route as genSearchSearch39Import } from './routes/(gen)/search/search39' +import { Route as genSearchSearch38Import } from './routes/(gen)/search/search38' +import { Route as genSearchSearch37Import } from './routes/(gen)/search/search37' +import { Route as genSearchSearch36Import } from './routes/(gen)/search/search36' +import { Route as genSearchSearch35Import } from './routes/(gen)/search/search35' +import { Route as genSearchSearch34Import } from './routes/(gen)/search/search34' +import { Route as genSearchSearch33Import } from './routes/(gen)/search/search33' +import { Route as genSearchSearch32Import } from './routes/(gen)/search/search32' +import { Route as genSearchSearch31Import } from './routes/(gen)/search/search31' +import { Route as genSearchSearch30Import } from './routes/(gen)/search/search30' +import { Route as genSearchSearch3Import } from './routes/(gen)/search/search3' +import { Route as genSearchSearch29Import } from './routes/(gen)/search/search29' +import { Route as genSearchSearch28Import } from './routes/(gen)/search/search28' +import { Route as genSearchSearch27Import } from './routes/(gen)/search/search27' +import { Route as genSearchSearch26Import } from './routes/(gen)/search/search26' +import { Route as genSearchSearch25Import } from './routes/(gen)/search/search25' +import { Route as genSearchSearch24Import } from './routes/(gen)/search/search24' +import { Route as genSearchSearch23Import } from './routes/(gen)/search/search23' +import { Route as genSearchSearch22Import } from './routes/(gen)/search/search22' +import { Route as genSearchSearch21Import } from './routes/(gen)/search/search21' +import { Route as genSearchSearch20Import } from './routes/(gen)/search/search20' +import { Route as genSearchSearch2Import } from './routes/(gen)/search/search2' +import { Route as genSearchSearch19Import } from './routes/(gen)/search/search19' +import { Route as genSearchSearch18Import } from './routes/(gen)/search/search18' +import { Route as genSearchSearch17Import } from './routes/(gen)/search/search17' +import { Route as genSearchSearch16Import } from './routes/(gen)/search/search16' +import { Route as genSearchSearch15Import } from './routes/(gen)/search/search15' +import { Route as genSearchSearch14Import } from './routes/(gen)/search/search14' +import { Route as genSearchSearch13Import } from './routes/(gen)/search/search13' +import { Route as genSearchSearch12Import } from './routes/(gen)/search/search12' +import { Route as genSearchSearch11Import } from './routes/(gen)/search/search11' +import { Route as genSearchSearch10Import } from './routes/(gen)/search/search10' +import { Route as genSearchSearch1Import } from './routes/(gen)/search/search1' +import { Route as genSearchSearch0Import } from './routes/(gen)/search/search0' +import { Route as genParamsParam99Import } from './routes/(gen)/params/$param99' +import { Route as genParamsParam98Import } from './routes/(gen)/params/$param98' +import { Route as genParamsParam97Import } from './routes/(gen)/params/$param97' +import { Route as genParamsParam96Import } from './routes/(gen)/params/$param96' +import { Route as genParamsParam95Import } from './routes/(gen)/params/$param95' +import { Route as genParamsParam94Import } from './routes/(gen)/params/$param94' +import { Route as genParamsParam93Import } from './routes/(gen)/params/$param93' +import { Route as genParamsParam92Import } from './routes/(gen)/params/$param92' +import { Route as genParamsParam91Import } from './routes/(gen)/params/$param91' +import { Route as genParamsParam90Import } from './routes/(gen)/params/$param90' +import { Route as genParamsParam9Import } from './routes/(gen)/params/$param9' +import { Route as genParamsParam89Import } from './routes/(gen)/params/$param89' +import { Route as genParamsParam88Import } from './routes/(gen)/params/$param88' +import { Route as genParamsParam87Import } from './routes/(gen)/params/$param87' +import { Route as genParamsParam86Import } from './routes/(gen)/params/$param86' +import { Route as genParamsParam85Import } from './routes/(gen)/params/$param85' +import { Route as genParamsParam84Import } from './routes/(gen)/params/$param84' +import { Route as genParamsParam83Import } from './routes/(gen)/params/$param83' +import { Route as genParamsParam82Import } from './routes/(gen)/params/$param82' +import { Route as genParamsParam81Import } from './routes/(gen)/params/$param81' +import { Route as genParamsParam80Import } from './routes/(gen)/params/$param80' +import { Route as genParamsParam8Import } from './routes/(gen)/params/$param8' +import { Route as genParamsParam79Import } from './routes/(gen)/params/$param79' +import { Route as genParamsParam78Import } from './routes/(gen)/params/$param78' +import { Route as genParamsParam77Import } from './routes/(gen)/params/$param77' +import { Route as genParamsParam76Import } from './routes/(gen)/params/$param76' +import { Route as genParamsParam75Import } from './routes/(gen)/params/$param75' +import { Route as genParamsParam74Import } from './routes/(gen)/params/$param74' +import { Route as genParamsParam73Import } from './routes/(gen)/params/$param73' +import { Route as genParamsParam72Import } from './routes/(gen)/params/$param72' +import { Route as genParamsParam71Import } from './routes/(gen)/params/$param71' +import { Route as genParamsParam70Import } from './routes/(gen)/params/$param70' +import { Route as genParamsParam7Import } from './routes/(gen)/params/$param7' +import { Route as genParamsParam69Import } from './routes/(gen)/params/$param69' +import { Route as genParamsParam68Import } from './routes/(gen)/params/$param68' +import { Route as genParamsParam67Import } from './routes/(gen)/params/$param67' +import { Route as genParamsParam66Import } from './routes/(gen)/params/$param66' +import { Route as genParamsParam65Import } from './routes/(gen)/params/$param65' +import { Route as genParamsParam64Import } from './routes/(gen)/params/$param64' +import { Route as genParamsParam63Import } from './routes/(gen)/params/$param63' +import { Route as genParamsParam62Import } from './routes/(gen)/params/$param62' +import { Route as genParamsParam61Import } from './routes/(gen)/params/$param61' +import { Route as genParamsParam60Import } from './routes/(gen)/params/$param60' +import { Route as genParamsParam6Import } from './routes/(gen)/params/$param6' +import { Route as genParamsParam59Import } from './routes/(gen)/params/$param59' +import { Route as genParamsParam58Import } from './routes/(gen)/params/$param58' +import { Route as genParamsParam57Import } from './routes/(gen)/params/$param57' +import { Route as genParamsParam56Import } from './routes/(gen)/params/$param56' +import { Route as genParamsParam55Import } from './routes/(gen)/params/$param55' +import { Route as genParamsParam54Import } from './routes/(gen)/params/$param54' +import { Route as genParamsParam53Import } from './routes/(gen)/params/$param53' +import { Route as genParamsParam52Import } from './routes/(gen)/params/$param52' +import { Route as genParamsParam51Import } from './routes/(gen)/params/$param51' +import { Route as genParamsParam50Import } from './routes/(gen)/params/$param50' +import { Route as genParamsParam5Import } from './routes/(gen)/params/$param5' +import { Route as genParamsParam49Import } from './routes/(gen)/params/$param49' +import { Route as genParamsParam48Import } from './routes/(gen)/params/$param48' +import { Route as genParamsParam47Import } from './routes/(gen)/params/$param47' +import { Route as genParamsParam46Import } from './routes/(gen)/params/$param46' +import { Route as genParamsParam45Import } from './routes/(gen)/params/$param45' +import { Route as genParamsParam44Import } from './routes/(gen)/params/$param44' +import { Route as genParamsParam43Import } from './routes/(gen)/params/$param43' +import { Route as genParamsParam42Import } from './routes/(gen)/params/$param42' +import { Route as genParamsParam41Import } from './routes/(gen)/params/$param41' +import { Route as genParamsParam40Import } from './routes/(gen)/params/$param40' +import { Route as genParamsParam4Import } from './routes/(gen)/params/$param4' +import { Route as genParamsParam39Import } from './routes/(gen)/params/$param39' +import { Route as genParamsParam38Import } from './routes/(gen)/params/$param38' +import { Route as genParamsParam37Import } from './routes/(gen)/params/$param37' +import { Route as genParamsParam36Import } from './routes/(gen)/params/$param36' +import { Route as genParamsParam35Import } from './routes/(gen)/params/$param35' +import { Route as genParamsParam34Import } from './routes/(gen)/params/$param34' +import { Route as genParamsParam33Import } from './routes/(gen)/params/$param33' +import { Route as genParamsParam32Import } from './routes/(gen)/params/$param32' +import { Route as genParamsParam31Import } from './routes/(gen)/params/$param31' +import { Route as genParamsParam30Import } from './routes/(gen)/params/$param30' +import { Route as genParamsParam3Import } from './routes/(gen)/params/$param3' +import { Route as genParamsParam29Import } from './routes/(gen)/params/$param29' +import { Route as genParamsParam28Import } from './routes/(gen)/params/$param28' +import { Route as genParamsParam27Import } from './routes/(gen)/params/$param27' +import { Route as genParamsParam26Import } from './routes/(gen)/params/$param26' +import { Route as genParamsParam25Import } from './routes/(gen)/params/$param25' +import { Route as genParamsParam24Import } from './routes/(gen)/params/$param24' +import { Route as genParamsParam23Import } from './routes/(gen)/params/$param23' +import { Route as genParamsParam22Import } from './routes/(gen)/params/$param22' +import { Route as genParamsParam21Import } from './routes/(gen)/params/$param21' +import { Route as genParamsParam20Import } from './routes/(gen)/params/$param20' +import { Route as genParamsParam2Import } from './routes/(gen)/params/$param2' +import { Route as genParamsParam19Import } from './routes/(gen)/params/$param19' +import { Route as genParamsParam18Import } from './routes/(gen)/params/$param18' +import { Route as genParamsParam17Import } from './routes/(gen)/params/$param17' +import { Route as genParamsParam16Import } from './routes/(gen)/params/$param16' +import { Route as genParamsParam15Import } from './routes/(gen)/params/$param15' +import { Route as genParamsParam14Import } from './routes/(gen)/params/$param14' +import { Route as genParamsParam13Import } from './routes/(gen)/params/$param13' +import { Route as genParamsParam12Import } from './routes/(gen)/params/$param12' +import { Route as genParamsParam11Import } from './routes/(gen)/params/$param11' +import { Route as genParamsParam10Import } from './routes/(gen)/params/$param10' +import { Route as genParamsParam1Import } from './routes/(gen)/params/$param1' +import { Route as genParamsParam0Import } from './routes/(gen)/params/$param0' // Create/Update Routes @@ -62,130 +464,10079 @@ const ParamsParamsPlaceholderRoute = ParamsParamsPlaceholderImport.update({ getParentRoute: () => ParamsRouteRoute, } as any) -// Populate the FileRoutesByPath interface +const genRelative99Route = genRelative99Import.update({ + path: '/relative99', + getParentRoute: () => rootRoute, +} as any) -declare module '@tanstack/react-router' { - interface FileRoutesByPath { - '/': { - id: '/' - path: '/' - fullPath: '/' - preLoaderRoute: typeof IndexImport - parentRoute: typeof rootRoute - } - '/params': { - id: '/params' - path: '/params' - fullPath: '/params' - preLoaderRoute: typeof ParamsRouteImport - parentRoute: typeof rootRoute - } - '/search': { - id: '/search' - path: '/search' - fullPath: '/search' - preLoaderRoute: typeof SearchRouteImport - parentRoute: typeof rootRoute - } - '/absolute': { - id: '/absolute' - path: '/absolute' - fullPath: '/absolute' - preLoaderRoute: typeof AbsoluteImport - parentRoute: typeof rootRoute - } - '/linkProps': { - id: '/linkProps' - path: '/linkProps' - fullPath: '/linkProps' - preLoaderRoute: typeof LinkPropsImport - parentRoute: typeof rootRoute - } - '/relative': { - id: '/relative' - path: '/relative' - fullPath: '/relative' - preLoaderRoute: typeof RelativeImport - parentRoute: typeof rootRoute - } - '/params/$paramsPlaceholder': { - id: '/params/$paramsPlaceholder' - path: '/$paramsPlaceholder' - fullPath: '/params/$paramsPlaceholder' - preLoaderRoute: typeof ParamsParamsPlaceholderImport - parentRoute: typeof ParamsRouteImport - } - '/search/searchPlaceholder': { - id: '/search/searchPlaceholder' - path: '/searchPlaceholder' - fullPath: '/search/searchPlaceholder' - preLoaderRoute: typeof SearchSearchPlaceholderImport - parentRoute: typeof SearchRouteImport - } - } -} +const genRelative98Route = genRelative98Import.update({ + path: '/relative98', + getParentRoute: () => rootRoute, +} as any) -// Create and export the route tree +const genRelative97Route = genRelative97Import.update({ + path: '/relative97', + getParentRoute: () => rootRoute, +} as any) -export const routeTree = rootRoute.addChildren({ - IndexRoute, - ParamsRouteRoute: ParamsRouteRoute.addChildren({ - ParamsParamsPlaceholderRoute, - }), - SearchRouteRoute: SearchRouteRoute.addChildren({ - SearchSearchPlaceholderRoute, - }), - AbsoluteRoute, - LinkPropsRoute, - RelativeRoute, -}) +const genRelative96Route = genRelative96Import.update({ + path: '/relative96', + getParentRoute: () => rootRoute, +} as any) -/* prettier-ignore-end */ +const genRelative95Route = genRelative95Import.update({ + path: '/relative95', + getParentRoute: () => rootRoute, +} as any) -/* ROUTE_MANIFEST_START -{ - "routes": { - "__root__": { - "filePath": "__root.tsx", - "children": [ - "/", - "/params", - "/search", - "/absolute", - "/linkProps", - "/relative" - ] +const genRelative94Route = genRelative94Import.update({ + path: '/relative94', + getParentRoute: () => rootRoute, +} as any) + +const genRelative93Route = genRelative93Import.update({ + path: '/relative93', + getParentRoute: () => rootRoute, +} as any) + +const genRelative92Route = genRelative92Import.update({ + path: '/relative92', + getParentRoute: () => rootRoute, +} as any) + +const genRelative91Route = genRelative91Import.update({ + path: '/relative91', + getParentRoute: () => rootRoute, +} as any) + +const genRelative90Route = genRelative90Import.update({ + path: '/relative90', + getParentRoute: () => rootRoute, +} as any) + +const genRelative9Route = genRelative9Import.update({ + path: '/relative9', + getParentRoute: () => rootRoute, +} as any) + +const genRelative89Route = genRelative89Import.update({ + path: '/relative89', + getParentRoute: () => rootRoute, +} as any) + +const genRelative88Route = genRelative88Import.update({ + path: '/relative88', + getParentRoute: () => rootRoute, +} as any) + +const genRelative87Route = genRelative87Import.update({ + path: '/relative87', + getParentRoute: () => rootRoute, +} as any) + +const genRelative86Route = genRelative86Import.update({ + path: '/relative86', + getParentRoute: () => rootRoute, +} as any) + +const genRelative85Route = genRelative85Import.update({ + path: '/relative85', + getParentRoute: () => rootRoute, +} as any) + +const genRelative84Route = genRelative84Import.update({ + path: '/relative84', + getParentRoute: () => rootRoute, +} as any) + +const genRelative83Route = genRelative83Import.update({ + path: '/relative83', + getParentRoute: () => rootRoute, +} as any) + +const genRelative82Route = genRelative82Import.update({ + path: '/relative82', + getParentRoute: () => rootRoute, +} as any) + +const genRelative81Route = genRelative81Import.update({ + path: '/relative81', + getParentRoute: () => rootRoute, +} as any) + +const genRelative80Route = genRelative80Import.update({ + path: '/relative80', + getParentRoute: () => rootRoute, +} as any) + +const genRelative8Route = genRelative8Import.update({ + path: '/relative8', + getParentRoute: () => rootRoute, +} as any) + +const genRelative79Route = genRelative79Import.update({ + path: '/relative79', + getParentRoute: () => rootRoute, +} as any) + +const genRelative78Route = genRelative78Import.update({ + path: '/relative78', + getParentRoute: () => rootRoute, +} as any) + +const genRelative77Route = genRelative77Import.update({ + path: '/relative77', + getParentRoute: () => rootRoute, +} as any) + +const genRelative76Route = genRelative76Import.update({ + path: '/relative76', + getParentRoute: () => rootRoute, +} as any) + +const genRelative75Route = genRelative75Import.update({ + path: '/relative75', + getParentRoute: () => rootRoute, +} as any) + +const genRelative74Route = genRelative74Import.update({ + path: '/relative74', + getParentRoute: () => rootRoute, +} as any) + +const genRelative73Route = genRelative73Import.update({ + path: '/relative73', + getParentRoute: () => rootRoute, +} as any) + +const genRelative72Route = genRelative72Import.update({ + path: '/relative72', + getParentRoute: () => rootRoute, +} as any) + +const genRelative71Route = genRelative71Import.update({ + path: '/relative71', + getParentRoute: () => rootRoute, +} as any) + +const genRelative70Route = genRelative70Import.update({ + path: '/relative70', + getParentRoute: () => rootRoute, +} as any) + +const genRelative7Route = genRelative7Import.update({ + path: '/relative7', + getParentRoute: () => rootRoute, +} as any) + +const genRelative69Route = genRelative69Import.update({ + path: '/relative69', + getParentRoute: () => rootRoute, +} as any) + +const genRelative68Route = genRelative68Import.update({ + path: '/relative68', + getParentRoute: () => rootRoute, +} as any) + +const genRelative67Route = genRelative67Import.update({ + path: '/relative67', + getParentRoute: () => rootRoute, +} as any) + +const genRelative66Route = genRelative66Import.update({ + path: '/relative66', + getParentRoute: () => rootRoute, +} as any) + +const genRelative65Route = genRelative65Import.update({ + path: '/relative65', + getParentRoute: () => rootRoute, +} as any) + +const genRelative64Route = genRelative64Import.update({ + path: '/relative64', + getParentRoute: () => rootRoute, +} as any) + +const genRelative63Route = genRelative63Import.update({ + path: '/relative63', + getParentRoute: () => rootRoute, +} as any) + +const genRelative62Route = genRelative62Import.update({ + path: '/relative62', + getParentRoute: () => rootRoute, +} as any) + +const genRelative61Route = genRelative61Import.update({ + path: '/relative61', + getParentRoute: () => rootRoute, +} as any) + +const genRelative60Route = genRelative60Import.update({ + path: '/relative60', + getParentRoute: () => rootRoute, +} as any) + +const genRelative6Route = genRelative6Import.update({ + path: '/relative6', + getParentRoute: () => rootRoute, +} as any) + +const genRelative59Route = genRelative59Import.update({ + path: '/relative59', + getParentRoute: () => rootRoute, +} as any) + +const genRelative58Route = genRelative58Import.update({ + path: '/relative58', + getParentRoute: () => rootRoute, +} as any) + +const genRelative57Route = genRelative57Import.update({ + path: '/relative57', + getParentRoute: () => rootRoute, +} as any) + +const genRelative56Route = genRelative56Import.update({ + path: '/relative56', + getParentRoute: () => rootRoute, +} as any) + +const genRelative55Route = genRelative55Import.update({ + path: '/relative55', + getParentRoute: () => rootRoute, +} as any) + +const genRelative54Route = genRelative54Import.update({ + path: '/relative54', + getParentRoute: () => rootRoute, +} as any) + +const genRelative53Route = genRelative53Import.update({ + path: '/relative53', + getParentRoute: () => rootRoute, +} as any) + +const genRelative52Route = genRelative52Import.update({ + path: '/relative52', + getParentRoute: () => rootRoute, +} as any) + +const genRelative51Route = genRelative51Import.update({ + path: '/relative51', + getParentRoute: () => rootRoute, +} as any) + +const genRelative50Route = genRelative50Import.update({ + path: '/relative50', + getParentRoute: () => rootRoute, +} as any) + +const genRelative5Route = genRelative5Import.update({ + path: '/relative5', + getParentRoute: () => rootRoute, +} as any) + +const genRelative49Route = genRelative49Import.update({ + path: '/relative49', + getParentRoute: () => rootRoute, +} as any) + +const genRelative48Route = genRelative48Import.update({ + path: '/relative48', + getParentRoute: () => rootRoute, +} as any) + +const genRelative47Route = genRelative47Import.update({ + path: '/relative47', + getParentRoute: () => rootRoute, +} as any) + +const genRelative46Route = genRelative46Import.update({ + path: '/relative46', + getParentRoute: () => rootRoute, +} as any) + +const genRelative45Route = genRelative45Import.update({ + path: '/relative45', + getParentRoute: () => rootRoute, +} as any) + +const genRelative44Route = genRelative44Import.update({ + path: '/relative44', + getParentRoute: () => rootRoute, +} as any) + +const genRelative43Route = genRelative43Import.update({ + path: '/relative43', + getParentRoute: () => rootRoute, +} as any) + +const genRelative42Route = genRelative42Import.update({ + path: '/relative42', + getParentRoute: () => rootRoute, +} as any) + +const genRelative41Route = genRelative41Import.update({ + path: '/relative41', + getParentRoute: () => rootRoute, +} as any) + +const genRelative40Route = genRelative40Import.update({ + path: '/relative40', + getParentRoute: () => rootRoute, +} as any) + +const genRelative4Route = genRelative4Import.update({ + path: '/relative4', + getParentRoute: () => rootRoute, +} as any) + +const genRelative39Route = genRelative39Import.update({ + path: '/relative39', + getParentRoute: () => rootRoute, +} as any) + +const genRelative38Route = genRelative38Import.update({ + path: '/relative38', + getParentRoute: () => rootRoute, +} as any) + +const genRelative37Route = genRelative37Import.update({ + path: '/relative37', + getParentRoute: () => rootRoute, +} as any) + +const genRelative36Route = genRelative36Import.update({ + path: '/relative36', + getParentRoute: () => rootRoute, +} as any) + +const genRelative35Route = genRelative35Import.update({ + path: '/relative35', + getParentRoute: () => rootRoute, +} as any) + +const genRelative34Route = genRelative34Import.update({ + path: '/relative34', + getParentRoute: () => rootRoute, +} as any) + +const genRelative33Route = genRelative33Import.update({ + path: '/relative33', + getParentRoute: () => rootRoute, +} as any) + +const genRelative32Route = genRelative32Import.update({ + path: '/relative32', + getParentRoute: () => rootRoute, +} as any) + +const genRelative31Route = genRelative31Import.update({ + path: '/relative31', + getParentRoute: () => rootRoute, +} as any) + +const genRelative30Route = genRelative30Import.update({ + path: '/relative30', + getParentRoute: () => rootRoute, +} as any) + +const genRelative3Route = genRelative3Import.update({ + path: '/relative3', + getParentRoute: () => rootRoute, +} as any) + +const genRelative29Route = genRelative29Import.update({ + path: '/relative29', + getParentRoute: () => rootRoute, +} as any) + +const genRelative28Route = genRelative28Import.update({ + path: '/relative28', + getParentRoute: () => rootRoute, +} as any) + +const genRelative27Route = genRelative27Import.update({ + path: '/relative27', + getParentRoute: () => rootRoute, +} as any) + +const genRelative26Route = genRelative26Import.update({ + path: '/relative26', + getParentRoute: () => rootRoute, +} as any) + +const genRelative25Route = genRelative25Import.update({ + path: '/relative25', + getParentRoute: () => rootRoute, +} as any) + +const genRelative24Route = genRelative24Import.update({ + path: '/relative24', + getParentRoute: () => rootRoute, +} as any) + +const genRelative23Route = genRelative23Import.update({ + path: '/relative23', + getParentRoute: () => rootRoute, +} as any) + +const genRelative22Route = genRelative22Import.update({ + path: '/relative22', + getParentRoute: () => rootRoute, +} as any) + +const genRelative21Route = genRelative21Import.update({ + path: '/relative21', + getParentRoute: () => rootRoute, +} as any) + +const genRelative20Route = genRelative20Import.update({ + path: '/relative20', + getParentRoute: () => rootRoute, +} as any) + +const genRelative2Route = genRelative2Import.update({ + path: '/relative2', + getParentRoute: () => rootRoute, +} as any) + +const genRelative19Route = genRelative19Import.update({ + path: '/relative19', + getParentRoute: () => rootRoute, +} as any) + +const genRelative18Route = genRelative18Import.update({ + path: '/relative18', + getParentRoute: () => rootRoute, +} as any) + +const genRelative17Route = genRelative17Import.update({ + path: '/relative17', + getParentRoute: () => rootRoute, +} as any) + +const genRelative16Route = genRelative16Import.update({ + path: '/relative16', + getParentRoute: () => rootRoute, +} as any) + +const genRelative15Route = genRelative15Import.update({ + path: '/relative15', + getParentRoute: () => rootRoute, +} as any) + +const genRelative14Route = genRelative14Import.update({ + path: '/relative14', + getParentRoute: () => rootRoute, +} as any) + +const genRelative13Route = genRelative13Import.update({ + path: '/relative13', + getParentRoute: () => rootRoute, +} as any) + +const genRelative12Route = genRelative12Import.update({ + path: '/relative12', + getParentRoute: () => rootRoute, +} as any) + +const genRelative11Route = genRelative11Import.update({ + path: '/relative11', + getParentRoute: () => rootRoute, +} as any) + +const genRelative10Route = genRelative10Import.update({ + path: '/relative10', + getParentRoute: () => rootRoute, +} as any) + +const genRelative1Route = genRelative1Import.update({ + path: '/relative1', + getParentRoute: () => rootRoute, +} as any) + +const genRelative0Route = genRelative0Import.update({ + path: '/relative0', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute99Route = genAbsolute99Import.update({ + path: '/absolute99', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute98Route = genAbsolute98Import.update({ + path: '/absolute98', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute97Route = genAbsolute97Import.update({ + path: '/absolute97', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute96Route = genAbsolute96Import.update({ + path: '/absolute96', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute95Route = genAbsolute95Import.update({ + path: '/absolute95', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute94Route = genAbsolute94Import.update({ + path: '/absolute94', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute93Route = genAbsolute93Import.update({ + path: '/absolute93', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute92Route = genAbsolute92Import.update({ + path: '/absolute92', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute91Route = genAbsolute91Import.update({ + path: '/absolute91', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute90Route = genAbsolute90Import.update({ + path: '/absolute90', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute9Route = genAbsolute9Import.update({ + path: '/absolute9', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute89Route = genAbsolute89Import.update({ + path: '/absolute89', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute88Route = genAbsolute88Import.update({ + path: '/absolute88', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute87Route = genAbsolute87Import.update({ + path: '/absolute87', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute86Route = genAbsolute86Import.update({ + path: '/absolute86', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute85Route = genAbsolute85Import.update({ + path: '/absolute85', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute84Route = genAbsolute84Import.update({ + path: '/absolute84', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute83Route = genAbsolute83Import.update({ + path: '/absolute83', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute82Route = genAbsolute82Import.update({ + path: '/absolute82', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute81Route = genAbsolute81Import.update({ + path: '/absolute81', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute80Route = genAbsolute80Import.update({ + path: '/absolute80', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute8Route = genAbsolute8Import.update({ + path: '/absolute8', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute79Route = genAbsolute79Import.update({ + path: '/absolute79', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute78Route = genAbsolute78Import.update({ + path: '/absolute78', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute77Route = genAbsolute77Import.update({ + path: '/absolute77', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute76Route = genAbsolute76Import.update({ + path: '/absolute76', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute75Route = genAbsolute75Import.update({ + path: '/absolute75', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute74Route = genAbsolute74Import.update({ + path: '/absolute74', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute73Route = genAbsolute73Import.update({ + path: '/absolute73', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute72Route = genAbsolute72Import.update({ + path: '/absolute72', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute71Route = genAbsolute71Import.update({ + path: '/absolute71', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute70Route = genAbsolute70Import.update({ + path: '/absolute70', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute7Route = genAbsolute7Import.update({ + path: '/absolute7', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute69Route = genAbsolute69Import.update({ + path: '/absolute69', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute68Route = genAbsolute68Import.update({ + path: '/absolute68', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute67Route = genAbsolute67Import.update({ + path: '/absolute67', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute66Route = genAbsolute66Import.update({ + path: '/absolute66', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute65Route = genAbsolute65Import.update({ + path: '/absolute65', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute64Route = genAbsolute64Import.update({ + path: '/absolute64', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute63Route = genAbsolute63Import.update({ + path: '/absolute63', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute62Route = genAbsolute62Import.update({ + path: '/absolute62', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute61Route = genAbsolute61Import.update({ + path: '/absolute61', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute60Route = genAbsolute60Import.update({ + path: '/absolute60', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute6Route = genAbsolute6Import.update({ + path: '/absolute6', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute59Route = genAbsolute59Import.update({ + path: '/absolute59', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute58Route = genAbsolute58Import.update({ + path: '/absolute58', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute57Route = genAbsolute57Import.update({ + path: '/absolute57', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute56Route = genAbsolute56Import.update({ + path: '/absolute56', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute55Route = genAbsolute55Import.update({ + path: '/absolute55', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute54Route = genAbsolute54Import.update({ + path: '/absolute54', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute53Route = genAbsolute53Import.update({ + path: '/absolute53', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute52Route = genAbsolute52Import.update({ + path: '/absolute52', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute51Route = genAbsolute51Import.update({ + path: '/absolute51', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute50Route = genAbsolute50Import.update({ + path: '/absolute50', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute5Route = genAbsolute5Import.update({ + path: '/absolute5', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute49Route = genAbsolute49Import.update({ + path: '/absolute49', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute48Route = genAbsolute48Import.update({ + path: '/absolute48', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute47Route = genAbsolute47Import.update({ + path: '/absolute47', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute46Route = genAbsolute46Import.update({ + path: '/absolute46', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute45Route = genAbsolute45Import.update({ + path: '/absolute45', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute44Route = genAbsolute44Import.update({ + path: '/absolute44', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute43Route = genAbsolute43Import.update({ + path: '/absolute43', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute42Route = genAbsolute42Import.update({ + path: '/absolute42', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute41Route = genAbsolute41Import.update({ + path: '/absolute41', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute40Route = genAbsolute40Import.update({ + path: '/absolute40', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute4Route = genAbsolute4Import.update({ + path: '/absolute4', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute39Route = genAbsolute39Import.update({ + path: '/absolute39', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute38Route = genAbsolute38Import.update({ + path: '/absolute38', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute37Route = genAbsolute37Import.update({ + path: '/absolute37', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute36Route = genAbsolute36Import.update({ + path: '/absolute36', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute35Route = genAbsolute35Import.update({ + path: '/absolute35', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute34Route = genAbsolute34Import.update({ + path: '/absolute34', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute33Route = genAbsolute33Import.update({ + path: '/absolute33', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute32Route = genAbsolute32Import.update({ + path: '/absolute32', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute31Route = genAbsolute31Import.update({ + path: '/absolute31', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute30Route = genAbsolute30Import.update({ + path: '/absolute30', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute3Route = genAbsolute3Import.update({ + path: '/absolute3', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute29Route = genAbsolute29Import.update({ + path: '/absolute29', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute28Route = genAbsolute28Import.update({ + path: '/absolute28', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute27Route = genAbsolute27Import.update({ + path: '/absolute27', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute26Route = genAbsolute26Import.update({ + path: '/absolute26', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute25Route = genAbsolute25Import.update({ + path: '/absolute25', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute24Route = genAbsolute24Import.update({ + path: '/absolute24', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute23Route = genAbsolute23Import.update({ + path: '/absolute23', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute22Route = genAbsolute22Import.update({ + path: '/absolute22', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute21Route = genAbsolute21Import.update({ + path: '/absolute21', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute20Route = genAbsolute20Import.update({ + path: '/absolute20', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute2Route = genAbsolute2Import.update({ + path: '/absolute2', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute19Route = genAbsolute19Import.update({ + path: '/absolute19', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute18Route = genAbsolute18Import.update({ + path: '/absolute18', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute17Route = genAbsolute17Import.update({ + path: '/absolute17', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute16Route = genAbsolute16Import.update({ + path: '/absolute16', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute15Route = genAbsolute15Import.update({ + path: '/absolute15', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute14Route = genAbsolute14Import.update({ + path: '/absolute14', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute13Route = genAbsolute13Import.update({ + path: '/absolute13', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute12Route = genAbsolute12Import.update({ + path: '/absolute12', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute11Route = genAbsolute11Import.update({ + path: '/absolute11', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute10Route = genAbsolute10Import.update({ + path: '/absolute10', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute1Route = genAbsolute1Import.update({ + path: '/absolute1', + getParentRoute: () => rootRoute, +} as any) + +const genAbsolute0Route = genAbsolute0Import.update({ + path: '/absolute0', + getParentRoute: () => rootRoute, +} as any) + +const genSearchRouteRoute = genSearchRouteImport.update({ + path: '/search', + getParentRoute: () => rootRoute, +} as any) + +const genParamsRouteRoute = genParamsRouteImport.update({ + path: '/params', + getParentRoute: () => rootRoute, +} as any) + +const genSearchSearch99Route = genSearchSearch99Import.update({ + path: '/search99', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch98Route = genSearchSearch98Import.update({ + path: '/search98', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch97Route = genSearchSearch97Import.update({ + path: '/search97', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch96Route = genSearchSearch96Import.update({ + path: '/search96', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch95Route = genSearchSearch95Import.update({ + path: '/search95', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch94Route = genSearchSearch94Import.update({ + path: '/search94', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch93Route = genSearchSearch93Import.update({ + path: '/search93', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch92Route = genSearchSearch92Import.update({ + path: '/search92', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch91Route = genSearchSearch91Import.update({ + path: '/search91', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch90Route = genSearchSearch90Import.update({ + path: '/search90', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch9Route = genSearchSearch9Import.update({ + path: '/search9', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch89Route = genSearchSearch89Import.update({ + path: '/search89', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch88Route = genSearchSearch88Import.update({ + path: '/search88', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch87Route = genSearchSearch87Import.update({ + path: '/search87', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch86Route = genSearchSearch86Import.update({ + path: '/search86', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch85Route = genSearchSearch85Import.update({ + path: '/search85', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch84Route = genSearchSearch84Import.update({ + path: '/search84', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch83Route = genSearchSearch83Import.update({ + path: '/search83', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch82Route = genSearchSearch82Import.update({ + path: '/search82', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch81Route = genSearchSearch81Import.update({ + path: '/search81', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch80Route = genSearchSearch80Import.update({ + path: '/search80', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch8Route = genSearchSearch8Import.update({ + path: '/search8', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch79Route = genSearchSearch79Import.update({ + path: '/search79', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch78Route = genSearchSearch78Import.update({ + path: '/search78', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch77Route = genSearchSearch77Import.update({ + path: '/search77', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch76Route = genSearchSearch76Import.update({ + path: '/search76', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch75Route = genSearchSearch75Import.update({ + path: '/search75', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch74Route = genSearchSearch74Import.update({ + path: '/search74', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch73Route = genSearchSearch73Import.update({ + path: '/search73', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch72Route = genSearchSearch72Import.update({ + path: '/search72', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch71Route = genSearchSearch71Import.update({ + path: '/search71', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch70Route = genSearchSearch70Import.update({ + path: '/search70', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch7Route = genSearchSearch7Import.update({ + path: '/search7', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch69Route = genSearchSearch69Import.update({ + path: '/search69', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch68Route = genSearchSearch68Import.update({ + path: '/search68', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch67Route = genSearchSearch67Import.update({ + path: '/search67', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch66Route = genSearchSearch66Import.update({ + path: '/search66', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch65Route = genSearchSearch65Import.update({ + path: '/search65', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch64Route = genSearchSearch64Import.update({ + path: '/search64', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch63Route = genSearchSearch63Import.update({ + path: '/search63', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch62Route = genSearchSearch62Import.update({ + path: '/search62', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch61Route = genSearchSearch61Import.update({ + path: '/search61', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch60Route = genSearchSearch60Import.update({ + path: '/search60', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch6Route = genSearchSearch6Import.update({ + path: '/search6', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch59Route = genSearchSearch59Import.update({ + path: '/search59', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch58Route = genSearchSearch58Import.update({ + path: '/search58', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch57Route = genSearchSearch57Import.update({ + path: '/search57', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch56Route = genSearchSearch56Import.update({ + path: '/search56', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch55Route = genSearchSearch55Import.update({ + path: '/search55', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch54Route = genSearchSearch54Import.update({ + path: '/search54', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch53Route = genSearchSearch53Import.update({ + path: '/search53', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch52Route = genSearchSearch52Import.update({ + path: '/search52', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch51Route = genSearchSearch51Import.update({ + path: '/search51', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch50Route = genSearchSearch50Import.update({ + path: '/search50', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch5Route = genSearchSearch5Import.update({ + path: '/search5', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch49Route = genSearchSearch49Import.update({ + path: '/search49', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch48Route = genSearchSearch48Import.update({ + path: '/search48', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch47Route = genSearchSearch47Import.update({ + path: '/search47', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch46Route = genSearchSearch46Import.update({ + path: '/search46', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch45Route = genSearchSearch45Import.update({ + path: '/search45', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch44Route = genSearchSearch44Import.update({ + path: '/search44', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch43Route = genSearchSearch43Import.update({ + path: '/search43', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch42Route = genSearchSearch42Import.update({ + path: '/search42', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch41Route = genSearchSearch41Import.update({ + path: '/search41', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch40Route = genSearchSearch40Import.update({ + path: '/search40', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch4Route = genSearchSearch4Import.update({ + path: '/search4', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch39Route = genSearchSearch39Import.update({ + path: '/search39', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch38Route = genSearchSearch38Import.update({ + path: '/search38', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch37Route = genSearchSearch37Import.update({ + path: '/search37', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch36Route = genSearchSearch36Import.update({ + path: '/search36', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch35Route = genSearchSearch35Import.update({ + path: '/search35', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch34Route = genSearchSearch34Import.update({ + path: '/search34', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch33Route = genSearchSearch33Import.update({ + path: '/search33', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch32Route = genSearchSearch32Import.update({ + path: '/search32', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch31Route = genSearchSearch31Import.update({ + path: '/search31', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch30Route = genSearchSearch30Import.update({ + path: '/search30', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch3Route = genSearchSearch3Import.update({ + path: '/search3', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch29Route = genSearchSearch29Import.update({ + path: '/search29', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch28Route = genSearchSearch28Import.update({ + path: '/search28', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch27Route = genSearchSearch27Import.update({ + path: '/search27', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch26Route = genSearchSearch26Import.update({ + path: '/search26', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch25Route = genSearchSearch25Import.update({ + path: '/search25', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch24Route = genSearchSearch24Import.update({ + path: '/search24', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch23Route = genSearchSearch23Import.update({ + path: '/search23', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch22Route = genSearchSearch22Import.update({ + path: '/search22', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch21Route = genSearchSearch21Import.update({ + path: '/search21', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch20Route = genSearchSearch20Import.update({ + path: '/search20', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch2Route = genSearchSearch2Import.update({ + path: '/search2', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch19Route = genSearchSearch19Import.update({ + path: '/search19', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch18Route = genSearchSearch18Import.update({ + path: '/search18', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch17Route = genSearchSearch17Import.update({ + path: '/search17', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch16Route = genSearchSearch16Import.update({ + path: '/search16', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch15Route = genSearchSearch15Import.update({ + path: '/search15', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch14Route = genSearchSearch14Import.update({ + path: '/search14', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch13Route = genSearchSearch13Import.update({ + path: '/search13', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch12Route = genSearchSearch12Import.update({ + path: '/search12', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch11Route = genSearchSearch11Import.update({ + path: '/search11', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch10Route = genSearchSearch10Import.update({ + path: '/search10', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch1Route = genSearchSearch1Import.update({ + path: '/search1', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genSearchSearch0Route = genSearchSearch0Import.update({ + path: '/search0', + getParentRoute: () => genSearchRouteRoute, +} as any) + +const genParamsParam99Route = genParamsParam99Import.update({ + path: '/$param99', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam98Route = genParamsParam98Import.update({ + path: '/$param98', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam97Route = genParamsParam97Import.update({ + path: '/$param97', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam96Route = genParamsParam96Import.update({ + path: '/$param96', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam95Route = genParamsParam95Import.update({ + path: '/$param95', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam94Route = genParamsParam94Import.update({ + path: '/$param94', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam93Route = genParamsParam93Import.update({ + path: '/$param93', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam92Route = genParamsParam92Import.update({ + path: '/$param92', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam91Route = genParamsParam91Import.update({ + path: '/$param91', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam90Route = genParamsParam90Import.update({ + path: '/$param90', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam9Route = genParamsParam9Import.update({ + path: '/$param9', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam89Route = genParamsParam89Import.update({ + path: '/$param89', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam88Route = genParamsParam88Import.update({ + path: '/$param88', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam87Route = genParamsParam87Import.update({ + path: '/$param87', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam86Route = genParamsParam86Import.update({ + path: '/$param86', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam85Route = genParamsParam85Import.update({ + path: '/$param85', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam84Route = genParamsParam84Import.update({ + path: '/$param84', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam83Route = genParamsParam83Import.update({ + path: '/$param83', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam82Route = genParamsParam82Import.update({ + path: '/$param82', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam81Route = genParamsParam81Import.update({ + path: '/$param81', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam80Route = genParamsParam80Import.update({ + path: '/$param80', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam8Route = genParamsParam8Import.update({ + path: '/$param8', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam79Route = genParamsParam79Import.update({ + path: '/$param79', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam78Route = genParamsParam78Import.update({ + path: '/$param78', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam77Route = genParamsParam77Import.update({ + path: '/$param77', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam76Route = genParamsParam76Import.update({ + path: '/$param76', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam75Route = genParamsParam75Import.update({ + path: '/$param75', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam74Route = genParamsParam74Import.update({ + path: '/$param74', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam73Route = genParamsParam73Import.update({ + path: '/$param73', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam72Route = genParamsParam72Import.update({ + path: '/$param72', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam71Route = genParamsParam71Import.update({ + path: '/$param71', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam70Route = genParamsParam70Import.update({ + path: '/$param70', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam7Route = genParamsParam7Import.update({ + path: '/$param7', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam69Route = genParamsParam69Import.update({ + path: '/$param69', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam68Route = genParamsParam68Import.update({ + path: '/$param68', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam67Route = genParamsParam67Import.update({ + path: '/$param67', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam66Route = genParamsParam66Import.update({ + path: '/$param66', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam65Route = genParamsParam65Import.update({ + path: '/$param65', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam64Route = genParamsParam64Import.update({ + path: '/$param64', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam63Route = genParamsParam63Import.update({ + path: '/$param63', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam62Route = genParamsParam62Import.update({ + path: '/$param62', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam61Route = genParamsParam61Import.update({ + path: '/$param61', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam60Route = genParamsParam60Import.update({ + path: '/$param60', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam6Route = genParamsParam6Import.update({ + path: '/$param6', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam59Route = genParamsParam59Import.update({ + path: '/$param59', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam58Route = genParamsParam58Import.update({ + path: '/$param58', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam57Route = genParamsParam57Import.update({ + path: '/$param57', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam56Route = genParamsParam56Import.update({ + path: '/$param56', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam55Route = genParamsParam55Import.update({ + path: '/$param55', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam54Route = genParamsParam54Import.update({ + path: '/$param54', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam53Route = genParamsParam53Import.update({ + path: '/$param53', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam52Route = genParamsParam52Import.update({ + path: '/$param52', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam51Route = genParamsParam51Import.update({ + path: '/$param51', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam50Route = genParamsParam50Import.update({ + path: '/$param50', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam5Route = genParamsParam5Import.update({ + path: '/$param5', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam49Route = genParamsParam49Import.update({ + path: '/$param49', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam48Route = genParamsParam48Import.update({ + path: '/$param48', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam47Route = genParamsParam47Import.update({ + path: '/$param47', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam46Route = genParamsParam46Import.update({ + path: '/$param46', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam45Route = genParamsParam45Import.update({ + path: '/$param45', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam44Route = genParamsParam44Import.update({ + path: '/$param44', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam43Route = genParamsParam43Import.update({ + path: '/$param43', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam42Route = genParamsParam42Import.update({ + path: '/$param42', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam41Route = genParamsParam41Import.update({ + path: '/$param41', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam40Route = genParamsParam40Import.update({ + path: '/$param40', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam4Route = genParamsParam4Import.update({ + path: '/$param4', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam39Route = genParamsParam39Import.update({ + path: '/$param39', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam38Route = genParamsParam38Import.update({ + path: '/$param38', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam37Route = genParamsParam37Import.update({ + path: '/$param37', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam36Route = genParamsParam36Import.update({ + path: '/$param36', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam35Route = genParamsParam35Import.update({ + path: '/$param35', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam34Route = genParamsParam34Import.update({ + path: '/$param34', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam33Route = genParamsParam33Import.update({ + path: '/$param33', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam32Route = genParamsParam32Import.update({ + path: '/$param32', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam31Route = genParamsParam31Import.update({ + path: '/$param31', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam30Route = genParamsParam30Import.update({ + path: '/$param30', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam3Route = genParamsParam3Import.update({ + path: '/$param3', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam29Route = genParamsParam29Import.update({ + path: '/$param29', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam28Route = genParamsParam28Import.update({ + path: '/$param28', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam27Route = genParamsParam27Import.update({ + path: '/$param27', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam26Route = genParamsParam26Import.update({ + path: '/$param26', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam25Route = genParamsParam25Import.update({ + path: '/$param25', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam24Route = genParamsParam24Import.update({ + path: '/$param24', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam23Route = genParamsParam23Import.update({ + path: '/$param23', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam22Route = genParamsParam22Import.update({ + path: '/$param22', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam21Route = genParamsParam21Import.update({ + path: '/$param21', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam20Route = genParamsParam20Import.update({ + path: '/$param20', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam2Route = genParamsParam2Import.update({ + path: '/$param2', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam19Route = genParamsParam19Import.update({ + path: '/$param19', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam18Route = genParamsParam18Import.update({ + path: '/$param18', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam17Route = genParamsParam17Import.update({ + path: '/$param17', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam16Route = genParamsParam16Import.update({ + path: '/$param16', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam15Route = genParamsParam15Import.update({ + path: '/$param15', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam14Route = genParamsParam14Import.update({ + path: '/$param14', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam13Route = genParamsParam13Import.update({ + path: '/$param13', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam12Route = genParamsParam12Import.update({ + path: '/$param12', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam11Route = genParamsParam11Import.update({ + path: '/$param11', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam10Route = genParamsParam10Import.update({ + path: '/$param10', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam1Route = genParamsParam1Import.update({ + path: '/$param1', + getParentRoute: () => genParamsRouteRoute, +} as any) + +const genParamsParam0Route = genParamsParam0Import.update({ + path: '/$param0', + getParentRoute: () => genParamsRouteRoute, +} as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexImport + parentRoute: typeof rootRoute + } + '/params': { + id: '/params' + path: '/params' + fullPath: '/params' + preLoaderRoute: typeof ParamsRouteImport + parentRoute: typeof rootRoute + } + '/search': { + id: '/search' + path: '/search' + fullPath: '/search' + preLoaderRoute: typeof SearchRouteImport + parentRoute: typeof rootRoute + } + '/absolute': { + id: '/absolute' + path: '/absolute' + fullPath: '/absolute' + preLoaderRoute: typeof AbsoluteImport + parentRoute: typeof rootRoute + } + '/linkProps': { + id: '/linkProps' + path: '/linkProps' + fullPath: '/linkProps' + preLoaderRoute: typeof LinkPropsImport + parentRoute: typeof rootRoute + } + '/relative': { + id: '/relative' + path: '/relative' + fullPath: '/relative' + preLoaderRoute: typeof RelativeImport + parentRoute: typeof rootRoute + } + '/(gen)/params': { + id: '/params' + path: '/params' + fullPath: '/params' + preLoaderRoute: typeof genParamsRouteImport + parentRoute: typeof rootRoute + } + '/(gen)/search': { + id: '/search' + path: '/search' + fullPath: '/search' + preLoaderRoute: typeof genSearchRouteImport + parentRoute: typeof rootRoute + } + '/(gen)/absolute0': { + id: '/absolute0' + path: '/absolute0' + fullPath: '/absolute0' + preLoaderRoute: typeof genAbsolute0Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute1': { + id: '/absolute1' + path: '/absolute1' + fullPath: '/absolute1' + preLoaderRoute: typeof genAbsolute1Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute10': { + id: '/absolute10' + path: '/absolute10' + fullPath: '/absolute10' + preLoaderRoute: typeof genAbsolute10Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute11': { + id: '/absolute11' + path: '/absolute11' + fullPath: '/absolute11' + preLoaderRoute: typeof genAbsolute11Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute12': { + id: '/absolute12' + path: '/absolute12' + fullPath: '/absolute12' + preLoaderRoute: typeof genAbsolute12Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute13': { + id: '/absolute13' + path: '/absolute13' + fullPath: '/absolute13' + preLoaderRoute: typeof genAbsolute13Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute14': { + id: '/absolute14' + path: '/absolute14' + fullPath: '/absolute14' + preLoaderRoute: typeof genAbsolute14Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute15': { + id: '/absolute15' + path: '/absolute15' + fullPath: '/absolute15' + preLoaderRoute: typeof genAbsolute15Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute16': { + id: '/absolute16' + path: '/absolute16' + fullPath: '/absolute16' + preLoaderRoute: typeof genAbsolute16Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute17': { + id: '/absolute17' + path: '/absolute17' + fullPath: '/absolute17' + preLoaderRoute: typeof genAbsolute17Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute18': { + id: '/absolute18' + path: '/absolute18' + fullPath: '/absolute18' + preLoaderRoute: typeof genAbsolute18Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute19': { + id: '/absolute19' + path: '/absolute19' + fullPath: '/absolute19' + preLoaderRoute: typeof genAbsolute19Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute2': { + id: '/absolute2' + path: '/absolute2' + fullPath: '/absolute2' + preLoaderRoute: typeof genAbsolute2Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute20': { + id: '/absolute20' + path: '/absolute20' + fullPath: '/absolute20' + preLoaderRoute: typeof genAbsolute20Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute21': { + id: '/absolute21' + path: '/absolute21' + fullPath: '/absolute21' + preLoaderRoute: typeof genAbsolute21Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute22': { + id: '/absolute22' + path: '/absolute22' + fullPath: '/absolute22' + preLoaderRoute: typeof genAbsolute22Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute23': { + id: '/absolute23' + path: '/absolute23' + fullPath: '/absolute23' + preLoaderRoute: typeof genAbsolute23Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute24': { + id: '/absolute24' + path: '/absolute24' + fullPath: '/absolute24' + preLoaderRoute: typeof genAbsolute24Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute25': { + id: '/absolute25' + path: '/absolute25' + fullPath: '/absolute25' + preLoaderRoute: typeof genAbsolute25Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute26': { + id: '/absolute26' + path: '/absolute26' + fullPath: '/absolute26' + preLoaderRoute: typeof genAbsolute26Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute27': { + id: '/absolute27' + path: '/absolute27' + fullPath: '/absolute27' + preLoaderRoute: typeof genAbsolute27Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute28': { + id: '/absolute28' + path: '/absolute28' + fullPath: '/absolute28' + preLoaderRoute: typeof genAbsolute28Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute29': { + id: '/absolute29' + path: '/absolute29' + fullPath: '/absolute29' + preLoaderRoute: typeof genAbsolute29Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute3': { + id: '/absolute3' + path: '/absolute3' + fullPath: '/absolute3' + preLoaderRoute: typeof genAbsolute3Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute30': { + id: '/absolute30' + path: '/absolute30' + fullPath: '/absolute30' + preLoaderRoute: typeof genAbsolute30Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute31': { + id: '/absolute31' + path: '/absolute31' + fullPath: '/absolute31' + preLoaderRoute: typeof genAbsolute31Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute32': { + id: '/absolute32' + path: '/absolute32' + fullPath: '/absolute32' + preLoaderRoute: typeof genAbsolute32Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute33': { + id: '/absolute33' + path: '/absolute33' + fullPath: '/absolute33' + preLoaderRoute: typeof genAbsolute33Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute34': { + id: '/absolute34' + path: '/absolute34' + fullPath: '/absolute34' + preLoaderRoute: typeof genAbsolute34Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute35': { + id: '/absolute35' + path: '/absolute35' + fullPath: '/absolute35' + preLoaderRoute: typeof genAbsolute35Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute36': { + id: '/absolute36' + path: '/absolute36' + fullPath: '/absolute36' + preLoaderRoute: typeof genAbsolute36Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute37': { + id: '/absolute37' + path: '/absolute37' + fullPath: '/absolute37' + preLoaderRoute: typeof genAbsolute37Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute38': { + id: '/absolute38' + path: '/absolute38' + fullPath: '/absolute38' + preLoaderRoute: typeof genAbsolute38Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute39': { + id: '/absolute39' + path: '/absolute39' + fullPath: '/absolute39' + preLoaderRoute: typeof genAbsolute39Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute4': { + id: '/absolute4' + path: '/absolute4' + fullPath: '/absolute4' + preLoaderRoute: typeof genAbsolute4Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute40': { + id: '/absolute40' + path: '/absolute40' + fullPath: '/absolute40' + preLoaderRoute: typeof genAbsolute40Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute41': { + id: '/absolute41' + path: '/absolute41' + fullPath: '/absolute41' + preLoaderRoute: typeof genAbsolute41Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute42': { + id: '/absolute42' + path: '/absolute42' + fullPath: '/absolute42' + preLoaderRoute: typeof genAbsolute42Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute43': { + id: '/absolute43' + path: '/absolute43' + fullPath: '/absolute43' + preLoaderRoute: typeof genAbsolute43Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute44': { + id: '/absolute44' + path: '/absolute44' + fullPath: '/absolute44' + preLoaderRoute: typeof genAbsolute44Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute45': { + id: '/absolute45' + path: '/absolute45' + fullPath: '/absolute45' + preLoaderRoute: typeof genAbsolute45Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute46': { + id: '/absolute46' + path: '/absolute46' + fullPath: '/absolute46' + preLoaderRoute: typeof genAbsolute46Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute47': { + id: '/absolute47' + path: '/absolute47' + fullPath: '/absolute47' + preLoaderRoute: typeof genAbsolute47Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute48': { + id: '/absolute48' + path: '/absolute48' + fullPath: '/absolute48' + preLoaderRoute: typeof genAbsolute48Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute49': { + id: '/absolute49' + path: '/absolute49' + fullPath: '/absolute49' + preLoaderRoute: typeof genAbsolute49Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute5': { + id: '/absolute5' + path: '/absolute5' + fullPath: '/absolute5' + preLoaderRoute: typeof genAbsolute5Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute50': { + id: '/absolute50' + path: '/absolute50' + fullPath: '/absolute50' + preLoaderRoute: typeof genAbsolute50Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute51': { + id: '/absolute51' + path: '/absolute51' + fullPath: '/absolute51' + preLoaderRoute: typeof genAbsolute51Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute52': { + id: '/absolute52' + path: '/absolute52' + fullPath: '/absolute52' + preLoaderRoute: typeof genAbsolute52Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute53': { + id: '/absolute53' + path: '/absolute53' + fullPath: '/absolute53' + preLoaderRoute: typeof genAbsolute53Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute54': { + id: '/absolute54' + path: '/absolute54' + fullPath: '/absolute54' + preLoaderRoute: typeof genAbsolute54Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute55': { + id: '/absolute55' + path: '/absolute55' + fullPath: '/absolute55' + preLoaderRoute: typeof genAbsolute55Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute56': { + id: '/absolute56' + path: '/absolute56' + fullPath: '/absolute56' + preLoaderRoute: typeof genAbsolute56Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute57': { + id: '/absolute57' + path: '/absolute57' + fullPath: '/absolute57' + preLoaderRoute: typeof genAbsolute57Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute58': { + id: '/absolute58' + path: '/absolute58' + fullPath: '/absolute58' + preLoaderRoute: typeof genAbsolute58Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute59': { + id: '/absolute59' + path: '/absolute59' + fullPath: '/absolute59' + preLoaderRoute: typeof genAbsolute59Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute6': { + id: '/absolute6' + path: '/absolute6' + fullPath: '/absolute6' + preLoaderRoute: typeof genAbsolute6Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute60': { + id: '/absolute60' + path: '/absolute60' + fullPath: '/absolute60' + preLoaderRoute: typeof genAbsolute60Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute61': { + id: '/absolute61' + path: '/absolute61' + fullPath: '/absolute61' + preLoaderRoute: typeof genAbsolute61Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute62': { + id: '/absolute62' + path: '/absolute62' + fullPath: '/absolute62' + preLoaderRoute: typeof genAbsolute62Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute63': { + id: '/absolute63' + path: '/absolute63' + fullPath: '/absolute63' + preLoaderRoute: typeof genAbsolute63Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute64': { + id: '/absolute64' + path: '/absolute64' + fullPath: '/absolute64' + preLoaderRoute: typeof genAbsolute64Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute65': { + id: '/absolute65' + path: '/absolute65' + fullPath: '/absolute65' + preLoaderRoute: typeof genAbsolute65Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute66': { + id: '/absolute66' + path: '/absolute66' + fullPath: '/absolute66' + preLoaderRoute: typeof genAbsolute66Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute67': { + id: '/absolute67' + path: '/absolute67' + fullPath: '/absolute67' + preLoaderRoute: typeof genAbsolute67Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute68': { + id: '/absolute68' + path: '/absolute68' + fullPath: '/absolute68' + preLoaderRoute: typeof genAbsolute68Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute69': { + id: '/absolute69' + path: '/absolute69' + fullPath: '/absolute69' + preLoaderRoute: typeof genAbsolute69Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute7': { + id: '/absolute7' + path: '/absolute7' + fullPath: '/absolute7' + preLoaderRoute: typeof genAbsolute7Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute70': { + id: '/absolute70' + path: '/absolute70' + fullPath: '/absolute70' + preLoaderRoute: typeof genAbsolute70Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute71': { + id: '/absolute71' + path: '/absolute71' + fullPath: '/absolute71' + preLoaderRoute: typeof genAbsolute71Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute72': { + id: '/absolute72' + path: '/absolute72' + fullPath: '/absolute72' + preLoaderRoute: typeof genAbsolute72Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute73': { + id: '/absolute73' + path: '/absolute73' + fullPath: '/absolute73' + preLoaderRoute: typeof genAbsolute73Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute74': { + id: '/absolute74' + path: '/absolute74' + fullPath: '/absolute74' + preLoaderRoute: typeof genAbsolute74Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute75': { + id: '/absolute75' + path: '/absolute75' + fullPath: '/absolute75' + preLoaderRoute: typeof genAbsolute75Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute76': { + id: '/absolute76' + path: '/absolute76' + fullPath: '/absolute76' + preLoaderRoute: typeof genAbsolute76Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute77': { + id: '/absolute77' + path: '/absolute77' + fullPath: '/absolute77' + preLoaderRoute: typeof genAbsolute77Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute78': { + id: '/absolute78' + path: '/absolute78' + fullPath: '/absolute78' + preLoaderRoute: typeof genAbsolute78Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute79': { + id: '/absolute79' + path: '/absolute79' + fullPath: '/absolute79' + preLoaderRoute: typeof genAbsolute79Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute8': { + id: '/absolute8' + path: '/absolute8' + fullPath: '/absolute8' + preLoaderRoute: typeof genAbsolute8Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute80': { + id: '/absolute80' + path: '/absolute80' + fullPath: '/absolute80' + preLoaderRoute: typeof genAbsolute80Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute81': { + id: '/absolute81' + path: '/absolute81' + fullPath: '/absolute81' + preLoaderRoute: typeof genAbsolute81Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute82': { + id: '/absolute82' + path: '/absolute82' + fullPath: '/absolute82' + preLoaderRoute: typeof genAbsolute82Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute83': { + id: '/absolute83' + path: '/absolute83' + fullPath: '/absolute83' + preLoaderRoute: typeof genAbsolute83Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute84': { + id: '/absolute84' + path: '/absolute84' + fullPath: '/absolute84' + preLoaderRoute: typeof genAbsolute84Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute85': { + id: '/absolute85' + path: '/absolute85' + fullPath: '/absolute85' + preLoaderRoute: typeof genAbsolute85Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute86': { + id: '/absolute86' + path: '/absolute86' + fullPath: '/absolute86' + preLoaderRoute: typeof genAbsolute86Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute87': { + id: '/absolute87' + path: '/absolute87' + fullPath: '/absolute87' + preLoaderRoute: typeof genAbsolute87Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute88': { + id: '/absolute88' + path: '/absolute88' + fullPath: '/absolute88' + preLoaderRoute: typeof genAbsolute88Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute89': { + id: '/absolute89' + path: '/absolute89' + fullPath: '/absolute89' + preLoaderRoute: typeof genAbsolute89Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute9': { + id: '/absolute9' + path: '/absolute9' + fullPath: '/absolute9' + preLoaderRoute: typeof genAbsolute9Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute90': { + id: '/absolute90' + path: '/absolute90' + fullPath: '/absolute90' + preLoaderRoute: typeof genAbsolute90Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute91': { + id: '/absolute91' + path: '/absolute91' + fullPath: '/absolute91' + preLoaderRoute: typeof genAbsolute91Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute92': { + id: '/absolute92' + path: '/absolute92' + fullPath: '/absolute92' + preLoaderRoute: typeof genAbsolute92Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute93': { + id: '/absolute93' + path: '/absolute93' + fullPath: '/absolute93' + preLoaderRoute: typeof genAbsolute93Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute94': { + id: '/absolute94' + path: '/absolute94' + fullPath: '/absolute94' + preLoaderRoute: typeof genAbsolute94Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute95': { + id: '/absolute95' + path: '/absolute95' + fullPath: '/absolute95' + preLoaderRoute: typeof genAbsolute95Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute96': { + id: '/absolute96' + path: '/absolute96' + fullPath: '/absolute96' + preLoaderRoute: typeof genAbsolute96Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute97': { + id: '/absolute97' + path: '/absolute97' + fullPath: '/absolute97' + preLoaderRoute: typeof genAbsolute97Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute98': { + id: '/absolute98' + path: '/absolute98' + fullPath: '/absolute98' + preLoaderRoute: typeof genAbsolute98Import + parentRoute: typeof rootRoute + } + '/(gen)/absolute99': { + id: '/absolute99' + path: '/absolute99' + fullPath: '/absolute99' + preLoaderRoute: typeof genAbsolute99Import + parentRoute: typeof rootRoute + } + '/(gen)/relative0': { + id: '/relative0' + path: '/relative0' + fullPath: '/relative0' + preLoaderRoute: typeof genRelative0Import + parentRoute: typeof rootRoute + } + '/(gen)/relative1': { + id: '/relative1' + path: '/relative1' + fullPath: '/relative1' + preLoaderRoute: typeof genRelative1Import + parentRoute: typeof rootRoute + } + '/(gen)/relative10': { + id: '/relative10' + path: '/relative10' + fullPath: '/relative10' + preLoaderRoute: typeof genRelative10Import + parentRoute: typeof rootRoute + } + '/(gen)/relative11': { + id: '/relative11' + path: '/relative11' + fullPath: '/relative11' + preLoaderRoute: typeof genRelative11Import + parentRoute: typeof rootRoute + } + '/(gen)/relative12': { + id: '/relative12' + path: '/relative12' + fullPath: '/relative12' + preLoaderRoute: typeof genRelative12Import + parentRoute: typeof rootRoute + } + '/(gen)/relative13': { + id: '/relative13' + path: '/relative13' + fullPath: '/relative13' + preLoaderRoute: typeof genRelative13Import + parentRoute: typeof rootRoute + } + '/(gen)/relative14': { + id: '/relative14' + path: '/relative14' + fullPath: '/relative14' + preLoaderRoute: typeof genRelative14Import + parentRoute: typeof rootRoute + } + '/(gen)/relative15': { + id: '/relative15' + path: '/relative15' + fullPath: '/relative15' + preLoaderRoute: typeof genRelative15Import + parentRoute: typeof rootRoute + } + '/(gen)/relative16': { + id: '/relative16' + path: '/relative16' + fullPath: '/relative16' + preLoaderRoute: typeof genRelative16Import + parentRoute: typeof rootRoute + } + '/(gen)/relative17': { + id: '/relative17' + path: '/relative17' + fullPath: '/relative17' + preLoaderRoute: typeof genRelative17Import + parentRoute: typeof rootRoute + } + '/(gen)/relative18': { + id: '/relative18' + path: '/relative18' + fullPath: '/relative18' + preLoaderRoute: typeof genRelative18Import + parentRoute: typeof rootRoute + } + '/(gen)/relative19': { + id: '/relative19' + path: '/relative19' + fullPath: '/relative19' + preLoaderRoute: typeof genRelative19Import + parentRoute: typeof rootRoute + } + '/(gen)/relative2': { + id: '/relative2' + path: '/relative2' + fullPath: '/relative2' + preLoaderRoute: typeof genRelative2Import + parentRoute: typeof rootRoute + } + '/(gen)/relative20': { + id: '/relative20' + path: '/relative20' + fullPath: '/relative20' + preLoaderRoute: typeof genRelative20Import + parentRoute: typeof rootRoute + } + '/(gen)/relative21': { + id: '/relative21' + path: '/relative21' + fullPath: '/relative21' + preLoaderRoute: typeof genRelative21Import + parentRoute: typeof rootRoute + } + '/(gen)/relative22': { + id: '/relative22' + path: '/relative22' + fullPath: '/relative22' + preLoaderRoute: typeof genRelative22Import + parentRoute: typeof rootRoute + } + '/(gen)/relative23': { + id: '/relative23' + path: '/relative23' + fullPath: '/relative23' + preLoaderRoute: typeof genRelative23Import + parentRoute: typeof rootRoute + } + '/(gen)/relative24': { + id: '/relative24' + path: '/relative24' + fullPath: '/relative24' + preLoaderRoute: typeof genRelative24Import + parentRoute: typeof rootRoute + } + '/(gen)/relative25': { + id: '/relative25' + path: '/relative25' + fullPath: '/relative25' + preLoaderRoute: typeof genRelative25Import + parentRoute: typeof rootRoute + } + '/(gen)/relative26': { + id: '/relative26' + path: '/relative26' + fullPath: '/relative26' + preLoaderRoute: typeof genRelative26Import + parentRoute: typeof rootRoute + } + '/(gen)/relative27': { + id: '/relative27' + path: '/relative27' + fullPath: '/relative27' + preLoaderRoute: typeof genRelative27Import + parentRoute: typeof rootRoute + } + '/(gen)/relative28': { + id: '/relative28' + path: '/relative28' + fullPath: '/relative28' + preLoaderRoute: typeof genRelative28Import + parentRoute: typeof rootRoute + } + '/(gen)/relative29': { + id: '/relative29' + path: '/relative29' + fullPath: '/relative29' + preLoaderRoute: typeof genRelative29Import + parentRoute: typeof rootRoute + } + '/(gen)/relative3': { + id: '/relative3' + path: '/relative3' + fullPath: '/relative3' + preLoaderRoute: typeof genRelative3Import + parentRoute: typeof rootRoute + } + '/(gen)/relative30': { + id: '/relative30' + path: '/relative30' + fullPath: '/relative30' + preLoaderRoute: typeof genRelative30Import + parentRoute: typeof rootRoute + } + '/(gen)/relative31': { + id: '/relative31' + path: '/relative31' + fullPath: '/relative31' + preLoaderRoute: typeof genRelative31Import + parentRoute: typeof rootRoute + } + '/(gen)/relative32': { + id: '/relative32' + path: '/relative32' + fullPath: '/relative32' + preLoaderRoute: typeof genRelative32Import + parentRoute: typeof rootRoute + } + '/(gen)/relative33': { + id: '/relative33' + path: '/relative33' + fullPath: '/relative33' + preLoaderRoute: typeof genRelative33Import + parentRoute: typeof rootRoute + } + '/(gen)/relative34': { + id: '/relative34' + path: '/relative34' + fullPath: '/relative34' + preLoaderRoute: typeof genRelative34Import + parentRoute: typeof rootRoute + } + '/(gen)/relative35': { + id: '/relative35' + path: '/relative35' + fullPath: '/relative35' + preLoaderRoute: typeof genRelative35Import + parentRoute: typeof rootRoute + } + '/(gen)/relative36': { + id: '/relative36' + path: '/relative36' + fullPath: '/relative36' + preLoaderRoute: typeof genRelative36Import + parentRoute: typeof rootRoute + } + '/(gen)/relative37': { + id: '/relative37' + path: '/relative37' + fullPath: '/relative37' + preLoaderRoute: typeof genRelative37Import + parentRoute: typeof rootRoute + } + '/(gen)/relative38': { + id: '/relative38' + path: '/relative38' + fullPath: '/relative38' + preLoaderRoute: typeof genRelative38Import + parentRoute: typeof rootRoute + } + '/(gen)/relative39': { + id: '/relative39' + path: '/relative39' + fullPath: '/relative39' + preLoaderRoute: typeof genRelative39Import + parentRoute: typeof rootRoute + } + '/(gen)/relative4': { + id: '/relative4' + path: '/relative4' + fullPath: '/relative4' + preLoaderRoute: typeof genRelative4Import + parentRoute: typeof rootRoute + } + '/(gen)/relative40': { + id: '/relative40' + path: '/relative40' + fullPath: '/relative40' + preLoaderRoute: typeof genRelative40Import + parentRoute: typeof rootRoute + } + '/(gen)/relative41': { + id: '/relative41' + path: '/relative41' + fullPath: '/relative41' + preLoaderRoute: typeof genRelative41Import + parentRoute: typeof rootRoute + } + '/(gen)/relative42': { + id: '/relative42' + path: '/relative42' + fullPath: '/relative42' + preLoaderRoute: typeof genRelative42Import + parentRoute: typeof rootRoute + } + '/(gen)/relative43': { + id: '/relative43' + path: '/relative43' + fullPath: '/relative43' + preLoaderRoute: typeof genRelative43Import + parentRoute: typeof rootRoute + } + '/(gen)/relative44': { + id: '/relative44' + path: '/relative44' + fullPath: '/relative44' + preLoaderRoute: typeof genRelative44Import + parentRoute: typeof rootRoute + } + '/(gen)/relative45': { + id: '/relative45' + path: '/relative45' + fullPath: '/relative45' + preLoaderRoute: typeof genRelative45Import + parentRoute: typeof rootRoute + } + '/(gen)/relative46': { + id: '/relative46' + path: '/relative46' + fullPath: '/relative46' + preLoaderRoute: typeof genRelative46Import + parentRoute: typeof rootRoute + } + '/(gen)/relative47': { + id: '/relative47' + path: '/relative47' + fullPath: '/relative47' + preLoaderRoute: typeof genRelative47Import + parentRoute: typeof rootRoute + } + '/(gen)/relative48': { + id: '/relative48' + path: '/relative48' + fullPath: '/relative48' + preLoaderRoute: typeof genRelative48Import + parentRoute: typeof rootRoute + } + '/(gen)/relative49': { + id: '/relative49' + path: '/relative49' + fullPath: '/relative49' + preLoaderRoute: typeof genRelative49Import + parentRoute: typeof rootRoute + } + '/(gen)/relative5': { + id: '/relative5' + path: '/relative5' + fullPath: '/relative5' + preLoaderRoute: typeof genRelative5Import + parentRoute: typeof rootRoute + } + '/(gen)/relative50': { + id: '/relative50' + path: '/relative50' + fullPath: '/relative50' + preLoaderRoute: typeof genRelative50Import + parentRoute: typeof rootRoute + } + '/(gen)/relative51': { + id: '/relative51' + path: '/relative51' + fullPath: '/relative51' + preLoaderRoute: typeof genRelative51Import + parentRoute: typeof rootRoute + } + '/(gen)/relative52': { + id: '/relative52' + path: '/relative52' + fullPath: '/relative52' + preLoaderRoute: typeof genRelative52Import + parentRoute: typeof rootRoute + } + '/(gen)/relative53': { + id: '/relative53' + path: '/relative53' + fullPath: '/relative53' + preLoaderRoute: typeof genRelative53Import + parentRoute: typeof rootRoute + } + '/(gen)/relative54': { + id: '/relative54' + path: '/relative54' + fullPath: '/relative54' + preLoaderRoute: typeof genRelative54Import + parentRoute: typeof rootRoute + } + '/(gen)/relative55': { + id: '/relative55' + path: '/relative55' + fullPath: '/relative55' + preLoaderRoute: typeof genRelative55Import + parentRoute: typeof rootRoute + } + '/(gen)/relative56': { + id: '/relative56' + path: '/relative56' + fullPath: '/relative56' + preLoaderRoute: typeof genRelative56Import + parentRoute: typeof rootRoute + } + '/(gen)/relative57': { + id: '/relative57' + path: '/relative57' + fullPath: '/relative57' + preLoaderRoute: typeof genRelative57Import + parentRoute: typeof rootRoute + } + '/(gen)/relative58': { + id: '/relative58' + path: '/relative58' + fullPath: '/relative58' + preLoaderRoute: typeof genRelative58Import + parentRoute: typeof rootRoute + } + '/(gen)/relative59': { + id: '/relative59' + path: '/relative59' + fullPath: '/relative59' + preLoaderRoute: typeof genRelative59Import + parentRoute: typeof rootRoute + } + '/(gen)/relative6': { + id: '/relative6' + path: '/relative6' + fullPath: '/relative6' + preLoaderRoute: typeof genRelative6Import + parentRoute: typeof rootRoute + } + '/(gen)/relative60': { + id: '/relative60' + path: '/relative60' + fullPath: '/relative60' + preLoaderRoute: typeof genRelative60Import + parentRoute: typeof rootRoute + } + '/(gen)/relative61': { + id: '/relative61' + path: '/relative61' + fullPath: '/relative61' + preLoaderRoute: typeof genRelative61Import + parentRoute: typeof rootRoute + } + '/(gen)/relative62': { + id: '/relative62' + path: '/relative62' + fullPath: '/relative62' + preLoaderRoute: typeof genRelative62Import + parentRoute: typeof rootRoute + } + '/(gen)/relative63': { + id: '/relative63' + path: '/relative63' + fullPath: '/relative63' + preLoaderRoute: typeof genRelative63Import + parentRoute: typeof rootRoute + } + '/(gen)/relative64': { + id: '/relative64' + path: '/relative64' + fullPath: '/relative64' + preLoaderRoute: typeof genRelative64Import + parentRoute: typeof rootRoute + } + '/(gen)/relative65': { + id: '/relative65' + path: '/relative65' + fullPath: '/relative65' + preLoaderRoute: typeof genRelative65Import + parentRoute: typeof rootRoute + } + '/(gen)/relative66': { + id: '/relative66' + path: '/relative66' + fullPath: '/relative66' + preLoaderRoute: typeof genRelative66Import + parentRoute: typeof rootRoute + } + '/(gen)/relative67': { + id: '/relative67' + path: '/relative67' + fullPath: '/relative67' + preLoaderRoute: typeof genRelative67Import + parentRoute: typeof rootRoute + } + '/(gen)/relative68': { + id: '/relative68' + path: '/relative68' + fullPath: '/relative68' + preLoaderRoute: typeof genRelative68Import + parentRoute: typeof rootRoute + } + '/(gen)/relative69': { + id: '/relative69' + path: '/relative69' + fullPath: '/relative69' + preLoaderRoute: typeof genRelative69Import + parentRoute: typeof rootRoute + } + '/(gen)/relative7': { + id: '/relative7' + path: '/relative7' + fullPath: '/relative7' + preLoaderRoute: typeof genRelative7Import + parentRoute: typeof rootRoute + } + '/(gen)/relative70': { + id: '/relative70' + path: '/relative70' + fullPath: '/relative70' + preLoaderRoute: typeof genRelative70Import + parentRoute: typeof rootRoute + } + '/(gen)/relative71': { + id: '/relative71' + path: '/relative71' + fullPath: '/relative71' + preLoaderRoute: typeof genRelative71Import + parentRoute: typeof rootRoute + } + '/(gen)/relative72': { + id: '/relative72' + path: '/relative72' + fullPath: '/relative72' + preLoaderRoute: typeof genRelative72Import + parentRoute: typeof rootRoute + } + '/(gen)/relative73': { + id: '/relative73' + path: '/relative73' + fullPath: '/relative73' + preLoaderRoute: typeof genRelative73Import + parentRoute: typeof rootRoute + } + '/(gen)/relative74': { + id: '/relative74' + path: '/relative74' + fullPath: '/relative74' + preLoaderRoute: typeof genRelative74Import + parentRoute: typeof rootRoute + } + '/(gen)/relative75': { + id: '/relative75' + path: '/relative75' + fullPath: '/relative75' + preLoaderRoute: typeof genRelative75Import + parentRoute: typeof rootRoute + } + '/(gen)/relative76': { + id: '/relative76' + path: '/relative76' + fullPath: '/relative76' + preLoaderRoute: typeof genRelative76Import + parentRoute: typeof rootRoute + } + '/(gen)/relative77': { + id: '/relative77' + path: '/relative77' + fullPath: '/relative77' + preLoaderRoute: typeof genRelative77Import + parentRoute: typeof rootRoute + } + '/(gen)/relative78': { + id: '/relative78' + path: '/relative78' + fullPath: '/relative78' + preLoaderRoute: typeof genRelative78Import + parentRoute: typeof rootRoute + } + '/(gen)/relative79': { + id: '/relative79' + path: '/relative79' + fullPath: '/relative79' + preLoaderRoute: typeof genRelative79Import + parentRoute: typeof rootRoute + } + '/(gen)/relative8': { + id: '/relative8' + path: '/relative8' + fullPath: '/relative8' + preLoaderRoute: typeof genRelative8Import + parentRoute: typeof rootRoute + } + '/(gen)/relative80': { + id: '/relative80' + path: '/relative80' + fullPath: '/relative80' + preLoaderRoute: typeof genRelative80Import + parentRoute: typeof rootRoute + } + '/(gen)/relative81': { + id: '/relative81' + path: '/relative81' + fullPath: '/relative81' + preLoaderRoute: typeof genRelative81Import + parentRoute: typeof rootRoute + } + '/(gen)/relative82': { + id: '/relative82' + path: '/relative82' + fullPath: '/relative82' + preLoaderRoute: typeof genRelative82Import + parentRoute: typeof rootRoute + } + '/(gen)/relative83': { + id: '/relative83' + path: '/relative83' + fullPath: '/relative83' + preLoaderRoute: typeof genRelative83Import + parentRoute: typeof rootRoute + } + '/(gen)/relative84': { + id: '/relative84' + path: '/relative84' + fullPath: '/relative84' + preLoaderRoute: typeof genRelative84Import + parentRoute: typeof rootRoute + } + '/(gen)/relative85': { + id: '/relative85' + path: '/relative85' + fullPath: '/relative85' + preLoaderRoute: typeof genRelative85Import + parentRoute: typeof rootRoute + } + '/(gen)/relative86': { + id: '/relative86' + path: '/relative86' + fullPath: '/relative86' + preLoaderRoute: typeof genRelative86Import + parentRoute: typeof rootRoute + } + '/(gen)/relative87': { + id: '/relative87' + path: '/relative87' + fullPath: '/relative87' + preLoaderRoute: typeof genRelative87Import + parentRoute: typeof rootRoute + } + '/(gen)/relative88': { + id: '/relative88' + path: '/relative88' + fullPath: '/relative88' + preLoaderRoute: typeof genRelative88Import + parentRoute: typeof rootRoute + } + '/(gen)/relative89': { + id: '/relative89' + path: '/relative89' + fullPath: '/relative89' + preLoaderRoute: typeof genRelative89Import + parentRoute: typeof rootRoute + } + '/(gen)/relative9': { + id: '/relative9' + path: '/relative9' + fullPath: '/relative9' + preLoaderRoute: typeof genRelative9Import + parentRoute: typeof rootRoute + } + '/(gen)/relative90': { + id: '/relative90' + path: '/relative90' + fullPath: '/relative90' + preLoaderRoute: typeof genRelative90Import + parentRoute: typeof rootRoute + } + '/(gen)/relative91': { + id: '/relative91' + path: '/relative91' + fullPath: '/relative91' + preLoaderRoute: typeof genRelative91Import + parentRoute: typeof rootRoute + } + '/(gen)/relative92': { + id: '/relative92' + path: '/relative92' + fullPath: '/relative92' + preLoaderRoute: typeof genRelative92Import + parentRoute: typeof rootRoute + } + '/(gen)/relative93': { + id: '/relative93' + path: '/relative93' + fullPath: '/relative93' + preLoaderRoute: typeof genRelative93Import + parentRoute: typeof rootRoute + } + '/(gen)/relative94': { + id: '/relative94' + path: '/relative94' + fullPath: '/relative94' + preLoaderRoute: typeof genRelative94Import + parentRoute: typeof rootRoute + } + '/(gen)/relative95': { + id: '/relative95' + path: '/relative95' + fullPath: '/relative95' + preLoaderRoute: typeof genRelative95Import + parentRoute: typeof rootRoute + } + '/(gen)/relative96': { + id: '/relative96' + path: '/relative96' + fullPath: '/relative96' + preLoaderRoute: typeof genRelative96Import + parentRoute: typeof rootRoute + } + '/(gen)/relative97': { + id: '/relative97' + path: '/relative97' + fullPath: '/relative97' + preLoaderRoute: typeof genRelative97Import + parentRoute: typeof rootRoute + } + '/(gen)/relative98': { + id: '/relative98' + path: '/relative98' + fullPath: '/relative98' + preLoaderRoute: typeof genRelative98Import + parentRoute: typeof rootRoute + } + '/(gen)/relative99': { + id: '/relative99' + path: '/relative99' + fullPath: '/relative99' + preLoaderRoute: typeof genRelative99Import + parentRoute: typeof rootRoute + } + '/params/$paramsPlaceholder': { + id: '/params/$paramsPlaceholder' + path: '/$paramsPlaceholder' + fullPath: '/params/$paramsPlaceholder' + preLoaderRoute: typeof ParamsParamsPlaceholderImport + parentRoute: typeof ParamsRouteImport + } + '/search/searchPlaceholder': { + id: '/search/searchPlaceholder' + path: '/searchPlaceholder' + fullPath: '/search/searchPlaceholder' + preLoaderRoute: typeof SearchSearchPlaceholderImport + parentRoute: typeof SearchRouteImport + } + '/(gen)/params/$param0': { + id: '/params/$param0' + path: '/$param0' + fullPath: '/params/$param0' + preLoaderRoute: typeof genParamsParam0Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param1': { + id: '/params/$param1' + path: '/$param1' + fullPath: '/params/$param1' + preLoaderRoute: typeof genParamsParam1Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param10': { + id: '/params/$param10' + path: '/$param10' + fullPath: '/params/$param10' + preLoaderRoute: typeof genParamsParam10Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param11': { + id: '/params/$param11' + path: '/$param11' + fullPath: '/params/$param11' + preLoaderRoute: typeof genParamsParam11Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param12': { + id: '/params/$param12' + path: '/$param12' + fullPath: '/params/$param12' + preLoaderRoute: typeof genParamsParam12Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param13': { + id: '/params/$param13' + path: '/$param13' + fullPath: '/params/$param13' + preLoaderRoute: typeof genParamsParam13Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param14': { + id: '/params/$param14' + path: '/$param14' + fullPath: '/params/$param14' + preLoaderRoute: typeof genParamsParam14Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param15': { + id: '/params/$param15' + path: '/$param15' + fullPath: '/params/$param15' + preLoaderRoute: typeof genParamsParam15Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param16': { + id: '/params/$param16' + path: '/$param16' + fullPath: '/params/$param16' + preLoaderRoute: typeof genParamsParam16Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param17': { + id: '/params/$param17' + path: '/$param17' + fullPath: '/params/$param17' + preLoaderRoute: typeof genParamsParam17Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param18': { + id: '/params/$param18' + path: '/$param18' + fullPath: '/params/$param18' + preLoaderRoute: typeof genParamsParam18Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param19': { + id: '/params/$param19' + path: '/$param19' + fullPath: '/params/$param19' + preLoaderRoute: typeof genParamsParam19Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param2': { + id: '/params/$param2' + path: '/$param2' + fullPath: '/params/$param2' + preLoaderRoute: typeof genParamsParam2Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param20': { + id: '/params/$param20' + path: '/$param20' + fullPath: '/params/$param20' + preLoaderRoute: typeof genParamsParam20Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param21': { + id: '/params/$param21' + path: '/$param21' + fullPath: '/params/$param21' + preLoaderRoute: typeof genParamsParam21Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param22': { + id: '/params/$param22' + path: '/$param22' + fullPath: '/params/$param22' + preLoaderRoute: typeof genParamsParam22Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param23': { + id: '/params/$param23' + path: '/$param23' + fullPath: '/params/$param23' + preLoaderRoute: typeof genParamsParam23Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param24': { + id: '/params/$param24' + path: '/$param24' + fullPath: '/params/$param24' + preLoaderRoute: typeof genParamsParam24Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param25': { + id: '/params/$param25' + path: '/$param25' + fullPath: '/params/$param25' + preLoaderRoute: typeof genParamsParam25Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param26': { + id: '/params/$param26' + path: '/$param26' + fullPath: '/params/$param26' + preLoaderRoute: typeof genParamsParam26Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param27': { + id: '/params/$param27' + path: '/$param27' + fullPath: '/params/$param27' + preLoaderRoute: typeof genParamsParam27Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param28': { + id: '/params/$param28' + path: '/$param28' + fullPath: '/params/$param28' + preLoaderRoute: typeof genParamsParam28Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param29': { + id: '/params/$param29' + path: '/$param29' + fullPath: '/params/$param29' + preLoaderRoute: typeof genParamsParam29Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param3': { + id: '/params/$param3' + path: '/$param3' + fullPath: '/params/$param3' + preLoaderRoute: typeof genParamsParam3Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param30': { + id: '/params/$param30' + path: '/$param30' + fullPath: '/params/$param30' + preLoaderRoute: typeof genParamsParam30Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param31': { + id: '/params/$param31' + path: '/$param31' + fullPath: '/params/$param31' + preLoaderRoute: typeof genParamsParam31Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param32': { + id: '/params/$param32' + path: '/$param32' + fullPath: '/params/$param32' + preLoaderRoute: typeof genParamsParam32Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param33': { + id: '/params/$param33' + path: '/$param33' + fullPath: '/params/$param33' + preLoaderRoute: typeof genParamsParam33Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param34': { + id: '/params/$param34' + path: '/$param34' + fullPath: '/params/$param34' + preLoaderRoute: typeof genParamsParam34Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param35': { + id: '/params/$param35' + path: '/$param35' + fullPath: '/params/$param35' + preLoaderRoute: typeof genParamsParam35Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param36': { + id: '/params/$param36' + path: '/$param36' + fullPath: '/params/$param36' + preLoaderRoute: typeof genParamsParam36Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param37': { + id: '/params/$param37' + path: '/$param37' + fullPath: '/params/$param37' + preLoaderRoute: typeof genParamsParam37Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param38': { + id: '/params/$param38' + path: '/$param38' + fullPath: '/params/$param38' + preLoaderRoute: typeof genParamsParam38Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param39': { + id: '/params/$param39' + path: '/$param39' + fullPath: '/params/$param39' + preLoaderRoute: typeof genParamsParam39Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param4': { + id: '/params/$param4' + path: '/$param4' + fullPath: '/params/$param4' + preLoaderRoute: typeof genParamsParam4Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param40': { + id: '/params/$param40' + path: '/$param40' + fullPath: '/params/$param40' + preLoaderRoute: typeof genParamsParam40Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param41': { + id: '/params/$param41' + path: '/$param41' + fullPath: '/params/$param41' + preLoaderRoute: typeof genParamsParam41Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param42': { + id: '/params/$param42' + path: '/$param42' + fullPath: '/params/$param42' + preLoaderRoute: typeof genParamsParam42Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param43': { + id: '/params/$param43' + path: '/$param43' + fullPath: '/params/$param43' + preLoaderRoute: typeof genParamsParam43Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param44': { + id: '/params/$param44' + path: '/$param44' + fullPath: '/params/$param44' + preLoaderRoute: typeof genParamsParam44Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param45': { + id: '/params/$param45' + path: '/$param45' + fullPath: '/params/$param45' + preLoaderRoute: typeof genParamsParam45Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param46': { + id: '/params/$param46' + path: '/$param46' + fullPath: '/params/$param46' + preLoaderRoute: typeof genParamsParam46Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param47': { + id: '/params/$param47' + path: '/$param47' + fullPath: '/params/$param47' + preLoaderRoute: typeof genParamsParam47Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param48': { + id: '/params/$param48' + path: '/$param48' + fullPath: '/params/$param48' + preLoaderRoute: typeof genParamsParam48Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param49': { + id: '/params/$param49' + path: '/$param49' + fullPath: '/params/$param49' + preLoaderRoute: typeof genParamsParam49Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param5': { + id: '/params/$param5' + path: '/$param5' + fullPath: '/params/$param5' + preLoaderRoute: typeof genParamsParam5Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param50': { + id: '/params/$param50' + path: '/$param50' + fullPath: '/params/$param50' + preLoaderRoute: typeof genParamsParam50Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param51': { + id: '/params/$param51' + path: '/$param51' + fullPath: '/params/$param51' + preLoaderRoute: typeof genParamsParam51Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param52': { + id: '/params/$param52' + path: '/$param52' + fullPath: '/params/$param52' + preLoaderRoute: typeof genParamsParam52Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param53': { + id: '/params/$param53' + path: '/$param53' + fullPath: '/params/$param53' + preLoaderRoute: typeof genParamsParam53Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param54': { + id: '/params/$param54' + path: '/$param54' + fullPath: '/params/$param54' + preLoaderRoute: typeof genParamsParam54Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param55': { + id: '/params/$param55' + path: '/$param55' + fullPath: '/params/$param55' + preLoaderRoute: typeof genParamsParam55Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param56': { + id: '/params/$param56' + path: '/$param56' + fullPath: '/params/$param56' + preLoaderRoute: typeof genParamsParam56Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param57': { + id: '/params/$param57' + path: '/$param57' + fullPath: '/params/$param57' + preLoaderRoute: typeof genParamsParam57Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param58': { + id: '/params/$param58' + path: '/$param58' + fullPath: '/params/$param58' + preLoaderRoute: typeof genParamsParam58Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param59': { + id: '/params/$param59' + path: '/$param59' + fullPath: '/params/$param59' + preLoaderRoute: typeof genParamsParam59Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param6': { + id: '/params/$param6' + path: '/$param6' + fullPath: '/params/$param6' + preLoaderRoute: typeof genParamsParam6Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param60': { + id: '/params/$param60' + path: '/$param60' + fullPath: '/params/$param60' + preLoaderRoute: typeof genParamsParam60Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param61': { + id: '/params/$param61' + path: '/$param61' + fullPath: '/params/$param61' + preLoaderRoute: typeof genParamsParam61Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param62': { + id: '/params/$param62' + path: '/$param62' + fullPath: '/params/$param62' + preLoaderRoute: typeof genParamsParam62Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param63': { + id: '/params/$param63' + path: '/$param63' + fullPath: '/params/$param63' + preLoaderRoute: typeof genParamsParam63Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param64': { + id: '/params/$param64' + path: '/$param64' + fullPath: '/params/$param64' + preLoaderRoute: typeof genParamsParam64Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param65': { + id: '/params/$param65' + path: '/$param65' + fullPath: '/params/$param65' + preLoaderRoute: typeof genParamsParam65Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param66': { + id: '/params/$param66' + path: '/$param66' + fullPath: '/params/$param66' + preLoaderRoute: typeof genParamsParam66Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param67': { + id: '/params/$param67' + path: '/$param67' + fullPath: '/params/$param67' + preLoaderRoute: typeof genParamsParam67Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param68': { + id: '/params/$param68' + path: '/$param68' + fullPath: '/params/$param68' + preLoaderRoute: typeof genParamsParam68Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param69': { + id: '/params/$param69' + path: '/$param69' + fullPath: '/params/$param69' + preLoaderRoute: typeof genParamsParam69Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param7': { + id: '/params/$param7' + path: '/$param7' + fullPath: '/params/$param7' + preLoaderRoute: typeof genParamsParam7Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param70': { + id: '/params/$param70' + path: '/$param70' + fullPath: '/params/$param70' + preLoaderRoute: typeof genParamsParam70Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param71': { + id: '/params/$param71' + path: '/$param71' + fullPath: '/params/$param71' + preLoaderRoute: typeof genParamsParam71Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param72': { + id: '/params/$param72' + path: '/$param72' + fullPath: '/params/$param72' + preLoaderRoute: typeof genParamsParam72Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param73': { + id: '/params/$param73' + path: '/$param73' + fullPath: '/params/$param73' + preLoaderRoute: typeof genParamsParam73Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param74': { + id: '/params/$param74' + path: '/$param74' + fullPath: '/params/$param74' + preLoaderRoute: typeof genParamsParam74Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param75': { + id: '/params/$param75' + path: '/$param75' + fullPath: '/params/$param75' + preLoaderRoute: typeof genParamsParam75Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param76': { + id: '/params/$param76' + path: '/$param76' + fullPath: '/params/$param76' + preLoaderRoute: typeof genParamsParam76Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param77': { + id: '/params/$param77' + path: '/$param77' + fullPath: '/params/$param77' + preLoaderRoute: typeof genParamsParam77Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param78': { + id: '/params/$param78' + path: '/$param78' + fullPath: '/params/$param78' + preLoaderRoute: typeof genParamsParam78Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param79': { + id: '/params/$param79' + path: '/$param79' + fullPath: '/params/$param79' + preLoaderRoute: typeof genParamsParam79Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param8': { + id: '/params/$param8' + path: '/$param8' + fullPath: '/params/$param8' + preLoaderRoute: typeof genParamsParam8Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param80': { + id: '/params/$param80' + path: '/$param80' + fullPath: '/params/$param80' + preLoaderRoute: typeof genParamsParam80Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param81': { + id: '/params/$param81' + path: '/$param81' + fullPath: '/params/$param81' + preLoaderRoute: typeof genParamsParam81Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param82': { + id: '/params/$param82' + path: '/$param82' + fullPath: '/params/$param82' + preLoaderRoute: typeof genParamsParam82Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param83': { + id: '/params/$param83' + path: '/$param83' + fullPath: '/params/$param83' + preLoaderRoute: typeof genParamsParam83Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param84': { + id: '/params/$param84' + path: '/$param84' + fullPath: '/params/$param84' + preLoaderRoute: typeof genParamsParam84Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param85': { + id: '/params/$param85' + path: '/$param85' + fullPath: '/params/$param85' + preLoaderRoute: typeof genParamsParam85Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param86': { + id: '/params/$param86' + path: '/$param86' + fullPath: '/params/$param86' + preLoaderRoute: typeof genParamsParam86Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param87': { + id: '/params/$param87' + path: '/$param87' + fullPath: '/params/$param87' + preLoaderRoute: typeof genParamsParam87Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param88': { + id: '/params/$param88' + path: '/$param88' + fullPath: '/params/$param88' + preLoaderRoute: typeof genParamsParam88Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param89': { + id: '/params/$param89' + path: '/$param89' + fullPath: '/params/$param89' + preLoaderRoute: typeof genParamsParam89Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param9': { + id: '/params/$param9' + path: '/$param9' + fullPath: '/params/$param9' + preLoaderRoute: typeof genParamsParam9Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param90': { + id: '/params/$param90' + path: '/$param90' + fullPath: '/params/$param90' + preLoaderRoute: typeof genParamsParam90Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param91': { + id: '/params/$param91' + path: '/$param91' + fullPath: '/params/$param91' + preLoaderRoute: typeof genParamsParam91Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param92': { + id: '/params/$param92' + path: '/$param92' + fullPath: '/params/$param92' + preLoaderRoute: typeof genParamsParam92Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param93': { + id: '/params/$param93' + path: '/$param93' + fullPath: '/params/$param93' + preLoaderRoute: typeof genParamsParam93Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param94': { + id: '/params/$param94' + path: '/$param94' + fullPath: '/params/$param94' + preLoaderRoute: typeof genParamsParam94Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param95': { + id: '/params/$param95' + path: '/$param95' + fullPath: '/params/$param95' + preLoaderRoute: typeof genParamsParam95Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param96': { + id: '/params/$param96' + path: '/$param96' + fullPath: '/params/$param96' + preLoaderRoute: typeof genParamsParam96Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param97': { + id: '/params/$param97' + path: '/$param97' + fullPath: '/params/$param97' + preLoaderRoute: typeof genParamsParam97Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param98': { + id: '/params/$param98' + path: '/$param98' + fullPath: '/params/$param98' + preLoaderRoute: typeof genParamsParam98Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/params/$param99': { + id: '/params/$param99' + path: '/$param99' + fullPath: '/params/$param99' + preLoaderRoute: typeof genParamsParam99Import + parentRoute: typeof genParamsRouteImport + } + '/(gen)/search/search0': { + id: '/search/search0' + path: '/search0' + fullPath: '/search/search0' + preLoaderRoute: typeof genSearchSearch0Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search1': { + id: '/search/search1' + path: '/search1' + fullPath: '/search/search1' + preLoaderRoute: typeof genSearchSearch1Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search10': { + id: '/search/search10' + path: '/search10' + fullPath: '/search/search10' + preLoaderRoute: typeof genSearchSearch10Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search11': { + id: '/search/search11' + path: '/search11' + fullPath: '/search/search11' + preLoaderRoute: typeof genSearchSearch11Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search12': { + id: '/search/search12' + path: '/search12' + fullPath: '/search/search12' + preLoaderRoute: typeof genSearchSearch12Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search13': { + id: '/search/search13' + path: '/search13' + fullPath: '/search/search13' + preLoaderRoute: typeof genSearchSearch13Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search14': { + id: '/search/search14' + path: '/search14' + fullPath: '/search/search14' + preLoaderRoute: typeof genSearchSearch14Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search15': { + id: '/search/search15' + path: '/search15' + fullPath: '/search/search15' + preLoaderRoute: typeof genSearchSearch15Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search16': { + id: '/search/search16' + path: '/search16' + fullPath: '/search/search16' + preLoaderRoute: typeof genSearchSearch16Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search17': { + id: '/search/search17' + path: '/search17' + fullPath: '/search/search17' + preLoaderRoute: typeof genSearchSearch17Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search18': { + id: '/search/search18' + path: '/search18' + fullPath: '/search/search18' + preLoaderRoute: typeof genSearchSearch18Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search19': { + id: '/search/search19' + path: '/search19' + fullPath: '/search/search19' + preLoaderRoute: typeof genSearchSearch19Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search2': { + id: '/search/search2' + path: '/search2' + fullPath: '/search/search2' + preLoaderRoute: typeof genSearchSearch2Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search20': { + id: '/search/search20' + path: '/search20' + fullPath: '/search/search20' + preLoaderRoute: typeof genSearchSearch20Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search21': { + id: '/search/search21' + path: '/search21' + fullPath: '/search/search21' + preLoaderRoute: typeof genSearchSearch21Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search22': { + id: '/search/search22' + path: '/search22' + fullPath: '/search/search22' + preLoaderRoute: typeof genSearchSearch22Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search23': { + id: '/search/search23' + path: '/search23' + fullPath: '/search/search23' + preLoaderRoute: typeof genSearchSearch23Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search24': { + id: '/search/search24' + path: '/search24' + fullPath: '/search/search24' + preLoaderRoute: typeof genSearchSearch24Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search25': { + id: '/search/search25' + path: '/search25' + fullPath: '/search/search25' + preLoaderRoute: typeof genSearchSearch25Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search26': { + id: '/search/search26' + path: '/search26' + fullPath: '/search/search26' + preLoaderRoute: typeof genSearchSearch26Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search27': { + id: '/search/search27' + path: '/search27' + fullPath: '/search/search27' + preLoaderRoute: typeof genSearchSearch27Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search28': { + id: '/search/search28' + path: '/search28' + fullPath: '/search/search28' + preLoaderRoute: typeof genSearchSearch28Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search29': { + id: '/search/search29' + path: '/search29' + fullPath: '/search/search29' + preLoaderRoute: typeof genSearchSearch29Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search3': { + id: '/search/search3' + path: '/search3' + fullPath: '/search/search3' + preLoaderRoute: typeof genSearchSearch3Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search30': { + id: '/search/search30' + path: '/search30' + fullPath: '/search/search30' + preLoaderRoute: typeof genSearchSearch30Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search31': { + id: '/search/search31' + path: '/search31' + fullPath: '/search/search31' + preLoaderRoute: typeof genSearchSearch31Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search32': { + id: '/search/search32' + path: '/search32' + fullPath: '/search/search32' + preLoaderRoute: typeof genSearchSearch32Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search33': { + id: '/search/search33' + path: '/search33' + fullPath: '/search/search33' + preLoaderRoute: typeof genSearchSearch33Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search34': { + id: '/search/search34' + path: '/search34' + fullPath: '/search/search34' + preLoaderRoute: typeof genSearchSearch34Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search35': { + id: '/search/search35' + path: '/search35' + fullPath: '/search/search35' + preLoaderRoute: typeof genSearchSearch35Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search36': { + id: '/search/search36' + path: '/search36' + fullPath: '/search/search36' + preLoaderRoute: typeof genSearchSearch36Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search37': { + id: '/search/search37' + path: '/search37' + fullPath: '/search/search37' + preLoaderRoute: typeof genSearchSearch37Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search38': { + id: '/search/search38' + path: '/search38' + fullPath: '/search/search38' + preLoaderRoute: typeof genSearchSearch38Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search39': { + id: '/search/search39' + path: '/search39' + fullPath: '/search/search39' + preLoaderRoute: typeof genSearchSearch39Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search4': { + id: '/search/search4' + path: '/search4' + fullPath: '/search/search4' + preLoaderRoute: typeof genSearchSearch4Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search40': { + id: '/search/search40' + path: '/search40' + fullPath: '/search/search40' + preLoaderRoute: typeof genSearchSearch40Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search41': { + id: '/search/search41' + path: '/search41' + fullPath: '/search/search41' + preLoaderRoute: typeof genSearchSearch41Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search42': { + id: '/search/search42' + path: '/search42' + fullPath: '/search/search42' + preLoaderRoute: typeof genSearchSearch42Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search43': { + id: '/search/search43' + path: '/search43' + fullPath: '/search/search43' + preLoaderRoute: typeof genSearchSearch43Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search44': { + id: '/search/search44' + path: '/search44' + fullPath: '/search/search44' + preLoaderRoute: typeof genSearchSearch44Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search45': { + id: '/search/search45' + path: '/search45' + fullPath: '/search/search45' + preLoaderRoute: typeof genSearchSearch45Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search46': { + id: '/search/search46' + path: '/search46' + fullPath: '/search/search46' + preLoaderRoute: typeof genSearchSearch46Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search47': { + id: '/search/search47' + path: '/search47' + fullPath: '/search/search47' + preLoaderRoute: typeof genSearchSearch47Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search48': { + id: '/search/search48' + path: '/search48' + fullPath: '/search/search48' + preLoaderRoute: typeof genSearchSearch48Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search49': { + id: '/search/search49' + path: '/search49' + fullPath: '/search/search49' + preLoaderRoute: typeof genSearchSearch49Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search5': { + id: '/search/search5' + path: '/search5' + fullPath: '/search/search5' + preLoaderRoute: typeof genSearchSearch5Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search50': { + id: '/search/search50' + path: '/search50' + fullPath: '/search/search50' + preLoaderRoute: typeof genSearchSearch50Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search51': { + id: '/search/search51' + path: '/search51' + fullPath: '/search/search51' + preLoaderRoute: typeof genSearchSearch51Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search52': { + id: '/search/search52' + path: '/search52' + fullPath: '/search/search52' + preLoaderRoute: typeof genSearchSearch52Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search53': { + id: '/search/search53' + path: '/search53' + fullPath: '/search/search53' + preLoaderRoute: typeof genSearchSearch53Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search54': { + id: '/search/search54' + path: '/search54' + fullPath: '/search/search54' + preLoaderRoute: typeof genSearchSearch54Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search55': { + id: '/search/search55' + path: '/search55' + fullPath: '/search/search55' + preLoaderRoute: typeof genSearchSearch55Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search56': { + id: '/search/search56' + path: '/search56' + fullPath: '/search/search56' + preLoaderRoute: typeof genSearchSearch56Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search57': { + id: '/search/search57' + path: '/search57' + fullPath: '/search/search57' + preLoaderRoute: typeof genSearchSearch57Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search58': { + id: '/search/search58' + path: '/search58' + fullPath: '/search/search58' + preLoaderRoute: typeof genSearchSearch58Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search59': { + id: '/search/search59' + path: '/search59' + fullPath: '/search/search59' + preLoaderRoute: typeof genSearchSearch59Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search6': { + id: '/search/search6' + path: '/search6' + fullPath: '/search/search6' + preLoaderRoute: typeof genSearchSearch6Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search60': { + id: '/search/search60' + path: '/search60' + fullPath: '/search/search60' + preLoaderRoute: typeof genSearchSearch60Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search61': { + id: '/search/search61' + path: '/search61' + fullPath: '/search/search61' + preLoaderRoute: typeof genSearchSearch61Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search62': { + id: '/search/search62' + path: '/search62' + fullPath: '/search/search62' + preLoaderRoute: typeof genSearchSearch62Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search63': { + id: '/search/search63' + path: '/search63' + fullPath: '/search/search63' + preLoaderRoute: typeof genSearchSearch63Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search64': { + id: '/search/search64' + path: '/search64' + fullPath: '/search/search64' + preLoaderRoute: typeof genSearchSearch64Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search65': { + id: '/search/search65' + path: '/search65' + fullPath: '/search/search65' + preLoaderRoute: typeof genSearchSearch65Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search66': { + id: '/search/search66' + path: '/search66' + fullPath: '/search/search66' + preLoaderRoute: typeof genSearchSearch66Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search67': { + id: '/search/search67' + path: '/search67' + fullPath: '/search/search67' + preLoaderRoute: typeof genSearchSearch67Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search68': { + id: '/search/search68' + path: '/search68' + fullPath: '/search/search68' + preLoaderRoute: typeof genSearchSearch68Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search69': { + id: '/search/search69' + path: '/search69' + fullPath: '/search/search69' + preLoaderRoute: typeof genSearchSearch69Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search7': { + id: '/search/search7' + path: '/search7' + fullPath: '/search/search7' + preLoaderRoute: typeof genSearchSearch7Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search70': { + id: '/search/search70' + path: '/search70' + fullPath: '/search/search70' + preLoaderRoute: typeof genSearchSearch70Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search71': { + id: '/search/search71' + path: '/search71' + fullPath: '/search/search71' + preLoaderRoute: typeof genSearchSearch71Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search72': { + id: '/search/search72' + path: '/search72' + fullPath: '/search/search72' + preLoaderRoute: typeof genSearchSearch72Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search73': { + id: '/search/search73' + path: '/search73' + fullPath: '/search/search73' + preLoaderRoute: typeof genSearchSearch73Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search74': { + id: '/search/search74' + path: '/search74' + fullPath: '/search/search74' + preLoaderRoute: typeof genSearchSearch74Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search75': { + id: '/search/search75' + path: '/search75' + fullPath: '/search/search75' + preLoaderRoute: typeof genSearchSearch75Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search76': { + id: '/search/search76' + path: '/search76' + fullPath: '/search/search76' + preLoaderRoute: typeof genSearchSearch76Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search77': { + id: '/search/search77' + path: '/search77' + fullPath: '/search/search77' + preLoaderRoute: typeof genSearchSearch77Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search78': { + id: '/search/search78' + path: '/search78' + fullPath: '/search/search78' + preLoaderRoute: typeof genSearchSearch78Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search79': { + id: '/search/search79' + path: '/search79' + fullPath: '/search/search79' + preLoaderRoute: typeof genSearchSearch79Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search8': { + id: '/search/search8' + path: '/search8' + fullPath: '/search/search8' + preLoaderRoute: typeof genSearchSearch8Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search80': { + id: '/search/search80' + path: '/search80' + fullPath: '/search/search80' + preLoaderRoute: typeof genSearchSearch80Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search81': { + id: '/search/search81' + path: '/search81' + fullPath: '/search/search81' + preLoaderRoute: typeof genSearchSearch81Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search82': { + id: '/search/search82' + path: '/search82' + fullPath: '/search/search82' + preLoaderRoute: typeof genSearchSearch82Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search83': { + id: '/search/search83' + path: '/search83' + fullPath: '/search/search83' + preLoaderRoute: typeof genSearchSearch83Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search84': { + id: '/search/search84' + path: '/search84' + fullPath: '/search/search84' + preLoaderRoute: typeof genSearchSearch84Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search85': { + id: '/search/search85' + path: '/search85' + fullPath: '/search/search85' + preLoaderRoute: typeof genSearchSearch85Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search86': { + id: '/search/search86' + path: '/search86' + fullPath: '/search/search86' + preLoaderRoute: typeof genSearchSearch86Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search87': { + id: '/search/search87' + path: '/search87' + fullPath: '/search/search87' + preLoaderRoute: typeof genSearchSearch87Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search88': { + id: '/search/search88' + path: '/search88' + fullPath: '/search/search88' + preLoaderRoute: typeof genSearchSearch88Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search89': { + id: '/search/search89' + path: '/search89' + fullPath: '/search/search89' + preLoaderRoute: typeof genSearchSearch89Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search9': { + id: '/search/search9' + path: '/search9' + fullPath: '/search/search9' + preLoaderRoute: typeof genSearchSearch9Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search90': { + id: '/search/search90' + path: '/search90' + fullPath: '/search/search90' + preLoaderRoute: typeof genSearchSearch90Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search91': { + id: '/search/search91' + path: '/search91' + fullPath: '/search/search91' + preLoaderRoute: typeof genSearchSearch91Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search92': { + id: '/search/search92' + path: '/search92' + fullPath: '/search/search92' + preLoaderRoute: typeof genSearchSearch92Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search93': { + id: '/search/search93' + path: '/search93' + fullPath: '/search/search93' + preLoaderRoute: typeof genSearchSearch93Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search94': { + id: '/search/search94' + path: '/search94' + fullPath: '/search/search94' + preLoaderRoute: typeof genSearchSearch94Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search95': { + id: '/search/search95' + path: '/search95' + fullPath: '/search/search95' + preLoaderRoute: typeof genSearchSearch95Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search96': { + id: '/search/search96' + path: '/search96' + fullPath: '/search/search96' + preLoaderRoute: typeof genSearchSearch96Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search97': { + id: '/search/search97' + path: '/search97' + fullPath: '/search/search97' + preLoaderRoute: typeof genSearchSearch97Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search98': { + id: '/search/search98' + path: '/search98' + fullPath: '/search/search98' + preLoaderRoute: typeof genSearchSearch98Import + parentRoute: typeof genSearchRouteImport + } + '/(gen)/search/search99': { + id: '/search/search99' + path: '/search99' + fullPath: '/search/search99' + preLoaderRoute: typeof genSearchSearch99Import + parentRoute: typeof genSearchRouteImport + } + } +} + +// Create and export the route tree + +interface ParamsRouteRouteChildren { + ParamsParamsPlaceholderRoute: typeof ParamsParamsPlaceholderRoute +} + +const ParamsRouteRouteChildren: ParamsRouteRouteChildren = { + ParamsParamsPlaceholderRoute: ParamsParamsPlaceholderRoute, +} + +const ParamsRouteRouteWithChildren = ParamsRouteRoute._addFileChildren( + ParamsRouteRouteChildren, +) + +interface SearchRouteRouteChildren { + SearchSearchPlaceholderRoute: typeof SearchSearchPlaceholderRoute +} + +const SearchRouteRouteChildren: SearchRouteRouteChildren = { + SearchSearchPlaceholderRoute: SearchSearchPlaceholderRoute, +} + +const SearchRouteRouteWithChildren = SearchRouteRoute._addFileChildren( + SearchRouteRouteChildren, +) + +interface genParamsRouteRouteChildren { + genParamsParam0Route: typeof genParamsParam0Route + genParamsParam1Route: typeof genParamsParam1Route + genParamsParam10Route: typeof genParamsParam10Route + genParamsParam11Route: typeof genParamsParam11Route + genParamsParam12Route: typeof genParamsParam12Route + genParamsParam13Route: typeof genParamsParam13Route + genParamsParam14Route: typeof genParamsParam14Route + genParamsParam15Route: typeof genParamsParam15Route + genParamsParam16Route: typeof genParamsParam16Route + genParamsParam17Route: typeof genParamsParam17Route + genParamsParam18Route: typeof genParamsParam18Route + genParamsParam19Route: typeof genParamsParam19Route + genParamsParam2Route: typeof genParamsParam2Route + genParamsParam20Route: typeof genParamsParam20Route + genParamsParam21Route: typeof genParamsParam21Route + genParamsParam22Route: typeof genParamsParam22Route + genParamsParam23Route: typeof genParamsParam23Route + genParamsParam24Route: typeof genParamsParam24Route + genParamsParam25Route: typeof genParamsParam25Route + genParamsParam26Route: typeof genParamsParam26Route + genParamsParam27Route: typeof genParamsParam27Route + genParamsParam28Route: typeof genParamsParam28Route + genParamsParam29Route: typeof genParamsParam29Route + genParamsParam3Route: typeof genParamsParam3Route + genParamsParam30Route: typeof genParamsParam30Route + genParamsParam31Route: typeof genParamsParam31Route + genParamsParam32Route: typeof genParamsParam32Route + genParamsParam33Route: typeof genParamsParam33Route + genParamsParam34Route: typeof genParamsParam34Route + genParamsParam35Route: typeof genParamsParam35Route + genParamsParam36Route: typeof genParamsParam36Route + genParamsParam37Route: typeof genParamsParam37Route + genParamsParam38Route: typeof genParamsParam38Route + genParamsParam39Route: typeof genParamsParam39Route + genParamsParam4Route: typeof genParamsParam4Route + genParamsParam40Route: typeof genParamsParam40Route + genParamsParam41Route: typeof genParamsParam41Route + genParamsParam42Route: typeof genParamsParam42Route + genParamsParam43Route: typeof genParamsParam43Route + genParamsParam44Route: typeof genParamsParam44Route + genParamsParam45Route: typeof genParamsParam45Route + genParamsParam46Route: typeof genParamsParam46Route + genParamsParam47Route: typeof genParamsParam47Route + genParamsParam48Route: typeof genParamsParam48Route + genParamsParam49Route: typeof genParamsParam49Route + genParamsParam5Route: typeof genParamsParam5Route + genParamsParam50Route: typeof genParamsParam50Route + genParamsParam51Route: typeof genParamsParam51Route + genParamsParam52Route: typeof genParamsParam52Route + genParamsParam53Route: typeof genParamsParam53Route + genParamsParam54Route: typeof genParamsParam54Route + genParamsParam55Route: typeof genParamsParam55Route + genParamsParam56Route: typeof genParamsParam56Route + genParamsParam57Route: typeof genParamsParam57Route + genParamsParam58Route: typeof genParamsParam58Route + genParamsParam59Route: typeof genParamsParam59Route + genParamsParam6Route: typeof genParamsParam6Route + genParamsParam60Route: typeof genParamsParam60Route + genParamsParam61Route: typeof genParamsParam61Route + genParamsParam62Route: typeof genParamsParam62Route + genParamsParam63Route: typeof genParamsParam63Route + genParamsParam64Route: typeof genParamsParam64Route + genParamsParam65Route: typeof genParamsParam65Route + genParamsParam66Route: typeof genParamsParam66Route + genParamsParam67Route: typeof genParamsParam67Route + genParamsParam68Route: typeof genParamsParam68Route + genParamsParam69Route: typeof genParamsParam69Route + genParamsParam7Route: typeof genParamsParam7Route + genParamsParam70Route: typeof genParamsParam70Route + genParamsParam71Route: typeof genParamsParam71Route + genParamsParam72Route: typeof genParamsParam72Route + genParamsParam73Route: typeof genParamsParam73Route + genParamsParam74Route: typeof genParamsParam74Route + genParamsParam75Route: typeof genParamsParam75Route + genParamsParam76Route: typeof genParamsParam76Route + genParamsParam77Route: typeof genParamsParam77Route + genParamsParam78Route: typeof genParamsParam78Route + genParamsParam79Route: typeof genParamsParam79Route + genParamsParam8Route: typeof genParamsParam8Route + genParamsParam80Route: typeof genParamsParam80Route + genParamsParam81Route: typeof genParamsParam81Route + genParamsParam82Route: typeof genParamsParam82Route + genParamsParam83Route: typeof genParamsParam83Route + genParamsParam84Route: typeof genParamsParam84Route + genParamsParam85Route: typeof genParamsParam85Route + genParamsParam86Route: typeof genParamsParam86Route + genParamsParam87Route: typeof genParamsParam87Route + genParamsParam88Route: typeof genParamsParam88Route + genParamsParam89Route: typeof genParamsParam89Route + genParamsParam9Route: typeof genParamsParam9Route + genParamsParam90Route: typeof genParamsParam90Route + genParamsParam91Route: typeof genParamsParam91Route + genParamsParam92Route: typeof genParamsParam92Route + genParamsParam93Route: typeof genParamsParam93Route + genParamsParam94Route: typeof genParamsParam94Route + genParamsParam95Route: typeof genParamsParam95Route + genParamsParam96Route: typeof genParamsParam96Route + genParamsParam97Route: typeof genParamsParam97Route + genParamsParam98Route: typeof genParamsParam98Route + genParamsParam99Route: typeof genParamsParam99Route +} + +const genParamsRouteRouteChildren: genParamsRouteRouteChildren = { + genParamsParam0Route: genParamsParam0Route, + genParamsParam1Route: genParamsParam1Route, + genParamsParam10Route: genParamsParam10Route, + genParamsParam11Route: genParamsParam11Route, + genParamsParam12Route: genParamsParam12Route, + genParamsParam13Route: genParamsParam13Route, + genParamsParam14Route: genParamsParam14Route, + genParamsParam15Route: genParamsParam15Route, + genParamsParam16Route: genParamsParam16Route, + genParamsParam17Route: genParamsParam17Route, + genParamsParam18Route: genParamsParam18Route, + genParamsParam19Route: genParamsParam19Route, + genParamsParam2Route: genParamsParam2Route, + genParamsParam20Route: genParamsParam20Route, + genParamsParam21Route: genParamsParam21Route, + genParamsParam22Route: genParamsParam22Route, + genParamsParam23Route: genParamsParam23Route, + genParamsParam24Route: genParamsParam24Route, + genParamsParam25Route: genParamsParam25Route, + genParamsParam26Route: genParamsParam26Route, + genParamsParam27Route: genParamsParam27Route, + genParamsParam28Route: genParamsParam28Route, + genParamsParam29Route: genParamsParam29Route, + genParamsParam3Route: genParamsParam3Route, + genParamsParam30Route: genParamsParam30Route, + genParamsParam31Route: genParamsParam31Route, + genParamsParam32Route: genParamsParam32Route, + genParamsParam33Route: genParamsParam33Route, + genParamsParam34Route: genParamsParam34Route, + genParamsParam35Route: genParamsParam35Route, + genParamsParam36Route: genParamsParam36Route, + genParamsParam37Route: genParamsParam37Route, + genParamsParam38Route: genParamsParam38Route, + genParamsParam39Route: genParamsParam39Route, + genParamsParam4Route: genParamsParam4Route, + genParamsParam40Route: genParamsParam40Route, + genParamsParam41Route: genParamsParam41Route, + genParamsParam42Route: genParamsParam42Route, + genParamsParam43Route: genParamsParam43Route, + genParamsParam44Route: genParamsParam44Route, + genParamsParam45Route: genParamsParam45Route, + genParamsParam46Route: genParamsParam46Route, + genParamsParam47Route: genParamsParam47Route, + genParamsParam48Route: genParamsParam48Route, + genParamsParam49Route: genParamsParam49Route, + genParamsParam5Route: genParamsParam5Route, + genParamsParam50Route: genParamsParam50Route, + genParamsParam51Route: genParamsParam51Route, + genParamsParam52Route: genParamsParam52Route, + genParamsParam53Route: genParamsParam53Route, + genParamsParam54Route: genParamsParam54Route, + genParamsParam55Route: genParamsParam55Route, + genParamsParam56Route: genParamsParam56Route, + genParamsParam57Route: genParamsParam57Route, + genParamsParam58Route: genParamsParam58Route, + genParamsParam59Route: genParamsParam59Route, + genParamsParam6Route: genParamsParam6Route, + genParamsParam60Route: genParamsParam60Route, + genParamsParam61Route: genParamsParam61Route, + genParamsParam62Route: genParamsParam62Route, + genParamsParam63Route: genParamsParam63Route, + genParamsParam64Route: genParamsParam64Route, + genParamsParam65Route: genParamsParam65Route, + genParamsParam66Route: genParamsParam66Route, + genParamsParam67Route: genParamsParam67Route, + genParamsParam68Route: genParamsParam68Route, + genParamsParam69Route: genParamsParam69Route, + genParamsParam7Route: genParamsParam7Route, + genParamsParam70Route: genParamsParam70Route, + genParamsParam71Route: genParamsParam71Route, + genParamsParam72Route: genParamsParam72Route, + genParamsParam73Route: genParamsParam73Route, + genParamsParam74Route: genParamsParam74Route, + genParamsParam75Route: genParamsParam75Route, + genParamsParam76Route: genParamsParam76Route, + genParamsParam77Route: genParamsParam77Route, + genParamsParam78Route: genParamsParam78Route, + genParamsParam79Route: genParamsParam79Route, + genParamsParam8Route: genParamsParam8Route, + genParamsParam80Route: genParamsParam80Route, + genParamsParam81Route: genParamsParam81Route, + genParamsParam82Route: genParamsParam82Route, + genParamsParam83Route: genParamsParam83Route, + genParamsParam84Route: genParamsParam84Route, + genParamsParam85Route: genParamsParam85Route, + genParamsParam86Route: genParamsParam86Route, + genParamsParam87Route: genParamsParam87Route, + genParamsParam88Route: genParamsParam88Route, + genParamsParam89Route: genParamsParam89Route, + genParamsParam9Route: genParamsParam9Route, + genParamsParam90Route: genParamsParam90Route, + genParamsParam91Route: genParamsParam91Route, + genParamsParam92Route: genParamsParam92Route, + genParamsParam93Route: genParamsParam93Route, + genParamsParam94Route: genParamsParam94Route, + genParamsParam95Route: genParamsParam95Route, + genParamsParam96Route: genParamsParam96Route, + genParamsParam97Route: genParamsParam97Route, + genParamsParam98Route: genParamsParam98Route, + genParamsParam99Route: genParamsParam99Route, +} + +const genParamsRouteRouteWithChildren = genParamsRouteRoute._addFileChildren( + genParamsRouteRouteChildren, +) + +interface genSearchRouteRouteChildren { + genSearchSearch0Route: typeof genSearchSearch0Route + genSearchSearch1Route: typeof genSearchSearch1Route + genSearchSearch10Route: typeof genSearchSearch10Route + genSearchSearch11Route: typeof genSearchSearch11Route + genSearchSearch12Route: typeof genSearchSearch12Route + genSearchSearch13Route: typeof genSearchSearch13Route + genSearchSearch14Route: typeof genSearchSearch14Route + genSearchSearch15Route: typeof genSearchSearch15Route + genSearchSearch16Route: typeof genSearchSearch16Route + genSearchSearch17Route: typeof genSearchSearch17Route + genSearchSearch18Route: typeof genSearchSearch18Route + genSearchSearch19Route: typeof genSearchSearch19Route + genSearchSearch2Route: typeof genSearchSearch2Route + genSearchSearch20Route: typeof genSearchSearch20Route + genSearchSearch21Route: typeof genSearchSearch21Route + genSearchSearch22Route: typeof genSearchSearch22Route + genSearchSearch23Route: typeof genSearchSearch23Route + genSearchSearch24Route: typeof genSearchSearch24Route + genSearchSearch25Route: typeof genSearchSearch25Route + genSearchSearch26Route: typeof genSearchSearch26Route + genSearchSearch27Route: typeof genSearchSearch27Route + genSearchSearch28Route: typeof genSearchSearch28Route + genSearchSearch29Route: typeof genSearchSearch29Route + genSearchSearch3Route: typeof genSearchSearch3Route + genSearchSearch30Route: typeof genSearchSearch30Route + genSearchSearch31Route: typeof genSearchSearch31Route + genSearchSearch32Route: typeof genSearchSearch32Route + genSearchSearch33Route: typeof genSearchSearch33Route + genSearchSearch34Route: typeof genSearchSearch34Route + genSearchSearch35Route: typeof genSearchSearch35Route + genSearchSearch36Route: typeof genSearchSearch36Route + genSearchSearch37Route: typeof genSearchSearch37Route + genSearchSearch38Route: typeof genSearchSearch38Route + genSearchSearch39Route: typeof genSearchSearch39Route + genSearchSearch4Route: typeof genSearchSearch4Route + genSearchSearch40Route: typeof genSearchSearch40Route + genSearchSearch41Route: typeof genSearchSearch41Route + genSearchSearch42Route: typeof genSearchSearch42Route + genSearchSearch43Route: typeof genSearchSearch43Route + genSearchSearch44Route: typeof genSearchSearch44Route + genSearchSearch45Route: typeof genSearchSearch45Route + genSearchSearch46Route: typeof genSearchSearch46Route + genSearchSearch47Route: typeof genSearchSearch47Route + genSearchSearch48Route: typeof genSearchSearch48Route + genSearchSearch49Route: typeof genSearchSearch49Route + genSearchSearch5Route: typeof genSearchSearch5Route + genSearchSearch50Route: typeof genSearchSearch50Route + genSearchSearch51Route: typeof genSearchSearch51Route + genSearchSearch52Route: typeof genSearchSearch52Route + genSearchSearch53Route: typeof genSearchSearch53Route + genSearchSearch54Route: typeof genSearchSearch54Route + genSearchSearch55Route: typeof genSearchSearch55Route + genSearchSearch56Route: typeof genSearchSearch56Route + genSearchSearch57Route: typeof genSearchSearch57Route + genSearchSearch58Route: typeof genSearchSearch58Route + genSearchSearch59Route: typeof genSearchSearch59Route + genSearchSearch6Route: typeof genSearchSearch6Route + genSearchSearch60Route: typeof genSearchSearch60Route + genSearchSearch61Route: typeof genSearchSearch61Route + genSearchSearch62Route: typeof genSearchSearch62Route + genSearchSearch63Route: typeof genSearchSearch63Route + genSearchSearch64Route: typeof genSearchSearch64Route + genSearchSearch65Route: typeof genSearchSearch65Route + genSearchSearch66Route: typeof genSearchSearch66Route + genSearchSearch67Route: typeof genSearchSearch67Route + genSearchSearch68Route: typeof genSearchSearch68Route + genSearchSearch69Route: typeof genSearchSearch69Route + genSearchSearch7Route: typeof genSearchSearch7Route + genSearchSearch70Route: typeof genSearchSearch70Route + genSearchSearch71Route: typeof genSearchSearch71Route + genSearchSearch72Route: typeof genSearchSearch72Route + genSearchSearch73Route: typeof genSearchSearch73Route + genSearchSearch74Route: typeof genSearchSearch74Route + genSearchSearch75Route: typeof genSearchSearch75Route + genSearchSearch76Route: typeof genSearchSearch76Route + genSearchSearch77Route: typeof genSearchSearch77Route + genSearchSearch78Route: typeof genSearchSearch78Route + genSearchSearch79Route: typeof genSearchSearch79Route + genSearchSearch8Route: typeof genSearchSearch8Route + genSearchSearch80Route: typeof genSearchSearch80Route + genSearchSearch81Route: typeof genSearchSearch81Route + genSearchSearch82Route: typeof genSearchSearch82Route + genSearchSearch83Route: typeof genSearchSearch83Route + genSearchSearch84Route: typeof genSearchSearch84Route + genSearchSearch85Route: typeof genSearchSearch85Route + genSearchSearch86Route: typeof genSearchSearch86Route + genSearchSearch87Route: typeof genSearchSearch87Route + genSearchSearch88Route: typeof genSearchSearch88Route + genSearchSearch89Route: typeof genSearchSearch89Route + genSearchSearch9Route: typeof genSearchSearch9Route + genSearchSearch90Route: typeof genSearchSearch90Route + genSearchSearch91Route: typeof genSearchSearch91Route + genSearchSearch92Route: typeof genSearchSearch92Route + genSearchSearch93Route: typeof genSearchSearch93Route + genSearchSearch94Route: typeof genSearchSearch94Route + genSearchSearch95Route: typeof genSearchSearch95Route + genSearchSearch96Route: typeof genSearchSearch96Route + genSearchSearch97Route: typeof genSearchSearch97Route + genSearchSearch98Route: typeof genSearchSearch98Route + genSearchSearch99Route: typeof genSearchSearch99Route +} + +const genSearchRouteRouteChildren: genSearchRouteRouteChildren = { + genSearchSearch0Route: genSearchSearch0Route, + genSearchSearch1Route: genSearchSearch1Route, + genSearchSearch10Route: genSearchSearch10Route, + genSearchSearch11Route: genSearchSearch11Route, + genSearchSearch12Route: genSearchSearch12Route, + genSearchSearch13Route: genSearchSearch13Route, + genSearchSearch14Route: genSearchSearch14Route, + genSearchSearch15Route: genSearchSearch15Route, + genSearchSearch16Route: genSearchSearch16Route, + genSearchSearch17Route: genSearchSearch17Route, + genSearchSearch18Route: genSearchSearch18Route, + genSearchSearch19Route: genSearchSearch19Route, + genSearchSearch2Route: genSearchSearch2Route, + genSearchSearch20Route: genSearchSearch20Route, + genSearchSearch21Route: genSearchSearch21Route, + genSearchSearch22Route: genSearchSearch22Route, + genSearchSearch23Route: genSearchSearch23Route, + genSearchSearch24Route: genSearchSearch24Route, + genSearchSearch25Route: genSearchSearch25Route, + genSearchSearch26Route: genSearchSearch26Route, + genSearchSearch27Route: genSearchSearch27Route, + genSearchSearch28Route: genSearchSearch28Route, + genSearchSearch29Route: genSearchSearch29Route, + genSearchSearch3Route: genSearchSearch3Route, + genSearchSearch30Route: genSearchSearch30Route, + genSearchSearch31Route: genSearchSearch31Route, + genSearchSearch32Route: genSearchSearch32Route, + genSearchSearch33Route: genSearchSearch33Route, + genSearchSearch34Route: genSearchSearch34Route, + genSearchSearch35Route: genSearchSearch35Route, + genSearchSearch36Route: genSearchSearch36Route, + genSearchSearch37Route: genSearchSearch37Route, + genSearchSearch38Route: genSearchSearch38Route, + genSearchSearch39Route: genSearchSearch39Route, + genSearchSearch4Route: genSearchSearch4Route, + genSearchSearch40Route: genSearchSearch40Route, + genSearchSearch41Route: genSearchSearch41Route, + genSearchSearch42Route: genSearchSearch42Route, + genSearchSearch43Route: genSearchSearch43Route, + genSearchSearch44Route: genSearchSearch44Route, + genSearchSearch45Route: genSearchSearch45Route, + genSearchSearch46Route: genSearchSearch46Route, + genSearchSearch47Route: genSearchSearch47Route, + genSearchSearch48Route: genSearchSearch48Route, + genSearchSearch49Route: genSearchSearch49Route, + genSearchSearch5Route: genSearchSearch5Route, + genSearchSearch50Route: genSearchSearch50Route, + genSearchSearch51Route: genSearchSearch51Route, + genSearchSearch52Route: genSearchSearch52Route, + genSearchSearch53Route: genSearchSearch53Route, + genSearchSearch54Route: genSearchSearch54Route, + genSearchSearch55Route: genSearchSearch55Route, + genSearchSearch56Route: genSearchSearch56Route, + genSearchSearch57Route: genSearchSearch57Route, + genSearchSearch58Route: genSearchSearch58Route, + genSearchSearch59Route: genSearchSearch59Route, + genSearchSearch6Route: genSearchSearch6Route, + genSearchSearch60Route: genSearchSearch60Route, + genSearchSearch61Route: genSearchSearch61Route, + genSearchSearch62Route: genSearchSearch62Route, + genSearchSearch63Route: genSearchSearch63Route, + genSearchSearch64Route: genSearchSearch64Route, + genSearchSearch65Route: genSearchSearch65Route, + genSearchSearch66Route: genSearchSearch66Route, + genSearchSearch67Route: genSearchSearch67Route, + genSearchSearch68Route: genSearchSearch68Route, + genSearchSearch69Route: genSearchSearch69Route, + genSearchSearch7Route: genSearchSearch7Route, + genSearchSearch70Route: genSearchSearch70Route, + genSearchSearch71Route: genSearchSearch71Route, + genSearchSearch72Route: genSearchSearch72Route, + genSearchSearch73Route: genSearchSearch73Route, + genSearchSearch74Route: genSearchSearch74Route, + genSearchSearch75Route: genSearchSearch75Route, + genSearchSearch76Route: genSearchSearch76Route, + genSearchSearch77Route: genSearchSearch77Route, + genSearchSearch78Route: genSearchSearch78Route, + genSearchSearch79Route: genSearchSearch79Route, + genSearchSearch8Route: genSearchSearch8Route, + genSearchSearch80Route: genSearchSearch80Route, + genSearchSearch81Route: genSearchSearch81Route, + genSearchSearch82Route: genSearchSearch82Route, + genSearchSearch83Route: genSearchSearch83Route, + genSearchSearch84Route: genSearchSearch84Route, + genSearchSearch85Route: genSearchSearch85Route, + genSearchSearch86Route: genSearchSearch86Route, + genSearchSearch87Route: genSearchSearch87Route, + genSearchSearch88Route: genSearchSearch88Route, + genSearchSearch89Route: genSearchSearch89Route, + genSearchSearch9Route: genSearchSearch9Route, + genSearchSearch90Route: genSearchSearch90Route, + genSearchSearch91Route: genSearchSearch91Route, + genSearchSearch92Route: genSearchSearch92Route, + genSearchSearch93Route: genSearchSearch93Route, + genSearchSearch94Route: genSearchSearch94Route, + genSearchSearch95Route: genSearchSearch95Route, + genSearchSearch96Route: genSearchSearch96Route, + genSearchSearch97Route: genSearchSearch97Route, + genSearchSearch98Route: genSearchSearch98Route, + genSearchSearch99Route: genSearchSearch99Route, +} + +const genSearchRouteRouteWithChildren = genSearchRouteRoute._addFileChildren( + genSearchRouteRouteChildren, +) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/params': typeof genParamsRouteRouteWithChildren + '/search': typeof genSearchRouteRouteWithChildren + '/absolute': typeof AbsoluteRoute + '/linkProps': typeof LinkPropsRoute + '/relative': typeof RelativeRoute + '/absolute0': typeof genAbsolute0Route + '/absolute1': typeof genAbsolute1Route + '/absolute10': typeof genAbsolute10Route + '/absolute11': typeof genAbsolute11Route + '/absolute12': typeof genAbsolute12Route + '/absolute13': typeof genAbsolute13Route + '/absolute14': typeof genAbsolute14Route + '/absolute15': typeof genAbsolute15Route + '/absolute16': typeof genAbsolute16Route + '/absolute17': typeof genAbsolute17Route + '/absolute18': typeof genAbsolute18Route + '/absolute19': typeof genAbsolute19Route + '/absolute2': typeof genAbsolute2Route + '/absolute20': typeof genAbsolute20Route + '/absolute21': typeof genAbsolute21Route + '/absolute22': typeof genAbsolute22Route + '/absolute23': typeof genAbsolute23Route + '/absolute24': typeof genAbsolute24Route + '/absolute25': typeof genAbsolute25Route + '/absolute26': typeof genAbsolute26Route + '/absolute27': typeof genAbsolute27Route + '/absolute28': typeof genAbsolute28Route + '/absolute29': typeof genAbsolute29Route + '/absolute3': typeof genAbsolute3Route + '/absolute30': typeof genAbsolute30Route + '/absolute31': typeof genAbsolute31Route + '/absolute32': typeof genAbsolute32Route + '/absolute33': typeof genAbsolute33Route + '/absolute34': typeof genAbsolute34Route + '/absolute35': typeof genAbsolute35Route + '/absolute36': typeof genAbsolute36Route + '/absolute37': typeof genAbsolute37Route + '/absolute38': typeof genAbsolute38Route + '/absolute39': typeof genAbsolute39Route + '/absolute4': typeof genAbsolute4Route + '/absolute40': typeof genAbsolute40Route + '/absolute41': typeof genAbsolute41Route + '/absolute42': typeof genAbsolute42Route + '/absolute43': typeof genAbsolute43Route + '/absolute44': typeof genAbsolute44Route + '/absolute45': typeof genAbsolute45Route + '/absolute46': typeof genAbsolute46Route + '/absolute47': typeof genAbsolute47Route + '/absolute48': typeof genAbsolute48Route + '/absolute49': typeof genAbsolute49Route + '/absolute5': typeof genAbsolute5Route + '/absolute50': typeof genAbsolute50Route + '/absolute51': typeof genAbsolute51Route + '/absolute52': typeof genAbsolute52Route + '/absolute53': typeof genAbsolute53Route + '/absolute54': typeof genAbsolute54Route + '/absolute55': typeof genAbsolute55Route + '/absolute56': typeof genAbsolute56Route + '/absolute57': typeof genAbsolute57Route + '/absolute58': typeof genAbsolute58Route + '/absolute59': typeof genAbsolute59Route + '/absolute6': typeof genAbsolute6Route + '/absolute60': typeof genAbsolute60Route + '/absolute61': typeof genAbsolute61Route + '/absolute62': typeof genAbsolute62Route + '/absolute63': typeof genAbsolute63Route + '/absolute64': typeof genAbsolute64Route + '/absolute65': typeof genAbsolute65Route + '/absolute66': typeof genAbsolute66Route + '/absolute67': typeof genAbsolute67Route + '/absolute68': typeof genAbsolute68Route + '/absolute69': typeof genAbsolute69Route + '/absolute7': typeof genAbsolute7Route + '/absolute70': typeof genAbsolute70Route + '/absolute71': typeof genAbsolute71Route + '/absolute72': typeof genAbsolute72Route + '/absolute73': typeof genAbsolute73Route + '/absolute74': typeof genAbsolute74Route + '/absolute75': typeof genAbsolute75Route + '/absolute76': typeof genAbsolute76Route + '/absolute77': typeof genAbsolute77Route + '/absolute78': typeof genAbsolute78Route + '/absolute79': typeof genAbsolute79Route + '/absolute8': typeof genAbsolute8Route + '/absolute80': typeof genAbsolute80Route + '/absolute81': typeof genAbsolute81Route + '/absolute82': typeof genAbsolute82Route + '/absolute83': typeof genAbsolute83Route + '/absolute84': typeof genAbsolute84Route + '/absolute85': typeof genAbsolute85Route + '/absolute86': typeof genAbsolute86Route + '/absolute87': typeof genAbsolute87Route + '/absolute88': typeof genAbsolute88Route + '/absolute89': typeof genAbsolute89Route + '/absolute9': typeof genAbsolute9Route + '/absolute90': typeof genAbsolute90Route + '/absolute91': typeof genAbsolute91Route + '/absolute92': typeof genAbsolute92Route + '/absolute93': typeof genAbsolute93Route + '/absolute94': typeof genAbsolute94Route + '/absolute95': typeof genAbsolute95Route + '/absolute96': typeof genAbsolute96Route + '/absolute97': typeof genAbsolute97Route + '/absolute98': typeof genAbsolute98Route + '/absolute99': typeof genAbsolute99Route + '/relative0': typeof genRelative0Route + '/relative1': typeof genRelative1Route + '/relative10': typeof genRelative10Route + '/relative11': typeof genRelative11Route + '/relative12': typeof genRelative12Route + '/relative13': typeof genRelative13Route + '/relative14': typeof genRelative14Route + '/relative15': typeof genRelative15Route + '/relative16': typeof genRelative16Route + '/relative17': typeof genRelative17Route + '/relative18': typeof genRelative18Route + '/relative19': typeof genRelative19Route + '/relative2': typeof genRelative2Route + '/relative20': typeof genRelative20Route + '/relative21': typeof genRelative21Route + '/relative22': typeof genRelative22Route + '/relative23': typeof genRelative23Route + '/relative24': typeof genRelative24Route + '/relative25': typeof genRelative25Route + '/relative26': typeof genRelative26Route + '/relative27': typeof genRelative27Route + '/relative28': typeof genRelative28Route + '/relative29': typeof genRelative29Route + '/relative3': typeof genRelative3Route + '/relative30': typeof genRelative30Route + '/relative31': typeof genRelative31Route + '/relative32': typeof genRelative32Route + '/relative33': typeof genRelative33Route + '/relative34': typeof genRelative34Route + '/relative35': typeof genRelative35Route + '/relative36': typeof genRelative36Route + '/relative37': typeof genRelative37Route + '/relative38': typeof genRelative38Route + '/relative39': typeof genRelative39Route + '/relative4': typeof genRelative4Route + '/relative40': typeof genRelative40Route + '/relative41': typeof genRelative41Route + '/relative42': typeof genRelative42Route + '/relative43': typeof genRelative43Route + '/relative44': typeof genRelative44Route + '/relative45': typeof genRelative45Route + '/relative46': typeof genRelative46Route + '/relative47': typeof genRelative47Route + '/relative48': typeof genRelative48Route + '/relative49': typeof genRelative49Route + '/relative5': typeof genRelative5Route + '/relative50': typeof genRelative50Route + '/relative51': typeof genRelative51Route + '/relative52': typeof genRelative52Route + '/relative53': typeof genRelative53Route + '/relative54': typeof genRelative54Route + '/relative55': typeof genRelative55Route + '/relative56': typeof genRelative56Route + '/relative57': typeof genRelative57Route + '/relative58': typeof genRelative58Route + '/relative59': typeof genRelative59Route + '/relative6': typeof genRelative6Route + '/relative60': typeof genRelative60Route + '/relative61': typeof genRelative61Route + '/relative62': typeof genRelative62Route + '/relative63': typeof genRelative63Route + '/relative64': typeof genRelative64Route + '/relative65': typeof genRelative65Route + '/relative66': typeof genRelative66Route + '/relative67': typeof genRelative67Route + '/relative68': typeof genRelative68Route + '/relative69': typeof genRelative69Route + '/relative7': typeof genRelative7Route + '/relative70': typeof genRelative70Route + '/relative71': typeof genRelative71Route + '/relative72': typeof genRelative72Route + '/relative73': typeof genRelative73Route + '/relative74': typeof genRelative74Route + '/relative75': typeof genRelative75Route + '/relative76': typeof genRelative76Route + '/relative77': typeof genRelative77Route + '/relative78': typeof genRelative78Route + '/relative79': typeof genRelative79Route + '/relative8': typeof genRelative8Route + '/relative80': typeof genRelative80Route + '/relative81': typeof genRelative81Route + '/relative82': typeof genRelative82Route + '/relative83': typeof genRelative83Route + '/relative84': typeof genRelative84Route + '/relative85': typeof genRelative85Route + '/relative86': typeof genRelative86Route + '/relative87': typeof genRelative87Route + '/relative88': typeof genRelative88Route + '/relative89': typeof genRelative89Route + '/relative9': typeof genRelative9Route + '/relative90': typeof genRelative90Route + '/relative91': typeof genRelative91Route + '/relative92': typeof genRelative92Route + '/relative93': typeof genRelative93Route + '/relative94': typeof genRelative94Route + '/relative95': typeof genRelative95Route + '/relative96': typeof genRelative96Route + '/relative97': typeof genRelative97Route + '/relative98': typeof genRelative98Route + '/relative99': typeof genRelative99Route + '/params/$paramsPlaceholder': typeof ParamsParamsPlaceholderRoute + '/search/searchPlaceholder': typeof SearchSearchPlaceholderRoute + '/params/$param0': typeof genParamsParam0Route + '/params/$param1': typeof genParamsParam1Route + '/params/$param10': typeof genParamsParam10Route + '/params/$param11': typeof genParamsParam11Route + '/params/$param12': typeof genParamsParam12Route + '/params/$param13': typeof genParamsParam13Route + '/params/$param14': typeof genParamsParam14Route + '/params/$param15': typeof genParamsParam15Route + '/params/$param16': typeof genParamsParam16Route + '/params/$param17': typeof genParamsParam17Route + '/params/$param18': typeof genParamsParam18Route + '/params/$param19': typeof genParamsParam19Route + '/params/$param2': typeof genParamsParam2Route + '/params/$param20': typeof genParamsParam20Route + '/params/$param21': typeof genParamsParam21Route + '/params/$param22': typeof genParamsParam22Route + '/params/$param23': typeof genParamsParam23Route + '/params/$param24': typeof genParamsParam24Route + '/params/$param25': typeof genParamsParam25Route + '/params/$param26': typeof genParamsParam26Route + '/params/$param27': typeof genParamsParam27Route + '/params/$param28': typeof genParamsParam28Route + '/params/$param29': typeof genParamsParam29Route + '/params/$param3': typeof genParamsParam3Route + '/params/$param30': typeof genParamsParam30Route + '/params/$param31': typeof genParamsParam31Route + '/params/$param32': typeof genParamsParam32Route + '/params/$param33': typeof genParamsParam33Route + '/params/$param34': typeof genParamsParam34Route + '/params/$param35': typeof genParamsParam35Route + '/params/$param36': typeof genParamsParam36Route + '/params/$param37': typeof genParamsParam37Route + '/params/$param38': typeof genParamsParam38Route + '/params/$param39': typeof genParamsParam39Route + '/params/$param4': typeof genParamsParam4Route + '/params/$param40': typeof genParamsParam40Route + '/params/$param41': typeof genParamsParam41Route + '/params/$param42': typeof genParamsParam42Route + '/params/$param43': typeof genParamsParam43Route + '/params/$param44': typeof genParamsParam44Route + '/params/$param45': typeof genParamsParam45Route + '/params/$param46': typeof genParamsParam46Route + '/params/$param47': typeof genParamsParam47Route + '/params/$param48': typeof genParamsParam48Route + '/params/$param49': typeof genParamsParam49Route + '/params/$param5': typeof genParamsParam5Route + '/params/$param50': typeof genParamsParam50Route + '/params/$param51': typeof genParamsParam51Route + '/params/$param52': typeof genParamsParam52Route + '/params/$param53': typeof genParamsParam53Route + '/params/$param54': typeof genParamsParam54Route + '/params/$param55': typeof genParamsParam55Route + '/params/$param56': typeof genParamsParam56Route + '/params/$param57': typeof genParamsParam57Route + '/params/$param58': typeof genParamsParam58Route + '/params/$param59': typeof genParamsParam59Route + '/params/$param6': typeof genParamsParam6Route + '/params/$param60': typeof genParamsParam60Route + '/params/$param61': typeof genParamsParam61Route + '/params/$param62': typeof genParamsParam62Route + '/params/$param63': typeof genParamsParam63Route + '/params/$param64': typeof genParamsParam64Route + '/params/$param65': typeof genParamsParam65Route + '/params/$param66': typeof genParamsParam66Route + '/params/$param67': typeof genParamsParam67Route + '/params/$param68': typeof genParamsParam68Route + '/params/$param69': typeof genParamsParam69Route + '/params/$param7': typeof genParamsParam7Route + '/params/$param70': typeof genParamsParam70Route + '/params/$param71': typeof genParamsParam71Route + '/params/$param72': typeof genParamsParam72Route + '/params/$param73': typeof genParamsParam73Route + '/params/$param74': typeof genParamsParam74Route + '/params/$param75': typeof genParamsParam75Route + '/params/$param76': typeof genParamsParam76Route + '/params/$param77': typeof genParamsParam77Route + '/params/$param78': typeof genParamsParam78Route + '/params/$param79': typeof genParamsParam79Route + '/params/$param8': typeof genParamsParam8Route + '/params/$param80': typeof genParamsParam80Route + '/params/$param81': typeof genParamsParam81Route + '/params/$param82': typeof genParamsParam82Route + '/params/$param83': typeof genParamsParam83Route + '/params/$param84': typeof genParamsParam84Route + '/params/$param85': typeof genParamsParam85Route + '/params/$param86': typeof genParamsParam86Route + '/params/$param87': typeof genParamsParam87Route + '/params/$param88': typeof genParamsParam88Route + '/params/$param89': typeof genParamsParam89Route + '/params/$param9': typeof genParamsParam9Route + '/params/$param90': typeof genParamsParam90Route + '/params/$param91': typeof genParamsParam91Route + '/params/$param92': typeof genParamsParam92Route + '/params/$param93': typeof genParamsParam93Route + '/params/$param94': typeof genParamsParam94Route + '/params/$param95': typeof genParamsParam95Route + '/params/$param96': typeof genParamsParam96Route + '/params/$param97': typeof genParamsParam97Route + '/params/$param98': typeof genParamsParam98Route + '/params/$param99': typeof genParamsParam99Route + '/search/search0': typeof genSearchSearch0Route + '/search/search1': typeof genSearchSearch1Route + '/search/search10': typeof genSearchSearch10Route + '/search/search11': typeof genSearchSearch11Route + '/search/search12': typeof genSearchSearch12Route + '/search/search13': typeof genSearchSearch13Route + '/search/search14': typeof genSearchSearch14Route + '/search/search15': typeof genSearchSearch15Route + '/search/search16': typeof genSearchSearch16Route + '/search/search17': typeof genSearchSearch17Route + '/search/search18': typeof genSearchSearch18Route + '/search/search19': typeof genSearchSearch19Route + '/search/search2': typeof genSearchSearch2Route + '/search/search20': typeof genSearchSearch20Route + '/search/search21': typeof genSearchSearch21Route + '/search/search22': typeof genSearchSearch22Route + '/search/search23': typeof genSearchSearch23Route + '/search/search24': typeof genSearchSearch24Route + '/search/search25': typeof genSearchSearch25Route + '/search/search26': typeof genSearchSearch26Route + '/search/search27': typeof genSearchSearch27Route + '/search/search28': typeof genSearchSearch28Route + '/search/search29': typeof genSearchSearch29Route + '/search/search3': typeof genSearchSearch3Route + '/search/search30': typeof genSearchSearch30Route + '/search/search31': typeof genSearchSearch31Route + '/search/search32': typeof genSearchSearch32Route + '/search/search33': typeof genSearchSearch33Route + '/search/search34': typeof genSearchSearch34Route + '/search/search35': typeof genSearchSearch35Route + '/search/search36': typeof genSearchSearch36Route + '/search/search37': typeof genSearchSearch37Route + '/search/search38': typeof genSearchSearch38Route + '/search/search39': typeof genSearchSearch39Route + '/search/search4': typeof genSearchSearch4Route + '/search/search40': typeof genSearchSearch40Route + '/search/search41': typeof genSearchSearch41Route + '/search/search42': typeof genSearchSearch42Route + '/search/search43': typeof genSearchSearch43Route + '/search/search44': typeof genSearchSearch44Route + '/search/search45': typeof genSearchSearch45Route + '/search/search46': typeof genSearchSearch46Route + '/search/search47': typeof genSearchSearch47Route + '/search/search48': typeof genSearchSearch48Route + '/search/search49': typeof genSearchSearch49Route + '/search/search5': typeof genSearchSearch5Route + '/search/search50': typeof genSearchSearch50Route + '/search/search51': typeof genSearchSearch51Route + '/search/search52': typeof genSearchSearch52Route + '/search/search53': typeof genSearchSearch53Route + '/search/search54': typeof genSearchSearch54Route + '/search/search55': typeof genSearchSearch55Route + '/search/search56': typeof genSearchSearch56Route + '/search/search57': typeof genSearchSearch57Route + '/search/search58': typeof genSearchSearch58Route + '/search/search59': typeof genSearchSearch59Route + '/search/search6': typeof genSearchSearch6Route + '/search/search60': typeof genSearchSearch60Route + '/search/search61': typeof genSearchSearch61Route + '/search/search62': typeof genSearchSearch62Route + '/search/search63': typeof genSearchSearch63Route + '/search/search64': typeof genSearchSearch64Route + '/search/search65': typeof genSearchSearch65Route + '/search/search66': typeof genSearchSearch66Route + '/search/search67': typeof genSearchSearch67Route + '/search/search68': typeof genSearchSearch68Route + '/search/search69': typeof genSearchSearch69Route + '/search/search7': typeof genSearchSearch7Route + '/search/search70': typeof genSearchSearch70Route + '/search/search71': typeof genSearchSearch71Route + '/search/search72': typeof genSearchSearch72Route + '/search/search73': typeof genSearchSearch73Route + '/search/search74': typeof genSearchSearch74Route + '/search/search75': typeof genSearchSearch75Route + '/search/search76': typeof genSearchSearch76Route + '/search/search77': typeof genSearchSearch77Route + '/search/search78': typeof genSearchSearch78Route + '/search/search79': typeof genSearchSearch79Route + '/search/search8': typeof genSearchSearch8Route + '/search/search80': typeof genSearchSearch80Route + '/search/search81': typeof genSearchSearch81Route + '/search/search82': typeof genSearchSearch82Route + '/search/search83': typeof genSearchSearch83Route + '/search/search84': typeof genSearchSearch84Route + '/search/search85': typeof genSearchSearch85Route + '/search/search86': typeof genSearchSearch86Route + '/search/search87': typeof genSearchSearch87Route + '/search/search88': typeof genSearchSearch88Route + '/search/search89': typeof genSearchSearch89Route + '/search/search9': typeof genSearchSearch9Route + '/search/search90': typeof genSearchSearch90Route + '/search/search91': typeof genSearchSearch91Route + '/search/search92': typeof genSearchSearch92Route + '/search/search93': typeof genSearchSearch93Route + '/search/search94': typeof genSearchSearch94Route + '/search/search95': typeof genSearchSearch95Route + '/search/search96': typeof genSearchSearch96Route + '/search/search97': typeof genSearchSearch97Route + '/search/search98': typeof genSearchSearch98Route + '/search/search99': typeof genSearchSearch99Route +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/params': typeof genParamsRouteRouteWithChildren + '/search': typeof genSearchRouteRouteWithChildren + '/absolute': typeof AbsoluteRoute + '/linkProps': typeof LinkPropsRoute + '/relative': typeof RelativeRoute + '/absolute0': typeof genAbsolute0Route + '/absolute1': typeof genAbsolute1Route + '/absolute10': typeof genAbsolute10Route + '/absolute11': typeof genAbsolute11Route + '/absolute12': typeof genAbsolute12Route + '/absolute13': typeof genAbsolute13Route + '/absolute14': typeof genAbsolute14Route + '/absolute15': typeof genAbsolute15Route + '/absolute16': typeof genAbsolute16Route + '/absolute17': typeof genAbsolute17Route + '/absolute18': typeof genAbsolute18Route + '/absolute19': typeof genAbsolute19Route + '/absolute2': typeof genAbsolute2Route + '/absolute20': typeof genAbsolute20Route + '/absolute21': typeof genAbsolute21Route + '/absolute22': typeof genAbsolute22Route + '/absolute23': typeof genAbsolute23Route + '/absolute24': typeof genAbsolute24Route + '/absolute25': typeof genAbsolute25Route + '/absolute26': typeof genAbsolute26Route + '/absolute27': typeof genAbsolute27Route + '/absolute28': typeof genAbsolute28Route + '/absolute29': typeof genAbsolute29Route + '/absolute3': typeof genAbsolute3Route + '/absolute30': typeof genAbsolute30Route + '/absolute31': typeof genAbsolute31Route + '/absolute32': typeof genAbsolute32Route + '/absolute33': typeof genAbsolute33Route + '/absolute34': typeof genAbsolute34Route + '/absolute35': typeof genAbsolute35Route + '/absolute36': typeof genAbsolute36Route + '/absolute37': typeof genAbsolute37Route + '/absolute38': typeof genAbsolute38Route + '/absolute39': typeof genAbsolute39Route + '/absolute4': typeof genAbsolute4Route + '/absolute40': typeof genAbsolute40Route + '/absolute41': typeof genAbsolute41Route + '/absolute42': typeof genAbsolute42Route + '/absolute43': typeof genAbsolute43Route + '/absolute44': typeof genAbsolute44Route + '/absolute45': typeof genAbsolute45Route + '/absolute46': typeof genAbsolute46Route + '/absolute47': typeof genAbsolute47Route + '/absolute48': typeof genAbsolute48Route + '/absolute49': typeof genAbsolute49Route + '/absolute5': typeof genAbsolute5Route + '/absolute50': typeof genAbsolute50Route + '/absolute51': typeof genAbsolute51Route + '/absolute52': typeof genAbsolute52Route + '/absolute53': typeof genAbsolute53Route + '/absolute54': typeof genAbsolute54Route + '/absolute55': typeof genAbsolute55Route + '/absolute56': typeof genAbsolute56Route + '/absolute57': typeof genAbsolute57Route + '/absolute58': typeof genAbsolute58Route + '/absolute59': typeof genAbsolute59Route + '/absolute6': typeof genAbsolute6Route + '/absolute60': typeof genAbsolute60Route + '/absolute61': typeof genAbsolute61Route + '/absolute62': typeof genAbsolute62Route + '/absolute63': typeof genAbsolute63Route + '/absolute64': typeof genAbsolute64Route + '/absolute65': typeof genAbsolute65Route + '/absolute66': typeof genAbsolute66Route + '/absolute67': typeof genAbsolute67Route + '/absolute68': typeof genAbsolute68Route + '/absolute69': typeof genAbsolute69Route + '/absolute7': typeof genAbsolute7Route + '/absolute70': typeof genAbsolute70Route + '/absolute71': typeof genAbsolute71Route + '/absolute72': typeof genAbsolute72Route + '/absolute73': typeof genAbsolute73Route + '/absolute74': typeof genAbsolute74Route + '/absolute75': typeof genAbsolute75Route + '/absolute76': typeof genAbsolute76Route + '/absolute77': typeof genAbsolute77Route + '/absolute78': typeof genAbsolute78Route + '/absolute79': typeof genAbsolute79Route + '/absolute8': typeof genAbsolute8Route + '/absolute80': typeof genAbsolute80Route + '/absolute81': typeof genAbsolute81Route + '/absolute82': typeof genAbsolute82Route + '/absolute83': typeof genAbsolute83Route + '/absolute84': typeof genAbsolute84Route + '/absolute85': typeof genAbsolute85Route + '/absolute86': typeof genAbsolute86Route + '/absolute87': typeof genAbsolute87Route + '/absolute88': typeof genAbsolute88Route + '/absolute89': typeof genAbsolute89Route + '/absolute9': typeof genAbsolute9Route + '/absolute90': typeof genAbsolute90Route + '/absolute91': typeof genAbsolute91Route + '/absolute92': typeof genAbsolute92Route + '/absolute93': typeof genAbsolute93Route + '/absolute94': typeof genAbsolute94Route + '/absolute95': typeof genAbsolute95Route + '/absolute96': typeof genAbsolute96Route + '/absolute97': typeof genAbsolute97Route + '/absolute98': typeof genAbsolute98Route + '/absolute99': typeof genAbsolute99Route + '/relative0': typeof genRelative0Route + '/relative1': typeof genRelative1Route + '/relative10': typeof genRelative10Route + '/relative11': typeof genRelative11Route + '/relative12': typeof genRelative12Route + '/relative13': typeof genRelative13Route + '/relative14': typeof genRelative14Route + '/relative15': typeof genRelative15Route + '/relative16': typeof genRelative16Route + '/relative17': typeof genRelative17Route + '/relative18': typeof genRelative18Route + '/relative19': typeof genRelative19Route + '/relative2': typeof genRelative2Route + '/relative20': typeof genRelative20Route + '/relative21': typeof genRelative21Route + '/relative22': typeof genRelative22Route + '/relative23': typeof genRelative23Route + '/relative24': typeof genRelative24Route + '/relative25': typeof genRelative25Route + '/relative26': typeof genRelative26Route + '/relative27': typeof genRelative27Route + '/relative28': typeof genRelative28Route + '/relative29': typeof genRelative29Route + '/relative3': typeof genRelative3Route + '/relative30': typeof genRelative30Route + '/relative31': typeof genRelative31Route + '/relative32': typeof genRelative32Route + '/relative33': typeof genRelative33Route + '/relative34': typeof genRelative34Route + '/relative35': typeof genRelative35Route + '/relative36': typeof genRelative36Route + '/relative37': typeof genRelative37Route + '/relative38': typeof genRelative38Route + '/relative39': typeof genRelative39Route + '/relative4': typeof genRelative4Route + '/relative40': typeof genRelative40Route + '/relative41': typeof genRelative41Route + '/relative42': typeof genRelative42Route + '/relative43': typeof genRelative43Route + '/relative44': typeof genRelative44Route + '/relative45': typeof genRelative45Route + '/relative46': typeof genRelative46Route + '/relative47': typeof genRelative47Route + '/relative48': typeof genRelative48Route + '/relative49': typeof genRelative49Route + '/relative5': typeof genRelative5Route + '/relative50': typeof genRelative50Route + '/relative51': typeof genRelative51Route + '/relative52': typeof genRelative52Route + '/relative53': typeof genRelative53Route + '/relative54': typeof genRelative54Route + '/relative55': typeof genRelative55Route + '/relative56': typeof genRelative56Route + '/relative57': typeof genRelative57Route + '/relative58': typeof genRelative58Route + '/relative59': typeof genRelative59Route + '/relative6': typeof genRelative6Route + '/relative60': typeof genRelative60Route + '/relative61': typeof genRelative61Route + '/relative62': typeof genRelative62Route + '/relative63': typeof genRelative63Route + '/relative64': typeof genRelative64Route + '/relative65': typeof genRelative65Route + '/relative66': typeof genRelative66Route + '/relative67': typeof genRelative67Route + '/relative68': typeof genRelative68Route + '/relative69': typeof genRelative69Route + '/relative7': typeof genRelative7Route + '/relative70': typeof genRelative70Route + '/relative71': typeof genRelative71Route + '/relative72': typeof genRelative72Route + '/relative73': typeof genRelative73Route + '/relative74': typeof genRelative74Route + '/relative75': typeof genRelative75Route + '/relative76': typeof genRelative76Route + '/relative77': typeof genRelative77Route + '/relative78': typeof genRelative78Route + '/relative79': typeof genRelative79Route + '/relative8': typeof genRelative8Route + '/relative80': typeof genRelative80Route + '/relative81': typeof genRelative81Route + '/relative82': typeof genRelative82Route + '/relative83': typeof genRelative83Route + '/relative84': typeof genRelative84Route + '/relative85': typeof genRelative85Route + '/relative86': typeof genRelative86Route + '/relative87': typeof genRelative87Route + '/relative88': typeof genRelative88Route + '/relative89': typeof genRelative89Route + '/relative9': typeof genRelative9Route + '/relative90': typeof genRelative90Route + '/relative91': typeof genRelative91Route + '/relative92': typeof genRelative92Route + '/relative93': typeof genRelative93Route + '/relative94': typeof genRelative94Route + '/relative95': typeof genRelative95Route + '/relative96': typeof genRelative96Route + '/relative97': typeof genRelative97Route + '/relative98': typeof genRelative98Route + '/relative99': typeof genRelative99Route + '/params/$paramsPlaceholder': typeof ParamsParamsPlaceholderRoute + '/search/searchPlaceholder': typeof SearchSearchPlaceholderRoute + '/params/$param0': typeof genParamsParam0Route + '/params/$param1': typeof genParamsParam1Route + '/params/$param10': typeof genParamsParam10Route + '/params/$param11': typeof genParamsParam11Route + '/params/$param12': typeof genParamsParam12Route + '/params/$param13': typeof genParamsParam13Route + '/params/$param14': typeof genParamsParam14Route + '/params/$param15': typeof genParamsParam15Route + '/params/$param16': typeof genParamsParam16Route + '/params/$param17': typeof genParamsParam17Route + '/params/$param18': typeof genParamsParam18Route + '/params/$param19': typeof genParamsParam19Route + '/params/$param2': typeof genParamsParam2Route + '/params/$param20': typeof genParamsParam20Route + '/params/$param21': typeof genParamsParam21Route + '/params/$param22': typeof genParamsParam22Route + '/params/$param23': typeof genParamsParam23Route + '/params/$param24': typeof genParamsParam24Route + '/params/$param25': typeof genParamsParam25Route + '/params/$param26': typeof genParamsParam26Route + '/params/$param27': typeof genParamsParam27Route + '/params/$param28': typeof genParamsParam28Route + '/params/$param29': typeof genParamsParam29Route + '/params/$param3': typeof genParamsParam3Route + '/params/$param30': typeof genParamsParam30Route + '/params/$param31': typeof genParamsParam31Route + '/params/$param32': typeof genParamsParam32Route + '/params/$param33': typeof genParamsParam33Route + '/params/$param34': typeof genParamsParam34Route + '/params/$param35': typeof genParamsParam35Route + '/params/$param36': typeof genParamsParam36Route + '/params/$param37': typeof genParamsParam37Route + '/params/$param38': typeof genParamsParam38Route + '/params/$param39': typeof genParamsParam39Route + '/params/$param4': typeof genParamsParam4Route + '/params/$param40': typeof genParamsParam40Route + '/params/$param41': typeof genParamsParam41Route + '/params/$param42': typeof genParamsParam42Route + '/params/$param43': typeof genParamsParam43Route + '/params/$param44': typeof genParamsParam44Route + '/params/$param45': typeof genParamsParam45Route + '/params/$param46': typeof genParamsParam46Route + '/params/$param47': typeof genParamsParam47Route + '/params/$param48': typeof genParamsParam48Route + '/params/$param49': typeof genParamsParam49Route + '/params/$param5': typeof genParamsParam5Route + '/params/$param50': typeof genParamsParam50Route + '/params/$param51': typeof genParamsParam51Route + '/params/$param52': typeof genParamsParam52Route + '/params/$param53': typeof genParamsParam53Route + '/params/$param54': typeof genParamsParam54Route + '/params/$param55': typeof genParamsParam55Route + '/params/$param56': typeof genParamsParam56Route + '/params/$param57': typeof genParamsParam57Route + '/params/$param58': typeof genParamsParam58Route + '/params/$param59': typeof genParamsParam59Route + '/params/$param6': typeof genParamsParam6Route + '/params/$param60': typeof genParamsParam60Route + '/params/$param61': typeof genParamsParam61Route + '/params/$param62': typeof genParamsParam62Route + '/params/$param63': typeof genParamsParam63Route + '/params/$param64': typeof genParamsParam64Route + '/params/$param65': typeof genParamsParam65Route + '/params/$param66': typeof genParamsParam66Route + '/params/$param67': typeof genParamsParam67Route + '/params/$param68': typeof genParamsParam68Route + '/params/$param69': typeof genParamsParam69Route + '/params/$param7': typeof genParamsParam7Route + '/params/$param70': typeof genParamsParam70Route + '/params/$param71': typeof genParamsParam71Route + '/params/$param72': typeof genParamsParam72Route + '/params/$param73': typeof genParamsParam73Route + '/params/$param74': typeof genParamsParam74Route + '/params/$param75': typeof genParamsParam75Route + '/params/$param76': typeof genParamsParam76Route + '/params/$param77': typeof genParamsParam77Route + '/params/$param78': typeof genParamsParam78Route + '/params/$param79': typeof genParamsParam79Route + '/params/$param8': typeof genParamsParam8Route + '/params/$param80': typeof genParamsParam80Route + '/params/$param81': typeof genParamsParam81Route + '/params/$param82': typeof genParamsParam82Route + '/params/$param83': typeof genParamsParam83Route + '/params/$param84': typeof genParamsParam84Route + '/params/$param85': typeof genParamsParam85Route + '/params/$param86': typeof genParamsParam86Route + '/params/$param87': typeof genParamsParam87Route + '/params/$param88': typeof genParamsParam88Route + '/params/$param89': typeof genParamsParam89Route + '/params/$param9': typeof genParamsParam9Route + '/params/$param90': typeof genParamsParam90Route + '/params/$param91': typeof genParamsParam91Route + '/params/$param92': typeof genParamsParam92Route + '/params/$param93': typeof genParamsParam93Route + '/params/$param94': typeof genParamsParam94Route + '/params/$param95': typeof genParamsParam95Route + '/params/$param96': typeof genParamsParam96Route + '/params/$param97': typeof genParamsParam97Route + '/params/$param98': typeof genParamsParam98Route + '/params/$param99': typeof genParamsParam99Route + '/search/search0': typeof genSearchSearch0Route + '/search/search1': typeof genSearchSearch1Route + '/search/search10': typeof genSearchSearch10Route + '/search/search11': typeof genSearchSearch11Route + '/search/search12': typeof genSearchSearch12Route + '/search/search13': typeof genSearchSearch13Route + '/search/search14': typeof genSearchSearch14Route + '/search/search15': typeof genSearchSearch15Route + '/search/search16': typeof genSearchSearch16Route + '/search/search17': typeof genSearchSearch17Route + '/search/search18': typeof genSearchSearch18Route + '/search/search19': typeof genSearchSearch19Route + '/search/search2': typeof genSearchSearch2Route + '/search/search20': typeof genSearchSearch20Route + '/search/search21': typeof genSearchSearch21Route + '/search/search22': typeof genSearchSearch22Route + '/search/search23': typeof genSearchSearch23Route + '/search/search24': typeof genSearchSearch24Route + '/search/search25': typeof genSearchSearch25Route + '/search/search26': typeof genSearchSearch26Route + '/search/search27': typeof genSearchSearch27Route + '/search/search28': typeof genSearchSearch28Route + '/search/search29': typeof genSearchSearch29Route + '/search/search3': typeof genSearchSearch3Route + '/search/search30': typeof genSearchSearch30Route + '/search/search31': typeof genSearchSearch31Route + '/search/search32': typeof genSearchSearch32Route + '/search/search33': typeof genSearchSearch33Route + '/search/search34': typeof genSearchSearch34Route + '/search/search35': typeof genSearchSearch35Route + '/search/search36': typeof genSearchSearch36Route + '/search/search37': typeof genSearchSearch37Route + '/search/search38': typeof genSearchSearch38Route + '/search/search39': typeof genSearchSearch39Route + '/search/search4': typeof genSearchSearch4Route + '/search/search40': typeof genSearchSearch40Route + '/search/search41': typeof genSearchSearch41Route + '/search/search42': typeof genSearchSearch42Route + '/search/search43': typeof genSearchSearch43Route + '/search/search44': typeof genSearchSearch44Route + '/search/search45': typeof genSearchSearch45Route + '/search/search46': typeof genSearchSearch46Route + '/search/search47': typeof genSearchSearch47Route + '/search/search48': typeof genSearchSearch48Route + '/search/search49': typeof genSearchSearch49Route + '/search/search5': typeof genSearchSearch5Route + '/search/search50': typeof genSearchSearch50Route + '/search/search51': typeof genSearchSearch51Route + '/search/search52': typeof genSearchSearch52Route + '/search/search53': typeof genSearchSearch53Route + '/search/search54': typeof genSearchSearch54Route + '/search/search55': typeof genSearchSearch55Route + '/search/search56': typeof genSearchSearch56Route + '/search/search57': typeof genSearchSearch57Route + '/search/search58': typeof genSearchSearch58Route + '/search/search59': typeof genSearchSearch59Route + '/search/search6': typeof genSearchSearch6Route + '/search/search60': typeof genSearchSearch60Route + '/search/search61': typeof genSearchSearch61Route + '/search/search62': typeof genSearchSearch62Route + '/search/search63': typeof genSearchSearch63Route + '/search/search64': typeof genSearchSearch64Route + '/search/search65': typeof genSearchSearch65Route + '/search/search66': typeof genSearchSearch66Route + '/search/search67': typeof genSearchSearch67Route + '/search/search68': typeof genSearchSearch68Route + '/search/search69': typeof genSearchSearch69Route + '/search/search7': typeof genSearchSearch7Route + '/search/search70': typeof genSearchSearch70Route + '/search/search71': typeof genSearchSearch71Route + '/search/search72': typeof genSearchSearch72Route + '/search/search73': typeof genSearchSearch73Route + '/search/search74': typeof genSearchSearch74Route + '/search/search75': typeof genSearchSearch75Route + '/search/search76': typeof genSearchSearch76Route + '/search/search77': typeof genSearchSearch77Route + '/search/search78': typeof genSearchSearch78Route + '/search/search79': typeof genSearchSearch79Route + '/search/search8': typeof genSearchSearch8Route + '/search/search80': typeof genSearchSearch80Route + '/search/search81': typeof genSearchSearch81Route + '/search/search82': typeof genSearchSearch82Route + '/search/search83': typeof genSearchSearch83Route + '/search/search84': typeof genSearchSearch84Route + '/search/search85': typeof genSearchSearch85Route + '/search/search86': typeof genSearchSearch86Route + '/search/search87': typeof genSearchSearch87Route + '/search/search88': typeof genSearchSearch88Route + '/search/search89': typeof genSearchSearch89Route + '/search/search9': typeof genSearchSearch9Route + '/search/search90': typeof genSearchSearch90Route + '/search/search91': typeof genSearchSearch91Route + '/search/search92': typeof genSearchSearch92Route + '/search/search93': typeof genSearchSearch93Route + '/search/search94': typeof genSearchSearch94Route + '/search/search95': typeof genSearchSearch95Route + '/search/search96': typeof genSearchSearch96Route + '/search/search97': typeof genSearchSearch97Route + '/search/search98': typeof genSearchSearch98Route + '/search/search99': typeof genSearchSearch99Route +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/params': typeof genParamsRouteRouteWithChildren + '/search': typeof genSearchRouteRouteWithChildren + '/absolute': typeof AbsoluteRoute + '/linkProps': typeof LinkPropsRoute + '/relative': typeof RelativeRoute + '/absolute0': typeof genAbsolute0Route + '/absolute1': typeof genAbsolute1Route + '/absolute10': typeof genAbsolute10Route + '/absolute11': typeof genAbsolute11Route + '/absolute12': typeof genAbsolute12Route + '/absolute13': typeof genAbsolute13Route + '/absolute14': typeof genAbsolute14Route + '/absolute15': typeof genAbsolute15Route + '/absolute16': typeof genAbsolute16Route + '/absolute17': typeof genAbsolute17Route + '/absolute18': typeof genAbsolute18Route + '/absolute19': typeof genAbsolute19Route + '/absolute2': typeof genAbsolute2Route + '/absolute20': typeof genAbsolute20Route + '/absolute21': typeof genAbsolute21Route + '/absolute22': typeof genAbsolute22Route + '/absolute23': typeof genAbsolute23Route + '/absolute24': typeof genAbsolute24Route + '/absolute25': typeof genAbsolute25Route + '/absolute26': typeof genAbsolute26Route + '/absolute27': typeof genAbsolute27Route + '/absolute28': typeof genAbsolute28Route + '/absolute29': typeof genAbsolute29Route + '/absolute3': typeof genAbsolute3Route + '/absolute30': typeof genAbsolute30Route + '/absolute31': typeof genAbsolute31Route + '/absolute32': typeof genAbsolute32Route + '/absolute33': typeof genAbsolute33Route + '/absolute34': typeof genAbsolute34Route + '/absolute35': typeof genAbsolute35Route + '/absolute36': typeof genAbsolute36Route + '/absolute37': typeof genAbsolute37Route + '/absolute38': typeof genAbsolute38Route + '/absolute39': typeof genAbsolute39Route + '/absolute4': typeof genAbsolute4Route + '/absolute40': typeof genAbsolute40Route + '/absolute41': typeof genAbsolute41Route + '/absolute42': typeof genAbsolute42Route + '/absolute43': typeof genAbsolute43Route + '/absolute44': typeof genAbsolute44Route + '/absolute45': typeof genAbsolute45Route + '/absolute46': typeof genAbsolute46Route + '/absolute47': typeof genAbsolute47Route + '/absolute48': typeof genAbsolute48Route + '/absolute49': typeof genAbsolute49Route + '/absolute5': typeof genAbsolute5Route + '/absolute50': typeof genAbsolute50Route + '/absolute51': typeof genAbsolute51Route + '/absolute52': typeof genAbsolute52Route + '/absolute53': typeof genAbsolute53Route + '/absolute54': typeof genAbsolute54Route + '/absolute55': typeof genAbsolute55Route + '/absolute56': typeof genAbsolute56Route + '/absolute57': typeof genAbsolute57Route + '/absolute58': typeof genAbsolute58Route + '/absolute59': typeof genAbsolute59Route + '/absolute6': typeof genAbsolute6Route + '/absolute60': typeof genAbsolute60Route + '/absolute61': typeof genAbsolute61Route + '/absolute62': typeof genAbsolute62Route + '/absolute63': typeof genAbsolute63Route + '/absolute64': typeof genAbsolute64Route + '/absolute65': typeof genAbsolute65Route + '/absolute66': typeof genAbsolute66Route + '/absolute67': typeof genAbsolute67Route + '/absolute68': typeof genAbsolute68Route + '/absolute69': typeof genAbsolute69Route + '/absolute7': typeof genAbsolute7Route + '/absolute70': typeof genAbsolute70Route + '/absolute71': typeof genAbsolute71Route + '/absolute72': typeof genAbsolute72Route + '/absolute73': typeof genAbsolute73Route + '/absolute74': typeof genAbsolute74Route + '/absolute75': typeof genAbsolute75Route + '/absolute76': typeof genAbsolute76Route + '/absolute77': typeof genAbsolute77Route + '/absolute78': typeof genAbsolute78Route + '/absolute79': typeof genAbsolute79Route + '/absolute8': typeof genAbsolute8Route + '/absolute80': typeof genAbsolute80Route + '/absolute81': typeof genAbsolute81Route + '/absolute82': typeof genAbsolute82Route + '/absolute83': typeof genAbsolute83Route + '/absolute84': typeof genAbsolute84Route + '/absolute85': typeof genAbsolute85Route + '/absolute86': typeof genAbsolute86Route + '/absolute87': typeof genAbsolute87Route + '/absolute88': typeof genAbsolute88Route + '/absolute89': typeof genAbsolute89Route + '/absolute9': typeof genAbsolute9Route + '/absolute90': typeof genAbsolute90Route + '/absolute91': typeof genAbsolute91Route + '/absolute92': typeof genAbsolute92Route + '/absolute93': typeof genAbsolute93Route + '/absolute94': typeof genAbsolute94Route + '/absolute95': typeof genAbsolute95Route + '/absolute96': typeof genAbsolute96Route + '/absolute97': typeof genAbsolute97Route + '/absolute98': typeof genAbsolute98Route + '/absolute99': typeof genAbsolute99Route + '/relative0': typeof genRelative0Route + '/relative1': typeof genRelative1Route + '/relative10': typeof genRelative10Route + '/relative11': typeof genRelative11Route + '/relative12': typeof genRelative12Route + '/relative13': typeof genRelative13Route + '/relative14': typeof genRelative14Route + '/relative15': typeof genRelative15Route + '/relative16': typeof genRelative16Route + '/relative17': typeof genRelative17Route + '/relative18': typeof genRelative18Route + '/relative19': typeof genRelative19Route + '/relative2': typeof genRelative2Route + '/relative20': typeof genRelative20Route + '/relative21': typeof genRelative21Route + '/relative22': typeof genRelative22Route + '/relative23': typeof genRelative23Route + '/relative24': typeof genRelative24Route + '/relative25': typeof genRelative25Route + '/relative26': typeof genRelative26Route + '/relative27': typeof genRelative27Route + '/relative28': typeof genRelative28Route + '/relative29': typeof genRelative29Route + '/relative3': typeof genRelative3Route + '/relative30': typeof genRelative30Route + '/relative31': typeof genRelative31Route + '/relative32': typeof genRelative32Route + '/relative33': typeof genRelative33Route + '/relative34': typeof genRelative34Route + '/relative35': typeof genRelative35Route + '/relative36': typeof genRelative36Route + '/relative37': typeof genRelative37Route + '/relative38': typeof genRelative38Route + '/relative39': typeof genRelative39Route + '/relative4': typeof genRelative4Route + '/relative40': typeof genRelative40Route + '/relative41': typeof genRelative41Route + '/relative42': typeof genRelative42Route + '/relative43': typeof genRelative43Route + '/relative44': typeof genRelative44Route + '/relative45': typeof genRelative45Route + '/relative46': typeof genRelative46Route + '/relative47': typeof genRelative47Route + '/relative48': typeof genRelative48Route + '/relative49': typeof genRelative49Route + '/relative5': typeof genRelative5Route + '/relative50': typeof genRelative50Route + '/relative51': typeof genRelative51Route + '/relative52': typeof genRelative52Route + '/relative53': typeof genRelative53Route + '/relative54': typeof genRelative54Route + '/relative55': typeof genRelative55Route + '/relative56': typeof genRelative56Route + '/relative57': typeof genRelative57Route + '/relative58': typeof genRelative58Route + '/relative59': typeof genRelative59Route + '/relative6': typeof genRelative6Route + '/relative60': typeof genRelative60Route + '/relative61': typeof genRelative61Route + '/relative62': typeof genRelative62Route + '/relative63': typeof genRelative63Route + '/relative64': typeof genRelative64Route + '/relative65': typeof genRelative65Route + '/relative66': typeof genRelative66Route + '/relative67': typeof genRelative67Route + '/relative68': typeof genRelative68Route + '/relative69': typeof genRelative69Route + '/relative7': typeof genRelative7Route + '/relative70': typeof genRelative70Route + '/relative71': typeof genRelative71Route + '/relative72': typeof genRelative72Route + '/relative73': typeof genRelative73Route + '/relative74': typeof genRelative74Route + '/relative75': typeof genRelative75Route + '/relative76': typeof genRelative76Route + '/relative77': typeof genRelative77Route + '/relative78': typeof genRelative78Route + '/relative79': typeof genRelative79Route + '/relative8': typeof genRelative8Route + '/relative80': typeof genRelative80Route + '/relative81': typeof genRelative81Route + '/relative82': typeof genRelative82Route + '/relative83': typeof genRelative83Route + '/relative84': typeof genRelative84Route + '/relative85': typeof genRelative85Route + '/relative86': typeof genRelative86Route + '/relative87': typeof genRelative87Route + '/relative88': typeof genRelative88Route + '/relative89': typeof genRelative89Route + '/relative9': typeof genRelative9Route + '/relative90': typeof genRelative90Route + '/relative91': typeof genRelative91Route + '/relative92': typeof genRelative92Route + '/relative93': typeof genRelative93Route + '/relative94': typeof genRelative94Route + '/relative95': typeof genRelative95Route + '/relative96': typeof genRelative96Route + '/relative97': typeof genRelative97Route + '/relative98': typeof genRelative98Route + '/relative99': typeof genRelative99Route + '/params/$paramsPlaceholder': typeof ParamsParamsPlaceholderRoute + '/search/searchPlaceholder': typeof SearchSearchPlaceholderRoute + '/params/$param0': typeof genParamsParam0Route + '/params/$param1': typeof genParamsParam1Route + '/params/$param10': typeof genParamsParam10Route + '/params/$param11': typeof genParamsParam11Route + '/params/$param12': typeof genParamsParam12Route + '/params/$param13': typeof genParamsParam13Route + '/params/$param14': typeof genParamsParam14Route + '/params/$param15': typeof genParamsParam15Route + '/params/$param16': typeof genParamsParam16Route + '/params/$param17': typeof genParamsParam17Route + '/params/$param18': typeof genParamsParam18Route + '/params/$param19': typeof genParamsParam19Route + '/params/$param2': typeof genParamsParam2Route + '/params/$param20': typeof genParamsParam20Route + '/params/$param21': typeof genParamsParam21Route + '/params/$param22': typeof genParamsParam22Route + '/params/$param23': typeof genParamsParam23Route + '/params/$param24': typeof genParamsParam24Route + '/params/$param25': typeof genParamsParam25Route + '/params/$param26': typeof genParamsParam26Route + '/params/$param27': typeof genParamsParam27Route + '/params/$param28': typeof genParamsParam28Route + '/params/$param29': typeof genParamsParam29Route + '/params/$param3': typeof genParamsParam3Route + '/params/$param30': typeof genParamsParam30Route + '/params/$param31': typeof genParamsParam31Route + '/params/$param32': typeof genParamsParam32Route + '/params/$param33': typeof genParamsParam33Route + '/params/$param34': typeof genParamsParam34Route + '/params/$param35': typeof genParamsParam35Route + '/params/$param36': typeof genParamsParam36Route + '/params/$param37': typeof genParamsParam37Route + '/params/$param38': typeof genParamsParam38Route + '/params/$param39': typeof genParamsParam39Route + '/params/$param4': typeof genParamsParam4Route + '/params/$param40': typeof genParamsParam40Route + '/params/$param41': typeof genParamsParam41Route + '/params/$param42': typeof genParamsParam42Route + '/params/$param43': typeof genParamsParam43Route + '/params/$param44': typeof genParamsParam44Route + '/params/$param45': typeof genParamsParam45Route + '/params/$param46': typeof genParamsParam46Route + '/params/$param47': typeof genParamsParam47Route + '/params/$param48': typeof genParamsParam48Route + '/params/$param49': typeof genParamsParam49Route + '/params/$param5': typeof genParamsParam5Route + '/params/$param50': typeof genParamsParam50Route + '/params/$param51': typeof genParamsParam51Route + '/params/$param52': typeof genParamsParam52Route + '/params/$param53': typeof genParamsParam53Route + '/params/$param54': typeof genParamsParam54Route + '/params/$param55': typeof genParamsParam55Route + '/params/$param56': typeof genParamsParam56Route + '/params/$param57': typeof genParamsParam57Route + '/params/$param58': typeof genParamsParam58Route + '/params/$param59': typeof genParamsParam59Route + '/params/$param6': typeof genParamsParam6Route + '/params/$param60': typeof genParamsParam60Route + '/params/$param61': typeof genParamsParam61Route + '/params/$param62': typeof genParamsParam62Route + '/params/$param63': typeof genParamsParam63Route + '/params/$param64': typeof genParamsParam64Route + '/params/$param65': typeof genParamsParam65Route + '/params/$param66': typeof genParamsParam66Route + '/params/$param67': typeof genParamsParam67Route + '/params/$param68': typeof genParamsParam68Route + '/params/$param69': typeof genParamsParam69Route + '/params/$param7': typeof genParamsParam7Route + '/params/$param70': typeof genParamsParam70Route + '/params/$param71': typeof genParamsParam71Route + '/params/$param72': typeof genParamsParam72Route + '/params/$param73': typeof genParamsParam73Route + '/params/$param74': typeof genParamsParam74Route + '/params/$param75': typeof genParamsParam75Route + '/params/$param76': typeof genParamsParam76Route + '/params/$param77': typeof genParamsParam77Route + '/params/$param78': typeof genParamsParam78Route + '/params/$param79': typeof genParamsParam79Route + '/params/$param8': typeof genParamsParam8Route + '/params/$param80': typeof genParamsParam80Route + '/params/$param81': typeof genParamsParam81Route + '/params/$param82': typeof genParamsParam82Route + '/params/$param83': typeof genParamsParam83Route + '/params/$param84': typeof genParamsParam84Route + '/params/$param85': typeof genParamsParam85Route + '/params/$param86': typeof genParamsParam86Route + '/params/$param87': typeof genParamsParam87Route + '/params/$param88': typeof genParamsParam88Route + '/params/$param89': typeof genParamsParam89Route + '/params/$param9': typeof genParamsParam9Route + '/params/$param90': typeof genParamsParam90Route + '/params/$param91': typeof genParamsParam91Route + '/params/$param92': typeof genParamsParam92Route + '/params/$param93': typeof genParamsParam93Route + '/params/$param94': typeof genParamsParam94Route + '/params/$param95': typeof genParamsParam95Route + '/params/$param96': typeof genParamsParam96Route + '/params/$param97': typeof genParamsParam97Route + '/params/$param98': typeof genParamsParam98Route + '/params/$param99': typeof genParamsParam99Route + '/search/search0': typeof genSearchSearch0Route + '/search/search1': typeof genSearchSearch1Route + '/search/search10': typeof genSearchSearch10Route + '/search/search11': typeof genSearchSearch11Route + '/search/search12': typeof genSearchSearch12Route + '/search/search13': typeof genSearchSearch13Route + '/search/search14': typeof genSearchSearch14Route + '/search/search15': typeof genSearchSearch15Route + '/search/search16': typeof genSearchSearch16Route + '/search/search17': typeof genSearchSearch17Route + '/search/search18': typeof genSearchSearch18Route + '/search/search19': typeof genSearchSearch19Route + '/search/search2': typeof genSearchSearch2Route + '/search/search20': typeof genSearchSearch20Route + '/search/search21': typeof genSearchSearch21Route + '/search/search22': typeof genSearchSearch22Route + '/search/search23': typeof genSearchSearch23Route + '/search/search24': typeof genSearchSearch24Route + '/search/search25': typeof genSearchSearch25Route + '/search/search26': typeof genSearchSearch26Route + '/search/search27': typeof genSearchSearch27Route + '/search/search28': typeof genSearchSearch28Route + '/search/search29': typeof genSearchSearch29Route + '/search/search3': typeof genSearchSearch3Route + '/search/search30': typeof genSearchSearch30Route + '/search/search31': typeof genSearchSearch31Route + '/search/search32': typeof genSearchSearch32Route + '/search/search33': typeof genSearchSearch33Route + '/search/search34': typeof genSearchSearch34Route + '/search/search35': typeof genSearchSearch35Route + '/search/search36': typeof genSearchSearch36Route + '/search/search37': typeof genSearchSearch37Route + '/search/search38': typeof genSearchSearch38Route + '/search/search39': typeof genSearchSearch39Route + '/search/search4': typeof genSearchSearch4Route + '/search/search40': typeof genSearchSearch40Route + '/search/search41': typeof genSearchSearch41Route + '/search/search42': typeof genSearchSearch42Route + '/search/search43': typeof genSearchSearch43Route + '/search/search44': typeof genSearchSearch44Route + '/search/search45': typeof genSearchSearch45Route + '/search/search46': typeof genSearchSearch46Route + '/search/search47': typeof genSearchSearch47Route + '/search/search48': typeof genSearchSearch48Route + '/search/search49': typeof genSearchSearch49Route + '/search/search5': typeof genSearchSearch5Route + '/search/search50': typeof genSearchSearch50Route + '/search/search51': typeof genSearchSearch51Route + '/search/search52': typeof genSearchSearch52Route + '/search/search53': typeof genSearchSearch53Route + '/search/search54': typeof genSearchSearch54Route + '/search/search55': typeof genSearchSearch55Route + '/search/search56': typeof genSearchSearch56Route + '/search/search57': typeof genSearchSearch57Route + '/search/search58': typeof genSearchSearch58Route + '/search/search59': typeof genSearchSearch59Route + '/search/search6': typeof genSearchSearch6Route + '/search/search60': typeof genSearchSearch60Route + '/search/search61': typeof genSearchSearch61Route + '/search/search62': typeof genSearchSearch62Route + '/search/search63': typeof genSearchSearch63Route + '/search/search64': typeof genSearchSearch64Route + '/search/search65': typeof genSearchSearch65Route + '/search/search66': typeof genSearchSearch66Route + '/search/search67': typeof genSearchSearch67Route + '/search/search68': typeof genSearchSearch68Route + '/search/search69': typeof genSearchSearch69Route + '/search/search7': typeof genSearchSearch7Route + '/search/search70': typeof genSearchSearch70Route + '/search/search71': typeof genSearchSearch71Route + '/search/search72': typeof genSearchSearch72Route + '/search/search73': typeof genSearchSearch73Route + '/search/search74': typeof genSearchSearch74Route + '/search/search75': typeof genSearchSearch75Route + '/search/search76': typeof genSearchSearch76Route + '/search/search77': typeof genSearchSearch77Route + '/search/search78': typeof genSearchSearch78Route + '/search/search79': typeof genSearchSearch79Route + '/search/search8': typeof genSearchSearch8Route + '/search/search80': typeof genSearchSearch80Route + '/search/search81': typeof genSearchSearch81Route + '/search/search82': typeof genSearchSearch82Route + '/search/search83': typeof genSearchSearch83Route + '/search/search84': typeof genSearchSearch84Route + '/search/search85': typeof genSearchSearch85Route + '/search/search86': typeof genSearchSearch86Route + '/search/search87': typeof genSearchSearch87Route + '/search/search88': typeof genSearchSearch88Route + '/search/search89': typeof genSearchSearch89Route + '/search/search9': typeof genSearchSearch9Route + '/search/search90': typeof genSearchSearch90Route + '/search/search91': typeof genSearchSearch91Route + '/search/search92': typeof genSearchSearch92Route + '/search/search93': typeof genSearchSearch93Route + '/search/search94': typeof genSearchSearch94Route + '/search/search95': typeof genSearchSearch95Route + '/search/search96': typeof genSearchSearch96Route + '/search/search97': typeof genSearchSearch97Route + '/search/search98': typeof genSearchSearch98Route + '/search/search99': typeof genSearchSearch99Route +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '/params' + | '/search' + | '/absolute' + | '/linkProps' + | '/relative' + | '/absolute0' + | '/absolute1' + | '/absolute10' + | '/absolute11' + | '/absolute12' + | '/absolute13' + | '/absolute14' + | '/absolute15' + | '/absolute16' + | '/absolute17' + | '/absolute18' + | '/absolute19' + | '/absolute2' + | '/absolute20' + | '/absolute21' + | '/absolute22' + | '/absolute23' + | '/absolute24' + | '/absolute25' + | '/absolute26' + | '/absolute27' + | '/absolute28' + | '/absolute29' + | '/absolute3' + | '/absolute30' + | '/absolute31' + | '/absolute32' + | '/absolute33' + | '/absolute34' + | '/absolute35' + | '/absolute36' + | '/absolute37' + | '/absolute38' + | '/absolute39' + | '/absolute4' + | '/absolute40' + | '/absolute41' + | '/absolute42' + | '/absolute43' + | '/absolute44' + | '/absolute45' + | '/absolute46' + | '/absolute47' + | '/absolute48' + | '/absolute49' + | '/absolute5' + | '/absolute50' + | '/absolute51' + | '/absolute52' + | '/absolute53' + | '/absolute54' + | '/absolute55' + | '/absolute56' + | '/absolute57' + | '/absolute58' + | '/absolute59' + | '/absolute6' + | '/absolute60' + | '/absolute61' + | '/absolute62' + | '/absolute63' + | '/absolute64' + | '/absolute65' + | '/absolute66' + | '/absolute67' + | '/absolute68' + | '/absolute69' + | '/absolute7' + | '/absolute70' + | '/absolute71' + | '/absolute72' + | '/absolute73' + | '/absolute74' + | '/absolute75' + | '/absolute76' + | '/absolute77' + | '/absolute78' + | '/absolute79' + | '/absolute8' + | '/absolute80' + | '/absolute81' + | '/absolute82' + | '/absolute83' + | '/absolute84' + | '/absolute85' + | '/absolute86' + | '/absolute87' + | '/absolute88' + | '/absolute89' + | '/absolute9' + | '/absolute90' + | '/absolute91' + | '/absolute92' + | '/absolute93' + | '/absolute94' + | '/absolute95' + | '/absolute96' + | '/absolute97' + | '/absolute98' + | '/absolute99' + | '/relative0' + | '/relative1' + | '/relative10' + | '/relative11' + | '/relative12' + | '/relative13' + | '/relative14' + | '/relative15' + | '/relative16' + | '/relative17' + | '/relative18' + | '/relative19' + | '/relative2' + | '/relative20' + | '/relative21' + | '/relative22' + | '/relative23' + | '/relative24' + | '/relative25' + | '/relative26' + | '/relative27' + | '/relative28' + | '/relative29' + | '/relative3' + | '/relative30' + | '/relative31' + | '/relative32' + | '/relative33' + | '/relative34' + | '/relative35' + | '/relative36' + | '/relative37' + | '/relative38' + | '/relative39' + | '/relative4' + | '/relative40' + | '/relative41' + | '/relative42' + | '/relative43' + | '/relative44' + | '/relative45' + | '/relative46' + | '/relative47' + | '/relative48' + | '/relative49' + | '/relative5' + | '/relative50' + | '/relative51' + | '/relative52' + | '/relative53' + | '/relative54' + | '/relative55' + | '/relative56' + | '/relative57' + | '/relative58' + | '/relative59' + | '/relative6' + | '/relative60' + | '/relative61' + | '/relative62' + | '/relative63' + | '/relative64' + | '/relative65' + | '/relative66' + | '/relative67' + | '/relative68' + | '/relative69' + | '/relative7' + | '/relative70' + | '/relative71' + | '/relative72' + | '/relative73' + | '/relative74' + | '/relative75' + | '/relative76' + | '/relative77' + | '/relative78' + | '/relative79' + | '/relative8' + | '/relative80' + | '/relative81' + | '/relative82' + | '/relative83' + | '/relative84' + | '/relative85' + | '/relative86' + | '/relative87' + | '/relative88' + | '/relative89' + | '/relative9' + | '/relative90' + | '/relative91' + | '/relative92' + | '/relative93' + | '/relative94' + | '/relative95' + | '/relative96' + | '/relative97' + | '/relative98' + | '/relative99' + | '/params/$paramsPlaceholder' + | '/search/searchPlaceholder' + | '/params/$param0' + | '/params/$param1' + | '/params/$param10' + | '/params/$param11' + | '/params/$param12' + | '/params/$param13' + | '/params/$param14' + | '/params/$param15' + | '/params/$param16' + | '/params/$param17' + | '/params/$param18' + | '/params/$param19' + | '/params/$param2' + | '/params/$param20' + | '/params/$param21' + | '/params/$param22' + | '/params/$param23' + | '/params/$param24' + | '/params/$param25' + | '/params/$param26' + | '/params/$param27' + | '/params/$param28' + | '/params/$param29' + | '/params/$param3' + | '/params/$param30' + | '/params/$param31' + | '/params/$param32' + | '/params/$param33' + | '/params/$param34' + | '/params/$param35' + | '/params/$param36' + | '/params/$param37' + | '/params/$param38' + | '/params/$param39' + | '/params/$param4' + | '/params/$param40' + | '/params/$param41' + | '/params/$param42' + | '/params/$param43' + | '/params/$param44' + | '/params/$param45' + | '/params/$param46' + | '/params/$param47' + | '/params/$param48' + | '/params/$param49' + | '/params/$param5' + | '/params/$param50' + | '/params/$param51' + | '/params/$param52' + | '/params/$param53' + | '/params/$param54' + | '/params/$param55' + | '/params/$param56' + | '/params/$param57' + | '/params/$param58' + | '/params/$param59' + | '/params/$param6' + | '/params/$param60' + | '/params/$param61' + | '/params/$param62' + | '/params/$param63' + | '/params/$param64' + | '/params/$param65' + | '/params/$param66' + | '/params/$param67' + | '/params/$param68' + | '/params/$param69' + | '/params/$param7' + | '/params/$param70' + | '/params/$param71' + | '/params/$param72' + | '/params/$param73' + | '/params/$param74' + | '/params/$param75' + | '/params/$param76' + | '/params/$param77' + | '/params/$param78' + | '/params/$param79' + | '/params/$param8' + | '/params/$param80' + | '/params/$param81' + | '/params/$param82' + | '/params/$param83' + | '/params/$param84' + | '/params/$param85' + | '/params/$param86' + | '/params/$param87' + | '/params/$param88' + | '/params/$param89' + | '/params/$param9' + | '/params/$param90' + | '/params/$param91' + | '/params/$param92' + | '/params/$param93' + | '/params/$param94' + | '/params/$param95' + | '/params/$param96' + | '/params/$param97' + | '/params/$param98' + | '/params/$param99' + | '/search/search0' + | '/search/search1' + | '/search/search10' + | '/search/search11' + | '/search/search12' + | '/search/search13' + | '/search/search14' + | '/search/search15' + | '/search/search16' + | '/search/search17' + | '/search/search18' + | '/search/search19' + | '/search/search2' + | '/search/search20' + | '/search/search21' + | '/search/search22' + | '/search/search23' + | '/search/search24' + | '/search/search25' + | '/search/search26' + | '/search/search27' + | '/search/search28' + | '/search/search29' + | '/search/search3' + | '/search/search30' + | '/search/search31' + | '/search/search32' + | '/search/search33' + | '/search/search34' + | '/search/search35' + | '/search/search36' + | '/search/search37' + | '/search/search38' + | '/search/search39' + | '/search/search4' + | '/search/search40' + | '/search/search41' + | '/search/search42' + | '/search/search43' + | '/search/search44' + | '/search/search45' + | '/search/search46' + | '/search/search47' + | '/search/search48' + | '/search/search49' + | '/search/search5' + | '/search/search50' + | '/search/search51' + | '/search/search52' + | '/search/search53' + | '/search/search54' + | '/search/search55' + | '/search/search56' + | '/search/search57' + | '/search/search58' + | '/search/search59' + | '/search/search6' + | '/search/search60' + | '/search/search61' + | '/search/search62' + | '/search/search63' + | '/search/search64' + | '/search/search65' + | '/search/search66' + | '/search/search67' + | '/search/search68' + | '/search/search69' + | '/search/search7' + | '/search/search70' + | '/search/search71' + | '/search/search72' + | '/search/search73' + | '/search/search74' + | '/search/search75' + | '/search/search76' + | '/search/search77' + | '/search/search78' + | '/search/search79' + | '/search/search8' + | '/search/search80' + | '/search/search81' + | '/search/search82' + | '/search/search83' + | '/search/search84' + | '/search/search85' + | '/search/search86' + | '/search/search87' + | '/search/search88' + | '/search/search89' + | '/search/search9' + | '/search/search90' + | '/search/search91' + | '/search/search92' + | '/search/search93' + | '/search/search94' + | '/search/search95' + | '/search/search96' + | '/search/search97' + | '/search/search98' + | '/search/search99' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '/params' + | '/search' + | '/absolute' + | '/linkProps' + | '/relative' + | '/absolute0' + | '/absolute1' + | '/absolute10' + | '/absolute11' + | '/absolute12' + | '/absolute13' + | '/absolute14' + | '/absolute15' + | '/absolute16' + | '/absolute17' + | '/absolute18' + | '/absolute19' + | '/absolute2' + | '/absolute20' + | '/absolute21' + | '/absolute22' + | '/absolute23' + | '/absolute24' + | '/absolute25' + | '/absolute26' + | '/absolute27' + | '/absolute28' + | '/absolute29' + | '/absolute3' + | '/absolute30' + | '/absolute31' + | '/absolute32' + | '/absolute33' + | '/absolute34' + | '/absolute35' + | '/absolute36' + | '/absolute37' + | '/absolute38' + | '/absolute39' + | '/absolute4' + | '/absolute40' + | '/absolute41' + | '/absolute42' + | '/absolute43' + | '/absolute44' + | '/absolute45' + | '/absolute46' + | '/absolute47' + | '/absolute48' + | '/absolute49' + | '/absolute5' + | '/absolute50' + | '/absolute51' + | '/absolute52' + | '/absolute53' + | '/absolute54' + | '/absolute55' + | '/absolute56' + | '/absolute57' + | '/absolute58' + | '/absolute59' + | '/absolute6' + | '/absolute60' + | '/absolute61' + | '/absolute62' + | '/absolute63' + | '/absolute64' + | '/absolute65' + | '/absolute66' + | '/absolute67' + | '/absolute68' + | '/absolute69' + | '/absolute7' + | '/absolute70' + | '/absolute71' + | '/absolute72' + | '/absolute73' + | '/absolute74' + | '/absolute75' + | '/absolute76' + | '/absolute77' + | '/absolute78' + | '/absolute79' + | '/absolute8' + | '/absolute80' + | '/absolute81' + | '/absolute82' + | '/absolute83' + | '/absolute84' + | '/absolute85' + | '/absolute86' + | '/absolute87' + | '/absolute88' + | '/absolute89' + | '/absolute9' + | '/absolute90' + | '/absolute91' + | '/absolute92' + | '/absolute93' + | '/absolute94' + | '/absolute95' + | '/absolute96' + | '/absolute97' + | '/absolute98' + | '/absolute99' + | '/relative0' + | '/relative1' + | '/relative10' + | '/relative11' + | '/relative12' + | '/relative13' + | '/relative14' + | '/relative15' + | '/relative16' + | '/relative17' + | '/relative18' + | '/relative19' + | '/relative2' + | '/relative20' + | '/relative21' + | '/relative22' + | '/relative23' + | '/relative24' + | '/relative25' + | '/relative26' + | '/relative27' + | '/relative28' + | '/relative29' + | '/relative3' + | '/relative30' + | '/relative31' + | '/relative32' + | '/relative33' + | '/relative34' + | '/relative35' + | '/relative36' + | '/relative37' + | '/relative38' + | '/relative39' + | '/relative4' + | '/relative40' + | '/relative41' + | '/relative42' + | '/relative43' + | '/relative44' + | '/relative45' + | '/relative46' + | '/relative47' + | '/relative48' + | '/relative49' + | '/relative5' + | '/relative50' + | '/relative51' + | '/relative52' + | '/relative53' + | '/relative54' + | '/relative55' + | '/relative56' + | '/relative57' + | '/relative58' + | '/relative59' + | '/relative6' + | '/relative60' + | '/relative61' + | '/relative62' + | '/relative63' + | '/relative64' + | '/relative65' + | '/relative66' + | '/relative67' + | '/relative68' + | '/relative69' + | '/relative7' + | '/relative70' + | '/relative71' + | '/relative72' + | '/relative73' + | '/relative74' + | '/relative75' + | '/relative76' + | '/relative77' + | '/relative78' + | '/relative79' + | '/relative8' + | '/relative80' + | '/relative81' + | '/relative82' + | '/relative83' + | '/relative84' + | '/relative85' + | '/relative86' + | '/relative87' + | '/relative88' + | '/relative89' + | '/relative9' + | '/relative90' + | '/relative91' + | '/relative92' + | '/relative93' + | '/relative94' + | '/relative95' + | '/relative96' + | '/relative97' + | '/relative98' + | '/relative99' + | '/params/$paramsPlaceholder' + | '/search/searchPlaceholder' + | '/params/$param0' + | '/params/$param1' + | '/params/$param10' + | '/params/$param11' + | '/params/$param12' + | '/params/$param13' + | '/params/$param14' + | '/params/$param15' + | '/params/$param16' + | '/params/$param17' + | '/params/$param18' + | '/params/$param19' + | '/params/$param2' + | '/params/$param20' + | '/params/$param21' + | '/params/$param22' + | '/params/$param23' + | '/params/$param24' + | '/params/$param25' + | '/params/$param26' + | '/params/$param27' + | '/params/$param28' + | '/params/$param29' + | '/params/$param3' + | '/params/$param30' + | '/params/$param31' + | '/params/$param32' + | '/params/$param33' + | '/params/$param34' + | '/params/$param35' + | '/params/$param36' + | '/params/$param37' + | '/params/$param38' + | '/params/$param39' + | '/params/$param4' + | '/params/$param40' + | '/params/$param41' + | '/params/$param42' + | '/params/$param43' + | '/params/$param44' + | '/params/$param45' + | '/params/$param46' + | '/params/$param47' + | '/params/$param48' + | '/params/$param49' + | '/params/$param5' + | '/params/$param50' + | '/params/$param51' + | '/params/$param52' + | '/params/$param53' + | '/params/$param54' + | '/params/$param55' + | '/params/$param56' + | '/params/$param57' + | '/params/$param58' + | '/params/$param59' + | '/params/$param6' + | '/params/$param60' + | '/params/$param61' + | '/params/$param62' + | '/params/$param63' + | '/params/$param64' + | '/params/$param65' + | '/params/$param66' + | '/params/$param67' + | '/params/$param68' + | '/params/$param69' + | '/params/$param7' + | '/params/$param70' + | '/params/$param71' + | '/params/$param72' + | '/params/$param73' + | '/params/$param74' + | '/params/$param75' + | '/params/$param76' + | '/params/$param77' + | '/params/$param78' + | '/params/$param79' + | '/params/$param8' + | '/params/$param80' + | '/params/$param81' + | '/params/$param82' + | '/params/$param83' + | '/params/$param84' + | '/params/$param85' + | '/params/$param86' + | '/params/$param87' + | '/params/$param88' + | '/params/$param89' + | '/params/$param9' + | '/params/$param90' + | '/params/$param91' + | '/params/$param92' + | '/params/$param93' + | '/params/$param94' + | '/params/$param95' + | '/params/$param96' + | '/params/$param97' + | '/params/$param98' + | '/params/$param99' + | '/search/search0' + | '/search/search1' + | '/search/search10' + | '/search/search11' + | '/search/search12' + | '/search/search13' + | '/search/search14' + | '/search/search15' + | '/search/search16' + | '/search/search17' + | '/search/search18' + | '/search/search19' + | '/search/search2' + | '/search/search20' + | '/search/search21' + | '/search/search22' + | '/search/search23' + | '/search/search24' + | '/search/search25' + | '/search/search26' + | '/search/search27' + | '/search/search28' + | '/search/search29' + | '/search/search3' + | '/search/search30' + | '/search/search31' + | '/search/search32' + | '/search/search33' + | '/search/search34' + | '/search/search35' + | '/search/search36' + | '/search/search37' + | '/search/search38' + | '/search/search39' + | '/search/search4' + | '/search/search40' + | '/search/search41' + | '/search/search42' + | '/search/search43' + | '/search/search44' + | '/search/search45' + | '/search/search46' + | '/search/search47' + | '/search/search48' + | '/search/search49' + | '/search/search5' + | '/search/search50' + | '/search/search51' + | '/search/search52' + | '/search/search53' + | '/search/search54' + | '/search/search55' + | '/search/search56' + | '/search/search57' + | '/search/search58' + | '/search/search59' + | '/search/search6' + | '/search/search60' + | '/search/search61' + | '/search/search62' + | '/search/search63' + | '/search/search64' + | '/search/search65' + | '/search/search66' + | '/search/search67' + | '/search/search68' + | '/search/search69' + | '/search/search7' + | '/search/search70' + | '/search/search71' + | '/search/search72' + | '/search/search73' + | '/search/search74' + | '/search/search75' + | '/search/search76' + | '/search/search77' + | '/search/search78' + | '/search/search79' + | '/search/search8' + | '/search/search80' + | '/search/search81' + | '/search/search82' + | '/search/search83' + | '/search/search84' + | '/search/search85' + | '/search/search86' + | '/search/search87' + | '/search/search88' + | '/search/search89' + | '/search/search9' + | '/search/search90' + | '/search/search91' + | '/search/search92' + | '/search/search93' + | '/search/search94' + | '/search/search95' + | '/search/search96' + | '/search/search97' + | '/search/search98' + | '/search/search99' + id: + | '__root__' + | '/' + | '/params' + | '/search' + | '/absolute' + | '/linkProps' + | '/relative' + | '/absolute0' + | '/absolute1' + | '/absolute10' + | '/absolute11' + | '/absolute12' + | '/absolute13' + | '/absolute14' + | '/absolute15' + | '/absolute16' + | '/absolute17' + | '/absolute18' + | '/absolute19' + | '/absolute2' + | '/absolute20' + | '/absolute21' + | '/absolute22' + | '/absolute23' + | '/absolute24' + | '/absolute25' + | '/absolute26' + | '/absolute27' + | '/absolute28' + | '/absolute29' + | '/absolute3' + | '/absolute30' + | '/absolute31' + | '/absolute32' + | '/absolute33' + | '/absolute34' + | '/absolute35' + | '/absolute36' + | '/absolute37' + | '/absolute38' + | '/absolute39' + | '/absolute4' + | '/absolute40' + | '/absolute41' + | '/absolute42' + | '/absolute43' + | '/absolute44' + | '/absolute45' + | '/absolute46' + | '/absolute47' + | '/absolute48' + | '/absolute49' + | '/absolute5' + | '/absolute50' + | '/absolute51' + | '/absolute52' + | '/absolute53' + | '/absolute54' + | '/absolute55' + | '/absolute56' + | '/absolute57' + | '/absolute58' + | '/absolute59' + | '/absolute6' + | '/absolute60' + | '/absolute61' + | '/absolute62' + | '/absolute63' + | '/absolute64' + | '/absolute65' + | '/absolute66' + | '/absolute67' + | '/absolute68' + | '/absolute69' + | '/absolute7' + | '/absolute70' + | '/absolute71' + | '/absolute72' + | '/absolute73' + | '/absolute74' + | '/absolute75' + | '/absolute76' + | '/absolute77' + | '/absolute78' + | '/absolute79' + | '/absolute8' + | '/absolute80' + | '/absolute81' + | '/absolute82' + | '/absolute83' + | '/absolute84' + | '/absolute85' + | '/absolute86' + | '/absolute87' + | '/absolute88' + | '/absolute89' + | '/absolute9' + | '/absolute90' + | '/absolute91' + | '/absolute92' + | '/absolute93' + | '/absolute94' + | '/absolute95' + | '/absolute96' + | '/absolute97' + | '/absolute98' + | '/absolute99' + | '/relative0' + | '/relative1' + | '/relative10' + | '/relative11' + | '/relative12' + | '/relative13' + | '/relative14' + | '/relative15' + | '/relative16' + | '/relative17' + | '/relative18' + | '/relative19' + | '/relative2' + | '/relative20' + | '/relative21' + | '/relative22' + | '/relative23' + | '/relative24' + | '/relative25' + | '/relative26' + | '/relative27' + | '/relative28' + | '/relative29' + | '/relative3' + | '/relative30' + | '/relative31' + | '/relative32' + | '/relative33' + | '/relative34' + | '/relative35' + | '/relative36' + | '/relative37' + | '/relative38' + | '/relative39' + | '/relative4' + | '/relative40' + | '/relative41' + | '/relative42' + | '/relative43' + | '/relative44' + | '/relative45' + | '/relative46' + | '/relative47' + | '/relative48' + | '/relative49' + | '/relative5' + | '/relative50' + | '/relative51' + | '/relative52' + | '/relative53' + | '/relative54' + | '/relative55' + | '/relative56' + | '/relative57' + | '/relative58' + | '/relative59' + | '/relative6' + | '/relative60' + | '/relative61' + | '/relative62' + | '/relative63' + | '/relative64' + | '/relative65' + | '/relative66' + | '/relative67' + | '/relative68' + | '/relative69' + | '/relative7' + | '/relative70' + | '/relative71' + | '/relative72' + | '/relative73' + | '/relative74' + | '/relative75' + | '/relative76' + | '/relative77' + | '/relative78' + | '/relative79' + | '/relative8' + | '/relative80' + | '/relative81' + | '/relative82' + | '/relative83' + | '/relative84' + | '/relative85' + | '/relative86' + | '/relative87' + | '/relative88' + | '/relative89' + | '/relative9' + | '/relative90' + | '/relative91' + | '/relative92' + | '/relative93' + | '/relative94' + | '/relative95' + | '/relative96' + | '/relative97' + | '/relative98' + | '/relative99' + | '/params/$paramsPlaceholder' + | '/search/searchPlaceholder' + | '/params/$param0' + | '/params/$param1' + | '/params/$param10' + | '/params/$param11' + | '/params/$param12' + | '/params/$param13' + | '/params/$param14' + | '/params/$param15' + | '/params/$param16' + | '/params/$param17' + | '/params/$param18' + | '/params/$param19' + | '/params/$param2' + | '/params/$param20' + | '/params/$param21' + | '/params/$param22' + | '/params/$param23' + | '/params/$param24' + | '/params/$param25' + | '/params/$param26' + | '/params/$param27' + | '/params/$param28' + | '/params/$param29' + | '/params/$param3' + | '/params/$param30' + | '/params/$param31' + | '/params/$param32' + | '/params/$param33' + | '/params/$param34' + | '/params/$param35' + | '/params/$param36' + | '/params/$param37' + | '/params/$param38' + | '/params/$param39' + | '/params/$param4' + | '/params/$param40' + | '/params/$param41' + | '/params/$param42' + | '/params/$param43' + | '/params/$param44' + | '/params/$param45' + | '/params/$param46' + | '/params/$param47' + | '/params/$param48' + | '/params/$param49' + | '/params/$param5' + | '/params/$param50' + | '/params/$param51' + | '/params/$param52' + | '/params/$param53' + | '/params/$param54' + | '/params/$param55' + | '/params/$param56' + | '/params/$param57' + | '/params/$param58' + | '/params/$param59' + | '/params/$param6' + | '/params/$param60' + | '/params/$param61' + | '/params/$param62' + | '/params/$param63' + | '/params/$param64' + | '/params/$param65' + | '/params/$param66' + | '/params/$param67' + | '/params/$param68' + | '/params/$param69' + | '/params/$param7' + | '/params/$param70' + | '/params/$param71' + | '/params/$param72' + | '/params/$param73' + | '/params/$param74' + | '/params/$param75' + | '/params/$param76' + | '/params/$param77' + | '/params/$param78' + | '/params/$param79' + | '/params/$param8' + | '/params/$param80' + | '/params/$param81' + | '/params/$param82' + | '/params/$param83' + | '/params/$param84' + | '/params/$param85' + | '/params/$param86' + | '/params/$param87' + | '/params/$param88' + | '/params/$param89' + | '/params/$param9' + | '/params/$param90' + | '/params/$param91' + | '/params/$param92' + | '/params/$param93' + | '/params/$param94' + | '/params/$param95' + | '/params/$param96' + | '/params/$param97' + | '/params/$param98' + | '/params/$param99' + | '/search/search0' + | '/search/search1' + | '/search/search10' + | '/search/search11' + | '/search/search12' + | '/search/search13' + | '/search/search14' + | '/search/search15' + | '/search/search16' + | '/search/search17' + | '/search/search18' + | '/search/search19' + | '/search/search2' + | '/search/search20' + | '/search/search21' + | '/search/search22' + | '/search/search23' + | '/search/search24' + | '/search/search25' + | '/search/search26' + | '/search/search27' + | '/search/search28' + | '/search/search29' + | '/search/search3' + | '/search/search30' + | '/search/search31' + | '/search/search32' + | '/search/search33' + | '/search/search34' + | '/search/search35' + | '/search/search36' + | '/search/search37' + | '/search/search38' + | '/search/search39' + | '/search/search4' + | '/search/search40' + | '/search/search41' + | '/search/search42' + | '/search/search43' + | '/search/search44' + | '/search/search45' + | '/search/search46' + | '/search/search47' + | '/search/search48' + | '/search/search49' + | '/search/search5' + | '/search/search50' + | '/search/search51' + | '/search/search52' + | '/search/search53' + | '/search/search54' + | '/search/search55' + | '/search/search56' + | '/search/search57' + | '/search/search58' + | '/search/search59' + | '/search/search6' + | '/search/search60' + | '/search/search61' + | '/search/search62' + | '/search/search63' + | '/search/search64' + | '/search/search65' + | '/search/search66' + | '/search/search67' + | '/search/search68' + | '/search/search69' + | '/search/search7' + | '/search/search70' + | '/search/search71' + | '/search/search72' + | '/search/search73' + | '/search/search74' + | '/search/search75' + | '/search/search76' + | '/search/search77' + | '/search/search78' + | '/search/search79' + | '/search/search8' + | '/search/search80' + | '/search/search81' + | '/search/search82' + | '/search/search83' + | '/search/search84' + | '/search/search85' + | '/search/search86' + | '/search/search87' + | '/search/search88' + | '/search/search89' + | '/search/search9' + | '/search/search90' + | '/search/search91' + | '/search/search92' + | '/search/search93' + | '/search/search94' + | '/search/search95' + | '/search/search96' + | '/search/search97' + | '/search/search98' + | '/search/search99' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + ParamsRouteRoute: typeof ParamsRouteRouteWithChildren + SearchRouteRoute: typeof SearchRouteRouteWithChildren + AbsoluteRoute: typeof AbsoluteRoute + LinkPropsRoute: typeof LinkPropsRoute + RelativeRoute: typeof RelativeRoute + genParamsRouteRoute: typeof genParamsRouteRouteWithChildren + genSearchRouteRoute: typeof genSearchRouteRouteWithChildren + genAbsolute0Route: typeof genAbsolute0Route + genAbsolute1Route: typeof genAbsolute1Route + genAbsolute10Route: typeof genAbsolute10Route + genAbsolute11Route: typeof genAbsolute11Route + genAbsolute12Route: typeof genAbsolute12Route + genAbsolute13Route: typeof genAbsolute13Route + genAbsolute14Route: typeof genAbsolute14Route + genAbsolute15Route: typeof genAbsolute15Route + genAbsolute16Route: typeof genAbsolute16Route + genAbsolute17Route: typeof genAbsolute17Route + genAbsolute18Route: typeof genAbsolute18Route + genAbsolute19Route: typeof genAbsolute19Route + genAbsolute2Route: typeof genAbsolute2Route + genAbsolute20Route: typeof genAbsolute20Route + genAbsolute21Route: typeof genAbsolute21Route + genAbsolute22Route: typeof genAbsolute22Route + genAbsolute23Route: typeof genAbsolute23Route + genAbsolute24Route: typeof genAbsolute24Route + genAbsolute25Route: typeof genAbsolute25Route + genAbsolute26Route: typeof genAbsolute26Route + genAbsolute27Route: typeof genAbsolute27Route + genAbsolute28Route: typeof genAbsolute28Route + genAbsolute29Route: typeof genAbsolute29Route + genAbsolute3Route: typeof genAbsolute3Route + genAbsolute30Route: typeof genAbsolute30Route + genAbsolute31Route: typeof genAbsolute31Route + genAbsolute32Route: typeof genAbsolute32Route + genAbsolute33Route: typeof genAbsolute33Route + genAbsolute34Route: typeof genAbsolute34Route + genAbsolute35Route: typeof genAbsolute35Route + genAbsolute36Route: typeof genAbsolute36Route + genAbsolute37Route: typeof genAbsolute37Route + genAbsolute38Route: typeof genAbsolute38Route + genAbsolute39Route: typeof genAbsolute39Route + genAbsolute4Route: typeof genAbsolute4Route + genAbsolute40Route: typeof genAbsolute40Route + genAbsolute41Route: typeof genAbsolute41Route + genAbsolute42Route: typeof genAbsolute42Route + genAbsolute43Route: typeof genAbsolute43Route + genAbsolute44Route: typeof genAbsolute44Route + genAbsolute45Route: typeof genAbsolute45Route + genAbsolute46Route: typeof genAbsolute46Route + genAbsolute47Route: typeof genAbsolute47Route + genAbsolute48Route: typeof genAbsolute48Route + genAbsolute49Route: typeof genAbsolute49Route + genAbsolute5Route: typeof genAbsolute5Route + genAbsolute50Route: typeof genAbsolute50Route + genAbsolute51Route: typeof genAbsolute51Route + genAbsolute52Route: typeof genAbsolute52Route + genAbsolute53Route: typeof genAbsolute53Route + genAbsolute54Route: typeof genAbsolute54Route + genAbsolute55Route: typeof genAbsolute55Route + genAbsolute56Route: typeof genAbsolute56Route + genAbsolute57Route: typeof genAbsolute57Route + genAbsolute58Route: typeof genAbsolute58Route + genAbsolute59Route: typeof genAbsolute59Route + genAbsolute6Route: typeof genAbsolute6Route + genAbsolute60Route: typeof genAbsolute60Route + genAbsolute61Route: typeof genAbsolute61Route + genAbsolute62Route: typeof genAbsolute62Route + genAbsolute63Route: typeof genAbsolute63Route + genAbsolute64Route: typeof genAbsolute64Route + genAbsolute65Route: typeof genAbsolute65Route + genAbsolute66Route: typeof genAbsolute66Route + genAbsolute67Route: typeof genAbsolute67Route + genAbsolute68Route: typeof genAbsolute68Route + genAbsolute69Route: typeof genAbsolute69Route + genAbsolute7Route: typeof genAbsolute7Route + genAbsolute70Route: typeof genAbsolute70Route + genAbsolute71Route: typeof genAbsolute71Route + genAbsolute72Route: typeof genAbsolute72Route + genAbsolute73Route: typeof genAbsolute73Route + genAbsolute74Route: typeof genAbsolute74Route + genAbsolute75Route: typeof genAbsolute75Route + genAbsolute76Route: typeof genAbsolute76Route + genAbsolute77Route: typeof genAbsolute77Route + genAbsolute78Route: typeof genAbsolute78Route + genAbsolute79Route: typeof genAbsolute79Route + genAbsolute8Route: typeof genAbsolute8Route + genAbsolute80Route: typeof genAbsolute80Route + genAbsolute81Route: typeof genAbsolute81Route + genAbsolute82Route: typeof genAbsolute82Route + genAbsolute83Route: typeof genAbsolute83Route + genAbsolute84Route: typeof genAbsolute84Route + genAbsolute85Route: typeof genAbsolute85Route + genAbsolute86Route: typeof genAbsolute86Route + genAbsolute87Route: typeof genAbsolute87Route + genAbsolute88Route: typeof genAbsolute88Route + genAbsolute89Route: typeof genAbsolute89Route + genAbsolute9Route: typeof genAbsolute9Route + genAbsolute90Route: typeof genAbsolute90Route + genAbsolute91Route: typeof genAbsolute91Route + genAbsolute92Route: typeof genAbsolute92Route + genAbsolute93Route: typeof genAbsolute93Route + genAbsolute94Route: typeof genAbsolute94Route + genAbsolute95Route: typeof genAbsolute95Route + genAbsolute96Route: typeof genAbsolute96Route + genAbsolute97Route: typeof genAbsolute97Route + genAbsolute98Route: typeof genAbsolute98Route + genAbsolute99Route: typeof genAbsolute99Route + genRelative0Route: typeof genRelative0Route + genRelative1Route: typeof genRelative1Route + genRelative10Route: typeof genRelative10Route + genRelative11Route: typeof genRelative11Route + genRelative12Route: typeof genRelative12Route + genRelative13Route: typeof genRelative13Route + genRelative14Route: typeof genRelative14Route + genRelative15Route: typeof genRelative15Route + genRelative16Route: typeof genRelative16Route + genRelative17Route: typeof genRelative17Route + genRelative18Route: typeof genRelative18Route + genRelative19Route: typeof genRelative19Route + genRelative2Route: typeof genRelative2Route + genRelative20Route: typeof genRelative20Route + genRelative21Route: typeof genRelative21Route + genRelative22Route: typeof genRelative22Route + genRelative23Route: typeof genRelative23Route + genRelative24Route: typeof genRelative24Route + genRelative25Route: typeof genRelative25Route + genRelative26Route: typeof genRelative26Route + genRelative27Route: typeof genRelative27Route + genRelative28Route: typeof genRelative28Route + genRelative29Route: typeof genRelative29Route + genRelative3Route: typeof genRelative3Route + genRelative30Route: typeof genRelative30Route + genRelative31Route: typeof genRelative31Route + genRelative32Route: typeof genRelative32Route + genRelative33Route: typeof genRelative33Route + genRelative34Route: typeof genRelative34Route + genRelative35Route: typeof genRelative35Route + genRelative36Route: typeof genRelative36Route + genRelative37Route: typeof genRelative37Route + genRelative38Route: typeof genRelative38Route + genRelative39Route: typeof genRelative39Route + genRelative4Route: typeof genRelative4Route + genRelative40Route: typeof genRelative40Route + genRelative41Route: typeof genRelative41Route + genRelative42Route: typeof genRelative42Route + genRelative43Route: typeof genRelative43Route + genRelative44Route: typeof genRelative44Route + genRelative45Route: typeof genRelative45Route + genRelative46Route: typeof genRelative46Route + genRelative47Route: typeof genRelative47Route + genRelative48Route: typeof genRelative48Route + genRelative49Route: typeof genRelative49Route + genRelative5Route: typeof genRelative5Route + genRelative50Route: typeof genRelative50Route + genRelative51Route: typeof genRelative51Route + genRelative52Route: typeof genRelative52Route + genRelative53Route: typeof genRelative53Route + genRelative54Route: typeof genRelative54Route + genRelative55Route: typeof genRelative55Route + genRelative56Route: typeof genRelative56Route + genRelative57Route: typeof genRelative57Route + genRelative58Route: typeof genRelative58Route + genRelative59Route: typeof genRelative59Route + genRelative6Route: typeof genRelative6Route + genRelative60Route: typeof genRelative60Route + genRelative61Route: typeof genRelative61Route + genRelative62Route: typeof genRelative62Route + genRelative63Route: typeof genRelative63Route + genRelative64Route: typeof genRelative64Route + genRelative65Route: typeof genRelative65Route + genRelative66Route: typeof genRelative66Route + genRelative67Route: typeof genRelative67Route + genRelative68Route: typeof genRelative68Route + genRelative69Route: typeof genRelative69Route + genRelative7Route: typeof genRelative7Route + genRelative70Route: typeof genRelative70Route + genRelative71Route: typeof genRelative71Route + genRelative72Route: typeof genRelative72Route + genRelative73Route: typeof genRelative73Route + genRelative74Route: typeof genRelative74Route + genRelative75Route: typeof genRelative75Route + genRelative76Route: typeof genRelative76Route + genRelative77Route: typeof genRelative77Route + genRelative78Route: typeof genRelative78Route + genRelative79Route: typeof genRelative79Route + genRelative8Route: typeof genRelative8Route + genRelative80Route: typeof genRelative80Route + genRelative81Route: typeof genRelative81Route + genRelative82Route: typeof genRelative82Route + genRelative83Route: typeof genRelative83Route + genRelative84Route: typeof genRelative84Route + genRelative85Route: typeof genRelative85Route + genRelative86Route: typeof genRelative86Route + genRelative87Route: typeof genRelative87Route + genRelative88Route: typeof genRelative88Route + genRelative89Route: typeof genRelative89Route + genRelative9Route: typeof genRelative9Route + genRelative90Route: typeof genRelative90Route + genRelative91Route: typeof genRelative91Route + genRelative92Route: typeof genRelative92Route + genRelative93Route: typeof genRelative93Route + genRelative94Route: typeof genRelative94Route + genRelative95Route: typeof genRelative95Route + genRelative96Route: typeof genRelative96Route + genRelative97Route: typeof genRelative97Route + genRelative98Route: typeof genRelative98Route + genRelative99Route: typeof genRelative99Route +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + ParamsRouteRoute: ParamsRouteRouteWithChildren, + SearchRouteRoute: SearchRouteRouteWithChildren, + AbsoluteRoute: AbsoluteRoute, + LinkPropsRoute: LinkPropsRoute, + RelativeRoute: RelativeRoute, + genParamsRouteRoute: genParamsRouteRouteWithChildren, + genSearchRouteRoute: genSearchRouteRouteWithChildren, + genAbsolute0Route: genAbsolute0Route, + genAbsolute1Route: genAbsolute1Route, + genAbsolute10Route: genAbsolute10Route, + genAbsolute11Route: genAbsolute11Route, + genAbsolute12Route: genAbsolute12Route, + genAbsolute13Route: genAbsolute13Route, + genAbsolute14Route: genAbsolute14Route, + genAbsolute15Route: genAbsolute15Route, + genAbsolute16Route: genAbsolute16Route, + genAbsolute17Route: genAbsolute17Route, + genAbsolute18Route: genAbsolute18Route, + genAbsolute19Route: genAbsolute19Route, + genAbsolute2Route: genAbsolute2Route, + genAbsolute20Route: genAbsolute20Route, + genAbsolute21Route: genAbsolute21Route, + genAbsolute22Route: genAbsolute22Route, + genAbsolute23Route: genAbsolute23Route, + genAbsolute24Route: genAbsolute24Route, + genAbsolute25Route: genAbsolute25Route, + genAbsolute26Route: genAbsolute26Route, + genAbsolute27Route: genAbsolute27Route, + genAbsolute28Route: genAbsolute28Route, + genAbsolute29Route: genAbsolute29Route, + genAbsolute3Route: genAbsolute3Route, + genAbsolute30Route: genAbsolute30Route, + genAbsolute31Route: genAbsolute31Route, + genAbsolute32Route: genAbsolute32Route, + genAbsolute33Route: genAbsolute33Route, + genAbsolute34Route: genAbsolute34Route, + genAbsolute35Route: genAbsolute35Route, + genAbsolute36Route: genAbsolute36Route, + genAbsolute37Route: genAbsolute37Route, + genAbsolute38Route: genAbsolute38Route, + genAbsolute39Route: genAbsolute39Route, + genAbsolute4Route: genAbsolute4Route, + genAbsolute40Route: genAbsolute40Route, + genAbsolute41Route: genAbsolute41Route, + genAbsolute42Route: genAbsolute42Route, + genAbsolute43Route: genAbsolute43Route, + genAbsolute44Route: genAbsolute44Route, + genAbsolute45Route: genAbsolute45Route, + genAbsolute46Route: genAbsolute46Route, + genAbsolute47Route: genAbsolute47Route, + genAbsolute48Route: genAbsolute48Route, + genAbsolute49Route: genAbsolute49Route, + genAbsolute5Route: genAbsolute5Route, + genAbsolute50Route: genAbsolute50Route, + genAbsolute51Route: genAbsolute51Route, + genAbsolute52Route: genAbsolute52Route, + genAbsolute53Route: genAbsolute53Route, + genAbsolute54Route: genAbsolute54Route, + genAbsolute55Route: genAbsolute55Route, + genAbsolute56Route: genAbsolute56Route, + genAbsolute57Route: genAbsolute57Route, + genAbsolute58Route: genAbsolute58Route, + genAbsolute59Route: genAbsolute59Route, + genAbsolute6Route: genAbsolute6Route, + genAbsolute60Route: genAbsolute60Route, + genAbsolute61Route: genAbsolute61Route, + genAbsolute62Route: genAbsolute62Route, + genAbsolute63Route: genAbsolute63Route, + genAbsolute64Route: genAbsolute64Route, + genAbsolute65Route: genAbsolute65Route, + genAbsolute66Route: genAbsolute66Route, + genAbsolute67Route: genAbsolute67Route, + genAbsolute68Route: genAbsolute68Route, + genAbsolute69Route: genAbsolute69Route, + genAbsolute7Route: genAbsolute7Route, + genAbsolute70Route: genAbsolute70Route, + genAbsolute71Route: genAbsolute71Route, + genAbsolute72Route: genAbsolute72Route, + genAbsolute73Route: genAbsolute73Route, + genAbsolute74Route: genAbsolute74Route, + genAbsolute75Route: genAbsolute75Route, + genAbsolute76Route: genAbsolute76Route, + genAbsolute77Route: genAbsolute77Route, + genAbsolute78Route: genAbsolute78Route, + genAbsolute79Route: genAbsolute79Route, + genAbsolute8Route: genAbsolute8Route, + genAbsolute80Route: genAbsolute80Route, + genAbsolute81Route: genAbsolute81Route, + genAbsolute82Route: genAbsolute82Route, + genAbsolute83Route: genAbsolute83Route, + genAbsolute84Route: genAbsolute84Route, + genAbsolute85Route: genAbsolute85Route, + genAbsolute86Route: genAbsolute86Route, + genAbsolute87Route: genAbsolute87Route, + genAbsolute88Route: genAbsolute88Route, + genAbsolute89Route: genAbsolute89Route, + genAbsolute9Route: genAbsolute9Route, + genAbsolute90Route: genAbsolute90Route, + genAbsolute91Route: genAbsolute91Route, + genAbsolute92Route: genAbsolute92Route, + genAbsolute93Route: genAbsolute93Route, + genAbsolute94Route: genAbsolute94Route, + genAbsolute95Route: genAbsolute95Route, + genAbsolute96Route: genAbsolute96Route, + genAbsolute97Route: genAbsolute97Route, + genAbsolute98Route: genAbsolute98Route, + genAbsolute99Route: genAbsolute99Route, + genRelative0Route: genRelative0Route, + genRelative1Route: genRelative1Route, + genRelative10Route: genRelative10Route, + genRelative11Route: genRelative11Route, + genRelative12Route: genRelative12Route, + genRelative13Route: genRelative13Route, + genRelative14Route: genRelative14Route, + genRelative15Route: genRelative15Route, + genRelative16Route: genRelative16Route, + genRelative17Route: genRelative17Route, + genRelative18Route: genRelative18Route, + genRelative19Route: genRelative19Route, + genRelative2Route: genRelative2Route, + genRelative20Route: genRelative20Route, + genRelative21Route: genRelative21Route, + genRelative22Route: genRelative22Route, + genRelative23Route: genRelative23Route, + genRelative24Route: genRelative24Route, + genRelative25Route: genRelative25Route, + genRelative26Route: genRelative26Route, + genRelative27Route: genRelative27Route, + genRelative28Route: genRelative28Route, + genRelative29Route: genRelative29Route, + genRelative3Route: genRelative3Route, + genRelative30Route: genRelative30Route, + genRelative31Route: genRelative31Route, + genRelative32Route: genRelative32Route, + genRelative33Route: genRelative33Route, + genRelative34Route: genRelative34Route, + genRelative35Route: genRelative35Route, + genRelative36Route: genRelative36Route, + genRelative37Route: genRelative37Route, + genRelative38Route: genRelative38Route, + genRelative39Route: genRelative39Route, + genRelative4Route: genRelative4Route, + genRelative40Route: genRelative40Route, + genRelative41Route: genRelative41Route, + genRelative42Route: genRelative42Route, + genRelative43Route: genRelative43Route, + genRelative44Route: genRelative44Route, + genRelative45Route: genRelative45Route, + genRelative46Route: genRelative46Route, + genRelative47Route: genRelative47Route, + genRelative48Route: genRelative48Route, + genRelative49Route: genRelative49Route, + genRelative5Route: genRelative5Route, + genRelative50Route: genRelative50Route, + genRelative51Route: genRelative51Route, + genRelative52Route: genRelative52Route, + genRelative53Route: genRelative53Route, + genRelative54Route: genRelative54Route, + genRelative55Route: genRelative55Route, + genRelative56Route: genRelative56Route, + genRelative57Route: genRelative57Route, + genRelative58Route: genRelative58Route, + genRelative59Route: genRelative59Route, + genRelative6Route: genRelative6Route, + genRelative60Route: genRelative60Route, + genRelative61Route: genRelative61Route, + genRelative62Route: genRelative62Route, + genRelative63Route: genRelative63Route, + genRelative64Route: genRelative64Route, + genRelative65Route: genRelative65Route, + genRelative66Route: genRelative66Route, + genRelative67Route: genRelative67Route, + genRelative68Route: genRelative68Route, + genRelative69Route: genRelative69Route, + genRelative7Route: genRelative7Route, + genRelative70Route: genRelative70Route, + genRelative71Route: genRelative71Route, + genRelative72Route: genRelative72Route, + genRelative73Route: genRelative73Route, + genRelative74Route: genRelative74Route, + genRelative75Route: genRelative75Route, + genRelative76Route: genRelative76Route, + genRelative77Route: genRelative77Route, + genRelative78Route: genRelative78Route, + genRelative79Route: genRelative79Route, + genRelative8Route: genRelative8Route, + genRelative80Route: genRelative80Route, + genRelative81Route: genRelative81Route, + genRelative82Route: genRelative82Route, + genRelative83Route: genRelative83Route, + genRelative84Route: genRelative84Route, + genRelative85Route: genRelative85Route, + genRelative86Route: genRelative86Route, + genRelative87Route: genRelative87Route, + genRelative88Route: genRelative88Route, + genRelative89Route: genRelative89Route, + genRelative9Route: genRelative9Route, + genRelative90Route: genRelative90Route, + genRelative91Route: genRelative91Route, + genRelative92Route: genRelative92Route, + genRelative93Route: genRelative93Route, + genRelative94Route: genRelative94Route, + genRelative95Route: genRelative95Route, + genRelative96Route: genRelative96Route, + genRelative97Route: genRelative97Route, + genRelative98Route: genRelative98Route, + genRelative99Route: genRelative99Route, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [ + "/", + "/params", + "/search", + "/absolute", + "/linkProps", + "/relative", + "/params", + "/search", + "/absolute0", + "/absolute1", + "/absolute10", + "/absolute11", + "/absolute12", + "/absolute13", + "/absolute14", + "/absolute15", + "/absolute16", + "/absolute17", + "/absolute18", + "/absolute19", + "/absolute2", + "/absolute20", + "/absolute21", + "/absolute22", + "/absolute23", + "/absolute24", + "/absolute25", + "/absolute26", + "/absolute27", + "/absolute28", + "/absolute29", + "/absolute3", + "/absolute30", + "/absolute31", + "/absolute32", + "/absolute33", + "/absolute34", + "/absolute35", + "/absolute36", + "/absolute37", + "/absolute38", + "/absolute39", + "/absolute4", + "/absolute40", + "/absolute41", + "/absolute42", + "/absolute43", + "/absolute44", + "/absolute45", + "/absolute46", + "/absolute47", + "/absolute48", + "/absolute49", + "/absolute5", + "/absolute50", + "/absolute51", + "/absolute52", + "/absolute53", + "/absolute54", + "/absolute55", + "/absolute56", + "/absolute57", + "/absolute58", + "/absolute59", + "/absolute6", + "/absolute60", + "/absolute61", + "/absolute62", + "/absolute63", + "/absolute64", + "/absolute65", + "/absolute66", + "/absolute67", + "/absolute68", + "/absolute69", + "/absolute7", + "/absolute70", + "/absolute71", + "/absolute72", + "/absolute73", + "/absolute74", + "/absolute75", + "/absolute76", + "/absolute77", + "/absolute78", + "/absolute79", + "/absolute8", + "/absolute80", + "/absolute81", + "/absolute82", + "/absolute83", + "/absolute84", + "/absolute85", + "/absolute86", + "/absolute87", + "/absolute88", + "/absolute89", + "/absolute9", + "/absolute90", + "/absolute91", + "/absolute92", + "/absolute93", + "/absolute94", + "/absolute95", + "/absolute96", + "/absolute97", + "/absolute98", + "/absolute99", + "/relative0", + "/relative1", + "/relative10", + "/relative11", + "/relative12", + "/relative13", + "/relative14", + "/relative15", + "/relative16", + "/relative17", + "/relative18", + "/relative19", + "/relative2", + "/relative20", + "/relative21", + "/relative22", + "/relative23", + "/relative24", + "/relative25", + "/relative26", + "/relative27", + "/relative28", + "/relative29", + "/relative3", + "/relative30", + "/relative31", + "/relative32", + "/relative33", + "/relative34", + "/relative35", + "/relative36", + "/relative37", + "/relative38", + "/relative39", + "/relative4", + "/relative40", + "/relative41", + "/relative42", + "/relative43", + "/relative44", + "/relative45", + "/relative46", + "/relative47", + "/relative48", + "/relative49", + "/relative5", + "/relative50", + "/relative51", + "/relative52", + "/relative53", + "/relative54", + "/relative55", + "/relative56", + "/relative57", + "/relative58", + "/relative59", + "/relative6", + "/relative60", + "/relative61", + "/relative62", + "/relative63", + "/relative64", + "/relative65", + "/relative66", + "/relative67", + "/relative68", + "/relative69", + "/relative7", + "/relative70", + "/relative71", + "/relative72", + "/relative73", + "/relative74", + "/relative75", + "/relative76", + "/relative77", + "/relative78", + "/relative79", + "/relative8", + "/relative80", + "/relative81", + "/relative82", + "/relative83", + "/relative84", + "/relative85", + "/relative86", + "/relative87", + "/relative88", + "/relative89", + "/relative9", + "/relative90", + "/relative91", + "/relative92", + "/relative93", + "/relative94", + "/relative95", + "/relative96", + "/relative97", + "/relative98", + "/relative99" + ] + }, + "/": { + "filePath": "index.tsx" + }, + "/params": { + "filePath": "(gen)/params/route.tsx", + "children": [ + "/params/$param0", + "/params/$param1", + "/params/$param10", + "/params/$param11", + "/params/$param12", + "/params/$param13", + "/params/$param14", + "/params/$param15", + "/params/$param16", + "/params/$param17", + "/params/$param18", + "/params/$param19", + "/params/$param2", + "/params/$param20", + "/params/$param21", + "/params/$param22", + "/params/$param23", + "/params/$param24", + "/params/$param25", + "/params/$param26", + "/params/$param27", + "/params/$param28", + "/params/$param29", + "/params/$param3", + "/params/$param30", + "/params/$param31", + "/params/$param32", + "/params/$param33", + "/params/$param34", + "/params/$param35", + "/params/$param36", + "/params/$param37", + "/params/$param38", + "/params/$param39", + "/params/$param4", + "/params/$param40", + "/params/$param41", + "/params/$param42", + "/params/$param43", + "/params/$param44", + "/params/$param45", + "/params/$param46", + "/params/$param47", + "/params/$param48", + "/params/$param49", + "/params/$param5", + "/params/$param50", + "/params/$param51", + "/params/$param52", + "/params/$param53", + "/params/$param54", + "/params/$param55", + "/params/$param56", + "/params/$param57", + "/params/$param58", + "/params/$param59", + "/params/$param6", + "/params/$param60", + "/params/$param61", + "/params/$param62", + "/params/$param63", + "/params/$param64", + "/params/$param65", + "/params/$param66", + "/params/$param67", + "/params/$param68", + "/params/$param69", + "/params/$param7", + "/params/$param70", + "/params/$param71", + "/params/$param72", + "/params/$param73", + "/params/$param74", + "/params/$param75", + "/params/$param76", + "/params/$param77", + "/params/$param78", + "/params/$param79", + "/params/$param8", + "/params/$param80", + "/params/$param81", + "/params/$param82", + "/params/$param83", + "/params/$param84", + "/params/$param85", + "/params/$param86", + "/params/$param87", + "/params/$param88", + "/params/$param89", + "/params/$param9", + "/params/$param90", + "/params/$param91", + "/params/$param92", + "/params/$param93", + "/params/$param94", + "/params/$param95", + "/params/$param96", + "/params/$param97", + "/params/$param98", + "/params/$param99" + ] + }, + "/search": { + "filePath": "(gen)/search/route.tsx", + "children": [ + "/search/search0", + "/search/search1", + "/search/search10", + "/search/search11", + "/search/search12", + "/search/search13", + "/search/search14", + "/search/search15", + "/search/search16", + "/search/search17", + "/search/search18", + "/search/search19", + "/search/search2", + "/search/search20", + "/search/search21", + "/search/search22", + "/search/search23", + "/search/search24", + "/search/search25", + "/search/search26", + "/search/search27", + "/search/search28", + "/search/search29", + "/search/search3", + "/search/search30", + "/search/search31", + "/search/search32", + "/search/search33", + "/search/search34", + "/search/search35", + "/search/search36", + "/search/search37", + "/search/search38", + "/search/search39", + "/search/search4", + "/search/search40", + "/search/search41", + "/search/search42", + "/search/search43", + "/search/search44", + "/search/search45", + "/search/search46", + "/search/search47", + "/search/search48", + "/search/search49", + "/search/search5", + "/search/search50", + "/search/search51", + "/search/search52", + "/search/search53", + "/search/search54", + "/search/search55", + "/search/search56", + "/search/search57", + "/search/search58", + "/search/search59", + "/search/search6", + "/search/search60", + "/search/search61", + "/search/search62", + "/search/search63", + "/search/search64", + "/search/search65", + "/search/search66", + "/search/search67", + "/search/search68", + "/search/search69", + "/search/search7", + "/search/search70", + "/search/search71", + "/search/search72", + "/search/search73", + "/search/search74", + "/search/search75", + "/search/search76", + "/search/search77", + "/search/search78", + "/search/search79", + "/search/search8", + "/search/search80", + "/search/search81", + "/search/search82", + "/search/search83", + "/search/search84", + "/search/search85", + "/search/search86", + "/search/search87", + "/search/search88", + "/search/search89", + "/search/search9", + "/search/search90", + "/search/search91", + "/search/search92", + "/search/search93", + "/search/search94", + "/search/search95", + "/search/search96", + "/search/search97", + "/search/search98", + "/search/search99" + ] + }, + "/absolute": { + "filePath": "absolute.tsx" + }, + "/linkProps": { + "filePath": "linkProps.tsx" + }, + "/relative": { + "filePath": "relative.tsx" + }, + "/absolute0": { + "filePath": "(gen)/absolute0.tsx" + }, + "/absolute1": { + "filePath": "(gen)/absolute1.tsx" + }, + "/absolute10": { + "filePath": "(gen)/absolute10.tsx" + }, + "/absolute11": { + "filePath": "(gen)/absolute11.tsx" + }, + "/absolute12": { + "filePath": "(gen)/absolute12.tsx" + }, + "/absolute13": { + "filePath": "(gen)/absolute13.tsx" + }, + "/absolute14": { + "filePath": "(gen)/absolute14.tsx" + }, + "/absolute15": { + "filePath": "(gen)/absolute15.tsx" + }, + "/absolute16": { + "filePath": "(gen)/absolute16.tsx" + }, + "/absolute17": { + "filePath": "(gen)/absolute17.tsx" + }, + "/absolute18": { + "filePath": "(gen)/absolute18.tsx" + }, + "/absolute19": { + "filePath": "(gen)/absolute19.tsx" + }, + "/absolute2": { + "filePath": "(gen)/absolute2.tsx" + }, + "/absolute20": { + "filePath": "(gen)/absolute20.tsx" + }, + "/absolute21": { + "filePath": "(gen)/absolute21.tsx" + }, + "/absolute22": { + "filePath": "(gen)/absolute22.tsx" + }, + "/absolute23": { + "filePath": "(gen)/absolute23.tsx" + }, + "/absolute24": { + "filePath": "(gen)/absolute24.tsx" + }, + "/absolute25": { + "filePath": "(gen)/absolute25.tsx" + }, + "/absolute26": { + "filePath": "(gen)/absolute26.tsx" + }, + "/absolute27": { + "filePath": "(gen)/absolute27.tsx" + }, + "/absolute28": { + "filePath": "(gen)/absolute28.tsx" + }, + "/absolute29": { + "filePath": "(gen)/absolute29.tsx" + }, + "/absolute3": { + "filePath": "(gen)/absolute3.tsx" + }, + "/absolute30": { + "filePath": "(gen)/absolute30.tsx" + }, + "/absolute31": { + "filePath": "(gen)/absolute31.tsx" + }, + "/absolute32": { + "filePath": "(gen)/absolute32.tsx" + }, + "/absolute33": { + "filePath": "(gen)/absolute33.tsx" + }, + "/absolute34": { + "filePath": "(gen)/absolute34.tsx" + }, + "/absolute35": { + "filePath": "(gen)/absolute35.tsx" + }, + "/absolute36": { + "filePath": "(gen)/absolute36.tsx" + }, + "/absolute37": { + "filePath": "(gen)/absolute37.tsx" + }, + "/absolute38": { + "filePath": "(gen)/absolute38.tsx" + }, + "/absolute39": { + "filePath": "(gen)/absolute39.tsx" + }, + "/absolute4": { + "filePath": "(gen)/absolute4.tsx" + }, + "/absolute40": { + "filePath": "(gen)/absolute40.tsx" + }, + "/absolute41": { + "filePath": "(gen)/absolute41.tsx" + }, + "/absolute42": { + "filePath": "(gen)/absolute42.tsx" + }, + "/absolute43": { + "filePath": "(gen)/absolute43.tsx" + }, + "/absolute44": { + "filePath": "(gen)/absolute44.tsx" + }, + "/absolute45": { + "filePath": "(gen)/absolute45.tsx" + }, + "/absolute46": { + "filePath": "(gen)/absolute46.tsx" + }, + "/absolute47": { + "filePath": "(gen)/absolute47.tsx" + }, + "/absolute48": { + "filePath": "(gen)/absolute48.tsx" + }, + "/absolute49": { + "filePath": "(gen)/absolute49.tsx" + }, + "/absolute5": { + "filePath": "(gen)/absolute5.tsx" + }, + "/absolute50": { + "filePath": "(gen)/absolute50.tsx" + }, + "/absolute51": { + "filePath": "(gen)/absolute51.tsx" + }, + "/absolute52": { + "filePath": "(gen)/absolute52.tsx" + }, + "/absolute53": { + "filePath": "(gen)/absolute53.tsx" + }, + "/absolute54": { + "filePath": "(gen)/absolute54.tsx" + }, + "/absolute55": { + "filePath": "(gen)/absolute55.tsx" + }, + "/absolute56": { + "filePath": "(gen)/absolute56.tsx" + }, + "/absolute57": { + "filePath": "(gen)/absolute57.tsx" + }, + "/absolute58": { + "filePath": "(gen)/absolute58.tsx" + }, + "/absolute59": { + "filePath": "(gen)/absolute59.tsx" + }, + "/absolute6": { + "filePath": "(gen)/absolute6.tsx" + }, + "/absolute60": { + "filePath": "(gen)/absolute60.tsx" + }, + "/absolute61": { + "filePath": "(gen)/absolute61.tsx" + }, + "/absolute62": { + "filePath": "(gen)/absolute62.tsx" + }, + "/absolute63": { + "filePath": "(gen)/absolute63.tsx" + }, + "/absolute64": { + "filePath": "(gen)/absolute64.tsx" + }, + "/absolute65": { + "filePath": "(gen)/absolute65.tsx" + }, + "/absolute66": { + "filePath": "(gen)/absolute66.tsx" + }, + "/absolute67": { + "filePath": "(gen)/absolute67.tsx" + }, + "/absolute68": { + "filePath": "(gen)/absolute68.tsx" + }, + "/absolute69": { + "filePath": "(gen)/absolute69.tsx" + }, + "/absolute7": { + "filePath": "(gen)/absolute7.tsx" + }, + "/absolute70": { + "filePath": "(gen)/absolute70.tsx" + }, + "/absolute71": { + "filePath": "(gen)/absolute71.tsx" + }, + "/absolute72": { + "filePath": "(gen)/absolute72.tsx" + }, + "/absolute73": { + "filePath": "(gen)/absolute73.tsx" + }, + "/absolute74": { + "filePath": "(gen)/absolute74.tsx" + }, + "/absolute75": { + "filePath": "(gen)/absolute75.tsx" + }, + "/absolute76": { + "filePath": "(gen)/absolute76.tsx" + }, + "/absolute77": { + "filePath": "(gen)/absolute77.tsx" + }, + "/absolute78": { + "filePath": "(gen)/absolute78.tsx" + }, + "/absolute79": { + "filePath": "(gen)/absolute79.tsx" + }, + "/absolute8": { + "filePath": "(gen)/absolute8.tsx" + }, + "/absolute80": { + "filePath": "(gen)/absolute80.tsx" + }, + "/absolute81": { + "filePath": "(gen)/absolute81.tsx" + }, + "/absolute82": { + "filePath": "(gen)/absolute82.tsx" + }, + "/absolute83": { + "filePath": "(gen)/absolute83.tsx" + }, + "/absolute84": { + "filePath": "(gen)/absolute84.tsx" + }, + "/absolute85": { + "filePath": "(gen)/absolute85.tsx" + }, + "/absolute86": { + "filePath": "(gen)/absolute86.tsx" + }, + "/absolute87": { + "filePath": "(gen)/absolute87.tsx" + }, + "/absolute88": { + "filePath": "(gen)/absolute88.tsx" + }, + "/absolute89": { + "filePath": "(gen)/absolute89.tsx" + }, + "/absolute9": { + "filePath": "(gen)/absolute9.tsx" + }, + "/absolute90": { + "filePath": "(gen)/absolute90.tsx" + }, + "/absolute91": { + "filePath": "(gen)/absolute91.tsx" + }, + "/absolute92": { + "filePath": "(gen)/absolute92.tsx" + }, + "/absolute93": { + "filePath": "(gen)/absolute93.tsx" + }, + "/absolute94": { + "filePath": "(gen)/absolute94.tsx" + }, + "/absolute95": { + "filePath": "(gen)/absolute95.tsx" + }, + "/absolute96": { + "filePath": "(gen)/absolute96.tsx" + }, + "/absolute97": { + "filePath": "(gen)/absolute97.tsx" + }, + "/absolute98": { + "filePath": "(gen)/absolute98.tsx" + }, + "/absolute99": { + "filePath": "(gen)/absolute99.tsx" + }, + "/relative0": { + "filePath": "(gen)/relative0.tsx" + }, + "/relative1": { + "filePath": "(gen)/relative1.tsx" + }, + "/relative10": { + "filePath": "(gen)/relative10.tsx" + }, + "/relative11": { + "filePath": "(gen)/relative11.tsx" + }, + "/relative12": { + "filePath": "(gen)/relative12.tsx" + }, + "/relative13": { + "filePath": "(gen)/relative13.tsx" + }, + "/relative14": { + "filePath": "(gen)/relative14.tsx" + }, + "/relative15": { + "filePath": "(gen)/relative15.tsx" + }, + "/relative16": { + "filePath": "(gen)/relative16.tsx" + }, + "/relative17": { + "filePath": "(gen)/relative17.tsx" + }, + "/relative18": { + "filePath": "(gen)/relative18.tsx" + }, + "/relative19": { + "filePath": "(gen)/relative19.tsx" + }, + "/relative2": { + "filePath": "(gen)/relative2.tsx" + }, + "/relative20": { + "filePath": "(gen)/relative20.tsx" + }, + "/relative21": { + "filePath": "(gen)/relative21.tsx" + }, + "/relative22": { + "filePath": "(gen)/relative22.tsx" + }, + "/relative23": { + "filePath": "(gen)/relative23.tsx" + }, + "/relative24": { + "filePath": "(gen)/relative24.tsx" + }, + "/relative25": { + "filePath": "(gen)/relative25.tsx" + }, + "/relative26": { + "filePath": "(gen)/relative26.tsx" + }, + "/relative27": { + "filePath": "(gen)/relative27.tsx" + }, + "/relative28": { + "filePath": "(gen)/relative28.tsx" + }, + "/relative29": { + "filePath": "(gen)/relative29.tsx" + }, + "/relative3": { + "filePath": "(gen)/relative3.tsx" + }, + "/relative30": { + "filePath": "(gen)/relative30.tsx" + }, + "/relative31": { + "filePath": "(gen)/relative31.tsx" + }, + "/relative32": { + "filePath": "(gen)/relative32.tsx" + }, + "/relative33": { + "filePath": "(gen)/relative33.tsx" + }, + "/relative34": { + "filePath": "(gen)/relative34.tsx" + }, + "/relative35": { + "filePath": "(gen)/relative35.tsx" + }, + "/relative36": { + "filePath": "(gen)/relative36.tsx" + }, + "/relative37": { + "filePath": "(gen)/relative37.tsx" + }, + "/relative38": { + "filePath": "(gen)/relative38.tsx" + }, + "/relative39": { + "filePath": "(gen)/relative39.tsx" + }, + "/relative4": { + "filePath": "(gen)/relative4.tsx" + }, + "/relative40": { + "filePath": "(gen)/relative40.tsx" + }, + "/relative41": { + "filePath": "(gen)/relative41.tsx" + }, + "/relative42": { + "filePath": "(gen)/relative42.tsx" + }, + "/relative43": { + "filePath": "(gen)/relative43.tsx" + }, + "/relative44": { + "filePath": "(gen)/relative44.tsx" + }, + "/relative45": { + "filePath": "(gen)/relative45.tsx" + }, + "/relative46": { + "filePath": "(gen)/relative46.tsx" + }, + "/relative47": { + "filePath": "(gen)/relative47.tsx" + }, + "/relative48": { + "filePath": "(gen)/relative48.tsx" + }, + "/relative49": { + "filePath": "(gen)/relative49.tsx" + }, + "/relative5": { + "filePath": "(gen)/relative5.tsx" + }, + "/relative50": { + "filePath": "(gen)/relative50.tsx" + }, + "/relative51": { + "filePath": "(gen)/relative51.tsx" + }, + "/relative52": { + "filePath": "(gen)/relative52.tsx" + }, + "/relative53": { + "filePath": "(gen)/relative53.tsx" + }, + "/relative54": { + "filePath": "(gen)/relative54.tsx" + }, + "/relative55": { + "filePath": "(gen)/relative55.tsx" + }, + "/relative56": { + "filePath": "(gen)/relative56.tsx" + }, + "/relative57": { + "filePath": "(gen)/relative57.tsx" + }, + "/relative58": { + "filePath": "(gen)/relative58.tsx" + }, + "/relative59": { + "filePath": "(gen)/relative59.tsx" + }, + "/relative6": { + "filePath": "(gen)/relative6.tsx" + }, + "/relative60": { + "filePath": "(gen)/relative60.tsx" + }, + "/relative61": { + "filePath": "(gen)/relative61.tsx" + }, + "/relative62": { + "filePath": "(gen)/relative62.tsx" + }, + "/relative63": { + "filePath": "(gen)/relative63.tsx" + }, + "/relative64": { + "filePath": "(gen)/relative64.tsx" + }, + "/relative65": { + "filePath": "(gen)/relative65.tsx" + }, + "/relative66": { + "filePath": "(gen)/relative66.tsx" + }, + "/relative67": { + "filePath": "(gen)/relative67.tsx" + }, + "/relative68": { + "filePath": "(gen)/relative68.tsx" + }, + "/relative69": { + "filePath": "(gen)/relative69.tsx" + }, + "/relative7": { + "filePath": "(gen)/relative7.tsx" + }, + "/relative70": { + "filePath": "(gen)/relative70.tsx" + }, + "/relative71": { + "filePath": "(gen)/relative71.tsx" + }, + "/relative72": { + "filePath": "(gen)/relative72.tsx" + }, + "/relative73": { + "filePath": "(gen)/relative73.tsx" + }, + "/relative74": { + "filePath": "(gen)/relative74.tsx" + }, + "/relative75": { + "filePath": "(gen)/relative75.tsx" + }, + "/relative76": { + "filePath": "(gen)/relative76.tsx" + }, + "/relative77": { + "filePath": "(gen)/relative77.tsx" + }, + "/relative78": { + "filePath": "(gen)/relative78.tsx" + }, + "/relative79": { + "filePath": "(gen)/relative79.tsx" + }, + "/relative8": { + "filePath": "(gen)/relative8.tsx" + }, + "/relative80": { + "filePath": "(gen)/relative80.tsx" + }, + "/relative81": { + "filePath": "(gen)/relative81.tsx" + }, + "/relative82": { + "filePath": "(gen)/relative82.tsx" + }, + "/relative83": { + "filePath": "(gen)/relative83.tsx" + }, + "/relative84": { + "filePath": "(gen)/relative84.tsx" + }, + "/relative85": { + "filePath": "(gen)/relative85.tsx" + }, + "/relative86": { + "filePath": "(gen)/relative86.tsx" + }, + "/relative87": { + "filePath": "(gen)/relative87.tsx" + }, + "/relative88": { + "filePath": "(gen)/relative88.tsx" + }, + "/relative89": { + "filePath": "(gen)/relative89.tsx" + }, + "/relative9": { + "filePath": "(gen)/relative9.tsx" + }, + "/relative90": { + "filePath": "(gen)/relative90.tsx" + }, + "/relative91": { + "filePath": "(gen)/relative91.tsx" + }, + "/relative92": { + "filePath": "(gen)/relative92.tsx" + }, + "/relative93": { + "filePath": "(gen)/relative93.tsx" + }, + "/relative94": { + "filePath": "(gen)/relative94.tsx" + }, + "/relative95": { + "filePath": "(gen)/relative95.tsx" + }, + "/relative96": { + "filePath": "(gen)/relative96.tsx" + }, + "/relative97": { + "filePath": "(gen)/relative97.tsx" + }, + "/relative98": { + "filePath": "(gen)/relative98.tsx" + }, + "/relative99": { + "filePath": "(gen)/relative99.tsx" + }, + "/params/$paramsPlaceholder": { + "filePath": "params/$paramsPlaceholder.tsx", + "parent": "/params" + }, + "/search/searchPlaceholder": { + "filePath": "search/searchPlaceholder.tsx", + "parent": "/search" + }, + "/params/$param0": { + "filePath": "(gen)/params/$param0.tsx", + "parent": "/params" + }, + "/params/$param1": { + "filePath": "(gen)/params/$param1.tsx", + "parent": "/params" + }, + "/params/$param10": { + "filePath": "(gen)/params/$param10.tsx", + "parent": "/params" + }, + "/params/$param11": { + "filePath": "(gen)/params/$param11.tsx", + "parent": "/params" + }, + "/params/$param12": { + "filePath": "(gen)/params/$param12.tsx", + "parent": "/params" + }, + "/params/$param13": { + "filePath": "(gen)/params/$param13.tsx", + "parent": "/params" + }, + "/params/$param14": { + "filePath": "(gen)/params/$param14.tsx", + "parent": "/params" + }, + "/params/$param15": { + "filePath": "(gen)/params/$param15.tsx", + "parent": "/params" + }, + "/params/$param16": { + "filePath": "(gen)/params/$param16.tsx", + "parent": "/params" + }, + "/params/$param17": { + "filePath": "(gen)/params/$param17.tsx", + "parent": "/params" + }, + "/params/$param18": { + "filePath": "(gen)/params/$param18.tsx", + "parent": "/params" + }, + "/params/$param19": { + "filePath": "(gen)/params/$param19.tsx", + "parent": "/params" + }, + "/params/$param2": { + "filePath": "(gen)/params/$param2.tsx", + "parent": "/params" + }, + "/params/$param20": { + "filePath": "(gen)/params/$param20.tsx", + "parent": "/params" + }, + "/params/$param21": { + "filePath": "(gen)/params/$param21.tsx", + "parent": "/params" + }, + "/params/$param22": { + "filePath": "(gen)/params/$param22.tsx", + "parent": "/params" + }, + "/params/$param23": { + "filePath": "(gen)/params/$param23.tsx", + "parent": "/params" + }, + "/params/$param24": { + "filePath": "(gen)/params/$param24.tsx", + "parent": "/params" + }, + "/params/$param25": { + "filePath": "(gen)/params/$param25.tsx", + "parent": "/params" + }, + "/params/$param26": { + "filePath": "(gen)/params/$param26.tsx", + "parent": "/params" + }, + "/params/$param27": { + "filePath": "(gen)/params/$param27.tsx", + "parent": "/params" + }, + "/params/$param28": { + "filePath": "(gen)/params/$param28.tsx", + "parent": "/params" + }, + "/params/$param29": { + "filePath": "(gen)/params/$param29.tsx", + "parent": "/params" + }, + "/params/$param3": { + "filePath": "(gen)/params/$param3.tsx", + "parent": "/params" + }, + "/params/$param30": { + "filePath": "(gen)/params/$param30.tsx", + "parent": "/params" + }, + "/params/$param31": { + "filePath": "(gen)/params/$param31.tsx", + "parent": "/params" + }, + "/params/$param32": { + "filePath": "(gen)/params/$param32.tsx", + "parent": "/params" + }, + "/params/$param33": { + "filePath": "(gen)/params/$param33.tsx", + "parent": "/params" + }, + "/params/$param34": { + "filePath": "(gen)/params/$param34.tsx", + "parent": "/params" + }, + "/params/$param35": { + "filePath": "(gen)/params/$param35.tsx", + "parent": "/params" + }, + "/params/$param36": { + "filePath": "(gen)/params/$param36.tsx", + "parent": "/params" + }, + "/params/$param37": { + "filePath": "(gen)/params/$param37.tsx", + "parent": "/params" + }, + "/params/$param38": { + "filePath": "(gen)/params/$param38.tsx", + "parent": "/params" + }, + "/params/$param39": { + "filePath": "(gen)/params/$param39.tsx", + "parent": "/params" + }, + "/params/$param4": { + "filePath": "(gen)/params/$param4.tsx", + "parent": "/params" + }, + "/params/$param40": { + "filePath": "(gen)/params/$param40.tsx", + "parent": "/params" + }, + "/params/$param41": { + "filePath": "(gen)/params/$param41.tsx", + "parent": "/params" + }, + "/params/$param42": { + "filePath": "(gen)/params/$param42.tsx", + "parent": "/params" + }, + "/params/$param43": { + "filePath": "(gen)/params/$param43.tsx", + "parent": "/params" + }, + "/params/$param44": { + "filePath": "(gen)/params/$param44.tsx", + "parent": "/params" + }, + "/params/$param45": { + "filePath": "(gen)/params/$param45.tsx", + "parent": "/params" + }, + "/params/$param46": { + "filePath": "(gen)/params/$param46.tsx", + "parent": "/params" + }, + "/params/$param47": { + "filePath": "(gen)/params/$param47.tsx", + "parent": "/params" + }, + "/params/$param48": { + "filePath": "(gen)/params/$param48.tsx", + "parent": "/params" + }, + "/params/$param49": { + "filePath": "(gen)/params/$param49.tsx", + "parent": "/params" + }, + "/params/$param5": { + "filePath": "(gen)/params/$param5.tsx", + "parent": "/params" + }, + "/params/$param50": { + "filePath": "(gen)/params/$param50.tsx", + "parent": "/params" + }, + "/params/$param51": { + "filePath": "(gen)/params/$param51.tsx", + "parent": "/params" + }, + "/params/$param52": { + "filePath": "(gen)/params/$param52.tsx", + "parent": "/params" + }, + "/params/$param53": { + "filePath": "(gen)/params/$param53.tsx", + "parent": "/params" + }, + "/params/$param54": { + "filePath": "(gen)/params/$param54.tsx", + "parent": "/params" + }, + "/params/$param55": { + "filePath": "(gen)/params/$param55.tsx", + "parent": "/params" + }, + "/params/$param56": { + "filePath": "(gen)/params/$param56.tsx", + "parent": "/params" + }, + "/params/$param57": { + "filePath": "(gen)/params/$param57.tsx", + "parent": "/params" + }, + "/params/$param58": { + "filePath": "(gen)/params/$param58.tsx", + "parent": "/params" + }, + "/params/$param59": { + "filePath": "(gen)/params/$param59.tsx", + "parent": "/params" + }, + "/params/$param6": { + "filePath": "(gen)/params/$param6.tsx", + "parent": "/params" + }, + "/params/$param60": { + "filePath": "(gen)/params/$param60.tsx", + "parent": "/params" + }, + "/params/$param61": { + "filePath": "(gen)/params/$param61.tsx", + "parent": "/params" + }, + "/params/$param62": { + "filePath": "(gen)/params/$param62.tsx", + "parent": "/params" + }, + "/params/$param63": { + "filePath": "(gen)/params/$param63.tsx", + "parent": "/params" + }, + "/params/$param64": { + "filePath": "(gen)/params/$param64.tsx", + "parent": "/params" + }, + "/params/$param65": { + "filePath": "(gen)/params/$param65.tsx", + "parent": "/params" + }, + "/params/$param66": { + "filePath": "(gen)/params/$param66.tsx", + "parent": "/params" + }, + "/params/$param67": { + "filePath": "(gen)/params/$param67.tsx", + "parent": "/params" + }, + "/params/$param68": { + "filePath": "(gen)/params/$param68.tsx", + "parent": "/params" + }, + "/params/$param69": { + "filePath": "(gen)/params/$param69.tsx", + "parent": "/params" + }, + "/params/$param7": { + "filePath": "(gen)/params/$param7.tsx", + "parent": "/params" + }, + "/params/$param70": { + "filePath": "(gen)/params/$param70.tsx", + "parent": "/params" + }, + "/params/$param71": { + "filePath": "(gen)/params/$param71.tsx", + "parent": "/params" + }, + "/params/$param72": { + "filePath": "(gen)/params/$param72.tsx", + "parent": "/params" + }, + "/params/$param73": { + "filePath": "(gen)/params/$param73.tsx", + "parent": "/params" + }, + "/params/$param74": { + "filePath": "(gen)/params/$param74.tsx", + "parent": "/params" + }, + "/params/$param75": { + "filePath": "(gen)/params/$param75.tsx", + "parent": "/params" + }, + "/params/$param76": { + "filePath": "(gen)/params/$param76.tsx", + "parent": "/params" + }, + "/params/$param77": { + "filePath": "(gen)/params/$param77.tsx", + "parent": "/params" }, - "/": { - "filePath": "index.tsx" + "/params/$param78": { + "filePath": "(gen)/params/$param78.tsx", + "parent": "/params" }, - "/params": { - "filePath": "params/route.tsx", - "children": [ - "/params/$paramsPlaceholder" - ] + "/params/$param79": { + "filePath": "(gen)/params/$param79.tsx", + "parent": "/params" }, - "/search": { - "filePath": "search/route.tsx", - "children": [ - "/search/searchPlaceholder" - ] + "/params/$param8": { + "filePath": "(gen)/params/$param8.tsx", + "parent": "/params" }, - "/absolute": { - "filePath": "absolute.tsx" + "/params/$param80": { + "filePath": "(gen)/params/$param80.tsx", + "parent": "/params" }, - "/linkProps": { - "filePath": "linkProps.tsx" + "/params/$param81": { + "filePath": "(gen)/params/$param81.tsx", + "parent": "/params" }, - "/relative": { - "filePath": "relative.tsx" + "/params/$param82": { + "filePath": "(gen)/params/$param82.tsx", + "parent": "/params" }, - "/params/$paramsPlaceholder": { - "filePath": "params/$paramsPlaceholder.tsx", + "/params/$param83": { + "filePath": "(gen)/params/$param83.tsx", "parent": "/params" }, - "/search/searchPlaceholder": { - "filePath": "search/searchPlaceholder.tsx", + "/params/$param84": { + "filePath": "(gen)/params/$param84.tsx", + "parent": "/params" + }, + "/params/$param85": { + "filePath": "(gen)/params/$param85.tsx", + "parent": "/params" + }, + "/params/$param86": { + "filePath": "(gen)/params/$param86.tsx", + "parent": "/params" + }, + "/params/$param87": { + "filePath": "(gen)/params/$param87.tsx", + "parent": "/params" + }, + "/params/$param88": { + "filePath": "(gen)/params/$param88.tsx", + "parent": "/params" + }, + "/params/$param89": { + "filePath": "(gen)/params/$param89.tsx", + "parent": "/params" + }, + "/params/$param9": { + "filePath": "(gen)/params/$param9.tsx", + "parent": "/params" + }, + "/params/$param90": { + "filePath": "(gen)/params/$param90.tsx", + "parent": "/params" + }, + "/params/$param91": { + "filePath": "(gen)/params/$param91.tsx", + "parent": "/params" + }, + "/params/$param92": { + "filePath": "(gen)/params/$param92.tsx", + "parent": "/params" + }, + "/params/$param93": { + "filePath": "(gen)/params/$param93.tsx", + "parent": "/params" + }, + "/params/$param94": { + "filePath": "(gen)/params/$param94.tsx", + "parent": "/params" + }, + "/params/$param95": { + "filePath": "(gen)/params/$param95.tsx", + "parent": "/params" + }, + "/params/$param96": { + "filePath": "(gen)/params/$param96.tsx", + "parent": "/params" + }, + "/params/$param97": { + "filePath": "(gen)/params/$param97.tsx", + "parent": "/params" + }, + "/params/$param98": { + "filePath": "(gen)/params/$param98.tsx", + "parent": "/params" + }, + "/params/$param99": { + "filePath": "(gen)/params/$param99.tsx", + "parent": "/params" + }, + "/search/search0": { + "filePath": "(gen)/search/search0.tsx", + "parent": "/search" + }, + "/search/search1": { + "filePath": "(gen)/search/search1.tsx", + "parent": "/search" + }, + "/search/search10": { + "filePath": "(gen)/search/search10.tsx", + "parent": "/search" + }, + "/search/search11": { + "filePath": "(gen)/search/search11.tsx", + "parent": "/search" + }, + "/search/search12": { + "filePath": "(gen)/search/search12.tsx", + "parent": "/search" + }, + "/search/search13": { + "filePath": "(gen)/search/search13.tsx", + "parent": "/search" + }, + "/search/search14": { + "filePath": "(gen)/search/search14.tsx", + "parent": "/search" + }, + "/search/search15": { + "filePath": "(gen)/search/search15.tsx", + "parent": "/search" + }, + "/search/search16": { + "filePath": "(gen)/search/search16.tsx", + "parent": "/search" + }, + "/search/search17": { + "filePath": "(gen)/search/search17.tsx", + "parent": "/search" + }, + "/search/search18": { + "filePath": "(gen)/search/search18.tsx", + "parent": "/search" + }, + "/search/search19": { + "filePath": "(gen)/search/search19.tsx", + "parent": "/search" + }, + "/search/search2": { + "filePath": "(gen)/search/search2.tsx", + "parent": "/search" + }, + "/search/search20": { + "filePath": "(gen)/search/search20.tsx", + "parent": "/search" + }, + "/search/search21": { + "filePath": "(gen)/search/search21.tsx", + "parent": "/search" + }, + "/search/search22": { + "filePath": "(gen)/search/search22.tsx", + "parent": "/search" + }, + "/search/search23": { + "filePath": "(gen)/search/search23.tsx", + "parent": "/search" + }, + "/search/search24": { + "filePath": "(gen)/search/search24.tsx", + "parent": "/search" + }, + "/search/search25": { + "filePath": "(gen)/search/search25.tsx", + "parent": "/search" + }, + "/search/search26": { + "filePath": "(gen)/search/search26.tsx", + "parent": "/search" + }, + "/search/search27": { + "filePath": "(gen)/search/search27.tsx", + "parent": "/search" + }, + "/search/search28": { + "filePath": "(gen)/search/search28.tsx", + "parent": "/search" + }, + "/search/search29": { + "filePath": "(gen)/search/search29.tsx", + "parent": "/search" + }, + "/search/search3": { + "filePath": "(gen)/search/search3.tsx", + "parent": "/search" + }, + "/search/search30": { + "filePath": "(gen)/search/search30.tsx", + "parent": "/search" + }, + "/search/search31": { + "filePath": "(gen)/search/search31.tsx", + "parent": "/search" + }, + "/search/search32": { + "filePath": "(gen)/search/search32.tsx", + "parent": "/search" + }, + "/search/search33": { + "filePath": "(gen)/search/search33.tsx", + "parent": "/search" + }, + "/search/search34": { + "filePath": "(gen)/search/search34.tsx", + "parent": "/search" + }, + "/search/search35": { + "filePath": "(gen)/search/search35.tsx", + "parent": "/search" + }, + "/search/search36": { + "filePath": "(gen)/search/search36.tsx", + "parent": "/search" + }, + "/search/search37": { + "filePath": "(gen)/search/search37.tsx", + "parent": "/search" + }, + "/search/search38": { + "filePath": "(gen)/search/search38.tsx", + "parent": "/search" + }, + "/search/search39": { + "filePath": "(gen)/search/search39.tsx", + "parent": "/search" + }, + "/search/search4": { + "filePath": "(gen)/search/search4.tsx", + "parent": "/search" + }, + "/search/search40": { + "filePath": "(gen)/search/search40.tsx", + "parent": "/search" + }, + "/search/search41": { + "filePath": "(gen)/search/search41.tsx", + "parent": "/search" + }, + "/search/search42": { + "filePath": "(gen)/search/search42.tsx", + "parent": "/search" + }, + "/search/search43": { + "filePath": "(gen)/search/search43.tsx", + "parent": "/search" + }, + "/search/search44": { + "filePath": "(gen)/search/search44.tsx", + "parent": "/search" + }, + "/search/search45": { + "filePath": "(gen)/search/search45.tsx", + "parent": "/search" + }, + "/search/search46": { + "filePath": "(gen)/search/search46.tsx", + "parent": "/search" + }, + "/search/search47": { + "filePath": "(gen)/search/search47.tsx", + "parent": "/search" + }, + "/search/search48": { + "filePath": "(gen)/search/search48.tsx", + "parent": "/search" + }, + "/search/search49": { + "filePath": "(gen)/search/search49.tsx", + "parent": "/search" + }, + "/search/search5": { + "filePath": "(gen)/search/search5.tsx", + "parent": "/search" + }, + "/search/search50": { + "filePath": "(gen)/search/search50.tsx", + "parent": "/search" + }, + "/search/search51": { + "filePath": "(gen)/search/search51.tsx", + "parent": "/search" + }, + "/search/search52": { + "filePath": "(gen)/search/search52.tsx", + "parent": "/search" + }, + "/search/search53": { + "filePath": "(gen)/search/search53.tsx", + "parent": "/search" + }, + "/search/search54": { + "filePath": "(gen)/search/search54.tsx", + "parent": "/search" + }, + "/search/search55": { + "filePath": "(gen)/search/search55.tsx", + "parent": "/search" + }, + "/search/search56": { + "filePath": "(gen)/search/search56.tsx", + "parent": "/search" + }, + "/search/search57": { + "filePath": "(gen)/search/search57.tsx", + "parent": "/search" + }, + "/search/search58": { + "filePath": "(gen)/search/search58.tsx", + "parent": "/search" + }, + "/search/search59": { + "filePath": "(gen)/search/search59.tsx", + "parent": "/search" + }, + "/search/search6": { + "filePath": "(gen)/search/search6.tsx", + "parent": "/search" + }, + "/search/search60": { + "filePath": "(gen)/search/search60.tsx", + "parent": "/search" + }, + "/search/search61": { + "filePath": "(gen)/search/search61.tsx", + "parent": "/search" + }, + "/search/search62": { + "filePath": "(gen)/search/search62.tsx", + "parent": "/search" + }, + "/search/search63": { + "filePath": "(gen)/search/search63.tsx", + "parent": "/search" + }, + "/search/search64": { + "filePath": "(gen)/search/search64.tsx", + "parent": "/search" + }, + "/search/search65": { + "filePath": "(gen)/search/search65.tsx", + "parent": "/search" + }, + "/search/search66": { + "filePath": "(gen)/search/search66.tsx", + "parent": "/search" + }, + "/search/search67": { + "filePath": "(gen)/search/search67.tsx", + "parent": "/search" + }, + "/search/search68": { + "filePath": "(gen)/search/search68.tsx", + "parent": "/search" + }, + "/search/search69": { + "filePath": "(gen)/search/search69.tsx", + "parent": "/search" + }, + "/search/search7": { + "filePath": "(gen)/search/search7.tsx", + "parent": "/search" + }, + "/search/search70": { + "filePath": "(gen)/search/search70.tsx", + "parent": "/search" + }, + "/search/search71": { + "filePath": "(gen)/search/search71.tsx", + "parent": "/search" + }, + "/search/search72": { + "filePath": "(gen)/search/search72.tsx", + "parent": "/search" + }, + "/search/search73": { + "filePath": "(gen)/search/search73.tsx", + "parent": "/search" + }, + "/search/search74": { + "filePath": "(gen)/search/search74.tsx", + "parent": "/search" + }, + "/search/search75": { + "filePath": "(gen)/search/search75.tsx", + "parent": "/search" + }, + "/search/search76": { + "filePath": "(gen)/search/search76.tsx", + "parent": "/search" + }, + "/search/search77": { + "filePath": "(gen)/search/search77.tsx", + "parent": "/search" + }, + "/search/search78": { + "filePath": "(gen)/search/search78.tsx", + "parent": "/search" + }, + "/search/search79": { + "filePath": "(gen)/search/search79.tsx", + "parent": "/search" + }, + "/search/search8": { + "filePath": "(gen)/search/search8.tsx", + "parent": "/search" + }, + "/search/search80": { + "filePath": "(gen)/search/search80.tsx", + "parent": "/search" + }, + "/search/search81": { + "filePath": "(gen)/search/search81.tsx", + "parent": "/search" + }, + "/search/search82": { + "filePath": "(gen)/search/search82.tsx", + "parent": "/search" + }, + "/search/search83": { + "filePath": "(gen)/search/search83.tsx", + "parent": "/search" + }, + "/search/search84": { + "filePath": "(gen)/search/search84.tsx", + "parent": "/search" + }, + "/search/search85": { + "filePath": "(gen)/search/search85.tsx", + "parent": "/search" + }, + "/search/search86": { + "filePath": "(gen)/search/search86.tsx", + "parent": "/search" + }, + "/search/search87": { + "filePath": "(gen)/search/search87.tsx", + "parent": "/search" + }, + "/search/search88": { + "filePath": "(gen)/search/search88.tsx", + "parent": "/search" + }, + "/search/search89": { + "filePath": "(gen)/search/search89.tsx", + "parent": "/search" + }, + "/search/search9": { + "filePath": "(gen)/search/search9.tsx", + "parent": "/search" + }, + "/search/search90": { + "filePath": "(gen)/search/search90.tsx", + "parent": "/search" + }, + "/search/search91": { + "filePath": "(gen)/search/search91.tsx", + "parent": "/search" + }, + "/search/search92": { + "filePath": "(gen)/search/search92.tsx", + "parent": "/search" + }, + "/search/search93": { + "filePath": "(gen)/search/search93.tsx", + "parent": "/search" + }, + "/search/search94": { + "filePath": "(gen)/search/search94.tsx", + "parent": "/search" + }, + "/search/search95": { + "filePath": "(gen)/search/search95.tsx", + "parent": "/search" + }, + "/search/search96": { + "filePath": "(gen)/search/search96.tsx", + "parent": "/search" + }, + "/search/search97": { + "filePath": "(gen)/search/search97.tsx", + "parent": "/search" + }, + "/search/search98": { + "filePath": "(gen)/search/search98.tsx", + "parent": "/search" + }, + "/search/search99": { + "filePath": "(gen)/search/search99.tsx", "parent": "/search" } } diff --git a/examples/react/large-file-based/tsconfig.json b/examples/react/large-file-based/tsconfig.json index eb34d24255..3435721cc4 100644 --- a/examples/react/large-file-based/tsconfig.json +++ b/examples/react/large-file-based/tsconfig.json @@ -3,6 +3,8 @@ "strict": true, "esModuleInterop": true, "jsx": "react-jsx", + "target": "ESNext", + "moduleResolution": "Bundler", "noEmit": true, "skipLibCheck": true } diff --git a/examples/react/location-masking/package.json b/examples/react/location-masking/package.json index 6770f164a7..9c30a580f7 100644 --- a/examples/react/location-masking/package.json +++ b/examples/react/location-masking/package.json @@ -4,15 +4,15 @@ "type": "module", "scripts": { "dev": "vite --port=3001", - "build": "vite build", + "build": "vite build && tsc --noEmit", "serve": "vite preview", "start": "vite" }, "dependencies": { "@radix-ui/react-dialog": "^1.1.1", - "@tanstack/react-query": "^5.51.21", - "@tanstack/react-router": "^1.51.2", - "@tanstack/router-devtools": "^1.51.2", + "@tanstack/react-query": "^5.56.2", + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", "redaxios": "^0.5.1", "react": "^18.2.0", "react-dom": "^18.2.0" @@ -21,6 +21,6 @@ "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", "@vitejs/plugin-react": "^4.3.1", - "vite": "^5.3.5" + "vite": "^5.4.5" } } diff --git a/examples/react/location-masking/src/main.tsx b/examples/react/location-masking/src/main.tsx index 6f03d95379..6f8babd554 100644 --- a/examples/react/location-masking/src/main.tsx +++ b/examples/react/location-masking/src/main.tsx @@ -90,7 +90,7 @@ function RootComponent() { Home {' '}
diff --git a/examples/react/location-masking/tsconfig.json b/examples/react/location-masking/tsconfig.json index c9e17e2b68..0d2a31a7d7 100644 --- a/examples/react/location-masking/tsconfig.json +++ b/examples/react/location-masking/tsconfig.json @@ -2,6 +2,9 @@ "compilerOptions": { "strict": true, "esModuleInterop": true, - "jsx": "react-jsx" + "jsx": "react-jsx", + "target": "ESNext", + "moduleResolution": "Bundler", + "module": "ESNext" } } diff --git a/examples/react/navigation-blocking/package.json b/examples/react/navigation-blocking/package.json index b1596d42d8..691c842ead 100644 --- a/examples/react/navigation-blocking/package.json +++ b/examples/react/navigation-blocking/package.json @@ -4,14 +4,14 @@ "type": "module", "scripts": { "dev": "vite --port=3001", - "build": "vite build", + "build": "vite build && tsc --noEmit", "serve": "vite preview", "start": "vite" }, "dependencies": { - "@tanstack/react-query": "^5.51.21", - "@tanstack/react-router": "^1.51.2", - "@tanstack/router-devtools": "^1.51.2", + "@tanstack/react-query": "^5.56.2", + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", "redaxios": "^0.5.1", "react": "^18.2.0", "react-dom": "^18.2.0" @@ -20,6 +20,6 @@ "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", "@vitejs/plugin-react": "^4.3.1", - "vite": "^5.3.5" + "vite": "^5.4.5" } } diff --git a/examples/react/navigation-blocking/src/main.tsx b/examples/react/navigation-blocking/src/main.tsx index 00026b0fe7..4c6037a738 100644 --- a/examples/react/navigation-blocking/src/main.tsx +++ b/examples/react/navigation-blocking/src/main.tsx @@ -29,7 +29,7 @@ function RootComponent() { Home {' '} () /* prettier-ignore-end */ diff --git a/examples/react/quickstart-file-based/src/routes/__root.tsx b/examples/react/quickstart-file-based/src/routes/__root.tsx index 5d93bc90cd..8896176e24 100644 --- a/examples/react/quickstart-file-based/src/routes/__root.tsx +++ b/examples/react/quickstart-file-based/src/routes/__root.tsx @@ -20,7 +20,7 @@ function RootComponent() { Home {' '} () /* prettier-ignore-end */ diff --git a/examples/react/quickstart-rspack-file-based/src/routes/__root.tsx b/examples/react/quickstart-rspack-file-based/src/routes/__root.tsx index 5d93bc90cd..8896176e24 100644 --- a/examples/react/quickstart-rspack-file-based/src/routes/__root.tsx +++ b/examples/react/quickstart-rspack-file-based/src/routes/__root.tsx @@ -20,7 +20,7 @@ function RootComponent() { Home {' '} () /* prettier-ignore-end */ diff --git a/examples/react/quickstart-webpack-file-based/src/routes/__root.tsx b/examples/react/quickstart-webpack-file-based/src/routes/__root.tsx index 1ffb9dbecb..3cfcdec9a8 100644 --- a/examples/react/quickstart-webpack-file-based/src/routes/__root.tsx +++ b/examples/react/quickstart-webpack-file-based/src/routes/__root.tsx @@ -19,7 +19,7 @@ function RootComponent() { Home {' '} () /* prettier-ignore-end */ diff --git a/examples/react/search-validator-adapters/tsconfig.json b/examples/react/search-validator-adapters/tsconfig.json index c9e17e2b68..44c53edd67 100644 --- a/examples/react/search-validator-adapters/tsconfig.json +++ b/examples/react/search-validator-adapters/tsconfig.json @@ -2,6 +2,10 @@ "compilerOptions": { "strict": true, "esModuleInterop": true, - "jsx": "react-jsx" + "jsx": "react-jsx", + "target": "ESNext", + "moduleResolution": "Bundler", + "module": "ESNext", + "skipLibCheck": true } } diff --git a/examples/react/start-basic-auth/.eslintrc b/examples/react/start-basic-auth/.eslintrc deleted file mode 100644 index af7fa28f83..0000000000 --- a/examples/react/start-basic-auth/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": ["react-app"], - "parser": "@typescript-eslint/parser", - "plugins": ["react-hooks"] -} diff --git a/examples/react/start-basic-auth/app/components/Login.tsx b/examples/react/start-basic-auth/app/components/Login.tsx index e330d3d93f..6e114612e7 100644 --- a/examples/react/start-basic-auth/app/components/Login.tsx +++ b/examples/react/start-basic-auth/app/components/Login.tsx @@ -1,4 +1,4 @@ -import { Link, useRouter } from '@tanstack/react-router' +import { useRouter } from '@tanstack/react-router' import { useServerFn } from '@tanstack/start' import { useMutation } from '../hooks/useMutation' import { loginFn } from '../routes/_authed' @@ -10,12 +10,10 @@ export function Login() { const loginMutation = useMutation({ fn: loginFn, - onSuccess: (ctx) => { + onSuccess: async (ctx) => { if (!ctx.data?.error) { - router.invalidate() - router.navigate({ - to: '/', - }) + await router.invalidate() + router.navigate({ to: '/' }) return } }, diff --git a/examples/react/start-basic-auth/app/routeTree.gen.ts b/examples/react/start-basic-auth/app/routeTree.gen.ts index d63d8d3e4d..5057c1f72b 100644 --- a/examples/react/start-basic-auth/app/routeTree.gen.ts +++ b/examples/react/start-basic-auth/app/routeTree.gen.ts @@ -127,18 +127,109 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ - IndexRoute, - AuthedRoute: AuthedRoute.addChildren({ - AuthedPostsRoute: AuthedPostsRoute.addChildren({ - AuthedPostsPostIdRoute, - AuthedPostsIndexRoute, - }), - }), - LoginRoute, - LogoutRoute, - SignupRoute, -}) +interface AuthedPostsRouteChildren { + AuthedPostsPostIdRoute: typeof AuthedPostsPostIdRoute + AuthedPostsIndexRoute: typeof AuthedPostsIndexRoute +} + +const AuthedPostsRouteChildren: AuthedPostsRouteChildren = { + AuthedPostsPostIdRoute: AuthedPostsPostIdRoute, + AuthedPostsIndexRoute: AuthedPostsIndexRoute, +} + +const AuthedPostsRouteWithChildren = AuthedPostsRoute._addFileChildren( + AuthedPostsRouteChildren, +) + +interface AuthedRouteChildren { + AuthedPostsRoute: typeof AuthedPostsRouteWithChildren +} + +const AuthedRouteChildren: AuthedRouteChildren = { + AuthedPostsRoute: AuthedPostsRouteWithChildren, +} + +const AuthedRouteWithChildren = + AuthedRoute._addFileChildren(AuthedRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '': typeof AuthedRouteWithChildren + '/login': typeof LoginRoute + '/logout': typeof LogoutRoute + '/signup': typeof SignupRoute + '/posts': typeof AuthedPostsRouteWithChildren + '/posts/$postId': typeof AuthedPostsPostIdRoute + '/posts/': typeof AuthedPostsIndexRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '': typeof AuthedRouteWithChildren + '/login': typeof LoginRoute + '/logout': typeof LogoutRoute + '/signup': typeof SignupRoute + '/posts/$postId': typeof AuthedPostsPostIdRoute + '/posts': typeof AuthedPostsIndexRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/_authed': typeof AuthedRouteWithChildren + '/login': typeof LoginRoute + '/logout': typeof LogoutRoute + '/signup': typeof SignupRoute + '/_authed/posts': typeof AuthedPostsRouteWithChildren + '/_authed/posts/$postId': typeof AuthedPostsPostIdRoute + '/_authed/posts/': typeof AuthedPostsIndexRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '' + | '/login' + | '/logout' + | '/signup' + | '/posts' + | '/posts/$postId' + | '/posts/' + fileRoutesByTo: FileRoutesByTo + to: '/' | '' | '/login' | '/logout' | '/signup' | '/posts/$postId' | '/posts' + id: + | '__root__' + | '/' + | '/_authed' + | '/login' + | '/logout' + | '/signup' + | '/_authed/posts' + | '/_authed/posts/$postId' + | '/_authed/posts/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + AuthedRoute: typeof AuthedRouteWithChildren + LoginRoute: typeof LoginRoute + LogoutRoute: typeof LogoutRoute + SignupRoute: typeof SignupRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + AuthedRoute: AuthedRouteWithChildren, + LoginRoute: LoginRoute, + LogoutRoute: LogoutRoute, + SignupRoute: SignupRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ diff --git a/examples/react/start-basic-auth/app/routes/__root.tsx b/examples/react/start-basic-auth/app/routes/__root.tsx index 8f90c99d55..6f5fc33295 100644 --- a/examples/react/start-basic-auth/app/routes/__root.tsx +++ b/examples/react/start-basic-auth/app/routes/__root.tsx @@ -18,19 +18,18 @@ import { DefaultCatchBoundary } from '~/components/DefaultCatchBoundary.js' import { NotFound } from '~/components/NotFound.js' import appCss from '~/styles/app.css?url' import { seo } from '~/utils/seo.js' -import { sessionStorage } from '~/utils/session.js' +import { useAppSession } from '~/utils/session.js' -const fetchUser = createServerFn('GET', async (_, { request }) => { - const cookie = request.headers.get('cookie') - const session = await sessionStorage.getSession(cookie) - const userEmail = session.get('userEmail') +const fetchUser = createServerFn('GET', async () => { + // We need to auth on the server so we have access to secure cookies + const session = await useAppSession() - if (!userEmail) { + if (!session.data.userEmail) { return null } return { - email: userEmail, + email: session.data.userEmail, } }) @@ -117,7 +116,7 @@ function RootDocument({ children }: { children: React.ReactNode }) { Home {' '} { - const session = await sessionStorage.getSession(request.headers.get('cookie')) +const logoutFn = createServerFn('POST', async () => { + const session = await useAppSession() + + session.clear() throw redirect({ href: '/', - headers: { - 'Set-Cookie': await sessionStorage.destroySession(session), - }, }) }) diff --git a/examples/react/start-basic-auth/app/routes/signup.tsx b/examples/react/start-basic-auth/app/routes/signup.tsx index 1acb45cb5c..5148372826 100644 --- a/examples/react/start-basic-auth/app/routes/signup.tsx +++ b/examples/react/start-basic-auth/app/routes/signup.tsx @@ -1,16 +1,18 @@ import { createFileRoute, redirect } from '@tanstack/react-router' import { createServerFn, useServerFn } from '@tanstack/start' +import { updateSession } from 'vinxi/http' import { hashPassword, prismaClient } from '~/utils/prisma' -import { sessionStorage } from '~/utils/session' import { useMutation } from '~/hooks/useMutation' import { Auth } from '~/components/Auth' +import { useAppSession } from '~/utils/session' export const signupFn = createServerFn( 'POST', - async ( - payload: { email: string; password: string; redirectUrl?: string }, - context, - ) => { + async (payload: { + email: string + password: string + redirectUrl?: string + }) => { // Check if the user already exists const found = await prismaClient.user.findUnique({ where: { @@ -22,9 +24,7 @@ export const signupFn = createServerFn( const password = await hashPassword(payload.password) // Create a session - const session = await sessionStorage.getSession( - context.request.headers.get('cookie'), - ) + const session = await useAppSession() if (found) { if (found.password !== password) { @@ -36,14 +36,13 @@ export const signupFn = createServerFn( } // Store the user's email in the session - session.set('userEmail', found.email) + await session.update({ + userEmail: found.email, + }) // Redirect to the prev page stored in the "redirect" search param throw redirect({ href: payload.redirectUrl || '/', - headers: { - 'Set-Cookie': await sessionStorage.commitSession(session), - }, }) } @@ -56,14 +55,13 @@ export const signupFn = createServerFn( }) // Store the user's email in the session - session.set('userEmail', user.email) + await session.update({ + userEmail: user.email, + }) // Redirect to the prev page stored in the "redirect" search param throw redirect({ href: payload.redirectUrl || '/', - headers: { - 'Set-Cookie': await sessionStorage.commitSession(session), - }, }) }, ) diff --git a/examples/react/start-basic-auth/app/utils/session.ts b/examples/react/start-basic-auth/app/utils/session.ts index bbf6cdc5ba..08d28177cb 100644 --- a/examples/react/start-basic-auth/app/utils/session.ts +++ b/examples/react/start-basic-auth/app/utils/session.ts @@ -1,20 +1,13 @@ // app/services/session.server.ts -import { createCookieSessionStorage } from '@remix-run/node' - +import { useSession } from 'vinxi/http' import type { User } from '@prisma/client' type SessionUser = { userEmail: User['email'] } -// export the whole sessionStorage object -export const sessionStorage = createCookieSessionStorage({ - cookie: { - name: '_session', // use any name you want here - sameSite: 'lax', // this helps with CSRF - path: '/', // remember to add this so the cookie will work in all routes - httpOnly: true, // for security reasons, make this cookie http only - secrets: ['s3cr3t'], // replace this with an actual secret - secure: process.env.NODE_ENV === 'production', // enable this in prod only - }, -}) +export function useAppSession() { + return useSession({ + password: 'ChangeThisBeforeShippingToProdOrYouWillBeFired', + }) +} diff --git a/examples/react/start-basic-auth/package.json b/examples/react/start-basic-auth/package.json index 5d7604509e..bf495cda89 100644 --- a/examples/react/start-basic-auth/package.json +++ b/examples/react/start-basic-auth/package.json @@ -1,5 +1,5 @@ { - "name": "tanstack-router-example-react-start-basic-auth", + "name": "tanstack-start-example-basic-auth", "private": true, "sideEffects": false, "type": "module", @@ -9,44 +9,35 @@ "start": "vinxi start", "lint": "prettier --check '**/*' --ignore-unknown && eslint --ext .ts,.tsx ./app", "format": "prettier --write '**/*' --ignore-unknown", - "prisma-generate": "prisma generate", - "test:e2e": "pnpm run prisma-generate && playwright test --project=chromium" + "prisma-generate": "prisma generate" }, "dependencies": { - "@prisma/client": "5.17.0", - "@remix-run/node": "^2.10.3", - "@remix-run/server-runtime": "^2.10.3", - "@tanstack/react-router": "^1.51.2", - "@tanstack/router-devtools": "^1.51.2", - "@tanstack/router-plugin": "^1.51.0", - "@tanstack/start": "^1.51.2", - "@typescript-eslint/parser": "^7.16.0", - "@vitejs/plugin-react": "^4.3.1", + "@prisma/client": "5.19.1", + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", + "@tanstack/router-plugin": "^1.58.4", + "@tanstack/start": "^1.58.5", "dotenv": "^16.4.5", - "isbot": "^5.1.12", - "prisma": "^5.17.0", + "isbot": "^5.1.17", + "prisma": "^5.19.1", "react": "^18.3.1", "react-dom": "^18.3.1", "redaxios": "^0.5.1", "remix-auth-form": "^1.5.0", - "tailwind-merge": "^2.4.0", - "vinxi": "0.3.12" + "tailwind-merge": "^2.5.2", + "vinxi": "0.4.3" }, "devDependencies": { - "@playwright/test": "^1.45.1", - "@replayio/playwright": "^3.1.8", - "@types/node": "^20.12.11", + "@types/node": "^22.5.4", "@types/react": "^18.2.65", "@types/react-dom": "^18.2.21", "@vitejs/plugin-react": "^4.3.1", - "autoprefixer": "^10.4.19", - "eslint": "^8.57.0", - "eslint-config-react-app": "^7.0.1", - "postcss": "^8.4.39", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.47", "prettier": "^3.3.3", - "tailwindcss": "^3.4.4", - "typescript": "^5.5.3", - "vite": "^5.3.3", - "vite-tsconfig-paths": "^4.3.2" + "tailwindcss": "^3.4.11", + "typescript": "^5.6.2", + "vite": "^5.4.5", + "vite-tsconfig-paths": "^5.0.1" } } diff --git a/examples/react/start-basic-counter/.eslintrc b/examples/react/start-basic-counter/.eslintrc deleted file mode 100644 index af7fa28f83..0000000000 --- a/examples/react/start-basic-counter/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": ["react-app"], - "parser": "@typescript-eslint/parser", - "plugins": ["react-hooks"] -} diff --git a/examples/react/start-basic-counter/app/routeTree.gen.ts b/examples/react/start-basic-counter/app/routeTree.gen.ts index 5ecc21f200..c89e6dd3db 100644 --- a/examples/react/start-basic-counter/app/routeTree.gen.ts +++ b/examples/react/start-basic-counter/app/routeTree.gen.ts @@ -36,7 +36,39 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ IndexRoute }) +export interface FileRoutesByFullPath { + '/': typeof IndexRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' + fileRoutesByTo: FileRoutesByTo + to: '/' + id: '__root__' | '/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ diff --git a/examples/react/start-basic-counter/package.json b/examples/react/start-basic-counter/package.json index 5bc1bd3a09..2a32d39810 100644 --- a/examples/react/start-basic-counter/package.json +++ b/examples/react/start-basic-counter/package.json @@ -1,5 +1,5 @@ { - "name": "tanstack-router-example-react-start-basic-counter", + "name": "tanstack-start-example-basic-counter", "private": true, "sideEffects": false, "type": "module", @@ -11,21 +11,18 @@ "format": "prettier --write '**/*' --ignore-unknown" }, "dependencies": { - "@tanstack/react-router": "^1.51.2", - "@tanstack/start": "^1.51.2", - "@typescript-eslint/parser": "^7.18.0", + "@tanstack/react-router": "^1.58.3", + "@tanstack/start": "^1.58.5", "react": "^18.3.1", "react-dom": "^18.3.1", - "vinxi": "0.4.1" + "vinxi": "0.4.3" }, "devDependencies": { - "@types/node": "^20.12.11", + "@types/node": "^22.5.4", "@types/react": "^18.2.65", "@types/react-dom": "^18.2.21", - "eslint": "^8.57.0", - "eslint-config-react-app": "^7.0.1", "prettier": "^3.3.3", - "typescript": "^5.5.3", - "vite": "^5.3.5" + "typescript": "^5.6.2", + "vite": "^5.4.5" } } diff --git a/examples/react/start-basic-react-query/.eslintrc b/examples/react/start-basic-react-query/.eslintrc deleted file mode 100644 index af7fa28f83..0000000000 --- a/examples/react/start-basic-react-query/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": ["react-app"], - "parser": "@typescript-eslint/parser", - "plugins": ["react-hooks"] -} diff --git a/examples/react/start-basic-react-query/app/routeTree.gen.ts b/examples/react/start-basic-react-query/app/routeTree.gen.ts index 0dc634cff7..d6df38d1bf 100644 --- a/examples/react/start-basic-react-query/app/routeTree.gen.ts +++ b/examples/react/start-basic-react-query/app/routeTree.gen.ts @@ -205,20 +205,174 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ - IndexRoute, - LayoutRoute: LayoutRoute.addChildren({ - LayoutLayout2Route: LayoutLayout2Route.addChildren({ - LayoutLayout2LayoutARoute, - LayoutLayout2LayoutBRoute, - }), - }), - DeferredRoute, - PostsRoute: PostsRoute.addChildren({ PostsPostIdRoute, PostsIndexRoute }), - RedirectRoute, - UsersRoute: UsersRoute.addChildren({ UsersUserIdRoute, UsersIndexRoute }), - PostsPostIdDeepRoute, -}) +interface LayoutLayout2RouteChildren { + LayoutLayout2LayoutARoute: typeof LayoutLayout2LayoutARoute + LayoutLayout2LayoutBRoute: typeof LayoutLayout2LayoutBRoute +} + +const LayoutLayout2RouteChildren: LayoutLayout2RouteChildren = { + LayoutLayout2LayoutARoute: LayoutLayout2LayoutARoute, + LayoutLayout2LayoutBRoute: LayoutLayout2LayoutBRoute, +} + +const LayoutLayout2RouteWithChildren = LayoutLayout2Route._addFileChildren( + LayoutLayout2RouteChildren, +) + +interface LayoutRouteChildren { + LayoutLayout2Route: typeof LayoutLayout2RouteWithChildren +} + +const LayoutRouteChildren: LayoutRouteChildren = { + LayoutLayout2Route: LayoutLayout2RouteWithChildren, +} + +const LayoutRouteWithChildren = + LayoutRoute._addFileChildren(LayoutRouteChildren) + +interface PostsRouteChildren { + PostsPostIdRoute: typeof PostsPostIdRoute + PostsIndexRoute: typeof PostsIndexRoute +} + +const PostsRouteChildren: PostsRouteChildren = { + PostsPostIdRoute: PostsPostIdRoute, + PostsIndexRoute: PostsIndexRoute, +} + +const PostsRouteWithChildren = PostsRoute._addFileChildren(PostsRouteChildren) + +interface UsersRouteChildren { + UsersUserIdRoute: typeof UsersUserIdRoute + UsersIndexRoute: typeof UsersIndexRoute +} + +const UsersRouteChildren: UsersRouteChildren = { + UsersUserIdRoute: UsersUserIdRoute, + UsersIndexRoute: UsersIndexRoute, +} + +const UsersRouteWithChildren = UsersRoute._addFileChildren(UsersRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '': typeof LayoutLayout2RouteWithChildren + '/deferred': typeof DeferredRoute + '/posts': typeof PostsRouteWithChildren + '/redirect': typeof RedirectRoute + '/users': typeof UsersRouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/users/$userId': typeof UsersUserIdRoute + '/posts/': typeof PostsIndexRoute + '/users/': typeof UsersIndexRoute + '/layout-a': typeof LayoutLayout2LayoutARoute + '/layout-b': typeof LayoutLayout2LayoutBRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '': typeof LayoutLayout2RouteWithChildren + '/deferred': typeof DeferredRoute + '/redirect': typeof RedirectRoute + '/posts/$postId': typeof PostsPostIdRoute + '/users/$userId': typeof UsersUserIdRoute + '/posts': typeof PostsIndexRoute + '/users': typeof UsersIndexRoute + '/layout-a': typeof LayoutLayout2LayoutARoute + '/layout-b': typeof LayoutLayout2LayoutBRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/_layout': typeof LayoutRouteWithChildren + '/deferred': typeof DeferredRoute + '/posts': typeof PostsRouteWithChildren + '/redirect': typeof RedirectRoute + '/users': typeof UsersRouteWithChildren + '/_layout/_layout-2': typeof LayoutLayout2RouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/users/$userId': typeof UsersUserIdRoute + '/posts/': typeof PostsIndexRoute + '/users/': typeof UsersIndexRoute + '/_layout/_layout-2/layout-a': typeof LayoutLayout2LayoutARoute + '/_layout/_layout-2/layout-b': typeof LayoutLayout2LayoutBRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '' + | '/deferred' + | '/posts' + | '/redirect' + | '/users' + | '/posts/$postId' + | '/users/$userId' + | '/posts/' + | '/users/' + | '/layout-a' + | '/layout-b' + | '/posts/$postId/deep' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '' + | '/deferred' + | '/redirect' + | '/posts/$postId' + | '/users/$userId' + | '/posts' + | '/users' + | '/layout-a' + | '/layout-b' + | '/posts/$postId/deep' + id: + | '__root__' + | '/' + | '/_layout' + | '/deferred' + | '/posts' + | '/redirect' + | '/users' + | '/_layout/_layout-2' + | '/posts/$postId' + | '/users/$userId' + | '/posts/' + | '/users/' + | '/_layout/_layout-2/layout-a' + | '/_layout/_layout-2/layout-b' + | '/posts/$postId/deep' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + LayoutRoute: typeof LayoutRouteWithChildren + DeferredRoute: typeof DeferredRoute + PostsRoute: typeof PostsRouteWithChildren + RedirectRoute: typeof RedirectRoute + UsersRoute: typeof UsersRouteWithChildren + PostsPostIdDeepRoute: typeof PostsPostIdDeepRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + LayoutRoute: LayoutRouteWithChildren, + DeferredRoute: DeferredRoute, + PostsRoute: PostsRouteWithChildren, + RedirectRoute: RedirectRoute, + UsersRoute: UsersRouteWithChildren, + PostsPostIdDeepRoute: PostsPostIdDeepRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ diff --git a/examples/react/start-basic-react-query/app/routes/__root.tsx b/examples/react/start-basic-react-query/app/routes/__root.tsx index 3e43406b38..87f26f02ef 100644 --- a/examples/react/start-basic-react-query/app/routes/__root.tsx +++ b/examples/react/start-basic-react-query/app/routes/__root.tsx @@ -91,7 +91,7 @@ function RootDocument({ children }: { children: React.ReactNode }) { Home {' '} {' '} () /* prettier-ignore-end */ diff --git a/examples/react/start-basic-rsc/app/routes/__root.tsx b/examples/react/start-basic-rsc/app/routes/__root.tsx index a11244e7dd..b973394ac6 100644 --- a/examples/react/start-basic-rsc/app/routes/__root.tsx +++ b/examples/react/start-basic-rsc/app/routes/__root.tsx @@ -86,7 +86,7 @@ function RootDocument({ children }: { children: React.ReactNode }) { Home {' '} () /* prettier-ignore-end */ diff --git a/examples/react/start-basic/app/routes/__root.tsx b/examples/react/start-basic/app/routes/__root.tsx index 2f08b28166..4ef88cfb27 100644 --- a/examples/react/start-basic/app/routes/__root.tsx +++ b/examples/react/start-basic/app/routes/__root.tsx @@ -87,7 +87,7 @@ function RootDocument({ children }: { children: React.ReactNode }) { Home {' '} {' '} () /* prettier-ignore-end */ diff --git a/examples/react/start-clerk-basic/app/routes/__root.tsx b/examples/react/start-clerk-basic/app/routes/__root.tsx index 2c4e4d9ef2..faf5f22ab7 100644 --- a/examples/react/start-clerk-basic/app/routes/__root.tsx +++ b/examples/react/start-clerk-basic/app/routes/__root.tsx @@ -1,3 +1,4 @@ +/// import { Link, Outlet, @@ -27,7 +28,7 @@ import { NotFound } from '~/components/NotFound.js' import appCss from '~/styles/app.css?url' const fetchClerkAuth = createServerFn('GET', async (_, ctx) => { - const user = await getAuth(ctx) + const user = await getAuth(ctx.request) return { user, @@ -112,7 +113,7 @@ function RootDocument({ children }: { children: React.ReactNode }) { Home {' '} - +
) } diff --git a/examples/react/start-clerk-basic/app/ssr.tsx b/examples/react/start-clerk-basic/app/ssr.tsx index 12446ca2c7..73d185feed 100644 --- a/examples/react/start-clerk-basic/app/ssr.tsx +++ b/examples/react/start-clerk-basic/app/ssr.tsx @@ -3,8 +3,8 @@ import { defaultStreamHandler, } from '@tanstack/start/server' import { getRouterManifest } from '@tanstack/start/router-manifest' -import { createRouter } from './router' import { createClerkHandler } from '@clerk/tanstack-start/server' +import { createRouter } from './router' const handler = createStartHandler({ createRouter, diff --git a/examples/react/start-clerk-basic/package.json b/examples/react/start-clerk-basic/package.json index 280720cdab..c70833219e 100644 --- a/examples/react/start-clerk-basic/package.json +++ b/examples/react/start-clerk-basic/package.json @@ -1,5 +1,5 @@ { - "name": "tanstack-router-example-react-start-clerk-basic", + "name": "tanstack-start-example-clerk-basic", "private": true, "sideEffects": false, "type": "module", @@ -8,43 +8,34 @@ "build": "vinxi build", "start": "vinxi start", "lint": "prettier --check '**/*' --ignore-unknown && eslint --ext .ts,.tsx ./app", - "format": "prettier --write '**/*' --ignore-unknown", - "test:e2e": "exit 0; playwright test --project=chromium" + "format": "prettier --write '**/*' --ignore-unknown" }, "dependencies": { - "@clerk/tanstack-start": "0.3.0-snapshot.vdf04997", - "@remix-run/node": "^2.10.3", - "@remix-run/server-runtime": "^2.10.3", - "@tanstack/react-router": "^1.51.2", - "@tanstack/router-devtools": "^1.51.2", - "@tanstack/router-plugin": "^1.51.0", - "@tanstack/start": "^1.51.2", - "@typescript-eslint/parser": "^7.16.0", - "@vitejs/plugin-react": "^4.3.1", + "@clerk/tanstack-start": "0.4.1", + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", + "@tanstack/router-plugin": "^1.58.4", + "@tanstack/start": "^1.58.5", "dotenv": "^16.4.5", - "isbot": "^5.1.12", + "isbot": "^5.1.17", "react": "^18.3.1", "react-dom": "^18.3.1", "redaxios": "^0.5.1", "remix-auth-form": "^1.5.0", - "tailwind-merge": "^2.4.0", - "vinxi": "0.3.12" + "tailwind-merge": "^2.5.2", + "vinxi": "0.4.3" }, "devDependencies": { - "@playwright/test": "^1.45.1", - "@replayio/playwright": "^3.1.8", - "@types/node": "^20.12.11", + "@types/node": "^22.5.4", "@types/react": "^18.2.65", "@types/react-dom": "^18.2.21", "@vitejs/plugin-react": "^4.3.1", - "autoprefixer": "^10.4.19", - "eslint": "^8.57.0", - "eslint-config-react-app": "^7.0.1", - "postcss": "^8.4.39", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.47", "prettier": "^3.3.3", - "tailwindcss": "^3.4.4", - "typescript": "^5.5.3", - "vite": "^5.3.3", - "vite-tsconfig-paths": "^4.3.2" + "tailwindcss": "^3.4.11", + "typescript": "^5.6.2", + "vite": "^5.4.5", + "vite-tsconfig-paths": "^5.0.1" } } diff --git a/examples/react/start-convex-trellaux/.eslintrc b/examples/react/start-convex-trellaux/.eslintrc deleted file mode 100644 index af7fa28f83..0000000000 --- a/examples/react/start-convex-trellaux/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": ["react-app"], - "parser": "@typescript-eslint/parser", - "plugins": ["react-hooks"] -} diff --git a/examples/react/start-convex-trellaux/app/routeTree.gen.ts b/examples/react/start-convex-trellaux/app/routeTree.gen.ts index 53cf865266..05b9df8269 100644 --- a/examples/react/start-convex-trellaux/app/routeTree.gen.ts +++ b/examples/react/start-convex-trellaux/app/routeTree.gen.ts @@ -49,10 +49,44 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ - IndexRoute, - BoardsBoardIdRoute, -}) +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/boards/$boardId': typeof BoardsBoardIdRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/boards/$boardId': typeof BoardsBoardIdRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/boards/$boardId': typeof BoardsBoardIdRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '/boards/$boardId' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/boards/$boardId' + id: '__root__' | '/' | '/boards/$boardId' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + BoardsBoardIdRoute: typeof BoardsBoardIdRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + BoardsBoardIdRoute: BoardsBoardIdRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ diff --git a/examples/react/start-convex-trellaux/app/router.tsx b/examples/react/start-convex-trellaux/app/router.tsx index 8942fef5f4..f3bfd4a02c 100644 --- a/examples/react/start-convex-trellaux/app/router.tsx +++ b/examples/react/start-convex-trellaux/app/router.tsx @@ -19,7 +19,7 @@ export function createRouter() { const CONVEX_URL = (import.meta as any).env.VITE_CONVEX_URL! if (!CONVEX_URL) { - throw new Error('missing envar') + console.error('missing envar CONVEX_URL') } const convexQueryClient = new ConvexQueryClient(CONVEX_URL) diff --git a/examples/react/start-convex-trellaux/convex/_generated/api.d.ts b/examples/react/start-convex-trellaux/convex/_generated/api.d.ts index e0ff5e0653..6158319746 100644 --- a/examples/react/start-convex-trellaux/convex/_generated/api.d.ts +++ b/examples/react/start-convex-trellaux/convex/_generated/api.d.ts @@ -4,7 +4,6 @@ * * THIS CODE IS AUTOMATICALLY GENERATED. * - * Generated by convex@1.13.2. * To regenerate, run `npx convex dev`. * @module */ diff --git a/examples/react/start-convex-trellaux/convex/_generated/api.js b/examples/react/start-convex-trellaux/convex/_generated/api.js index 72032d5575..2b62e6b82f 100644 --- a/examples/react/start-convex-trellaux/convex/_generated/api.js +++ b/examples/react/start-convex-trellaux/convex/_generated/api.js @@ -4,7 +4,6 @@ * * THIS CODE IS AUTOMATICALLY GENERATED. * - * Generated by convex@1.13.2. * To regenerate, run `npx convex dev`. * @module */ diff --git a/examples/react/start-convex-trellaux/convex/_generated/dataModel.d.ts b/examples/react/start-convex-trellaux/convex/_generated/dataModel.d.ts index 9f252168ef..5b936a43a0 100644 --- a/examples/react/start-convex-trellaux/convex/_generated/dataModel.d.ts +++ b/examples/react/start-convex-trellaux/convex/_generated/dataModel.d.ts @@ -4,7 +4,6 @@ * * THIS CODE IS AUTOMATICALLY GENERATED. * - * Generated by convex@1.13.2. * To regenerate, run `npx convex dev`. * @module */ diff --git a/examples/react/start-convex-trellaux/convex/_generated/server.d.ts b/examples/react/start-convex-trellaux/convex/_generated/server.d.ts index 948e82a490..869a677bc4 100644 --- a/examples/react/start-convex-trellaux/convex/_generated/server.d.ts +++ b/examples/react/start-convex-trellaux/convex/_generated/server.d.ts @@ -4,7 +4,6 @@ * * THIS CODE IS AUTOMATICALLY GENERATED. * - * Generated by convex@1.13.2. * To regenerate, run `npx convex dev`. * @module */ diff --git a/examples/react/start-convex-trellaux/convex/_generated/server.js b/examples/react/start-convex-trellaux/convex/_generated/server.js index c60175993d..d16f9527d3 100644 --- a/examples/react/start-convex-trellaux/convex/_generated/server.js +++ b/examples/react/start-convex-trellaux/convex/_generated/server.js @@ -4,7 +4,6 @@ * * THIS CODE IS AUTOMATICALLY GENERATED. * - * Generated by convex@1.13.2. * To regenerate, run `npx convex dev`. * @module */ diff --git a/examples/react/start-convex-trellaux/package.json b/examples/react/start-convex-trellaux/package.json index 1abb664635..90814bce80 100644 --- a/examples/react/start-convex-trellaux/package.json +++ b/examples/react/start-convex-trellaux/package.json @@ -1,10 +1,10 @@ { - "name": "tanstack-router-example-react-start-trello-trellaux", + "name": "tanstack-start-example-convex-trellaux", "private": true, "sideEffects": false, "type": "module", "scripts": { - "dev": "convex init && concurrently -r npm:dev:web npm:dev:db", + "dev": "npx convex dev --once && concurrently -r npm:dev:web npm:dev:db", "dev:web": "vinxi dev", "dev:db": "convex dev --run board:seed", "build": "vinxi build", @@ -13,28 +13,26 @@ "format": "prettier --write '**/*' --ignore-unknown" }, "dependencies": { - "@tanstack/react-query": "^5.51.21", - "@tanstack/react-query-devtools": "^5.51.21", - "@tanstack/react-router": "^1.51.2", - "@tanstack/react-router-with-query": "^1.51.2", - "@tanstack/router-devtools": "^1.51.2", - "@tanstack/router-plugin": "^1.51.0", - "@tanstack/start": "^1.51.2", - "@typescript-eslint/parser": "^7.18.0", - "@vitejs/plugin-react": "^4.3.1", + "@tanstack/react-query": "^5.56.2", + "@tanstack/react-query-devtools": "^5.56.2", + "@tanstack/react-router": "^1.58.3", + "@tanstack/react-router-with-query": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", + "@tanstack/router-plugin": "^1.58.4", + "@tanstack/start": "^1.58.5", "@convex-dev/react-query": "0.0.0-alpha.5", "concurrently": "^8.2.2", - "convex": "^1.13.2", - "isbot": "^5.1.14", - "ky": "^1.5.0", - "msw": "^2.3.5", + "convex": "^1.16.0", + "isbot": "^5.1.17", + "ky": "^1.7.2", + "msw": "^2.4.7", "react": "^18.3.1", "react-dom": "^18.3.1", "react-hot-toast": "^2.4.1", "redaxios": "^0.5.1", - "tailwind-merge": "^2.4.0", + "tailwind-merge": "^2.5.2", "tiny-invariant": "^1.3.3", - "vinxi": "0.4.1", + "vinxi": "0.4.3", "zod": "^3.23.8" }, "devDependencies": { @@ -42,13 +40,11 @@ "@types/react-dom": "^18.2.21", "@vitejs/plugin-react": "^4.3.1", "autoprefixer": "^10.4.20", - "eslint": "^8.57.0", - "eslint-config-react-app": "^7.0.1", - "postcss": "^8.4.40", + "postcss": "^8.4.47", "prettier": "^3.3.3", - "tailwindcss": "^3.4.7", - "typescript": "^5.5.3", - "vite": "^5.3.5", - "vite-tsconfig-paths": "^4.3.2" + "tailwindcss": "^3.4.11", + "typescript": "^5.6.2", + "vite": "^5.4.5", + "vite-tsconfig-paths": "^5.0.1" } } diff --git a/examples/react/start-supabase-basic/.env b/examples/react/start-supabase-basic/.env new file mode 100644 index 0000000000..a7cff24af4 --- /dev/null +++ b/examples/react/start-supabase-basic/.env @@ -0,0 +1,2 @@ +SUPABASE_URL=PleaseChangeMe +SUPABASE_ANON_KEY=PleaseChangeMe \ No newline at end of file diff --git a/examples/react/start-supabase-basic/.gitignore b/examples/react/start-supabase-basic/.gitignore new file mode 100644 index 0000000000..5578fb7487 --- /dev/null +++ b/examples/react/start-supabase-basic/.gitignore @@ -0,0 +1,24 @@ +node_modules +# Keep environment variables out of version control +!.env +package-lock.json +yarn.lock + +.DS_Store +.cache +.env +.vercel +.output +.vinxi + +/build/ +/api/ +/server/build +/public/build +.vinxi +# Sentry Config File +.env.sentry-build-plugin +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/examples/react/start-supabase-basic/app.config.ts b/examples/react/start-supabase-basic/app.config.ts new file mode 100644 index 0000000000..a1ee0f2776 --- /dev/null +++ b/examples/react/start-supabase-basic/app.config.ts @@ -0,0 +1,3 @@ +import { defineConfig } from '@tanstack/start/config' + +export default defineConfig({}) diff --git a/examples/react/start-supabase-basic/app/client.tsx b/examples/react/start-supabase-basic/app/client.tsx new file mode 100644 index 0000000000..f50c0354d4 --- /dev/null +++ b/examples/react/start-supabase-basic/app/client.tsx @@ -0,0 +1,8 @@ +// app/client.tsx +import { hydrateRoot } from 'react-dom/client' +import { StartClient } from '@tanstack/start' +import { createRouter } from './router' + +const router = createRouter() + +hydrateRoot(document.getElementById('root')!, ) diff --git a/examples/react/start-supabase-basic/app/components/Auth.tsx b/examples/react/start-supabase-basic/app/components/Auth.tsx new file mode 100644 index 0000000000..7504f8649b --- /dev/null +++ b/examples/react/start-supabase-basic/app/components/Auth.tsx @@ -0,0 +1,57 @@ +export function Auth({ + actionText, + onSubmit, + status, + afterSubmit, +}: { + actionText: string + onSubmit: (e: React.FormEvent) => void + status: 'pending' | 'idle' | 'success' | 'error' + afterSubmit?: React.ReactNode +}) { + return ( +
+
+

{actionText}

+
{ + e.preventDefault() + onSubmit(e) + }} + className="space-y-4" + > +
+ + +
+
+ + +
+ + {afterSubmit ? afterSubmit : null} +
+
+
+ ) +} diff --git a/examples/react/start-supabase-basic/app/components/DefaultCatchBoundary.tsx b/examples/react/start-supabase-basic/app/components/DefaultCatchBoundary.tsx new file mode 100644 index 0000000000..e646acbd45 --- /dev/null +++ b/examples/react/start-supabase-basic/app/components/DefaultCatchBoundary.tsx @@ -0,0 +1,55 @@ +import { + ErrorComponent, + Link, + rootRouteId, + // ErrorComponentProps, + useMatch, + useRouter, +} from '@tanstack/react-router' +import * as React from 'react' +import type { ErrorComponentProps } from '@tanstack/react-router' + +export function DefaultCatchBoundary({ error }: ErrorComponentProps) { + const router = useRouter() + const isRoot = useMatch({ + strict: false, + select: (state) => state.id === rootRouteId, + }) + + console.error(error) + + return ( +
+ +
+ + {isRoot ? ( + + Home + + ) : ( + { + e.preventDefault() + window.history.back() + }} + > + Go Back + + )} +
+
+ ) +} diff --git a/examples/react/start-supabase-basic/app/components/Login.tsx b/examples/react/start-supabase-basic/app/components/Login.tsx new file mode 100644 index 0000000000..8c0d0e073b --- /dev/null +++ b/examples/react/start-supabase-basic/app/components/Login.tsx @@ -0,0 +1,68 @@ +import { useRouter } from '@tanstack/react-router' +import { useServerFn } from '@tanstack/start' +import { useMutation } from '../hooks/useMutation' +import { loginFn } from '../routes/_authed' +import { signupFn } from '../routes/signup' +import { Auth } from './Auth' + +export function Login() { + const router = useRouter() + + const loginMutation = useMutation({ + fn: loginFn, + onSuccess: async (ctx) => { + if (!ctx.data?.error) { + await router.invalidate() + router.navigate({ to: '/' }) + return + } + }, + }) + + const signupMutation = useMutation({ + fn: useServerFn(signupFn), + }) + + return ( + { + const formData = new FormData(e.target as HTMLFormElement) + + loginMutation.mutate({ + email: formData.get('email') as string, + password: formData.get('password') as string, + }) + }} + afterSubmit={ + loginMutation.data ? ( + <> +
{loginMutation.data.message}
+ {loginMutation.data.error && + loginMutation.data.message === 'Invalid login credentials' ? ( +
+ +
+ ) : null} + + ) : null + } + /> + ) +} diff --git a/examples/react/start-supabase-basic/app/components/NotFound.tsx b/examples/react/start-supabase-basic/app/components/NotFound.tsx new file mode 100644 index 0000000000..7b54fa5680 --- /dev/null +++ b/examples/react/start-supabase-basic/app/components/NotFound.tsx @@ -0,0 +1,25 @@ +import { Link } from '@tanstack/react-router' + +export function NotFound({ children }: { children?: any }) { + return ( +
+
+ {children ||

The page you are looking for does not exist.

} +
+

+ + + Start Over + +

+
+ ) +} diff --git a/examples/react/start-supabase-basic/app/hooks/useMutation.ts b/examples/react/start-supabase-basic/app/hooks/useMutation.ts new file mode 100644 index 0000000000..1ff7a4653b --- /dev/null +++ b/examples/react/start-supabase-basic/app/hooks/useMutation.ts @@ -0,0 +1,44 @@ +import * as React from 'react' + +export function useMutation(opts: { + fn: (variables: TVariables) => Promise + onSuccess?: (ctx: { data: TData }) => void | Promise +}) { + const [submittedAt, setSubmittedAt] = React.useState() + const [variables, setVariables] = React.useState() + const [error, setError] = React.useState() + const [data, setData] = React.useState() + const [status, setStatus] = React.useState< + 'idle' | 'pending' | 'success' | 'error' + >('idle') + + const mutate = React.useCallback( + async (variables: TVariables): Promise => { + setStatus('pending') + setSubmittedAt(Date.now()) + setVariables(variables) + // + try { + const data = await opts.fn(variables) + await opts.onSuccess?.({ data }) + setStatus('success') + setError(undefined) + setData(data) + return data + } catch (err: any) { + setStatus('error') + setError(err) + } + }, + [opts.fn], + ) + + return { + status, + variables, + submittedAt, + mutate, + error, + data, + } +} diff --git a/examples/react/start-supabase-basic/app/routeTree.gen.ts b/examples/react/start-supabase-basic/app/routeTree.gen.ts new file mode 100644 index 0000000000..5057c1f72b --- /dev/null +++ b/examples/react/start-supabase-basic/app/routeTree.gen.ts @@ -0,0 +1,285 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/__root' +import { Route as SignupImport } from './routes/signup' +import { Route as LogoutImport } from './routes/logout' +import { Route as LoginImport } from './routes/login' +import { Route as AuthedImport } from './routes/_authed' +import { Route as IndexImport } from './routes/index' +import { Route as AuthedPostsImport } from './routes/_authed/posts' +import { Route as AuthedPostsIndexImport } from './routes/_authed/posts.index' +import { Route as AuthedPostsPostIdImport } from './routes/_authed/posts.$postId' + +// Create/Update Routes + +const SignupRoute = SignupImport.update({ + path: '/signup', + getParentRoute: () => rootRoute, +} as any) + +const LogoutRoute = LogoutImport.update({ + path: '/logout', + getParentRoute: () => rootRoute, +} as any) + +const LoginRoute = LoginImport.update({ + path: '/login', + getParentRoute: () => rootRoute, +} as any) + +const AuthedRoute = AuthedImport.update({ + id: '/_authed', + getParentRoute: () => rootRoute, +} as any) + +const IndexRoute = IndexImport.update({ + path: '/', + getParentRoute: () => rootRoute, +} as any) + +const AuthedPostsRoute = AuthedPostsImport.update({ + path: '/posts', + getParentRoute: () => AuthedRoute, +} as any) + +const AuthedPostsIndexRoute = AuthedPostsIndexImport.update({ + path: '/', + getParentRoute: () => AuthedPostsRoute, +} as any) + +const AuthedPostsPostIdRoute = AuthedPostsPostIdImport.update({ + path: '/$postId', + getParentRoute: () => AuthedPostsRoute, +} as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexImport + parentRoute: typeof rootRoute + } + '/_authed': { + id: '/_authed' + path: '' + fullPath: '' + preLoaderRoute: typeof AuthedImport + parentRoute: typeof rootRoute + } + '/login': { + id: '/login' + path: '/login' + fullPath: '/login' + preLoaderRoute: typeof LoginImport + parentRoute: typeof rootRoute + } + '/logout': { + id: '/logout' + path: '/logout' + fullPath: '/logout' + preLoaderRoute: typeof LogoutImport + parentRoute: typeof rootRoute + } + '/signup': { + id: '/signup' + path: '/signup' + fullPath: '/signup' + preLoaderRoute: typeof SignupImport + parentRoute: typeof rootRoute + } + '/_authed/posts': { + id: '/_authed/posts' + path: '/posts' + fullPath: '/posts' + preLoaderRoute: typeof AuthedPostsImport + parentRoute: typeof AuthedImport + } + '/_authed/posts/$postId': { + id: '/_authed/posts/$postId' + path: '/$postId' + fullPath: '/posts/$postId' + preLoaderRoute: typeof AuthedPostsPostIdImport + parentRoute: typeof AuthedPostsImport + } + '/_authed/posts/': { + id: '/_authed/posts/' + path: '/' + fullPath: '/posts/' + preLoaderRoute: typeof AuthedPostsIndexImport + parentRoute: typeof AuthedPostsImport + } + } +} + +// Create and export the route tree + +interface AuthedPostsRouteChildren { + AuthedPostsPostIdRoute: typeof AuthedPostsPostIdRoute + AuthedPostsIndexRoute: typeof AuthedPostsIndexRoute +} + +const AuthedPostsRouteChildren: AuthedPostsRouteChildren = { + AuthedPostsPostIdRoute: AuthedPostsPostIdRoute, + AuthedPostsIndexRoute: AuthedPostsIndexRoute, +} + +const AuthedPostsRouteWithChildren = AuthedPostsRoute._addFileChildren( + AuthedPostsRouteChildren, +) + +interface AuthedRouteChildren { + AuthedPostsRoute: typeof AuthedPostsRouteWithChildren +} + +const AuthedRouteChildren: AuthedRouteChildren = { + AuthedPostsRoute: AuthedPostsRouteWithChildren, +} + +const AuthedRouteWithChildren = + AuthedRoute._addFileChildren(AuthedRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '': typeof AuthedRouteWithChildren + '/login': typeof LoginRoute + '/logout': typeof LogoutRoute + '/signup': typeof SignupRoute + '/posts': typeof AuthedPostsRouteWithChildren + '/posts/$postId': typeof AuthedPostsPostIdRoute + '/posts/': typeof AuthedPostsIndexRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '': typeof AuthedRouteWithChildren + '/login': typeof LoginRoute + '/logout': typeof LogoutRoute + '/signup': typeof SignupRoute + '/posts/$postId': typeof AuthedPostsPostIdRoute + '/posts': typeof AuthedPostsIndexRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/_authed': typeof AuthedRouteWithChildren + '/login': typeof LoginRoute + '/logout': typeof LogoutRoute + '/signup': typeof SignupRoute + '/_authed/posts': typeof AuthedPostsRouteWithChildren + '/_authed/posts/$postId': typeof AuthedPostsPostIdRoute + '/_authed/posts/': typeof AuthedPostsIndexRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '' + | '/login' + | '/logout' + | '/signup' + | '/posts' + | '/posts/$postId' + | '/posts/' + fileRoutesByTo: FileRoutesByTo + to: '/' | '' | '/login' | '/logout' | '/signup' | '/posts/$postId' | '/posts' + id: + | '__root__' + | '/' + | '/_authed' + | '/login' + | '/logout' + | '/signup' + | '/_authed/posts' + | '/_authed/posts/$postId' + | '/_authed/posts/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + AuthedRoute: typeof AuthedRouteWithChildren + LoginRoute: typeof LoginRoute + LogoutRoute: typeof LogoutRoute + SignupRoute: typeof SignupRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + AuthedRoute: AuthedRouteWithChildren, + LoginRoute: LoginRoute, + LogoutRoute: LogoutRoute, + SignupRoute: SignupRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [ + "/", + "/_authed", + "/login", + "/logout", + "/signup" + ] + }, + "/": { + "filePath": "index.tsx" + }, + "/_authed": { + "filePath": "_authed.tsx", + "children": [ + "/_authed/posts" + ] + }, + "/login": { + "filePath": "login.tsx" + }, + "/logout": { + "filePath": "logout.tsx" + }, + "/signup": { + "filePath": "signup.tsx" + }, + "/_authed/posts": { + "filePath": "_authed/posts.tsx", + "parent": "/_authed", + "children": [ + "/_authed/posts/$postId", + "/_authed/posts/" + ] + }, + "/_authed/posts/$postId": { + "filePath": "_authed/posts.$postId.tsx", + "parent": "/_authed/posts" + }, + "/_authed/posts/": { + "filePath": "_authed/posts.index.tsx", + "parent": "/_authed/posts" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/examples/react/start-supabase-basic/app/router.tsx b/examples/react/start-supabase-basic/app/router.tsx new file mode 100644 index 0000000000..dc640c5f4c --- /dev/null +++ b/examples/react/start-supabase-basic/app/router.tsx @@ -0,0 +1,17 @@ +// app/router.tsx +import { createRouter as createTanStackRouter } from '@tanstack/react-router' +import { routeTree } from './routeTree.gen' + +export function createRouter() { + const router = createTanStackRouter({ + routeTree, + }) + + return router +} + +declare module '@tanstack/react-router' { + interface Register { + router: ReturnType + } +} diff --git a/examples/react/start-supabase-basic/app/routes/__root.tsx b/examples/react/start-supabase-basic/app/routes/__root.tsx new file mode 100644 index 0000000000..ea0201289c --- /dev/null +++ b/examples/react/start-supabase-basic/app/routes/__root.tsx @@ -0,0 +1,143 @@ +import { + Link, + Outlet, + ScrollRestoration, + createRootRoute, +} from '@tanstack/react-router' +import { TanStackRouterDevtools } from '@tanstack/router-devtools' +import { + Body, + Head, + Html, + Meta, + Scripts, + createServerFn, +} from '@tanstack/start' +import * as React from 'react' +import { DefaultCatchBoundary } from '../components/DefaultCatchBoundary' +import { NotFound } from '../components/NotFound' +import appCss from '../styles/app.css?url' +import { seo } from '../utils/seo' +import { getSupabaseServerClient } from '../utils/supabase' + +const fetchUser = createServerFn('GET', async () => { + const supabase = await getSupabaseServerClient() + const { data, error } = await supabase.auth.getUser() + + if (!data.user?.email) { + return null + } + + return data.user +}) + +export const Route = createRootRoute({ + meta: () => [ + { + charSet: 'utf-8', + }, + { + name: 'viewport', + content: 'width=device-width, initial-scale=1', + }, + ...seo({ + title: + 'TanStack Start | Type-Safe, Client-First, Full-Stack React Framework', + description: `TanStack Start is a type-safe, client-first, full-stack React framework. `, + }), + ], + links: () => [ + { rel: 'stylesheet', href: appCss }, + { + rel: 'apple-touch-icon', + sizes: '180x180', + href: '/apple-touch-icon.png', + }, + { + rel: 'icon', + type: 'image/png', + sizes: '32x32', + href: '/favicon-32x32.png', + }, + { + rel: 'icon', + type: 'image/png', + sizes: '16x16', + href: '/favicon-16x16.png', + }, + { rel: 'manifest', href: '/site.webmanifest', color: '#fffff' }, + { rel: 'icon', href: '/favicon.ico' }, + ], + beforeLoad: async () => { + const user = await fetchUser() + + return { + user, + } + }, + errorComponent: (props) => { + return ( + + + + ) + }, + notFoundComponent: () => , + component: RootComponent, +}) + +function RootComponent() { + return ( + + + + ) +} + +function RootDocument({ children }: { children: React.ReactNode }) { + const { user } = Route.useRouteContext() + + return ( + + + + + +
+ + Home + {' '} + + Posts + +
+ {user ? ( + <> + {user.email} + Logout + + ) : ( + Login + )} +
+
+
+ {children} + + + + + + ) +} diff --git a/examples/react/start-supabase-basic/app/routes/_authed.tsx b/examples/react/start-supabase-basic/app/routes/_authed.tsx new file mode 100644 index 0000000000..355df14255 --- /dev/null +++ b/examples/react/start-supabase-basic/app/routes/_authed.tsx @@ -0,0 +1,42 @@ +import { createFileRoute } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/start' +import { Login } from '../components/Login' +import { getSupabaseServerClient } from '../utils/supabase' + +export const loginFn = createServerFn( + 'POST', + async ( + payload: { + email: string + password: string + }, + { request }, + ) => { + const supabase = await getSupabaseServerClient() + const { data, error } = await supabase.auth.signInWithPassword({ + email: payload.email, + password: payload.password, + }) + if (error) { + return { + error: true, + message: error.message, + } + } + }, +) + +export const Route = createFileRoute('/_authed')({ + beforeLoad: ({ context }) => { + if (!context.user) { + throw new Error('Not authenticated') + } + }, + errorComponent: ({ error }) => { + if (error.message === 'Not authenticated') { + return + } + + throw error + }, +}) diff --git a/examples/react/start-supabase-basic/app/routes/_authed/posts.$postId.tsx b/examples/react/start-supabase-basic/app/routes/_authed/posts.$postId.tsx new file mode 100644 index 0000000000..e5519c1d0d --- /dev/null +++ b/examples/react/start-supabase-basic/app/routes/_authed/posts.$postId.tsx @@ -0,0 +1,28 @@ +import { ErrorComponent, createFileRoute } from '@tanstack/react-router' +import { NotFound } from '../../components/NotFound' +import { fetchPost } from '../../utils/posts' +import type { ErrorComponentProps } from '@tanstack/react-router' + +export const Route = createFileRoute('/_authed/posts/$postId')({ + loader: ({ params: { postId } }) => fetchPost(postId), + errorComponent: PostErrorComponent as any, + component: PostComponent, + notFoundComponent: () => { + return Post not found + }, +}) + +export function PostErrorComponent({ error }: ErrorComponentProps) { + return +} + +function PostComponent() { + const post = Route.useLoaderData() + + return ( +
+

{post.title}

+
{post.body}
+
+ ) +} diff --git a/examples/react/start-supabase-basic/app/routes/_authed/posts.index.tsx b/examples/react/start-supabase-basic/app/routes/_authed/posts.index.tsx new file mode 100644 index 0000000000..ea9e667e54 --- /dev/null +++ b/examples/react/start-supabase-basic/app/routes/_authed/posts.index.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_authed/posts/')({ + component: PostsIndexComponent, +}) + +function PostsIndexComponent() { + return
Select a post.
+} diff --git a/examples/react/start-supabase-basic/app/routes/_authed/posts.tsx b/examples/react/start-supabase-basic/app/routes/_authed/posts.tsx new file mode 100644 index 0000000000..f7d863b8b9 --- /dev/null +++ b/examples/react/start-supabase-basic/app/routes/_authed/posts.tsx @@ -0,0 +1,38 @@ +import { Link, Outlet, createFileRoute } from '@tanstack/react-router' +import { fetchPosts } from '../../utils/posts' + +export const Route = createFileRoute('/_authed/posts')({ + loader: () => fetchPosts(), + component: PostsComponent, +}) + +function PostsComponent() { + const posts = Route.useLoaderData() + + return ( +
+
    + {[...posts, { id: 'i-do-not-exist', title: 'Non-existent Post' }].map( + (post) => { + return ( +
  • + +
    {post.title.substring(0, 20)}
    + +
  • + ) + }, + )} +
+
+ +
+ ) +} diff --git a/examples/react/start-supabase-basic/app/routes/index.tsx b/examples/react/start-supabase-basic/app/routes/index.tsx new file mode 100644 index 0000000000..09a907cb18 --- /dev/null +++ b/examples/react/start-supabase-basic/app/routes/index.tsx @@ -0,0 +1,13 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: Home, +}) + +function Home() { + return ( +
+

Welcome Home!!!

+
+ ) +} diff --git a/examples/react/start-supabase-basic/app/routes/login.tsx b/examples/react/start-supabase-basic/app/routes/login.tsx new file mode 100644 index 0000000000..64b539d819 --- /dev/null +++ b/examples/react/start-supabase-basic/app/routes/login.tsx @@ -0,0 +1,10 @@ +import { createFileRoute } from '@tanstack/react-router' +import { Login } from '../components/Login' + +export const Route = createFileRoute('/login')({ + component: LoginComp, +}) + +function LoginComp() { + return +} diff --git a/examples/react/start-supabase-basic/app/routes/logout.tsx b/examples/react/start-supabase-basic/app/routes/logout.tsx new file mode 100644 index 0000000000..0f38aa4b58 --- /dev/null +++ b/examples/react/start-supabase-basic/app/routes/logout.tsx @@ -0,0 +1,24 @@ +import { createFileRoute, redirect } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/start' +import { getSupabaseServerClient } from '../utils/supabase' + +const logoutFn = createServerFn('POST', async () => { + const supabase = await getSupabaseServerClient() + const { error } = await supabase.auth.signOut() + + if (error) { + return { + error: true, + message: error.message, + } + } + + throw redirect({ + href: '/', + }) +}) + +export const Route = createFileRoute('/logout')({ + preload: false, + loader: () => logoutFn(), +}) diff --git a/examples/react/start-supabase-basic/app/routes/signup.tsx b/examples/react/start-supabase-basic/app/routes/signup.tsx new file mode 100644 index 0000000000..f52ca14311 --- /dev/null +++ b/examples/react/start-supabase-basic/app/routes/signup.tsx @@ -0,0 +1,63 @@ +import { createFileRoute, redirect } from '@tanstack/react-router' +import { createServerFn, useServerFn } from '@tanstack/start' +import { useMutation } from '../hooks/useMutation' +import { Auth } from '../components/Auth' +import { getSupabaseServerClient } from '../utils/supabase' + +export const signupFn = createServerFn( + 'POST', + async (payload: { + email: string + password: string + redirectUrl?: string + }) => { + const supabase = await getSupabaseServerClient() + const { data, error } = await supabase.auth.signUp({ + email: payload.email, + password: payload.password, + }) + if (error) { + return { + error: true, + message: error.message, + } + } + + // Redirect to the prev page stored in the "redirect" search param + throw redirect({ + href: payload.redirectUrl || '/', + }) + }, +) + +export const Route = createFileRoute('/signup')({ + component: SignupComp, +}) + +function SignupComp() { + const signupMutation = useMutation({ + fn: useServerFn(signupFn), + }) + + return ( + { + const formData = new FormData(e.target as HTMLFormElement) + + signupMutation.mutate({ + email: formData.get('email') as string, + password: formData.get('password') as string, + }) + }} + afterSubmit={ + signupMutation.data?.error ? ( + <> +
{signupMutation.data.message}
+ + ) : null + } + /> + ) +} diff --git a/examples/react/start-supabase-basic/app/ssr.tsx b/examples/react/start-supabase-basic/app/ssr.tsx new file mode 100644 index 0000000000..3e41f64ff9 --- /dev/null +++ b/examples/react/start-supabase-basic/app/ssr.tsx @@ -0,0 +1,13 @@ +// app/ssr.tsx +import { + createStartHandler, + defaultStreamHandler, +} from '@tanstack/start/server' +import { getRouterManifest } from '@tanstack/start/router-manifest' + +import { createRouter } from './router' + +export default createStartHandler({ + createRouter, + getRouterManifest, +})(defaultStreamHandler) diff --git a/examples/react/start-supabase-basic/app/styles/app.css b/examples/react/start-supabase-basic/app/styles/app.css new file mode 100644 index 0000000000..d6426ccb72 --- /dev/null +++ b/examples/react/start-supabase-basic/app/styles/app.css @@ -0,0 +1,14 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + html, + body { + @apply text-gray-900 bg-gray-50 dark:bg-gray-950 dark:text-gray-200; + } + + .using-mouse * { + outline: none !important; + } +} diff --git a/examples/react/start-supabase-basic/app/utils/posts.ts b/examples/react/start-supabase-basic/app/utils/posts.ts new file mode 100644 index 0000000000..00fc9ae143 --- /dev/null +++ b/examples/react/start-supabase-basic/app/utils/posts.ts @@ -0,0 +1,33 @@ +import { notFound } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/start' +import axios from 'redaxios' + +export type PostType = { + id: string + title: string + body: string +} + +export const fetchPost = createServerFn('GET', async (postId: string) => { + console.info(`Fetching post with id ${postId}...`) + const post = await axios + .get(`https://jsonplaceholder.typicode.com/posts/${postId}`) + .then((r) => r.data) + .catch((err) => { + console.error(err) + if (err.status === 404) { + throw notFound() + } + throw err + }) + + return post +}) + +export const fetchPosts = createServerFn('GET', async () => { + console.info('Fetching posts...') + await new Promise((r) => setTimeout(r, 1000)) + return axios + .get>('https://jsonplaceholder.typicode.com/posts') + .then((r) => r.data.slice(0, 10)) +}) diff --git a/examples/react/start-supabase-basic/app/utils/seo.ts b/examples/react/start-supabase-basic/app/utils/seo.ts new file mode 100644 index 0000000000..d18ad84b74 --- /dev/null +++ b/examples/react/start-supabase-basic/app/utils/seo.ts @@ -0,0 +1,33 @@ +export const seo = ({ + title, + description, + keywords, + image, +}: { + title: string + description?: string + image?: string + keywords?: string +}) => { + const tags = [ + { title }, + { name: 'description', content: description }, + { name: 'keywords', content: keywords }, + { name: 'twitter:title', content: title }, + { name: 'twitter:description', content: description }, + { name: 'twitter:creator', content: '@tannerlinsley' }, + { name: 'twitter:site', content: '@tannerlinsley' }, + { name: 'og:type', content: 'website' }, + { name: 'og:title', content: title }, + { name: 'og:description', content: description }, + ...(image + ? [ + { name: 'twitter:image', content: image }, + { name: 'twitter:card', content: 'summary_large_image' }, + { name: 'og:image', content: image }, + ] + : []), + ] + + return tags +} diff --git a/examples/react/start-supabase-basic/app/utils/supabase.ts b/examples/react/start-supabase-basic/app/utils/supabase.ts new file mode 100644 index 0000000000..b7d33639d4 --- /dev/null +++ b/examples/react/start-supabase-basic/app/utils/supabase.ts @@ -0,0 +1,25 @@ +import { parseCookies, setCookie } from 'vinxi/http' +import { createServerClient } from '@supabase/ssr' + +export function getSupabaseServerClient() { + return createServerClient( + process.env.SUPABASE_URL!, + process.env.SUPABASE_ANON_KEY!, + { + cookies: { + // @ts-ignore Wait till Supabase overload works + getAll() { + return Object.entries(parseCookies()).map(([name, value]) => ({ + name, + value, + })) + }, + setAll(cookies) { + cookies.forEach((cookie) => { + setCookie(cookie.name, cookie.value) + }) + }, + }, + }, + ) +} diff --git a/examples/react/start-supabase-basic/package.json b/examples/react/start-supabase-basic/package.json new file mode 100644 index 0000000000..92efdeecbc --- /dev/null +++ b/examples/react/start-supabase-basic/package.json @@ -0,0 +1,35 @@ +{ + "name": "tanstack-start-example-supabase-basic", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "dev": "vinxi dev", + "build": "vinxi build", + "start": "vinxi start" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@supabase/ssr": "^0.5.1", + "@supabase/supabase-js": "^2.45.4", + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-plugin": "^1.58.4", + "@tanstack/router-devtools": "^1.58.3", + "@tanstack/start": "^1.58.5", + "@vitejs/plugin-react": "^4.3.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "vinxi": "0.4.3" + }, + "devDependencies": { + "@types/react": "^18.3.5", + "@types/react-dom": "^18.3.0", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.47", + "tailwindcss": "^3.4.11", + "typescript": "^5.6.2" + } +} diff --git a/examples/react/start-supabase-basic/postcss.config.js b/examples/react/start-supabase-basic/postcss.config.js new file mode 100644 index 0000000000..f8316554c6 --- /dev/null +++ b/examples/react/start-supabase-basic/postcss.config.js @@ -0,0 +1,7 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + 'tailwindcss/nesting': {}, + }, +} diff --git a/examples/react/start-supabase-basic/tailwind.config.js b/examples/react/start-supabase-basic/tailwind.config.js new file mode 100644 index 0000000000..bb1025f91c --- /dev/null +++ b/examples/react/start-supabase-basic/tailwind.config.js @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./app/**/*.{js,ts,jsx,tsx}'], + theme: { + extend: {}, + }, + plugins: [], +} diff --git a/examples/react/start-supabase-basic/tailwind.config.ts b/examples/react/start-supabase-basic/tailwind.config.ts new file mode 100644 index 0000000000..d0253e59a8 --- /dev/null +++ b/examples/react/start-supabase-basic/tailwind.config.ts @@ -0,0 +1,9 @@ +import type { Config } from 'tailwindcss' + +export default { + content: [], + theme: { + extend: {}, + }, + plugins: [], +} satisfies Config diff --git a/examples/react/start-supabase-basic/tsconfig.json b/examples/react/start-supabase-basic/tsconfig.json new file mode 100644 index 0000000000..d1b5b77660 --- /dev/null +++ b/examples/react/start-supabase-basic/tsconfig.json @@ -0,0 +1,22 @@ +{ + "include": ["**/*.ts", "**/*.tsx"], + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "isolatedModules": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "target": "ES2022", + "allowJs": true, + "forceConsistentCasingInFileNames": true, + "baseUrl": ".", + "paths": { + "~/*": ["./app/*"] + }, + "noEmit": true + } +} diff --git a/examples/react/start-trellaux/.eslintrc b/examples/react/start-trellaux/.eslintrc deleted file mode 100644 index af7fa28f83..0000000000 --- a/examples/react/start-trellaux/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": ["react-app"], - "parser": "@typescript-eslint/parser", - "plugins": ["react-hooks"] -} diff --git a/examples/react/start-trellaux/app/routeTree.gen.ts b/examples/react/start-trellaux/app/routeTree.gen.ts index 53cf865266..05b9df8269 100644 --- a/examples/react/start-trellaux/app/routeTree.gen.ts +++ b/examples/react/start-trellaux/app/routeTree.gen.ts @@ -49,10 +49,44 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ - IndexRoute, - BoardsBoardIdRoute, -}) +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/boards/$boardId': typeof BoardsBoardIdRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/boards/$boardId': typeof BoardsBoardIdRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/boards/$boardId': typeof BoardsBoardIdRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '/boards/$boardId' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/boards/$boardId' + id: '__root__' | '/' | '/boards/$boardId' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + BoardsBoardIdRoute: typeof BoardsBoardIdRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + BoardsBoardIdRoute: BoardsBoardIdRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ diff --git a/examples/react/start-trellaux/package.json b/examples/react/start-trellaux/package.json index 4647fdba8f..2a8c9bf1eb 100644 --- a/examples/react/start-trellaux/package.json +++ b/examples/react/start-trellaux/package.json @@ -1,5 +1,5 @@ { - "name": "tanstack-router-example-react-start-basic-trellaux", + "name": "tanstack-start-example-trellaux", "private": true, "sideEffects": false, "type": "module", @@ -11,25 +11,23 @@ "format": "prettier --write '**/*' --ignore-unknown" }, "dependencies": { - "@tanstack/react-query": "^5.51.21", - "@tanstack/react-query-devtools": "^5.51.21", - "@tanstack/react-router": "^1.51.2", - "@tanstack/react-router-with-query": "^1.51.2", - "@tanstack/router-devtools": "^1.51.2", - "@tanstack/router-plugin": "^1.51.0", - "@tanstack/start": "^1.51.2", - "@typescript-eslint/parser": "^7.18.0", - "@vitejs/plugin-react": "^4.3.1", - "isbot": "^5.1.14", - "ky": "^1.5.0", - "msw": "^2.3.5", + "@tanstack/react-query": "^5.56.2", + "@tanstack/react-query-devtools": "^5.56.2", + "@tanstack/react-router": "^1.58.3", + "@tanstack/react-router-with-query": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", + "@tanstack/router-plugin": "^1.58.4", + "@tanstack/start": "^1.58.5", + "isbot": "^5.1.17", + "ky": "^1.7.2", + "msw": "^2.4.7", "react": "^18.3.1", "react-dom": "^18.3.1", "react-hot-toast": "^2.4.1", "redaxios": "^0.5.1", - "tailwind-merge": "^2.4.0", + "tailwind-merge": "^2.5.2", "tiny-invariant": "^1.3.3", - "vinxi": "0.4.1", + "vinxi": "0.4.3", "zod": "^3.23.8" }, "devDependencies": { @@ -37,13 +35,11 @@ "@types/react-dom": "^18.2.21", "@vitejs/plugin-react": "^4.3.1", "autoprefixer": "^10.4.20", - "eslint": "^8.57.0", - "eslint-config-react-app": "^7.0.1", - "postcss": "^8.4.40", + "postcss": "^8.4.47", "prettier": "^3.3.3", - "tailwindcss": "^3.4.7", - "typescript": "^5.5.3", - "vite": "^5.3.5", - "vite-tsconfig-paths": "^4.3.2" + "tailwindcss": "^3.4.11", + "typescript": "^5.6.2", + "vite": "^5.4.5", + "vite-tsconfig-paths": "^5.0.1" } } diff --git a/examples/react/with-framer-motion/package.json b/examples/react/with-framer-motion/package.json index 771085b048..1b545444d2 100644 --- a/examples/react/with-framer-motion/package.json +++ b/examples/react/with-framer-motion/package.json @@ -4,16 +4,15 @@ "type": "module", "scripts": { "dev": "vite --port=3001", - "build": "vite build", + "build": "vite build && tsc --noEmit", "serve": "vite preview", "start": "vite" }, "dependencies": { - "@tanstack/react-router": "^1.51.2", - "@tanstack/router-devtools": "^1.51.2", + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", "redaxios": "^0.5.1", - "framer-motion": "^11.3.21", - "immer": "^10.1.1", + "framer-motion": "^11.5.4", "react": "^18.2.0", "react-dom": "^18.2.0", "zod": "^3.23.8" @@ -22,6 +21,6 @@ "@types/react": "^18.2.47", "@types/react-dom": "^18.2.18", "@vitejs/plugin-react": "^4.3.1", - "vite": "^5.3.5" + "vite": "^5.4.5" } } diff --git a/examples/react/with-framer-motion/src/main.tsx b/examples/react/with-framer-motion/src/main.tsx index 93913e48cd..3ce3a89ea1 100644 --- a/examples/react/with-framer-motion/src/main.tsx +++ b/examples/react/with-framer-motion/src/main.tsx @@ -87,7 +87,7 @@ const rootRoute = createRootRoute({ Home {' '} () /* prettier-ignore-end */ diff --git a/examples/react/with-trpc-react-query/package.json b/examples/react/with-trpc-react-query/package.json index d71a1506a9..3b83fdc242 100644 --- a/examples/react/with-trpc-react-query/package.json +++ b/examples/react/with-trpc-react-query/package.json @@ -8,18 +8,18 @@ "start": "vinxi start" }, "dependencies": { - "@tanstack/react-query": "^5.51.21", - "@tanstack/react-query-devtools": "^5.51.21", - "@tanstack/react-router": "^1.51.2", - "@tanstack/router-devtools": "^1.51.2", - "@tanstack/router-plugin": "^1.51.0", - "@trpc/client": "11.0.0-rc.477", - "@trpc/react-query": "11.0.0-rc.477", - "@trpc/server": "11.0.0-rc.477", + "@tanstack/react-query": "^5.56.2", + "@tanstack/react-query-devtools": "^5.56.2", + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", + "@tanstack/router-plugin": "^1.58.4", + "@trpc/client": "11.0.0-rc.502", + "@trpc/react-query": "11.0.0-rc.502", + "@trpc/server": "11.0.0-rc.502", "react": "^18.2.0", "react-dom": "^18.2.0", "redaxios": "^0.5.1", - "vinxi": "0.4.1", + "vinxi": "0.4.3", "zod": "^3.23.8" }, "devDependencies": { diff --git a/examples/react/with-trpc-react-query/tsconfig.json b/examples/react/with-trpc-react-query/tsconfig.json index b50d8070ec..8db94c0f38 100644 --- a/examples/react/with-trpc-react-query/tsconfig.json +++ b/examples/react/with-trpc-react-query/tsconfig.json @@ -3,6 +3,8 @@ "strict": true, "esModuleInterop": true, "jsx": "react-jsx", + "target": "ESNext", + "moduleResolution": "Bundler", "skipLibCheck": true } } diff --git a/examples/react/with-trpc/app/routeTree.gen.ts b/examples/react/with-trpc/app/routeTree.gen.ts index e146506980..428a773af8 100644 --- a/examples/react/with-trpc/app/routeTree.gen.ts +++ b/examples/react/with-trpc/app/routeTree.gen.ts @@ -101,16 +101,95 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ - IndexRoute, - DashboardRoute: DashboardRoute.addChildren({ - DashboardPostsRoute: DashboardPostsRoute.addChildren({ - DashboardPostsPostIdRoute, - DashboardPostsIndexRoute, - }), - DashboardIndexRoute, - }), -}) +interface DashboardPostsRouteChildren { + DashboardPostsPostIdRoute: typeof DashboardPostsPostIdRoute + DashboardPostsIndexRoute: typeof DashboardPostsIndexRoute +} + +const DashboardPostsRouteChildren: DashboardPostsRouteChildren = { + DashboardPostsPostIdRoute: DashboardPostsPostIdRoute, + DashboardPostsIndexRoute: DashboardPostsIndexRoute, +} + +const DashboardPostsRouteWithChildren = DashboardPostsRoute._addFileChildren( + DashboardPostsRouteChildren, +) + +interface DashboardRouteChildren { + DashboardPostsRoute: typeof DashboardPostsRouteWithChildren + DashboardIndexRoute: typeof DashboardIndexRoute +} + +const DashboardRouteChildren: DashboardRouteChildren = { + DashboardPostsRoute: DashboardPostsRouteWithChildren, + DashboardIndexRoute: DashboardIndexRoute, +} + +const DashboardRouteWithChildren = DashboardRoute._addFileChildren( + DashboardRouteChildren, +) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/dashboard': typeof DashboardRouteWithChildren + '/dashboard/posts': typeof DashboardPostsRouteWithChildren + '/dashboard/': typeof DashboardIndexRoute + '/dashboard/posts/$postId': typeof DashboardPostsPostIdRoute + '/dashboard/posts/': typeof DashboardPostsIndexRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/dashboard': typeof DashboardIndexRoute + '/dashboard/posts/$postId': typeof DashboardPostsPostIdRoute + '/dashboard/posts': typeof DashboardPostsIndexRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/dashboard': typeof DashboardRouteWithChildren + '/dashboard/posts': typeof DashboardPostsRouteWithChildren + '/dashboard/': typeof DashboardIndexRoute + '/dashboard/posts/$postId': typeof DashboardPostsPostIdRoute + '/dashboard/posts/': typeof DashboardPostsIndexRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '/dashboard' + | '/dashboard/posts' + | '/dashboard/' + | '/dashboard/posts/$postId' + | '/dashboard/posts/' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/dashboard' | '/dashboard/posts/$postId' | '/dashboard/posts' + id: + | '__root__' + | '/' + | '/dashboard' + | '/dashboard/posts' + | '/dashboard/' + | '/dashboard/posts/$postId' + | '/dashboard/posts/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + DashboardRoute: typeof DashboardRouteWithChildren +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + DashboardRoute: DashboardRouteWithChildren, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ diff --git a/examples/react/with-trpc/package.json b/examples/react/with-trpc/package.json index 34cb7d541c..9746432176 100644 --- a/examples/react/with-trpc/package.json +++ b/examples/react/with-trpc/package.json @@ -8,15 +8,15 @@ "start": "vinxi start" }, "dependencies": { - "@tanstack/react-router": "^1.51.2", - "@tanstack/router-devtools": "^1.51.2", - "@tanstack/router-plugin": "^1.51.0", - "@trpc/client": "11.0.0-rc.477", - "@trpc/server": "11.0.0-rc.477", + "@tanstack/react-router": "^1.58.3", + "@tanstack/router-devtools": "^1.58.3", + "@tanstack/router-plugin": "^1.58.4", + "@trpc/client": "11.0.0-rc.502", + "@trpc/server": "11.0.0-rc.502", "react": "^18.2.0", "react-dom": "^18.2.0", "redaxios": "^0.5.1", - "vinxi": "0.4.1", + "vinxi": "0.4.3", "zod": "^3.23.8" }, "devDependencies": { diff --git a/examples/react/with-trpc/tsconfig.json b/examples/react/with-trpc/tsconfig.json index b50d8070ec..8db94c0f38 100644 --- a/examples/react/with-trpc/tsconfig.json +++ b/examples/react/with-trpc/tsconfig.json @@ -3,6 +3,8 @@ "strict": true, "esModuleInterop": true, "jsx": "react-jsx", + "target": "ESNext", + "moduleResolution": "Bundler", "skipLibCheck": true } } diff --git a/package.json b/package.json index 12cde525f3..f405581ea6 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "type": "git", "url": "https://github.com/TanStack/router.git" }, - "packageManager": "pnpm@9.6.0", + "packageManager": "pnpm@9.10.0", "type": "module", "scripts": { "clean": "pnpm --filter \"./packages/**\" run clean", @@ -13,15 +13,15 @@ "test": "pnpm run test:ci", "test:pr": "nx affected --targets=test:eslint,test:unit,test:e2e,test:types,test:build,build", "test:ci": "nx run-many --targets=test:eslint,test:unit,test:e2e,test:types,test:build,build", - "test:eslint": "nx affected --target=test:eslint --exclude=examples/**", + "test:eslint": "nx affected --target=test:eslint --exclude=examples/**,e2e/**", "test:format": "pnpm run prettier --check", - "test:unit": "nx affected --target=test:unit --exclude=examples/**", + "test:unit": "nx affected --target=test:unit --exclude=examples/**,e2e/**", "test:unit:dev": "pnpm run test:unit && nx watch --all -- pnpm run test:unit", "test:build": "nx affected --target=test:build --exclude=examples/**", "test:types": "nx affected --target=test:types --exclude=examples/**", "test:e2e": "nx run-many --target=test:e2e", - "build": "nx affected --target=build --exclude=examples/**", - "build:all": "nx run-many --target=build --exclude=examples/**", + "build": "nx affected --target=build --exclude=e2e/** --exclude=examples/**", + "build:all": "nx run-many --target=build --exclude=examples/** --exclude=e2e/** ", "watch": "pnpm run build:all && nx watch --all -- pnpm run build:all", "dev": "pnpm run watch", "prettier": "prettier --ignore-unknown '**/*'", @@ -30,30 +30,31 @@ "gpt-generate": "node gpt/generate.js" }, "devDependencies": { - "@eslint-react/eslint-plugin": "^1.8.2", - "@playwright/test": "^1.45.3", - "@rollup/plugin-replace": "^5.0.7", - "@tanstack/config": "^0.11.3", - "@types/node": "^20.14.7", + "@arethetypeswrong/cli": "^0.16.2", + "@eslint-react/eslint-plugin": "^1.14.1", + "@playwright/test": "^1.47.1", + "@tanstack/config": "^0.13.1", + "@types/node": "^22.5.4", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", - "eslint": "^8.57.0", - "eslint-plugin-react-hooks": "^4.6.2", + "eslint": "^9.10.0", + "eslint-plugin-react-hooks": "^5.1.0-rc-5dcb0097-20240918", "glob": "^10.4.5", - "nx": "^19.5.6", + "jsdom": "^25.0.0", + "nx": "^19.7.3", "prettier": "^3.3.3", - "publint": "^0.2.9", + "publint": "^0.2.10", "react": "^18.3.1", "react-dom": "^18.3.1", "redaxios": "^0.5.1", "rimraf": "^5.0.10", - "typescript": "^5.5.3", - "typescript50": "npm:typescript@5.0", + "typescript": "^5.6.2", "typescript51": "npm:typescript@5.1", "typescript52": "npm:typescript@5.2", "typescript53": "npm:typescript@5.3", "typescript54": "npm:typescript@5.4", - "vite": "^5.3.5", + "typescript55": "npm:typescript@5.5", + "vite": "^5.4.5", "vitest": "^1.6.0" }, "resolutions": { @@ -69,6 +70,7 @@ "@tanstack/router-cli": "workspace:*", "@tanstack/router-devtools": "workspace:*", "@tanstack/router-generator": "workspace:*", + "@tanstack/virtual-file-routes": "workspace:*", "@tanstack/router-plugin": "workspace:*", "@tanstack/router-vite-plugin": "workspace:*", "@tanstack/react-router-with-query": "workspace:*", @@ -77,6 +79,7 @@ "@tanstack/router-arktype-adapter": "workspace:*", "@tanstack/start": "workspace:*", "@tanstack/start-vite-plugin": "workspace:*", + "@tanstack/eslint-plugin-router": "workspace:*", "temp-react": "0.0.0-experimental-035a41c4e-20230704", "temp-react-dom": "0.0.0-experimental-035a41c4e-20230704" } diff --git a/packages/create-router/build.config.ts b/packages/create-router/build.config.ts new file mode 100644 index 0000000000..e61c91fb60 --- /dev/null +++ b/packages/create-router/build.config.ts @@ -0,0 +1,13 @@ +import { defineBuildConfig } from 'unbuild' + +export default defineBuildConfig({ + entries: ['src/index'], + clean: true, + rollup: { + inlineDependencies: true, + esbuild: { + target: 'node18', + minify: true, + }, + }, +}) diff --git a/packages/create-router/eslint.config.js b/packages/create-router/eslint.config.js new file mode 100644 index 0000000000..8ce6ad05fc --- /dev/null +++ b/packages/create-router/eslint.config.js @@ -0,0 +1,5 @@ +// @ts-check + +import rootConfig from '../../eslint.config.js' + +export default [...rootConfig] diff --git a/packages/create-router/index.js b/packages/create-router/index.js new file mode 100755 index 0000000000..f5e8e064a6 --- /dev/null +++ b/packages/create-router/index.js @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +import './dist/index.mjs' diff --git a/packages/create-router/package.json b/packages/create-router/package.json new file mode 100644 index 0000000000..c614950fa6 --- /dev/null +++ b/packages/create-router/package.json @@ -0,0 +1,123 @@ +{ + "name": "@tanstack/create-router", + "version": "1.58.4", + "description": "Modern and scalable routing for React applications", + "author": "Tanner Linsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/router.git", + "directory": "packages/create-router" + }, + "homepage": "https://tanstack.com/router", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "bin": { + "create-router": "index.js" + }, + "scripts": { + "dev": "unbuild --stub", + "clean": "rimraf ./dist && rimraf ./coverage", + "test:eslint": "eslint ./src", + "build": "unbuild" + }, + "type": "module", + "files": [ + "index.js", + "templates", + "dist" + ], + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "devDependencies": { + "@inquirer/prompts": "^5.5.0", + "@types/cross-spawn": "^6.0.6", + "@types/validate-npm-package-name": "^4.0.2", + "commander": "^12.1.0", + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.2", + "picocolors": "^1.1.0", + "unbuild": "^2.0.0", + "validate-npm-package-name": "^5.0.1", + "yocto-spinner": "^0.1.0" + }, + "peerDependencies": { + "@rsbuild/core": "^1.0.2", + "@rsbuild/plugin-react": "^1.0.1", + "@swc/core": "^1.7.25", + "@tanstack/react-router": "workspace:^", + "@tanstack/router-devtools": "workspace:^", + "@tanstack/router-plugin": "workspace:^", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "html-webpack-plugin": "^5.6.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "swc-loader": "^0.2.6", + "typescript": "^5.6.2", + "vite": "^5.4.4", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^5.1.0" + }, + "peerDependenciesMeta": { + "@tanstack/react-router": { + "optional": true + }, + "@tanstack/router-devtools": { + "optional": true + }, + "@tanstack/router-plugin": { + "optional": true + }, + "@vitejs/plugin-react": { + "optional": true + }, + "vite": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "html-webpack-plugin": { + "optional": true + }, + "swc-loader": { + "optional": true + }, + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "@rsbuild/core": { + "optional": true + }, + "@rsbuild/plugin-react": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "typescript": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } +} diff --git a/packages/create-router/src/bundler/index.ts b/packages/create-router/src/bundler/index.ts new file mode 100644 index 0000000000..78a0946fb4 --- /dev/null +++ b/packages/create-router/src/bundler/index.ts @@ -0,0 +1,16 @@ +import { apply as applyVite } from './vite' +import { apply as applyRspack } from './rspack' +import { apply as applyWebpack } from './webpack' +import type { Bundler } from '../constants' +import type { ApplyParams } from '../types' + +export function apply(bundler: Bundler, params: ApplyParams) { + switch (bundler) { + case 'vite': + return applyVite(params) + case 'rspack': + return applyRspack(params) + case 'webpack': + return applyWebpack(params) + } +} diff --git a/packages/create-router/src/bundler/rspack.ts b/packages/create-router/src/bundler/rspack.ts new file mode 100644 index 0000000000..d596b9cf85 --- /dev/null +++ b/packages/create-router/src/bundler/rspack.ts @@ -0,0 +1,27 @@ +import { copyTemplateFiles } from '../utils/copyTemplateFiles' +import type { ApplyParams, BundlerResult, PeerDependency } from '../types' + +export const scripts = { + dev: 'rsbuild dev --port 3001', + build: 'rsbuild build', + preview: 'rsbuild preview', +} as const + +export const devDependencies = [ + '@rsbuild/core', + '@rsbuild/plugin-react', +] as const satisfies Array + +export async function apply({ + targetFolder, +}: ApplyParams): Promise { + await copyTemplateFiles({ + file: '**/*', + sourceFolder: 'bundler/rspack', + targetFolder, + }) + return { + scripts, + devDependencies, + } +} diff --git a/packages/create-router/src/bundler/vite.ts b/packages/create-router/src/bundler/vite.ts new file mode 100644 index 0000000000..b0c4d042da --- /dev/null +++ b/packages/create-router/src/bundler/vite.ts @@ -0,0 +1,28 @@ +import { copyTemplateFiles } from '../utils/copyTemplateFiles' +import type { ApplyParams, BundlerResult, PeerDependency } from '../types' + +export const scripts = { + dev: 'vite --port=3001', + build: 'vite build', + serve: 'vite preview', + start: 'vite', +} as const + +export const devDependencies = [ + '@vitejs/plugin-react', + 'vite', +] as const satisfies Array + +export async function apply({ + targetFolder, +}: ApplyParams): Promise { + await copyTemplateFiles({ + file: '**/*', + sourceFolder: 'bundler/vite', + targetFolder, + }) + return { + scripts, + devDependencies, + } +} diff --git a/packages/create-router/src/bundler/webpack.ts b/packages/create-router/src/bundler/webpack.ts new file mode 100644 index 0000000000..2e6d198e25 --- /dev/null +++ b/packages/create-router/src/bundler/webpack.ts @@ -0,0 +1,30 @@ +import { copyTemplateFiles } from '../utils/copyTemplateFiles' +import type { ApplyParams, BundlerResult, PeerDependency } from '../types' + +export const scripts = { + dev: 'webpack serve --port 3001 --no-open', + build: 'webpack build', +} as const + +export const devDependencies = [ + '@swc/core', + 'html-webpack-plugin', + 'swc-loader', + 'webpack', + 'webpack-cli', + 'webpack-dev-server', +] as const satisfies Array + +export async function apply({ + targetFolder, +}: ApplyParams): Promise { + await copyTemplateFiles({ + file: '**/*', + sourceFolder: 'bundler/webpack', + targetFolder, + }) + return { + scripts, + devDependencies, + } +} diff --git a/packages/create-router/src/cli.ts b/packages/create-router/src/cli.ts new file mode 100644 index 0000000000..4b14a81004 --- /dev/null +++ b/packages/create-router/src/cli.ts @@ -0,0 +1,82 @@ +import { basename, resolve } from 'node:path' +import { Command, InvalidArgumentError } from 'commander' +import { + NAME, + SUPPORTED_BUNDLERS, + SUPPORTED_PACKAGE_MANAGERS, +} from './constants' +import { validateProjectName } from './utils/validateProjectName' +import { getPackageManager } from './utils/getPackageManager' +import { packageJson } from './utils/packageJson' +import type { Bundler, PackageManager } from './constants' + +let directory: string | undefined + +export const command = new Command(NAME) + .version( + packageJson.version, + '-v, --version', + `Output the current version of ${NAME}.`, + ) + .argument('[directory]') + .usage('[directory] [options]') + .helpOption('-h, --help', 'Display this help message.') + .option( + `--package-manager <${SUPPORTED_PACKAGE_MANAGERS.join('|')}>`, + `Explicitly tell the CLI to use this package manager`, + (value) => { + if (!SUPPORTED_PACKAGE_MANAGERS.includes(value as PackageManager)) { + throw new InvalidArgumentError( + `Invalid package manager: ${value}. Only the following are allowed: ${SUPPORTED_PACKAGE_MANAGERS.join(', ')}`, + ) + } + return value as PackageManager + }, + getPackageManager(), + ) + .option( + `--bundler <${SUPPORTED_BUNDLERS.join('|')}>`, + `use this bundler (${SUPPORTED_BUNDLERS.join(', ')})`, + (value) => { + if (!SUPPORTED_BUNDLERS.includes(value as Bundler)) { + throw new InvalidArgumentError( + `Invalid bundler: ${value}. Only the following are allowed: ${SUPPORTED_BUNDLERS.join(', ')}`, + ) + } + return value as Bundler + }, + ) + .option( + '--skip-install', + 'Explicitly tell the CLI to skip installing packages.', + false, + ) + .option( + '--skip-build', + 'Explicitly tell the CLI to skip building the newly generated project.', + false, + ) + .action((name) => { + if (typeof name === 'string') { + name = name.trim() + } + if (name) { + const validation = validateProjectName(basename(resolve(name))) + if (!validation.valid) { + throw new InvalidArgumentError( + `Invalid project name: ${validation.problems[0]}`, + ) + } + directory = name + } + }) + .parse() + +const options = command.opts<{ + packageManager: PackageManager | undefined + bundler: Bundler | undefined + skipInstall: boolean + skipBuild: false +}>() + +export const cli = { options, args: command.args, directory } diff --git a/packages/create-router/src/constants.ts b/packages/create-router/src/constants.ts new file mode 100644 index 0000000000..5ed4f5711d --- /dev/null +++ b/packages/create-router/src/constants.ts @@ -0,0 +1,21 @@ +import { fileURLToPath } from 'node:url' +import { resolve } from 'node:path' + +export const TEMPLATES_FOLDER = resolve( + fileURLToPath(import.meta.url), + '../../templates', +) +export const NAME = 'create-router' + +export const SUPPORTED_PACKAGE_MANAGERS = [ + 'npm', + 'yarn', + 'pnpm', + 'bun', +] as const +export type PackageManager = (typeof SUPPORTED_PACKAGE_MANAGERS)[number] +export const DEFAULT_PACKAGE_MANAGER: PackageManager = 'npm' + +export const SUPPORTED_BUNDLERS = ['vite', 'webpack', 'rspack'] as const +export type Bundler = (typeof SUPPORTED_BUNDLERS)[number] +export const DEFAULT_BUNDLER: Bundler = 'vite' diff --git a/packages/create-router/src/core.ts b/packages/create-router/src/core.ts new file mode 100644 index 0000000000..2ac98d9c0f --- /dev/null +++ b/packages/create-router/src/core.ts @@ -0,0 +1,27 @@ +import { copyTemplateFiles } from './utils/copyTemplateFiles' +import type { ApplyParams, PeerDependency } from './types' + +export const dependencies = [ + '@tanstack/react-router', + '@tanstack/router-devtools', + 'react', + 'react-dom', +] as const satisfies Array +export const devDependencies = [ + '@types/react', + '@types/react-dom', + '@tanstack/router-plugin', +] as const satisfies Array + +export const scripts = { + typecheck: 'tsc --noEmit', +} + +export async function apply({ targetFolder }: ApplyParams) { + await copyTemplateFiles({ file: '**/*', sourceFolder: 'core', targetFolder }) + return { + dependencies, + devDependencies, + scripts, + } +} diff --git a/packages/create-router/src/create.ts b/packages/create-router/src/create.ts new file mode 100644 index 0000000000..37e55fe942 --- /dev/null +++ b/packages/create-router/src/create.ts @@ -0,0 +1,124 @@ +import { mkdir } from 'node:fs/promises' +import yoctoSpinner from 'yocto-spinner' +import colors from 'picocolors' +import { apply as applyCore } from './core' +import { apply as applyBundler } from './bundler' +import { getDependenciesWithVersion } from './utils/getPeerDependencyVersion' +import { writeTemplateFile } from './utils/writeTemplateFile' +import { build, install } from './utils/runPackageManagerCommand' +import type { Bundler, PackageManager } from './constants' +import type { PeerDependency } from './types' + +interface GeneratePackageJsonParams { + name: string + scripts: Record + devDependencies: Array + dependencies: Array + overrides?: Partial< + Record>> + > +} +function generatePackageJson({ + name, + scripts, + dependencies, + devDependencies, + overrides, +}: GeneratePackageJsonParams) { + return { + name, + version: '0.0.0', + private: true, + type: 'module', + scripts, + devDependencies: getDependenciesWithVersion(devDependencies), + dependencies: getDependenciesWithVersion(dependencies), + overrides, + } +} + +export interface CreateParams { + targetFolder: string + projectName: string + skipInstall: boolean + skipBuild: boolean + bundler: Bundler + packageManager: PackageManager +} +export async function create({ + targetFolder, + projectName, + skipInstall, + skipBuild, + bundler, + packageManager, +}: CreateParams) { + const originalCwd = process.cwd() + await mkdir(targetFolder, { recursive: true }) + process.chdir(targetFolder) + + const coreResult = await applyCore({ targetFolder }) + const bundlerResult = await applyBundler(bundler, { targetFolder }) + + const packageJson = generatePackageJson({ + name: projectName, + scripts: { ...coreResult.scripts, ...bundlerResult.scripts }, + dependencies: coreResult.dependencies, + devDependencies: [ + ...coreResult.devDependencies, + ...bundlerResult.devDependencies, + ], + overrides: bundlerResult.overrides, + }) + + await writeTemplateFile('package.json', targetFolder, packageJson) + + if (skipInstall) { + console.log( + `${colors.green('Success')} Created ${projectName} at ${targetFolder}`, + ) + return + } + const installSpinner = yoctoSpinner({ + text: 'installing dependencies', + }).start() + try { + await install(packageManager) + installSpinner.success('dependencies installed') + } catch (e) { + console.error(e) + installSpinner.error('failed to install dependencies') + process.exit(1) + } + + if (skipBuild) { + console.log( + `${colors.green('Success')} Created ${projectName} at ${targetFolder}`, + ) + return + } + + const buildSpinner = yoctoSpinner({ text: 'building project' }).start() + try { + await build(packageManager) + buildSpinner.success('project built') + } catch (e) { + console.error(e) + buildSpinner.error('failed to build project') + process.exit(1) + } + + console.log( + `${colors.green('Success')} Created ${projectName} at ${targetFolder}`, + ) + console.log() + const needsCd = originalCwd !== targetFolder + if (needsCd) { + console.log('now go to your project using:') + console.log(colors.cyan(` cd ${targetFolder}`)) + console.log() + } + console.log(`${needsCd ? 'then ' : ''}start the development server via:`) + console.log(colors.cyan(` ${packageManager} run dev`)) + console.log() +} diff --git a/packages/create-router/src/index.ts b/packages/create-router/src/index.ts new file mode 100644 index 0000000000..443a90f6e8 --- /dev/null +++ b/packages/create-router/src/index.ts @@ -0,0 +1,95 @@ +import { basename, resolve } from 'node:path' +import { existsSync } from 'node:fs' + +import { confirm, input, select } from '@inquirer/prompts' +import { cli } from './cli' +import { + DEFAULT_BUNDLER, + DEFAULT_PACKAGE_MANAGER, + SUPPORTED_BUNDLERS, + SUPPORTED_PACKAGE_MANAGERS, +} from './constants' +import { validateProjectName } from './utils/validateProjectName' +import { create } from './create' +import { isEmptyDirectory } from './utils/isEmptyDirectory' + +async function main() { + // project cannot be built if packages are not installed + if (cli.options.skipInstall === true) { + cli.options.skipInstall = true + } + + if (!cli.options.packageManager) { + cli.options.packageManager = await select({ + message: 'Select a package manager', + choices: SUPPORTED_PACKAGE_MANAGERS.map((pm) => ({ value: pm })), + default: DEFAULT_PACKAGE_MANAGER, + }) + } + + if (!cli.directory) { + cli.directory = await input({ + message: 'Enter the project name', + default: 'my-router-app', + validate: (name) => { + const validation = validateProjectName(basename(resolve(name))) + if (validation.valid) { + return true + } + return 'Invalid project name: ' + validation.problems[0] + }, + }) + } + + do { + if (!cli.options.bundler) { + cli.options.bundler = await select({ + message: 'Select a bundler', + choices: SUPPORTED_BUNDLERS.map((bundler) => ({ value: bundler })), + default: DEFAULT_BUNDLER, + }) + } + + if (cli.options.bundler !== 'vite') { + const bundlerConfirmed = await confirm({ + message: + 'Are you sure you want to use this bundler? If you ever choose to adopt full-stack features with Start, Vite is currently required. Proceed anyway?', + }) + if (!bundlerConfirmed) { + cli.options.bundler = undefined + } + } + } while (cli.options.bundler === undefined) + + const targetFolder = resolve(cli.directory) + const projectName = basename(targetFolder) + + if (existsSync(targetFolder) && !(await isEmptyDirectory(targetFolder))) { + const dir = + cli.directory === '.' + ? 'Current directory' + : `Target directory "${targetFolder}"` + const message = `${dir} is not empty. Please choose how to proceed:` + const action = await select({ + message, + choices: [ + { name: 'Cancel', value: 'cancel' }, + { name: 'Ignore files and continue', value: 'ignore' }, + ], + }) + if (action === 'cancel') { + process.exit(1) + } + } + + await create({ + targetFolder, + projectName, + skipInstall: cli.options.skipInstall, + skipBuild: cli.options.skipBuild, + packageManager: cli.options.packageManager, + bundler: cli.options.bundler, + }) +} + +main().catch(console.error) diff --git a/packages/create-router/src/types.ts b/packages/create-router/src/types.ts new file mode 100644 index 0000000000..5cc66170c8 --- /dev/null +++ b/packages/create-router/src/types.ts @@ -0,0 +1,14 @@ +import type packageJson from '../package.json' + +export interface ApplyParams { + targetFolder: string +} + +export type PeerDependency = keyof typeof packageJson.peerDependencies + +export interface BundlerResult { + scripts: Record + devDependencies: Array + dependencies?: Array + overrides?: Partial>>> +} diff --git a/packages/create-router/src/utils/copyTemplateFiles.ts b/packages/create-router/src/utils/copyTemplateFiles.ts new file mode 100644 index 0000000000..75c379a66a --- /dev/null +++ b/packages/create-router/src/utils/copyTemplateFiles.ts @@ -0,0 +1,52 @@ +import { copyFile, mkdir, readdir, stat } from 'node:fs/promises' +import { resolve } from 'node:path' +import fastGlob from 'fast-glob' +import { TEMPLATES_FOLDER } from '../constants' + +/** + * all files prefixed with `_dot_` will be copied over to the created project with a `.` instead of the `_dot_` + */ +const DOT_PREFIX = '_dot_' + +interface CopyTemplateFilesParams { + file: string + sourceFolder: string + targetFolder: string +} +export async function copyTemplateFiles({ + file, + sourceFolder, + targetFolder, +}: CopyTemplateFilesParams) { + const files = await fastGlob.glob(file, { + cwd: resolve(TEMPLATES_FOLDER, sourceFolder), + onlyFiles: false, + }) + + for (const file of files) { + await copy( + resolve(TEMPLATES_FOLDER, sourceFolder, file), + resolve(targetFolder, file), + ) + } +} + +async function copyDir(srcDir: string, destDir: string) { + await mkdir(destDir, { recursive: true }) + const files = await readdir(srcDir) + for (const file of files) { + const srcFile = resolve(srcDir, file) + const destFile = resolve(destDir, file) + await copy(srcFile, destFile) + } +} + +async function copy(src: string, dest: string) { + const statResult = await stat(src) + const replacedDest = dest.replace(DOT_PREFIX, '.') + if (statResult.isDirectory()) { + copyDir(src, replacedDest) + } else { + await copyFile(src, replacedDest) + } +} diff --git a/packages/create-router/src/utils/getPackageManager.ts b/packages/create-router/src/utils/getPackageManager.ts new file mode 100644 index 0000000000..4bcb7b8032 --- /dev/null +++ b/packages/create-router/src/utils/getPackageManager.ts @@ -0,0 +1,16 @@ +import { SUPPORTED_PACKAGE_MANAGERS } from '../constants' +import type { PackageManager } from '../constants' + +export function getPackageManager(): PackageManager | undefined { + const userAgent = process.env.npm_config_user_agent + + if (userAgent === undefined) { + return undefined + } + + const packageManager = SUPPORTED_PACKAGE_MANAGERS.find((manager) => + userAgent.startsWith(manager), + ) + + return packageManager +} diff --git a/packages/create-router/src/utils/getPeerDependencyVersion.ts b/packages/create-router/src/utils/getPeerDependencyVersion.ts new file mode 100644 index 0000000000..b419626378 --- /dev/null +++ b/packages/create-router/src/utils/getPeerDependencyVersion.ts @@ -0,0 +1,13 @@ +import { resolve } from 'node:path' +import { packageJson } from './packageJson' +import type { PeerDependency } from '../types' + +export function getDependenciesWithVersion(deps: Array) { + return deps.reduce( + (acc, dep) => { + acc[dep] = packageJson.peerDependencies[dep] + return acc + }, + {} as Record, + ) +} diff --git a/packages/create-router/src/utils/isEmptyDirectory.ts b/packages/create-router/src/utils/isEmptyDirectory.ts new file mode 100644 index 0000000000..b317f645b7 --- /dev/null +++ b/packages/create-router/src/utils/isEmptyDirectory.ts @@ -0,0 +1,6 @@ +import { readdir } from 'node:fs/promises' + +export async function isEmptyDirectory(path: string) { + const files = await readdir(path) + return files.length === 0 || (files.length === 1 && files[0] === '.git') +} diff --git a/packages/create-router/src/utils/packageJson.ts b/packages/create-router/src/utils/packageJson.ts new file mode 100644 index 0000000000..4522a1edae --- /dev/null +++ b/packages/create-router/src/utils/packageJson.ts @@ -0,0 +1,14 @@ +import { readFile } from 'node:fs/promises' +import { resolve } from 'node:path' +import { fileURLToPath } from 'node:url' + +async function readPackageJson() { + const PACKAGE_JSON_FILE = resolve( + fileURLToPath(import.meta.url), + '../../package.json', + ) + const packageJson = await readFile(PACKAGE_JSON_FILE, 'utf-8') + return JSON.parse(packageJson) +} + +export const packageJson = await readPackageJson() diff --git a/packages/create-router/src/utils/runPackageManagerCommand.ts b/packages/create-router/src/utils/runPackageManagerCommand.ts new file mode 100644 index 0000000000..89382fe99f --- /dev/null +++ b/packages/create-router/src/utils/runPackageManagerCommand.ts @@ -0,0 +1,48 @@ +import spawn from 'cross-spawn' +import type { PackageManager } from '../constants' + +export async function runPackageManagerCommand( + packageManager: PackageManager, + args: Array, + env: NodeJS.ProcessEnv = {}, +) { + return new Promise((resolve, reject) => { + const child = spawn(packageManager, args, { + env: { + ...process.env, + ...env, + }, + stdio: ['pipe', 'pipe', 'pipe'], + }) + let stderrBuffer = '' + let stdoutBuffer = '' + + child.stderr?.on('data', (data) => { + stderrBuffer += data + }) + + child.stdout?.on('data', (data) => { + stdoutBuffer += data + }) + + child.on('close', (code) => { + if (code !== 0) { + reject( + `"${packageManager} ${args.join(' ')}" failed ${stdoutBuffer} ${stderrBuffer}`, + ) + return + } + resolve() + }) + }) +} + +export async function install(packageManager: PackageManager) { + return runPackageManagerCommand(packageManager, ['install'], { + NODE_ENV: 'development', + }) +} + +export async function build(packageManager: PackageManager) { + return runPackageManagerCommand(packageManager, ['run', 'build']) +} diff --git a/packages/create-router/src/utils/validateProjectName.ts b/packages/create-router/src/utils/validateProjectName.ts new file mode 100644 index 0000000000..dc1366ab4a --- /dev/null +++ b/packages/create-router/src/utils/validateProjectName.ts @@ -0,0 +1,25 @@ +import validate from 'validate-npm-package-name' + +type ValidatationResult = + | { + valid: true + } + | { + valid: false + problems: Array + } + +export function validateProjectName(name: string): ValidatationResult { + const nameValidation = validate(name) + if (nameValidation.validForNewPackages) { + return { valid: true } + } + + return { + valid: false, + problems: [ + ...(nameValidation.errors || []), + ...(nameValidation.warnings || []), + ], + } +} diff --git a/packages/create-router/src/utils/writeTemplateFile.ts b/packages/create-router/src/utils/writeTemplateFile.ts new file mode 100644 index 0000000000..44ab7840a3 --- /dev/null +++ b/packages/create-router/src/utils/writeTemplateFile.ts @@ -0,0 +1,17 @@ +import { resolve } from 'node:path' +import { writeFile } from 'node:fs/promises' + +export async function writeTemplateFile( + file: string, + targetFolder: string, + content: unknown, +) { + const targetPath = resolve(targetFolder, file) + let contentToWrite: string + if (typeof content === 'string') { + contentToWrite = content + } else { + contentToWrite = JSON.stringify(content, null, 2) + } + await writeFile(targetPath, contentToWrite) +} diff --git a/packages/create-router/templates/bundler/rspack/rsbuild.config.ts b/packages/create-router/templates/bundler/rspack/rsbuild.config.ts new file mode 100644 index 0000000000..9abc1a9b92 --- /dev/null +++ b/packages/create-router/templates/bundler/rspack/rsbuild.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from '@rsbuild/core' +import { pluginReact } from '@rsbuild/plugin-react' +import { TanStackRouterRspack } from '@tanstack/router-plugin/rspack' + +export default defineConfig({ + plugins: [pluginReact()], + source: { + entry: { index: './src/main.tsx' }, + }, + tools: { + rspack: { + plugins: [TanStackRouterRspack()], + }, + }, +}) diff --git a/packages/create-router/templates/bundler/vite/vite.config.ts b/packages/create-router/templates/bundler/vite/vite.config.ts new file mode 100644 index 0000000000..ca17be445d --- /dev/null +++ b/packages/create-router/templates/bundler/vite/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import { TanStackRouterVite } from '@tanstack/router-plugin/vite' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [TanStackRouterVite({}), react()], +}) diff --git a/packages/create-router/templates/bundler/webpack/_dot_swcrc b/packages/create-router/templates/bundler/webpack/_dot_swcrc new file mode 100644 index 0000000000..16ef25594c --- /dev/null +++ b/packages/create-router/templates/bundler/webpack/_dot_swcrc @@ -0,0 +1,15 @@ +{ + "$schema": "https://swc.rs/schema.json", + "jsc": { + "target": "es2015", + "parser": { + "syntax": "typescript", + "tsx": true + }, + "transform": { + "react": { + "runtime": "automatic" + } + } + } +} diff --git a/packages/create-router/templates/bundler/webpack/webpack.config.js b/packages/create-router/templates/bundler/webpack/webpack.config.js new file mode 100644 index 0000000000..46e0b36fa7 --- /dev/null +++ b/packages/create-router/templates/bundler/webpack/webpack.config.js @@ -0,0 +1,45 @@ +import path from 'path' +import { fileURLToPath } from 'url' +import HtmlWebpackPlugin from 'html-webpack-plugin' +import { TanStackRouterWebpack } from '@tanstack/router-plugin/webpack' + +const __dirname = fileURLToPath(new URL('.', import.meta.url)) + +/** @type import('webpack').Configuration */ +export default ({ WEBPACK_SERVE }) => ({ + target: 'web', + mode: WEBPACK_SERVE ? 'development' : 'production', + entry: path.resolve(__dirname, './src/main.tsx'), + output: { + path: path.resolve(__dirname, './dist'), + filename: '[name].bundle.js', + publicPath: '/', + }, + resolve: { + extensions: ['.ts', '.tsx', '.js', '.jsx'], + }, + plugins: [ + new HtmlWebpackPlugin({ + template: path.resolve(__dirname, './index.html'), + filename: 'index.html', + }), + TanStackRouterWebpack(), + ], + module: { + rules: [ + { + test: /\.tsx?$/, + exclude: /(node_modules)/, + use: { loader: 'swc-loader' }, + }, + ], + }, + devServer: { + open: true, + hot: true, + historyApiFallback: { + rewrites: [{ from: /./, to: '/index.html' }], + }, + static: ['public'], + }, +}) diff --git a/packages/create-router/templates/core/_dot_gitignore b/packages/create-router/templates/core/_dot_gitignore new file mode 100644 index 0000000000..ed335a7bdc --- /dev/null +++ b/packages/create-router/templates/core/_dot_gitignore @@ -0,0 +1,18 @@ +# Local +.DS_Store +*.local +*.log* + +# Dist +node_modules +dist/ +.vinxi +.output +.vercel +.netlify +.wrangler + +# IDE +.vscode/* +!.vscode/extensions.json +.idea diff --git a/packages/create-router/templates/core/index.html b/packages/create-router/templates/core/index.html new file mode 100644 index 0000000000..a4b3349437 --- /dev/null +++ b/packages/create-router/templates/core/index.html @@ -0,0 +1,24 @@ + + + + + + Vite App + + + + +
+ + + diff --git a/packages/create-router/templates/core/src/main.tsx b/packages/create-router/templates/core/src/main.tsx new file mode 100644 index 0000000000..489ebafacf --- /dev/null +++ b/packages/create-router/templates/core/src/main.tsx @@ -0,0 +1,24 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import { RouterProvider, createRouter } from '@tanstack/react-router' +import { routeTree } from './routeTree.gen' + +// Set up a Router instance +const router = createRouter({ + routeTree, + defaultPreload: 'intent', +}) + +// Register things for typesafety +declare module '@tanstack/react-router' { + interface Register { + router: typeof router + } +} + +const rootElement = document.getElementById('app')! + +if (!rootElement.innerHTML) { + const root = ReactDOM.createRoot(rootElement) + root.render() +} diff --git a/packages/create-router/templates/core/src/routes/__root.tsx b/packages/create-router/templates/core/src/routes/__root.tsx new file mode 100644 index 0000000000..8896176e24 --- /dev/null +++ b/packages/create-router/templates/core/src/routes/__root.tsx @@ -0,0 +1,36 @@ +import * as React from 'react' +import { Link, Outlet, createRootRoute } from '@tanstack/react-router' +import { TanStackRouterDevtools } from '@tanstack/router-devtools' + +export const Route = createRootRoute({ + component: RootComponent, +}) + +function RootComponent() { + return ( + <> +
+ + Home + {' '} + + About + +
+
+ + + + ) +} diff --git a/packages/create-router/templates/core/src/routes/about.tsx b/packages/create-router/templates/core/src/routes/about.tsx new file mode 100644 index 0000000000..492e6b85c2 --- /dev/null +++ b/packages/create-router/templates/core/src/routes/about.tsx @@ -0,0 +1,14 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/about')({ + component: AboutComponent, +}) + +function AboutComponent() { + return ( +
+

About

+
+ ) +} diff --git a/packages/create-router/templates/core/src/routes/index.tsx b/packages/create-router/templates/core/src/routes/index.tsx new file mode 100644 index 0000000000..c4588fb2c9 --- /dev/null +++ b/packages/create-router/templates/core/src/routes/index.tsx @@ -0,0 +1,14 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: HomeComponent, +}) + +function HomeComponent() { + return ( +
+

Welcome Home!

+
+ ) +} diff --git a/packages/create-router/templates/core/tsconfig.json b/packages/create-router/templates/core/tsconfig.json new file mode 100644 index 0000000000..28953fdefa --- /dev/null +++ b/packages/create-router/templates/core/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Bundler" + } +} diff --git a/packages/create-router/tsconfig.json b/packages/create-router/tsconfig.json new file mode 100644 index 0000000000..aa15ad9925 --- /dev/null +++ b/packages/create-router/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx", + "target": "ESNext", + "module": "ESNext" + }, + "moduleResolution": "Bundler", + "include": ["src", "tests", "build.config.ts"] +} diff --git a/packages/eslint-plugin-router/.attw.json b/packages/eslint-plugin-router/.attw.json new file mode 100644 index 0000000000..329bfe8343 --- /dev/null +++ b/packages/eslint-plugin-router/.attw.json @@ -0,0 +1,3 @@ +{ + "ignoreRules": ["false-export-default"] +} diff --git a/packages/eslint-plugin-router/eslint.config.js b/packages/eslint-plugin-router/eslint.config.js new file mode 100644 index 0000000000..8ce6ad05fc --- /dev/null +++ b/packages/eslint-plugin-router/eslint.config.js @@ -0,0 +1,5 @@ +// @ts-check + +import rootConfig from '../../eslint.config.js' + +export default [...rootConfig] diff --git a/packages/eslint-plugin-router/package.json b/packages/eslint-plugin-router/package.json new file mode 100644 index 0000000000..7e0cbdd51f --- /dev/null +++ b/packages/eslint-plugin-router/package.json @@ -0,0 +1,65 @@ +{ + "name": "@tanstack/eslint-plugin-router", + "version": "1.58.0", + "description": "ESLint plugin for TanStack Router", + "author": "Manuel Schiller", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/router.git", + "directory": "packages/eslint-plugin-router" + }, + "homepage": "https://tanstack.com/router", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "scripts": { + "clean": "rimraf ./dist ./coverage", + "test:eslint": "eslint ./src", + "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", + "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", + "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", + "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", + "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "tsc", + "test:unit": "vitest", + "test:unit:dev": "pnpm run test:unit --watch --typecheck", + "test:build": "publint --strict && attw --pack .", + "build": "vite build" + }, + "type": "module", + "types": "dist/esm/index.d.ts", + "main": "dist/cjs/index.cjs", + "module": "dist/esm/index.js", + "exports": { + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "files": [ + "dist", + "src" + ], + "dependencies": { + "@typescript-eslint/utils": "^8.3.0" + }, + "devDependencies": { + "@typescript-eslint/rule-tester": "^8.3.0", + "combinate": "^1.1.11", + "eslint": "^9.9.1" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } +} diff --git a/packages/eslint-plugin-router/src/__tests__/create-route-property-order.rule.test.ts b/packages/eslint-plugin-router/src/__tests__/create-route-property-order.rule.test.ts new file mode 100644 index 0000000000..139bd1710f --- /dev/null +++ b/packages/eslint-plugin-router/src/__tests__/create-route-property-order.rule.test.ts @@ -0,0 +1,153 @@ +import { RuleTester } from '@typescript-eslint/rule-tester' +import combinate from 'combinate' +import { + name, + rule, +} from '../rules/create-route-property-order/create-route-property-order.rule' +import { + checkedProperties, + createRouteFunctionsDirect, + createRouteFunctionsIndirect, +} from '../rules/create-route-property-order/constants' +import { + generateInterleavedCombinations, + generatePartialCombinations, + generatePermutations, + normalizeIndent, +} from './test-utils' + +const ruleTester = new RuleTester() + +// reduce the number of test cases by only testing a subset of the checked properties +const testedCheckedProperties = [ + checkedProperties[0], + checkedProperties[1], + checkedProperties[2], +] +type TestedCheckedProperties = (typeof testedCheckedProperties)[number] +const orderIndependentProps = ['gcTime', '...foo'] as const +type OrderIndependentProps = (typeof orderIndependentProps)[number] + +// reduce the number of test cases by only testing the first function of createRouteFunctionsDirect +const testedCreateRouteFunctions = [ + ...createRouteFunctionsIndirect, + createRouteFunctionsDirect[0], +] +type TestedCreateRouteFunction = (typeof testedCreateRouteFunctions)[number] + +interface TestCase { + createRouteFunction: TestedCreateRouteFunction + properties: Array +} + +const validTestMatrix = combinate({ + createRouteFunction: testedCreateRouteFunctions, + properties: generatePartialCombinations(testedCheckedProperties, 2), +}) + +export function generateInvalidPermutations( + arr: ReadonlyArray, +): Array<{ invalid: Array; valid: Array }> { + const combinations = generatePartialCombinations(arr, 2) + const allPermutations: Array<{ invalid: Array; valid: Array }> = [] + + for (const combination of combinations) { + const permutations = generatePermutations(combination) + // skip the first permutation as it matches the original combination + const invalidPermutations = permutations.slice(1) + allPermutations.push( + ...invalidPermutations.map((p) => ({ invalid: p, valid: combination })), + ) + } + + return allPermutations +} + +const invalidPermutations = generateInvalidPermutations(testedCheckedProperties) + +type Interleaved = TestedCheckedProperties | OrderIndependentProps +const interleavedInvalidPermutations: Array<{ + invalid: Array + valid: Array +}> = [] +for (const invalidPermutation of invalidPermutations) { + const invalid = generateInterleavedCombinations( + invalidPermutation.invalid, + orderIndependentProps, + ) + const valid = generateInterleavedCombinations( + invalidPermutation.valid, + orderIndependentProps, + ) + + for (let i = 0; i < invalid.length; i++) { + interleavedInvalidPermutations.push({ + invalid: invalid[i]!, + valid: valid[i]!, + }) + } +} + +const invalidTestMatrix = combinate({ + createRouteFunction: testedCreateRouteFunctions, + properties: interleavedInvalidPermutations, +}) + +function getCode({ createRouteFunction, properties }: TestCase) { + let invocation = '' + switch (createRouteFunction) { + case 'createFileRoute': { + invocation = `('/_layout/hello/foo/$id')` + break + } + case 'createRootRouteWithContext': { + invocation = normalizeIndent` + <{ + queryClient: QueryClient + }>()` + break + } + } + function getPropertyCode( + property: TestedCheckedProperties | OrderIndependentProps, + ) { + if (property.startsWith('...')) { + return property + } + return `${property}: () => null` + } + return ` + import { ${createRouteFunction} } from '@tanstack/react-router' + + const Route = ${createRouteFunction}${invocation}({ + ${properties.map(getPropertyCode).join(',\n ')} + }) + ` +} + +const validTestCases = validTestMatrix.map( + ({ createRouteFunction, properties }) => ({ + name: `should pass when order is correct for ${createRouteFunction} with order: ${properties.join(', ')}`, + code: getCode({ createRouteFunction, properties }), + }), +) + +const invalidTestCases = invalidTestMatrix.map( + ({ createRouteFunction, properties }) => ({ + name: `incorrect property order is detected for ${createRouteFunction} with order: ${properties.invalid.join(', ')}`, + code: getCode({ + createRouteFunction, + properties: properties.invalid, + }), + errors: [{ messageId: 'invalidOrder' }], + output: getCode({ + createRouteFunction, + properties: properties.valid, + }), + }), +) + +ruleTester.run(name, rule, { + valid: validTestCases, + invalid: invalidTestCases, +}) diff --git a/packages/eslint-plugin-router/src/__tests__/create-route-property-order.utils.test.ts b/packages/eslint-plugin-router/src/__tests__/create-route-property-order.utils.test.ts new file mode 100644 index 0000000000..b375ebe3e1 --- /dev/null +++ b/packages/eslint-plugin-router/src/__tests__/create-route-property-order.utils.test.ts @@ -0,0 +1,58 @@ +import { describe, expect, test } from 'vitest' +import { sortDataByOrder } from '../rules/create-route-property-order/create-route-property-order.utils' + +describe('create-route-property-order utils', () => { + describe('sortDataByOrder', () => { + const testCases = [ + { + data: [{ key: 'a' }, { key: 'c' }, { key: 'b' }], + orderArray: ['a', 'b', 'c'], + key: 'key', + expected: [{ key: 'a' }, { key: 'b' }, { key: 'c' }], + }, + { + data: [{ key: 'b' }, { key: 'a' }, { key: 'c' }], + orderArray: ['a', 'b', 'c'], + key: 'key', + expected: [{ key: 'a' }, { key: 'b' }, { key: 'c' }], + }, + { + data: [{ key: 'a' }, { key: 'b' }, { key: 'c' }], + orderArray: ['a', 'b', 'c'], + key: 'key', + expected: null, + }, + { + data: [{ key: 'a' }, { key: 'b' }, { key: 'c' }, { key: 'd' }], + orderArray: ['a', 'b', 'c'], + key: 'key', + expected: null, + }, + { + data: [{ key: 'a' }, { key: 'b' }, { key: 'd' }, { key: 'c' }], + orderArray: ['a', 'b', 'c'], + key: 'key', + expected: null, + }, + { + data: [{ key: 'd' }, { key: 'a' }, { key: 'b' }, { key: 'c' }], + orderArray: ['a', 'b', 'c'], + key: 'key', + expected: null, + }, + { + data: [{ key: 'd' }, { key: 'b' }, { key: 'a' }, { key: 'c' }], + orderArray: ['a', 'b', 'c'], + key: 'key', + expected: [{ key: 'd' }, { key: 'a' }, { key: 'b' }, { key: 'c' }], + }, + ] as const + test.each(testCases)( + '$data $orderArray $key $expected', + ({ data, orderArray, key, expected }) => { + const sortedData = sortDataByOrder(data, orderArray, key) + expect(sortedData).toEqual(expected) + }, + ) + }) +}) diff --git a/packages/eslint-plugin-router/src/__tests__/test-utils.test.ts b/packages/eslint-plugin-router/src/__tests__/test-utils.test.ts new file mode 100644 index 0000000000..aac231ebd3 --- /dev/null +++ b/packages/eslint-plugin-router/src/__tests__/test-utils.test.ts @@ -0,0 +1,104 @@ +import { describe, expect, test } from 'vitest' +import { + expectArrayEqualIgnoreOrder, + generateInterleavedCombinations, + generatePartialCombinations, + generatePermutations, +} from './test-utils' + +describe('test-utils', () => { + describe('generatePermutations', () => { + const testCases = [ + { + input: ['a', 'b', 'c'], + expected: [ + ['a', 'b', 'c'], + ['a', 'c', 'b'], + ['b', 'a', 'c'], + ['b', 'c', 'a'], + ['c', 'a', 'b'], + ['c', 'b', 'a'], + ], + }, + { + input: ['a', 'b'], + expected: [ + ['a', 'b'], + ['b', 'a'], + ], + }, + { + input: ['a'], + expected: [['a']], + }, + ] + test.each(testCases)('$input $expected', ({ input, expected }) => { + const permutations = generatePermutations(input) + expect(permutations).toEqual(expected) + }) + }) + + describe('generatePartialCombinations', () => { + const testCases = [ + { + input: ['a', 'b', 'c'], + minLength: 2, + expected: [ + ['a', 'b'], + ['a', 'c'], + ['b', 'c'], + ['a', 'b', 'c'], + ], + }, + { + input: ['a', 'b'], + expected: [['a', 'b']], + minLength: 2, + }, + { + input: ['a'], + expected: [], + minLength: 2, + }, + { + input: ['a'], + expected: [['a']], + minLength: 1, + }, + { + input: ['a'], + expected: [[], ['a']], + minLength: 0, + }, + ] + test.each(testCases)( + '$input $minLength $expected ', + ({ input, minLength, expected }) => { + const combinations = generatePartialCombinations(input, minLength) + expectArrayEqualIgnoreOrder(combinations, expected) + }, + ) + }) + + describe('generateInterleavedCombinations', () => { + const testCases = [ + { + data: ['a', 'b'], + additional: ['x'], + expected: [ + ['a', 'b'], + ['x', 'a', 'b'], + ['a', 'x', 'b'], + ['a', 'b', 'x'], + ], + }, + ] + test.each(testCases)( + '$input $expected', + ({ data, additional, expected }) => { + const combinations = generateInterleavedCombinations(data, additional) + expectArrayEqualIgnoreOrder(combinations, expected) + }, + ) + }) +}) diff --git a/packages/eslint-plugin-router/src/__tests__/test-utils.ts b/packages/eslint-plugin-router/src/__tests__/test-utils.ts new file mode 100644 index 0000000000..63a2f514fc --- /dev/null +++ b/packages/eslint-plugin-router/src/__tests__/test-utils.ts @@ -0,0 +1,108 @@ +import { expect } from 'vitest' + +export function generatePermutations(arr: Array): Array> { + if (arr.length <= 1) { + return [arr] + } + + const result: Array> = [] + for (let i = 0; i < arr.length; i++) { + const rest = arr.slice(0, i).concat(arr.slice(i + 1)) + const restPermutations = generatePermutations(rest) + for (const perm of restPermutations) { + result.push([arr[i]!, ...perm]) + } + } + + return result +} + +export function generatePartialCombinations( + arr: ReadonlyArray, + minLength: number, +): Array> { + const result: Array> = [] + + function backtrack(start: number, current: Array) { + if (current.length > minLength - 1) { + result.push([...current]) + } + for (let i = start; i < arr.length; i++) { + current.push(arr[i]!) + backtrack(i + 1, current) + current.pop() + } + } + backtrack(0, []) + return result +} + +export function expectArrayEqualIgnoreOrder(a: Array, b: Array) { + expect([...a].sort()).toEqual([...b].sort()) +} + +export function normalizeIndent(template: TemplateStringsArray) { + const codeLines = template[0]?.split('\n') ?? [''] + const leftPadding = codeLines[1]?.match(/\s+/)?.[0] ?? '' + return codeLines.map((line) => line.slice(leftPadding.length)).join('\n') +} + +export function generateInterleavedCombinations< + TData, + TAdditional, + TResult extends TData | TAdditional, +>( + data: Array | ReadonlyArray, + additional: Array | ReadonlyArray, +): Array> { + const result: Array> = [] + + function getSubsets(array: Array): Array> { + return array.reduce( + (subsets, value) => { + return subsets.concat(subsets.map((set) => [...set, value])) + }, + [[]] as Array>, + ) + } + + function insertAtPositions( + data: Array, + subset: Array, + ): Array> { + const combinations: Array> = [] + + const recurse = ( + currentData: Array, + currentSubset: Array, + start: number, + ): void => { + if (currentSubset.length === 0) { + combinations.push([...currentData]) + return + } + + for (let i = start; i <= currentData.length; i++) { + const newData = [ + ...currentData.slice(0, i), + currentSubset[0]!, + ...currentData.slice(i), + ] + recurse(newData, currentSubset.slice(1), i + 1) + } + } + + recurse(data, subset, 0) + return combinations + } + + const subsets = getSubsets(additional as Array) + + subsets.forEach((subset) => { + result.push( + ...insertAtPositions(data as Array, subset as Array), + ) + }) + + return result +} diff --git a/packages/eslint-plugin-router/src/index.ts b/packages/eslint-plugin-router/src/index.ts new file mode 100644 index 0000000000..f02ea5a000 --- /dev/null +++ b/packages/eslint-plugin-router/src/index.ts @@ -0,0 +1,43 @@ +import { rules } from './rules' +import type { ESLint, Linter } from 'eslint' +import type { RuleModule } from '@typescript-eslint/utils/ts-eslint' + +type RuleKey = keyof typeof rules + +interface Plugin extends Omit { + rules: Record> + configs: { + recommended: ESLint.ConfigData + 'flat/recommended': Array + } +} + +const plugin: Plugin = { + meta: { + name: '@tanstack/eslint-plugin-router', + }, + configs: {} as Plugin['configs'], + rules, +} + +// Assign configs here so we can reference `plugin` +Object.assign(plugin.configs, { + recommended: { + plugins: ['@tanstack/eslint-plugin-router'], + rules: { + '@tanstack/router/create-route-property-order': 'warn', + }, + }, + 'flat/recommended': [ + { + plugins: { + '@tanstack/router': plugin, + }, + rules: { + '@tanstack/router/create-route-property-order': 'warn', + }, + }, + ], +}) + +export default plugin diff --git a/packages/eslint-plugin-router/src/rules.ts b/packages/eslint-plugin-router/src/rules.ts new file mode 100644 index 0000000000..73219d401e --- /dev/null +++ b/packages/eslint-plugin-router/src/rules.ts @@ -0,0 +1,15 @@ +import * as createRoutePropertyOrder from './rules/create-route-property-order/create-route-property-order.rule' +import type { ESLintUtils } from '@typescript-eslint/utils' +import type { ExtraRuleDocs } from './types' + +export const rules: Record< + string, + ESLintUtils.RuleModule< + string, + ReadonlyArray, + ExtraRuleDocs, + ESLintUtils.RuleListener + > +> = { + [createRoutePropertyOrder.name]: createRoutePropertyOrder.rule, +} diff --git a/packages/eslint-plugin-router/src/rules/create-route-property-order/constants.ts b/packages/eslint-plugin-router/src/rules/create-route-property-order/constants.ts new file mode 100644 index 0000000000..9cee806177 --- /dev/null +++ b/packages/eslint-plugin-router/src/rules/create-route-property-order/constants.ts @@ -0,0 +1,24 @@ +export const createRouteFunctionsIndirect = [ + 'createFileRoute', + 'createRootRouteWithContext', +] as const +export const createRouteFunctionsDirect = [ + 'createRootRoute', + 'createRoute', +] as const + +export const createRouteFunctions = [ + ...createRouteFunctionsDirect, + ...createRouteFunctionsIndirect, +] as const + +export type CreateRouteFunction = (typeof createRouteFunctions)[number] + +export const checkedProperties = [ + 'params', + 'validateSearch', + 'context', + 'beforeLoad', + 'loaderDeps', + 'loader', +] as const diff --git a/packages/eslint-plugin-router/src/rules/create-route-property-order/create-route-property-order.rule.ts b/packages/eslint-plugin-router/src/rules/create-route-property-order/create-route-property-order.rule.ts new file mode 100644 index 0000000000..4a33cd9391 --- /dev/null +++ b/packages/eslint-plugin-router/src/rules/create-route-property-order/create-route-property-order.rule.ts @@ -0,0 +1,125 @@ +import { AST_NODE_TYPES, ESLintUtils } from '@typescript-eslint/utils' + +import { getDocsUrl } from '../../utils/get-docs-url' +import { detectTanstackRouterImports } from '../../utils/detect-router-imports' +import { sortDataByOrder } from './create-route-property-order.utils' +import { + checkedProperties, + createRouteFunctions, + createRouteFunctionsIndirect, +} from './constants' +import type { CreateRouteFunction } from './constants' +import type { ExtraRuleDocs } from '../../types' + +const createRule = ESLintUtils.RuleCreator(getDocsUrl) + +const createRouteFunctionSet = new Set(createRouteFunctions) +function isCreateRouteFunction(node: any): node is CreateRouteFunction { + return createRouteFunctionSet.has(node) +} + +export const name = 'create-route-property-order' + +export const rule = createRule({ + name, + meta: { + type: 'problem', + docs: { + description: + 'Ensure correct order of inference sensitive properties for createRoute functions', + recommended: 'error', + }, + messages: { + invalidOrder: 'Invalid order of properties for `{{function}}`.', + }, + schema: [], + hasSuggestions: true, + fixable: 'code', + }, + defaultOptions: [], + + create: detectTanstackRouterImports((context) => { + return { + CallExpression(node) { + if (node.callee.type !== AST_NODE_TYPES.Identifier) { + return + } + const createRouteFunction = node.callee.name + if (!isCreateRouteFunction(createRouteFunction)) { + return + } + let args = node.arguments + if (createRouteFunctionsIndirect.includes(createRouteFunction as any)) { + if (node.parent.type === AST_NODE_TYPES.CallExpression) { + args = node.parent.arguments + } else { + return + } + } + + const argument = args[0] + if (argument === undefined || argument.type !== 'ObjectExpression') { + return + } + + const allProperties = argument.properties + + // TODO we need to support spread elements, they would be discarded here + const properties = allProperties.flatMap((p) => { + if ( + p.type === AST_NODE_TYPES.Property && + p.key.type === AST_NODE_TYPES.Identifier + ) { + return { name: p.key.name, property: p } + } else if (p.type === AST_NODE_TYPES.SpreadElement) { + if (p.argument.type === AST_NODE_TYPES.Identifier) { + return { name: p.argument.name, property: p } + } else { + throw new Error('Unsupported spread element') + } + } + return [] + }) + + const sortedProperties = sortDataByOrder( + properties, + checkedProperties, + 'name', + ) + if (sortedProperties === null) { + return + } + context.report({ + node: argument, + data: { function: node.callee.name }, + messageId: 'invalidOrder', + fix(fixer) { + const sourceCode = context.sourceCode + + const text = sortedProperties.reduce( + (sourceText, specifier, index) => { + let text = '' + if (index < allProperties.length - 1) { + text = sourceCode + .getText() + .slice( + allProperties[index]!.range[1], + allProperties[index + 1]!.range[0], + ) + } + return ( + sourceText + sourceCode.getText(specifier.property) + text + ) + }, + '', + ) + return fixer.replaceTextRange( + [allProperties[0]!.range[0], allProperties.at(-1)!.range[1]], + text, + ) + }, + }) + }, + } + }), +}) diff --git a/packages/eslint-plugin-router/src/rules/create-route-property-order/create-route-property-order.utils.ts b/packages/eslint-plugin-router/src/rules/create-route-property-order/create-route-property-order.utils.ts new file mode 100644 index 0000000000..0f7d54a743 --- /dev/null +++ b/packages/eslint-plugin-router/src/rules/create-route-property-order/create-route-property-order.utils.ts @@ -0,0 +1,38 @@ +export function sortDataByOrder( + data: Array | ReadonlyArray, + orderArray: Array | ReadonlyArray, + key: TKey, +): Array | null { + const orderMap = new Map(orderArray.map((item, index) => [item, index])) + + // Separate items that are in orderArray from those that are not + const inOrderArray = data + .filter((item) => orderMap.has(item[key])) + .sort((a, b) => { + const indexA = orderMap.get(a[key])! + const indexB = orderMap.get(b[key])! + + return indexA - indexB + }) + + const inOrderIterator = inOrderArray.values() + + // `as boolean` is needed to avoid TS incorrectly inferring that wasResorted is always `true` + let wasResorted = false as boolean + + const result = data.map((item) => { + if (orderMap.has(item[key])) { + const sortedItem = inOrderIterator.next().value! + if (sortedItem[key] !== item[key]) { + wasResorted = true + } + return sortedItem + } + return item + }) + + if (!wasResorted) { + return null + } + return result +} diff --git a/packages/eslint-plugin-router/src/types.ts b/packages/eslint-plugin-router/src/types.ts new file mode 100644 index 0000000000..74c3053188 --- /dev/null +++ b/packages/eslint-plugin-router/src/types.ts @@ -0,0 +1,3 @@ +export type ExtraRuleDocs = { + recommended: 'strict' | 'error' | 'warn' +} diff --git a/packages/eslint-plugin-router/src/utils/detect-router-imports.ts b/packages/eslint-plugin-router/src/utils/detect-router-imports.ts new file mode 100644 index 0000000000..1e9e047dac --- /dev/null +++ b/packages/eslint-plugin-router/src/utils/detect-router-imports.ts @@ -0,0 +1,94 @@ +import { TSESTree } from '@typescript-eslint/utils' +import type { ESLintUtils, TSESLint } from '@typescript-eslint/utils' + +type Create = Parameters< + ReturnType +>[0]['create'] + +type Context = Parameters[0] +type Options = Parameters[1] +type Helpers = { + isSpecificTanstackRouterImport: ( + node: TSESTree.Identifier, + source: string, + ) => boolean + isTanstackRouterImport: (node: TSESTree.Identifier) => boolean +} + +type EnhancedCreate = ( + context: Context, + options: Options, + helpers: Helpers, +) => ReturnType + +export function detectTanstackRouterImports(create: EnhancedCreate): Create { + return (context, optionsWithDefault) => { + const tanstackRouterImportSpecifiers: Array = [] + + const helpers: Helpers = { + isSpecificTanstackRouterImport(node, source) { + return !!tanstackRouterImportSpecifiers.find((specifier) => { + if ( + specifier.type === TSESTree.AST_NODE_TYPES.ImportSpecifier && + specifier.parent.type === + TSESTree.AST_NODE_TYPES.ImportDeclaration && + specifier.parent.source.value === source + ) { + return node.name === specifier.local.name + } + + return false + }) + }, + isTanstackRouterImport(node) { + return !!tanstackRouterImportSpecifiers.find((specifier) => { + if (specifier.type === TSESTree.AST_NODE_TYPES.ImportSpecifier) { + return node.name === specifier.local.name + } + + return false + }) + }, + } + + const detectionInstructions: TSESLint.RuleListener = { + ImportDeclaration(node) { + if ( + node.specifiers.length > 0 && + node.importKind === 'value' && + node.source.value.startsWith('@tanstack/') && + node.source.value.endsWith('-router') + ) { + tanstackRouterImportSpecifiers.push(...node.specifiers) + } + }, + } + + // Call original rule definition + const ruleInstructions = create(context, optionsWithDefault, helpers) + const enhancedRuleInstructions: TSESLint.RuleListener = {} + + const allKeys = new Set( + Object.keys(detectionInstructions).concat(Object.keys(ruleInstructions)), + ) + + // Iterate over ALL instructions keys so we can override original rule instructions + // to prevent their execution if conditions to report errors are not met. + allKeys.forEach((instruction) => { + enhancedRuleInstructions[instruction] = (node) => { + if (instruction in detectionInstructions) { + detectionInstructions[instruction]?.(node) + } + + const ruleFunction = ruleInstructions[instruction] + if (ruleFunction !== undefined) { + return ruleFunction(node) + } + + return undefined + } + }) + + return enhancedRuleInstructions + } +} diff --git a/packages/eslint-plugin-router/src/utils/get-docs-url.ts b/packages/eslint-plugin-router/src/utils/get-docs-url.ts new file mode 100644 index 0000000000..8e82192cdc --- /dev/null +++ b/packages/eslint-plugin-router/src/utils/get-docs-url.ts @@ -0,0 +1,2 @@ +export const getDocsUrl = (ruleName: string): string => + `https://tanstack.com/router/latest/docs/eslint/${ruleName}` diff --git a/packages/eslint-plugin-router/tsconfig.json b/packages/eslint-plugin-router/tsconfig.json new file mode 100644 index 0000000000..cbceff3f8b --- /dev/null +++ b/packages/eslint-plugin-router/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "moduleResolution": "Bundler" + }, + "include": ["src", "eslint.config.js", "vite.config.ts"] +} diff --git a/packages/eslint-plugin-router/vite.config.ts b/packages/eslint-plugin-router/vite.config.ts new file mode 100644 index 0000000000..e0de55875e --- /dev/null +++ b/packages/eslint-plugin-router/vite.config.ts @@ -0,0 +1,23 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import packageJson from './package.json' + +const config = defineConfig({ + test: { + name: packageJson.name, + dir: './src', + watch: false, + globals: true, + typecheck: { enabled: true }, + restoreMocks: true, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: './src/index.ts', + srcDir: './src', + exclude: ['./src/__tests__'], + }), +) diff --git a/packages/history/package.json b/packages/history/package.json index e9fe552263..44f8ed8067 100644 --- a/packages/history/package.json +++ b/packages/history/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/history", - "version": "1.49.7", + "version": "1.57.6", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -22,13 +22,13 @@ "clean": "rimraf ./dist && rimraf ./coverage", "test:eslint": "eslint ./src", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", - "test:types:ts55": "tsc", - "test:build": "publint --strict", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "tsc", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", "test:unit": "vitest", "test:unit:dev": "pnpm run test:unit --watch", "build": "vite build" diff --git a/packages/history/src/index.ts b/packages/history/src/index.ts index ab16a03d3f..16fefadc64 100644 --- a/packages/history/src/index.ts +++ b/packages/history/src/index.ts @@ -281,10 +281,6 @@ export function createBrowserHistory(opts?: { } if (!scheduled) { - if (process.env.NODE_ENV === 'test') { - flush() - return - } // Schedule an update to the browser history scheduled = Promise.resolve().then(() => flush()) } diff --git a/packages/react-cross-context/package.json b/packages/react-cross-context/package.json index 0d5cd5a118..e7e30336a3 100644 --- a/packages/react-cross-context/package.json +++ b/packages/react-cross-context/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-cross-context", - "version": "1.44.2", + "version": "1.57.6", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -18,13 +18,13 @@ "clean": "rimraf ./dist && rimraf ./coverage", "test:eslint": "eslint ./src", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", - "test:types:ts55": "tsc", - "test:build": "publint --strict", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "tsc", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", "build": "vite build" }, "type": "module", diff --git a/packages/react-cross-context/vite.config.ts b/packages/react-cross-context/vite.config.ts index f26ab35cad..fd79635ec6 100644 --- a/packages/react-cross-context/vite.config.ts +++ b/packages/react-cross-context/vite.config.ts @@ -1,9 +1,10 @@ import { defineConfig, mergeConfig } from 'vitest/config' import { tanstackViteConfig } from '@tanstack/config/vite' import react from '@vitejs/plugin-react' +import type { UserConfig } from 'vitest/config' const config = defineConfig({ - plugins: [react()], + plugins: [react()] as UserConfig['plugins'], }) export default mergeConfig( diff --git a/packages/react-router-with-query/package.json b/packages/react-router-with-query/package.json index 7fd2759bdf..5d1acfdf80 100644 --- a/packages/react-router-with-query/package.json +++ b/packages/react-router-with-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-router-with-query", - "version": "1.51.2", + "version": "1.58.3", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -27,15 +27,15 @@ "clean": "rimraf ./dist && rimraf ./coverage", "test:eslint": "eslint ./src", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", - "test:types:ts55": "tsc", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "tsc", "test:unit": "vitest", "test:unit:dev": "pnpm run test:unit --watch", - "test:build": "publint --strict", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", "build": "vite build" }, "type": "module", @@ -68,7 +68,7 @@ "react": ">=18", "react-dom": ">=18", "@tanstack/react-router": "workspace:*", - "@tanstack/react-query": ">=5.51.21" + "@tanstack/react-query": ">=5.56.2" }, "peerDependencies": { "react": ">=18", diff --git a/packages/react-router-with-query/vite.config.ts b/packages/react-router-with-query/vite.config.ts index 64ae150c80..212232f411 100644 --- a/packages/react-router-with-query/vite.config.ts +++ b/packages/react-router-with-query/vite.config.ts @@ -2,9 +2,10 @@ import { defineConfig, mergeConfig } from 'vitest/config' import { tanstackViteConfig } from '@tanstack/config/vite' import react from '@vitejs/plugin-react' import packageJson from './package.json' +import type { UserConfig } from 'vitest/config' const config = defineConfig({ - plugins: [react()], + plugins: [react()] as UserConfig['plugins'], test: { name: packageJson.name, dir: './tests', diff --git a/packages/react-router/eslint.config.js b/packages/react-router/eslint.config.ts similarity index 73% rename from packages/react-router/eslint.config.js rename to packages/react-router/eslint.config.ts index 076c5ee394..a2f1715667 100644 --- a/packages/react-router/eslint.config.js +++ b/packages/react-router/eslint.config.ts @@ -1,18 +1,17 @@ -// @ts-check - import pluginReact from '@eslint-react/eslint-plugin' +// @ts-expect-error import pluginReactHooks from 'eslint-plugin-react-hooks' import rootConfig from '../../eslint.config.js' export default [ ...rootConfig, { - files: ['**/*.{ts,tsx}'], - ...pluginReact.configs.recommended, + files: ['src/**/*.{ts,tsx}', 'tests/**/*.{ts,tsx}'], }, { plugins: { 'react-hooks': pluginReactHooks, + '@eslint-react': pluginReact, }, rules: { '@eslint-react/no-unstable-context-value': 'off', @@ -22,10 +21,4 @@ export default [ 'react-hooks/rules-of-hooks': 'error', }, }, - { - files: ['**/__tests__/**'], - rules: { - '@typescript-eslint/no-unnecessary-condition': 'off', - }, - }, ] diff --git a/packages/react-router/package.json b/packages/react-router/package.json index dc4851556c..b4fad0972e 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-router", - "version": "1.51.2", + "version": "1.58.3", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -25,17 +25,17 @@ ], "scripts": { "clean": "rimraf ./dist && rimraf ./coverage", - "test:eslint": "eslint ./src", + "test:eslint": "eslint", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js -p tsconfig.legacy.json", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js -p tsconfig.legacy.json", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js -p tsconfig.legacy.json", "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js -p tsconfig.legacy.json", "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js -p tsconfig.legacy.json", - "test:types:ts55": "tsc", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js -p tsconfig.legacy.json", + "test:types:ts56": "tsc -p tsconfig.legacy.json", "test:unit": "vitest", "test:unit:dev": "pnpm run test:unit --watch --hideSkippedTests", - "test:build": "publint --strict", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", "build": "vite build" }, "type": "module", @@ -70,17 +70,22 @@ "tiny-warning": "^1.0.3" }, "devDependencies": { - "@testing-library/jest-dom": "^6.4.8", - "@testing-library/react": "^16.0.0", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", "@vitejs/plugin-react": "^4.3.1", "combinate": "^1.1.11", - "jsdom": "^24.1.1", "react": "^18.2.0", "react-dom": "^18.2.0", "zod": "^3.23.8" }, "peerDependencies": { "react": ">=18", - "react-dom": ">=18" + "react-dom": ">=18", + "@tanstack/router-generator": "workspace:*" + }, + "peerDependenciesMeta": { + "@tanstack/router-generator": { + "optional": true + } } } diff --git a/packages/react-router/src/Match.tsx b/packages/react-router/src/Match.tsx index 24cfe06810..57c8754c56 100644 --- a/packages/react-router/src/Match.tsx +++ b/packages/react-router/src/Match.tsx @@ -129,8 +129,8 @@ export const MatchInner = React.memo(function MatchInnerImpl({ const out = React.useMemo(() => { const Comp = route.options.component ?? router.options.defaultComponent - return Comp ? : - }, [routeId, route.options.component, router.options.defaultComponent]) + return Comp ? : + }, [route.options.component, router.options.defaultComponent]) // function useChangedDiff(value: any) { // const ref = React.useRef(value) diff --git a/packages/react-router/src/Matches.tsx b/packages/react-router/src/Matches.tsx index 0874e30d5e..8736c02447 100644 --- a/packages/react-router/src/Matches.tsx +++ b/packages/react-router/src/Matches.tsx @@ -4,14 +4,10 @@ import { CatchBoundary, ErrorComponent } from './CatchBoundary' import { useRouterState } from './useRouterState' import { useRouter } from './useRouter' import { Transitioner } from './Transitioner' -import { - type AnyRoute, - type ReactNode, - type StaticDataRouteOption, -} from './route' import { matchContext } from './matchContext' import { Match } from './Match' import { SafeFragment } from './SafeFragment' +import type { AnyRoute, ReactNode, StaticDataRouteOption } from './route' import type { AnyRouter, RegisteredRouter } from './router' import type { ResolveRelativePath, ToOptions } from './link' import type { @@ -173,31 +169,24 @@ export interface RouteMatch< export type MakeRouteMatch< TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], - TRouteId = ParseRoute['id'], + TRouteId = RouteIds, TStrict extends boolean = true, - TTypes extends AnyRoute['types'] = RouteById['types'], - TFullPath = TTypes['fullPath'], - TAllParams = TStrict extends false +> = RouteMatch< + TRouteId, + RouteById['types']['fullPath'], + TStrict extends false ? AllParams - : TTypes['allParams'], - TFullSearchSchema = TStrict extends false + : RouteById['types']['allParams'], + TStrict extends false ? FullSearchSchema - : TTypes['fullSearchSchema'], - TLoaderData = TStrict extends false + : RouteById['types']['fullSearchSchema'], + TStrict extends false ? AllLoaderData - : TTypes['loaderData'], - TAllContext = TStrict extends false + : RouteById['types']['loaderData'], + TStrict extends false ? AllContext - : TTypes['allContext'], - TLoaderDeps = TTypes['loaderDeps'], -> = RouteMatch< - TRouteId, - TFullPath, - TAllParams, - TFullSearchSchema, - TLoaderData, - TAllContext, - TLoaderDeps + : RouteById['types']['allContext'], + RouteById['types']['loaderDeps'] > export type AnyRouteMatch = RouteMatch @@ -268,11 +257,11 @@ export interface MatchRouteOptions { export type UseMatchRouteOptions< TRouter extends AnyRouter = RegisteredRouter, - TFrom extends RoutePaths = RoutePaths< + TFrom extends RoutePaths | string = RoutePaths< TRouter['routeTree'] >, TTo extends string = '', - TMaskFrom extends RoutePaths = TFrom, + TMaskFrom extends RoutePaths | string = TFrom, TMaskTo extends string = '', TOptions extends ToOptions< TRouter, @@ -356,8 +345,8 @@ export function MatchRoute< return params ? props.children : null } -export type MakeRouteMatches< - TRouter extends AnyRouter = AnyRouter, +export type MakeRouteMatchUnion< + TRouter extends AnyRouter = RegisteredRouter, TRoute extends AnyRoute = ParseRoute, > = TRoute extends any ? RouteMatch< @@ -373,7 +362,7 @@ export type MakeRouteMatches< export function useMatches< TRouter extends AnyRouter = RegisteredRouter, - TRouteMatch = MakeRouteMatches, + TRouteMatch = MakeRouteMatchUnion, T = Array, >(opts?: { select?: (matches: Array) => T }): T { return useRouterState({ @@ -387,9 +376,8 @@ export function useMatches< } export function useParentMatches< - TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], - TRouteId extends RouteIds = ParseRoute['id'], - TRouteMatch = MakeRouteMatch, + TRouter extends AnyRouter = RegisteredRouter, + TRouteMatch = MakeRouteMatchUnion, T = Array, >(opts?: { select?: (matches: Array) => T }): T { const contextMatchId = React.useContext(matchContext) @@ -408,9 +396,8 @@ export function useParentMatches< } export function useChildMatches< - TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], - TRouteId extends RouteIds = ParseRoute['id'], - TRouteMatch = MakeRouteMatch, + TRouter extends AnyRouter = RegisteredRouter, + TRouteMatch = MakeRouteMatchUnion, T = Array, >(opts?: { select?: (matches: Array) => T }): T { const contextMatchId = React.useContext(matchContext) diff --git a/packages/react-router/src/RouterProvider.tsx b/packages/react-router/src/RouterProvider.tsx index 6f17cbdac8..a2b8fddafe 100644 --- a/packages/react-router/src/RouterProvider.tsx +++ b/packages/react-router/src/RouterProvider.tsx @@ -30,20 +30,18 @@ export interface MatchLocation { } export type NavigateFn = < - TTo extends string, - TRouter extends AnyRouter = RegisteredRouter, + TRouter extends RegisteredRouter, + TTo extends string | undefined, TFrom extends RoutePaths | string = string, TMaskFrom extends RoutePaths | string = TFrom, TMaskTo extends string = '', >( - opts: NavigateOptions & { - __isRedirect?: boolean - }, + opts: NavigateOptions, ) => Promise export type BuildLocationFn = < - TTo extends string, - TRouter extends AnyRouter = RegisteredRouter, + TRouter extends RegisteredRouter, + TTo extends string | undefined, TFrom extends RoutePaths | string = string, TMaskFrom extends RoutePaths | string = TFrom, TMaskTo extends string = '', diff --git a/packages/react-router/src/ScriptOnce.tsx b/packages/react-router/src/ScriptOnce.tsx index b1630ddcb2..998c675b3c 100644 --- a/packages/react-router/src/ScriptOnce.tsx +++ b/packages/react-router/src/ScriptOnce.tsx @@ -1,4 +1,3 @@ -/* eslint-disable @eslint-react/dom/no-dangerously-set-innerhtml */ export function ScriptOnce({ className, children, diff --git a/packages/react-router/src/fileRoute.ts b/packages/react-router/src/fileRoute.ts index bb713ba93e..3cedea12c0 100644 --- a/packages/react-router/src/fileRoute.ts +++ b/packages/react-router/src/fileRoute.ts @@ -14,13 +14,14 @@ import type { AnySearchValidator, FileBaseRouteOptions, ResolveParams, + RootRoute, Route, RouteConstraints, RouteLoaderFn, UpdatableRouteOptions, } from './route' import type { MakeRouteMatch } from './Matches' -import type { RegisteredRouter } from './router' +import type { AnyRouter, RegisteredRouter } from './router' import type { RouteById, RouteIds } from './routeInfo' export interface FileRoutesByPath { @@ -29,6 +30,29 @@ export interface FileRoutesByPath { // } } +export interface FileRouteTypes { + fileRoutesByFullPath: any + fullPaths: any + to: any + fileRoutesByTo: any + id: any + fileRoutesById: any +} + +export type InferFileRouteTypes = + TRouteTree extends RootRoute< + any, + any, + any, + any, + any, + any, + any, + infer TFileRouteTypes extends FileRouteTypes + > + ? TFileRouteTypes + : never + export function createFileRoute< TFilePath extends keyof FileRoutesByPath, TParentRoute extends AnyRoute = FileRoutesByPath[TFilePath]['parentRoute'], @@ -241,9 +265,16 @@ export function createLazyRoute< } } +const routeGroupPatternRegex = /\(.+\)/g + +function removeGroups(s: string) { + return s.replaceAll(routeGroupPatternRegex, '').replaceAll('//', '/') +} + export function createLazyFileRoute< TFilePath extends keyof FileRoutesByPath, TRoute extends FileRoutesByPath[TFilePath]['preLoaderRoute'], >(id: TFilePath) { - return (opts: LazyRouteOptions) => new LazyRoute({ id, ...opts }) + return (opts: LazyRouteOptions) => + new LazyRoute({ id: removeGroups(id), ...opts }) } diff --git a/packages/react-router/src/index.tsx b/packages/react-router/src/index.tsx index 6a977f7f40..913713db47 100644 --- a/packages/react-router/src/index.tsx +++ b/packages/react-router/src/index.tsx @@ -32,7 +32,11 @@ export { createLazyRoute, createLazyFileRoute, } from './fileRoute' -export type { FileRoutesByPath, LazyRouteOptions } from './fileRoute' +export type { + FileRoutesByPath, + FileRouteTypes, + LazyRouteOptions, +} from './fileRoute' export * from './history' @@ -88,6 +92,8 @@ export type { MatchRouteOptions, UseMatchRouteOptions, MakeMatchRouteOptions, + MakeRouteMatch, + MakeRouteMatchUnion, } from './Matches' export { matchContext } from './matchContext' @@ -184,6 +190,40 @@ export type { TrimPathRight, RootRouteOptions, AnyRouteWithContext, + ParseSplatParams, + SplatParams, + StringifyParamsFn, + ParamsOptions, + FullSearchSchemaOption, + RouteContextFn, + RouteContextOptions, + BeforeLoadFn, + BeforeLoadContextOptions, + AnySearchValidator, + DefaultSearchValidator, + ContextOptions, + SearchValidatorObj, + AnySearchValidatorObj, + AnySearchValidatorAdapter, + AnySearchValidatorFn, + SearchValidatorFn, + SearchValidator, + InferAllParams, + InferAllContext, + ResolveSearchSchemaFnInput, + ResolveSearchSchemaInput, + ResolveSearchSchema, + LooseReturnType, + LooseAsyncReturnType, + ContextReturnType, + ContextAsyncReturnType, + RouteContextParameter, + BeforeLoadContextParameter, + ResolveAllContext, + ResolveLoaderData, + ResolveAllParamsFromParent, + ResolveRouteContext, + ResolveSearchSchemaFn, } from './route' export type { @@ -196,6 +236,9 @@ export type { RoutePaths, FullSearchSchema, AllParams, + AllLoaderData, + FullSearchSchemaInput, + AllContext, } from './routeInfo' export { diff --git a/packages/react-router/src/link.tsx b/packages/react-router/src/link.tsx index 977d84a414..131f21caec 100644 --- a/packages/react-router/src/link.tsx +++ b/packages/react-router/src/link.tsx @@ -97,6 +97,8 @@ export type Last> = T extends [...infer _, infer L] ? L : never +export type AddTrailingSlash = T extends `${string}/` ? T : `${T & string}/` + export type RemoveTrailingSlashes = T extends `${infer R}/` ? R : T export type RemoveLeadingSlashes = T extends `/${infer R}` ? R : T @@ -116,15 +118,15 @@ export type SearchPaths< TRouter extends AnyRouter, TSearchPath extends string, TPaths = ResolvePaths, -> = TPaths extends `${RemoveTrailingSlashes}${infer TRest}` - ? TRest - : never + TPrefix extends string = `${RemoveTrailingSlashes}/`, + TFilteredPaths = TPaths & `${TPrefix}${string}`, +> = TFilteredPaths extends `${TPrefix}${infer TRest}` ? TRest : never export type SearchRelativePathAutoComplete< TRouter extends AnyRouter, TTo extends string, TSearchPath extends string, -> = `${TTo}${SearchPaths}` +> = `${TTo}/${SearchPaths}` export type RelativeToParentPathAutoComplete< TRouter extends AnyRouter, @@ -144,7 +146,9 @@ export type RelativeToCurrentPathAutoComplete< TFrom extends string, TTo extends string, TResolvedPath extends string = ResolveRelativePath, -> = SearchRelativePathAutoComplete +> = + | SearchRelativePathAutoComplete + | CurrentPath> export type AbsolutePathAutoComplete< TRouter extends AnyRouter, @@ -173,22 +177,28 @@ export type RelativeToPathAutoComplete< TRouter extends AnyRouter, TFrom extends string, TTo extends string, -> = TTo extends `..${string}` - ? RelativeToParentPathAutoComplete> - : TTo extends `.${string}` - ? RelativeToCurrentPathAutoComplete< +> = string extends TFrom + ? AbsolutePathAutoComplete + : TTo extends `..${string}` + ? RelativeToParentPathAutoComplete< TRouter, TFrom, RemoveTrailingSlashes > - : AbsolutePathAutoComplete + : TTo extends `.${string}` + ? RelativeToCurrentPathAutoComplete< + TRouter, + TFrom, + RemoveTrailingSlashes + > + : AbsolutePathAutoComplete export type NavigateOptions< TRouter extends AnyRouter = RegisteredRouter, - TFrom extends RoutePaths | string = string, - TTo extends string = '', - TMaskFrom extends RoutePaths | string = TFrom, - TMaskTo extends string = '', + TFrom extends string = string, + TTo extends string | undefined = '.', + TMaskFrom extends string = TFrom, + TMaskTo extends string = '.', > = ToOptions & NavigateOptionProps export interface NavigateOptionProps { @@ -204,15 +214,15 @@ export interface NavigateOptionProps { export type ToOptions< TRouter extends AnyRouter = RegisteredRouter, - TFrom extends RoutePaths | string = string, - TTo extends string = '', - TMaskFrom extends RoutePaths | string = TFrom, - TMaskTo extends string = '', + TFrom extends string = string, + TTo extends string | undefined = '.', + TMaskFrom extends string = TFrom, + TMaskTo extends string = '.', > = ToSubOptions & MaskOptions export interface MaskOptions< in out TRouter extends AnyRouter, - in out TMaskFrom extends RoutePaths | string, + in out TMaskFrom extends string, in out TMaskTo extends string, > { _fromLocation?: undefined | ParsedLocation @@ -221,16 +231,16 @@ export interface MaskOptions< export type ToMaskOptions< TRouteTree extends AnyRouter = RegisteredRouter, - TMaskFrom extends RoutePaths | string = string, - TMaskTo extends string = '', + TMaskFrom extends string = string, + TMaskTo extends string = '.', > = ToSubOptions & { unmaskOnReload?: undefined | boolean } export type ToSubOptions< TRouter extends AnyRouter = RegisteredRouter, - TFrom extends RoutePaths | string = string, - TTo extends string = '', + TFrom extends string = string, + TTo extends string | undefined = '.', > = ToSubOptionsProps & SearchParamOptions & PathParamOptions @@ -238,7 +248,7 @@ export type ToSubOptions< export interface ToSubOptionsProps< in out TRouter extends AnyRouter = RegisteredRouter, in out TFrom extends RoutePaths | string = string, - in out TTo extends string = '', + in out TTo extends string | undefined = '.', > { to?: undefined | (ToPathOption & {}) hash?: undefined | true | Updater @@ -316,15 +326,17 @@ export type ResolveToParams< TTo, > = ResolveRelativePath extends infer TPath - ? string extends TPath - ? ResolveAllToParams - : TPath extends CatchAllPaths> + ? undefined extends TPath + ? never + : string extends TPath ? ResolveAllToParams - : ResolveRoute< - TRouter, - TFrom, - TTo - >['types'][ResolveToParamType] + : TPath extends CatchAllPaths> + ? ResolveAllToParams + : ResolveRoute< + TRouter, + TFrom, + TTo + >['types'][ResolveToParamType] : never type ResolveRelativeToParams< @@ -413,20 +425,12 @@ export type IsRequired< > : never -export type SearchParamOptions< - TRouter extends AnyRouter, - TFrom, - TTo extends string, -> = +export type SearchParamOptions = IsRequired extends never ? MakeOptionalSearchParams : MakeRequiredSearchParams -export type PathParamOptions< - TRouter extends AnyRouter, - TFrom, - TTo extends string, -> = +export type PathParamOptions = IsRequired extends never ? MakeOptionalPathParams : MakeRequiredPathParams @@ -434,7 +438,7 @@ export type PathParamOptions< export type ToPathOption< TRouter extends AnyRouter = AnyRouter, TFrom extends string = string, - TTo extends string = string, + TTo extends string | undefined = string, > = | CheckPath | RelativeToPathAutoComplete< @@ -472,9 +476,9 @@ export interface ActiveOptions { export type LinkOptions< TRouter extends AnyRouter = RegisteredRouter, TFrom extends string = string, - TTo extends string = '', + TTo extends string | undefined = '.', TMaskFrom extends string = TFrom, - TMaskTo extends string = '', + TMaskTo extends string = '.', > = NavigateOptions & LinkOptionsProps export interface LinkOptionsProps { @@ -522,29 +526,31 @@ export type ResolveRelativePath = string extends TFrom ? TTo : string extends TTo ? TFrom - : TFrom extends string - ? TTo extends string - ? TTo extends '.' - ? TFrom - : TTo extends `./` - ? Join<[TFrom, '/']> - : TTo extends `./${infer TRest}` - ? ResolveRelativePath - : TTo extends `/${infer TRest}` - ? TTo - : Split extends ['..', ...infer ToRest] - ? Split extends [...infer FromRest, infer FromTail] - ? ToRest extends ['/'] - ? Join<['/', ...FromRest, '/']> - : ResolveRelativePath, Join> - : never - : Split extends ['.', ...infer ToRest] - ? ToRest extends ['/'] - ? Join<[TFrom, '/']> - : ResolveRelativePath> - : CleanPath, ...Split]>> + : undefined extends TTo + ? TFrom + : TFrom extends string + ? TTo extends string + ? TTo extends '.' + ? TFrom + : TTo extends `./` + ? Join<[TFrom, '/']> + : TTo extends `./${infer TRest}` + ? ResolveRelativePath + : TTo extends `/${infer TRest}` + ? TTo + : Split extends ['..', ...infer ToRest] + ? Split extends [...infer FromRest, infer FromTail] + ? ToRest extends ['/'] + ? Join<['/', ...FromRest, '/']> + : ResolveRelativePath, Join> + : never + : Split extends ['.', ...infer ToRest] + ? ToRest extends ['/'] + ? Join<[TFrom, '/']> + : ResolveRelativePath> + : CleanPath, ...Split]>> + : never : never - : never // type Test1 = ResolveRelativePath<'/', '/posts'> // // ^? @@ -847,18 +853,18 @@ export function useLinkProps< export type UseLinkPropsOptions< TRouter extends AnyRouter = RegisteredRouter, TFrom extends RoutePaths | string = string, - TTo extends string = '', + TTo extends string | undefined = '.', TMaskFrom extends RoutePaths | string = TFrom, - TMaskTo extends string = '', + TMaskTo extends string = '.', > = ActiveLinkOptions & React.AnchorHTMLAttributes export type ActiveLinkOptions< TRouter extends AnyRouter = RegisteredRouter, TFrom extends string = string, - TTo extends string = '', + TTo extends string | undefined = '.', TMaskFrom extends string = TFrom, - TMaskTo extends string = '', + TMaskTo extends string = '.', > = LinkOptions & ActiveLinkOptionProps type ActiveLinkAnchorProps = Omit< @@ -890,9 +896,9 @@ export interface ActiveLinkOptionProps { export type LinkProps< TRouter extends AnyRouter = RegisteredRouter, TFrom extends string = string, - TTo extends string = '', + TTo extends string | undefined = '.', TMaskFrom extends string = TFrom, - TMaskTo extends string = '', + TMaskTo extends string = '.', > = ActiveLinkOptions & LinkPropsChildren @@ -928,16 +934,16 @@ export type LinkComponentProps< TComp, TRouter extends AnyRouter = RegisteredRouter, TFrom extends string = string, - TTo extends string = '', + TTo extends string | undefined = '.', TMaskFrom extends string = TFrom, - TMaskTo extends string = '', + TMaskTo extends string = '.', > = LinkComponentReactProps & LinkProps export type LinkComponent = < TRouter extends RegisteredRouter = RegisteredRouter, TFrom extends string = string, - TTo extends string = '', + TTo extends string | undefined = undefined, TMaskFrom extends string = TFrom, TMaskTo extends string = '', >( diff --git a/packages/react-router/src/path.ts b/packages/react-router/src/path.ts index bc9ed21cf9..c77ea0987d 100644 --- a/packages/react-router/src/path.ts +++ b/packages/react-router/src/path.ts @@ -181,7 +181,7 @@ export function parsePathname(pathname?: string): Array { return { type: 'pathname', - value: decodeURIComponent(part), + value: decodeURI(part), } }), ) diff --git a/packages/react-router/src/qss.ts b/packages/react-router/src/qss.ts index b5ec8e9e4d..b08d5878f1 100644 --- a/packages/react-router/src/qss.ts +++ b/packages/react-router/src/qss.ts @@ -68,6 +68,7 @@ export function decode(str: any, pfx?: string) { const equalIndex = tmp.indexOf('=') if (equalIndex !== -1) { k = tmp.slice(0, equalIndex) + k = decodeURIComponent(k) const value = tmp.slice(equalIndex + 1) if (out[k] !== void 0) { // @ts-expect-error @@ -77,6 +78,7 @@ export function decode(str: any, pfx?: string) { } } else { k = tmp + k = decodeURIComponent(k) out[k] = '' } } diff --git a/packages/react-router/src/redirects.ts b/packages/react-router/src/redirects.ts index 7c3188e714..b1a29a6893 100644 --- a/packages/react-router/src/redirects.ts +++ b/packages/react-router/src/redirects.ts @@ -7,10 +7,10 @@ export type AnyRedirect = Redirect export type Redirect< TRouter extends AnyRouter = RegisteredRouter, - TFrom extends RoutePaths = '/', - TTo extends string = '', - TMaskFrom extends RoutePaths = TFrom, - TMaskTo extends string = '', + TFrom extends RoutePaths | string = '/', + TTo extends string | undefined = '.', + TMaskFrom extends RoutePaths | string = TFrom, + TMaskTo extends string = '.', > = { /** * @deprecated Use `statusCode` instead @@ -36,10 +36,10 @@ export type ResolvedRedirect< } export function redirect< - TRouter extends AnyRouter = RegisteredRouter, - TFrom extends RoutePaths | string = string, - TTo extends string = '', - TMaskFrom extends RoutePaths | string = TFrom, + TRouter extends RegisteredRouter, + TTo extends string | undefined, + TFrom extends string = string, + TMaskFrom extends string = TFrom, TMaskTo extends string = '', >( opts: Redirect, diff --git a/packages/react-router/src/route.ts b/packages/react-router/src/route.ts index 000bdef20d..225d9e45b2 100644 --- a/packages/react-router/src/route.ts +++ b/packages/react-router/src/route.ts @@ -11,7 +11,7 @@ import { rootRouteId } from './root' import type * as React from 'react' import type { RootRouteId } from './root' import type { UseNavigateResult } from './useNavigate' -import type { MakeRouteMatch, RouteMatch } from './Matches' +import type { MakeRouteMatch, MakeRouteMatchUnion, RouteMatch } from './Matches' import type { NavigateOptions, ParsePathParams, ToMaskOptions } from './link' import type { ParsedLocation } from './location' import type { RouteById, RouteIds, RoutePaths } from './routeInfo' @@ -285,6 +285,7 @@ export interface ContextOptions< navigate: NavigateFn buildLocation: BuildLocationFn cause: 'preload' | 'enter' | 'stay' + matches: Array } export interface RouteContextOptions< @@ -749,37 +750,21 @@ export type RouteConstraints = { TRouteTree: AnyRoute } +export type RouteTypesById< + TRouter extends RegisteredRouter, + TId extends RouteIds, +> = RouteById['types'] + export function getRouteApi< - TId extends RouteIds, - TRouter extends AnyRouter = RegisteredRouter, - TRoute extends AnyRoute = RouteById, - TFullSearchSchema = TRoute['types']['fullSearchSchema'], - TAllParams = TRoute['types']['allParams'], - TAllContext = TRoute['types']['allContext'], - TLoaderDeps = TRoute['types']['loaderDeps'], - TLoaderData = TRoute['types']['loaderData'], + TRouter extends RegisteredRouter, + TId extends RouteIds, >(id: TId) { - return new RouteApi< - TId, - TRouter, - TRoute, - TFullSearchSchema, - TAllParams, - TAllContext, - TLoaderDeps, - TLoaderData - >({ id }) + return new RouteApi({ id }) } export class RouteApi< - TId extends RouteIds, - TRouter extends AnyRouter = RegisteredRouter, - TRoute extends AnyRoute = RouteById, - TFullSearchSchema = TRoute['types']['fullSearchSchema'], - TAllParams = TRoute['types']['allParams'], - TAllContext = TRoute['types']['allContext'], - TLoaderDeps = TRoute['types']['loaderDeps'], - TLoaderData = TRoute['types']['loaderData'], + TRouter extends RegisteredRouter, + TId extends RouteIds, > { id: TId @@ -800,8 +785,12 @@ export class RouteApi< return useMatch({ select: opts?.select, from: this.id }) } - useRouteContext = >(opts?: { - select?: (s: Expand) => TSelected + useRouteContext = < + TSelected = Expand['allContext']>, + >(opts?: { + select?: ( + s: Expand['allContext']>, + ) => TSelected }): TSelected => { return useMatch({ from: this.id, @@ -809,32 +798,44 @@ export class RouteApi< }) } - useSearch = >(opts?: { - select?: (s: Expand) => TSelected + useSearch = < + TSelected = Expand['fullSearchSchema']>, + >(opts?: { + select?: ( + s: Expand['fullSearchSchema']>, + ) => TSelected }): TSelected => { return useSearch({ ...opts, from: this.id }) } - useParams = >(opts?: { - select?: (s: Expand) => TSelected + useParams = < + TSelected = Expand['allParams']>, + >(opts?: { + select?: (s: Expand['allParams']>) => TSelected }): TSelected => { return useParams({ ...opts, from: this.id }) } - useLoaderDeps = (opts?: { - select?: (s: TLoaderDeps) => TSelected + useLoaderDeps = < + TSelected = RouteTypesById['loaderDeps'], + >(opts?: { + select?: (s: RouteTypesById['loaderDeps']) => TSelected }): TSelected => { return useLoaderDeps({ ...opts, from: this.id, strict: false } as any) } - useLoaderData = (opts?: { - select?: (s: TLoaderData) => TSelected + useLoaderData = < + TSelected = RouteTypesById['loaderData'], + >(opts?: { + select?: (s: RouteTypesById['loaderData']) => TSelected }): TSelected => { return useLoaderData({ ...opts, from: this.id, strict: false } as any) } - useNavigate = (): UseNavigateResult => { - return useNavigate({ from: this.id }) + useNavigate = (): UseNavigateResult< + RouteTypesById['fullPath'] + > => { + return useNavigate({ from: this.id as string }) } notFound = (opts?: NotFoundError) => { @@ -879,13 +880,45 @@ export class Route< TBeforeLoadFn > - // Set up in this.init() + // The following properties are set up in this.init() parentRoute!: TParentRoute - id!: TId - // customId!: TCustomId - path!: TPath - fullPath!: TFullPath - to!: TrimPathRight + private _id!: TId + private _path!: TPath + private _fullPath!: TFullPath + private _to!: TrimPathRight + + public get to() { + /* invariant( + this._to, + `trying to access property 'to' on a route which is not initialized yet. Route properties are only available after 'createRouter' completed.`, + )*/ + return this._to + } + + public get id() { + /* invariant( + this._id, + `trying to access property 'id' on a route which is not initialized yet. Route properties are only available after 'createRouter' completed.`, + )*/ + return this._id + } + + public get path() { + /* invariant( + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + this.isRoot || this._id || this._path, + `trying to access property 'path' on a route which is not initialized yet. Route properties are only available after 'createRouter' completed.`, + )*/ + return this._path + } + + public get fullPath() { + /* invariant( + this._fullPath, + `trying to access property 'fullPath' on a route which is not initialized yet. Route properties are only available after 'createRouter' completed.`, + )*/ + return this._fullPath + } // Optional children?: TChildren @@ -981,7 +1014,7 @@ export class Route< this.parentRoute = this.options.getParentRoute?.() if (isRoot) { - this.path = rootRouteId as TPath + this._path = rootRouteId as TPath } else { invariant( this.parentRoute, @@ -1017,11 +1050,11 @@ export class Route< const fullPath = id === rootRouteId ? '/' : joinPaths([this.parentRoute.fullPath, path]) - this.path = path as TPath - this.id = id as TId + this._path = path as TPath + this._id = id as TId // this.customId = customId as TCustomId - this.fullPath = fullPath as TFullPath - this.to = fullPath as TrimPathRight + this._fullPath = fullPath as TFullPath + this._to = fullPath as TrimPathRight } addChildren< @@ -1045,10 +1078,49 @@ export class Route< TLoaderFn, TNewChildren > { - this.children = ( - Array.isArray(children) ? children : Object.values(children) - ) as any - return this as any + return this._addFileChildren(children) + } + + _addFileChildren( + children: TNewChildren, + ): Route< + TParentRoute, + TPath, + TFullPath, + TCustomId, + TId, + TSearchValidator, + TParams, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TNewChildren + > { + if (Array.isArray(children)) { + this.children = children as TChildren + } + + if (typeof children === 'object' && children !== null) { + this.children = Object.values(children) as TChildren + } + + return this as unknown as Route< + TParentRoute, + TPath, + TFullPath, + TCustomId, + TId, + TSearchValidator, + TParams, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TNewChildren + > } updateLoader = (options: { @@ -1303,9 +1375,10 @@ export class RootRoute< in out TRouterContext = {}, in out TRouteContextFn = AnyContext, in out TBeforeLoadFn = AnyContext, - TLoaderDeps extends Record = {}, + in out TLoaderDeps extends Record = {}, in out TLoaderFn = undefined, - TChildren = unknown, + in out TChildren = unknown, + in out TFileRouteTypes = unknown, > extends Route< any, // TParentRoute '/', // TPath @@ -1350,9 +1423,58 @@ export class RootRoute< TBeforeLoadFn, TLoaderDeps, TLoaderFn, - TNewChildren + TNewChildren, + TFileRouteTypes > { - return super.addChildren(children) + super.addChildren(children) + return this as unknown as RootRoute< + TSearchValidator, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TNewChildren, + TFileRouteTypes + > + } + + _addFileChildren( + children: TNewChildren, + ): RootRoute< + TSearchValidator, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TNewChildren, + TFileRouteTypes + > { + super._addFileChildren(children) + return this as unknown as RootRoute< + TSearchValidator, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TNewChildren, + TFileRouteTypes + > + } + + _addFileTypes(): RootRoute< + TSearchValidator, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TChildren, + TFileRouteTypes + > { + return this as any } } @@ -1433,7 +1555,7 @@ export type RouteMask = { export function createRouteMask< TRouteTree extends AnyRoute, - TFrom extends RoutePaths, + TFrom extends RoutePaths | string, TTo extends string, >( opts: { diff --git a/packages/react-router/src/routeInfo.ts b/packages/react-router/src/routeInfo.ts index c19d6bc055..56d8df919f 100644 --- a/packages/react-router/src/routeInfo.ts +++ b/packages/react-router/src/routeInfo.ts @@ -1,3 +1,5 @@ +import type { InferFileRouteTypes } from './fileRoute' +import type { AddTrailingSlash, RemoveTrailingSlashes } from './link' import type { AnyRoute } from './route' import type { AnyRouter, TrailingSlashOption } from './router' import type { MergeUnion } from './utils' @@ -30,16 +32,32 @@ export type ParseRouteWithoutBranches = : never : never -export type RoutesById = { - [K in ParseRoute as K['id']]: K -} +export type CodeRoutesById = + ParseRoute extends infer TRoutes extends AnyRoute + ? { + [K in TRoutes as K['id']]: K + } + : never + +export type RoutesById = + InferFileRouteTypes extends never + ? CodeRoutesById + : InferFileRouteTypes['fileRoutesById'] export type RouteById = Extract< - RoutesById[TId], + RoutesById[TId & keyof RoutesById], AnyRoute > -export type RouteIds = ParseRoute['id'] +export type CodeRouteIds = + ParseRoute extends infer TRoutes extends AnyRoute + ? TRoutes['id'] + : never + +export type RouteIds = + InferFileRouteTypes extends never + ? CodeRouteIds + : InferFileRouteTypes['id'] export type ParentPath = 'always' extends TOption ? '../' @@ -53,22 +71,34 @@ export type CurrentPath = 'always' extends TOption ? '.' : './' | '.' -export type CatchAllPaths = - | CurrentPath - | ParentPath - | '' +export type CatchAllPaths = CurrentPath | ParentPath -export type RoutesByPath = { - [K in ParseRoute as K['fullPath']]: K -} +export type CodeRoutesByPath = + ParseRoute extends infer TRoutes extends AnyRoute + ? { + [K in TRoutes as K['fullPath']]: K + } + : never + +export type RoutesByPath = + InferFileRouteTypes extends never + ? CodeRoutesByPath + : InferFileRouteTypes['fileRoutesByFullPath'] export type RouteByPath = Extract< - RoutesByPath[TPath], + RoutesByPath[TPath & keyof RoutesByPath], AnyRoute > +export type CodeRoutePaths = + ParseRoute extends infer TRoutes extends AnyRoute + ? TRoutes['fullPath'] + : never + export type RoutePaths = - | ParseRoute['fullPath'] + | (InferFileRouteTypes extends never + ? CodeRoutePaths + : InferFileRouteTypes['fullPaths']) | '/' export type RouteToPathAlwaysTrailingSlash = @@ -107,7 +137,7 @@ export type RouteToByRouter< TRoute extends AnyRoute, > = RouteToPathByTrailingSlashOption[TrailingSlashOptionByRouter] -export type RouteToPath< +export type CodeRouteToPath< TRouter extends AnyRouter, TRouteTree extends AnyRoute, > = @@ -117,34 +147,82 @@ export type RouteToPath< : never : never -export type RoutesByToPath = { - [TRoute in ParseRouteWithoutBranches as RouteToByRouter< - TRouter, - TRoute - >]: TRoute -} +export type FileRouteToPath< + TRouter extends AnyRouter, + TTo = InferFileRouteTypes['to'], + TTrailingSlashOption = TrailingSlashOptionByRouter, +> = 'never' extends TTrailingSlashOption + ? TTo + : 'always' extends TTrailingSlashOption + ? AddTrailingSlash + : TTo | AddTrailingSlash -export type RouteByToPath = Extract< - RoutesByToPath[TTo], +export type RouteToPath< + TRouter extends AnyRouter, + TRouteTree extends AnyRoute, +> = + InferFileRouteTypes extends never + ? CodeRouteToPath + : FileRouteToPath + +export type CodeRoutesByToPath = + ParseRouteWithoutBranches extends infer TRoutes extends + AnyRoute + ? { + [TRoute in TRoutes as RouteToByRouter]: TRoute + } + : never + +export type RoutesByToPath = + InferFileRouteTypes extends never + ? CodeRoutesByToPath + : InferFileRouteTypes['fileRoutesByTo'] + +export type CodeRouteByToPath = Extract< + RoutesByToPath[TTo & keyof RoutesByToPath], AnyRoute > -export type FullSearchSchema = MergeUnion< - ParseRoute['types']['fullSearchSchema'] -> +export type FileRouteByToPath = + 'never' extends TrailingSlashOptionByRouter + ? CodeRouteByToPath + : 'always' extends TrailingSlashOptionByRouter + ? TTo extends '/' + ? CodeRouteByToPath + : TTo extends `${infer TPath}/` + ? CodeRouteByToPath + : never + : CodeRouteByToPath< + TRouter, + TTo extends '/' ? TTo : RemoveTrailingSlashes + > -export type FullSearchSchemaInput = MergeUnion< - ParseRoute['types']['fullSearchSchemaInput'] -> +export type RouteByToPath = + InferFileRouteTypes extends never + ? CodeRouteByToPath + : FileRouteByToPath -export type AllParams = MergeUnion< - ParseRoute['types']['allParams'] -> +export type FullSearchSchema = + ParseRoute extends infer TRoutes extends AnyRoute + ? MergeUnion + : never -export type AllContext = MergeUnion< - ParseRoute['types']['allContext'] -> +export type FullSearchSchemaInput = + ParseRoute extends infer TRoutes extends AnyRoute + ? MergeUnion + : never -export type AllLoaderData = MergeUnion< - ParseRoute['types']['loaderData'] -> +export type AllParams = + ParseRoute extends infer TRoutes extends AnyRoute + ? MergeUnion + : never + +export type AllContext = + ParseRoute extends infer TRoutes extends AnyRoute + ? MergeUnion + : never + +export type AllLoaderData = + ParseRoute extends infer TRoutes extends AnyRoute + ? MergeUnion + : never diff --git a/packages/react-router/src/router.ts b/packages/react-router/src/router.ts index 50d9b3e2f7..5044c95694 100644 --- a/packages/react-router/src/router.ts +++ b/packages/react-router/src/router.ts @@ -138,6 +138,7 @@ export type InferRouterContext = any, any, any, + any, any > ? TRouterContext @@ -305,7 +306,7 @@ export interface RouterOptions< */ notFoundMode?: 'root' | 'fuzzy' /** - * The default `gcTime` a route should use if no + * The default `gcTime` a route should use if no gcTime is provided. * * @default 1_800_000 `(30 minutes)` * @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaultgctime-property) @@ -321,7 +322,6 @@ export interface RouterOptions< */ caseSensitive?: boolean /** - * __Required*__ * * The route tree that will be used to configure the router instance. * @@ -492,7 +492,6 @@ export interface BuildNextOptions { unmaskOnReload?: boolean } from?: string - fromSearch?: unknown _fromLocation?: ParsedLocation } @@ -533,6 +532,15 @@ export const componentTypes = [ 'notFoundComponent', ] as const +function routeNeedsPreload(route: AnyRoute) { + for (const componentType of componentTypes) { + if ((route.options[componentType] as any)?.preload) { + return true + } + } + return false +} + export type RouterEvents = { onBeforeNavigate: { type: 'onBeforeNavigate' @@ -1180,7 +1188,10 @@ export class Router< } } else { const status = - route.options.loader || route.options.beforeLoad || route.lazyFn + route.options.loader || + route.options.beforeLoad || + route.lazyFn || + routeNeedsPreload(route) ? 'pending' : 'success' @@ -1265,6 +1276,7 @@ export class Router< cause: match.cause, abortController: match.abortController, preload: !!match.preload, + matches, } // Get the route context @@ -1304,13 +1316,9 @@ export class Router< } = {}, matches?: Array>, ): ParsedLocation => { - const fromMatches = - dest._fromLocation != null - ? this.matchRoutes({ - ...dest._fromLocation, - search: dest.fromSearch || dest._fromLocation.search, - }) - : this.state.matches + const fromMatches = dest._fromLocation + ? this.matchRoutes(dest._fromLocation) + : this.state.matches const fromMatch = dest.from != null @@ -1330,7 +1338,9 @@ export class Router< 'Could not find match for from: ' + dest.from, ) - const fromSearch = last(fromMatches)?.search || this.latestLocation.search + const fromSearch = this.state.pendingMatches?.length + ? last(this.state.pendingMatches)?.search + : last(fromMatches)?.search || this.latestLocation.search const stayingMatches = matches?.filter((d) => fromMatches.find((e) => e.routeId === d.routeId), @@ -1338,7 +1348,8 @@ export class Router< const fromRouteByFromPathRouteId = this.routesById[ - stayingMatches?.find((d) => d.pathname === fromPath)?.routeId + stayingMatches?.find((d) => d.pathname === fromPath) + ?.routeId as keyof this['routesById'] ] let pathname = dest.to @@ -1615,7 +1626,7 @@ export class Router< }) } - navigate: NavigateFn = ({ to, __isRedirect, ...rest }) => { + navigate: NavigateFn = ({ to, ...rest }) => { // If this link simply reloads the current route, // make sure it has a new key so it will trigger a data refresh @@ -1636,7 +1647,7 @@ export class Router< return this.buildAndCommitLocation({ ...rest, - to, + to: to as string, // to: toString, }) } @@ -1646,11 +1657,6 @@ export class Router< load = async (): Promise => { this.latestLocation = this.parseLocation(this.latestLocation) - this.__store.setState((s) => ({ - ...s, - loadedAt: Date.now(), - })) - let redirect: ResolvedRedirect | undefined let notFound: NotFoundError | undefined @@ -1741,6 +1747,7 @@ export class Router< return { ...s, isLoading: false, + loadedAt: Date.now(), matches: newMatches, pendingMatches: undefined, cachedMatches: [ @@ -1771,7 +1778,11 @@ export class Router< if (isResolvedRedirect(err)) { redirect = err if (!this.isServer) { - this.navigate({ ...err, replace: true, __isRedirect: true }) + this.navigate({ + ...err, + replace: true, + ignoreBlocker: true, + }) } } else if (isNotFound(err)) { notFound = err @@ -1820,12 +1831,16 @@ export class Router< // Reset the view transition flag delete this.shouldViewTransition // Attempt to start a view transition (or just apply the changes if we can't) - ;(shouldViewTransition && typeof document !== 'undefined' - ? document - : undefined - ) - // @ts-expect-error - ?.startViewTransition?.(fn) || fn() + if ( + shouldViewTransition && + typeof document !== 'undefined' && + 'startViewTransition' in document && + typeof document.startViewTransition === 'function' + ) { + document.startViewTransition(fn) + } else { + fn() + } } updateMatch = ( @@ -1978,12 +1993,38 @@ export class Router< const existingMatch = this.getMatch(matchId)! const parentMatchId = matches[index - 1]?.id + const route = this.looseRoutesById[routeId]! + + const pendingMs = + route.options.pendingMs ?? this.options.defaultPendingMs + + const shouldPending = !!( + onReady && + !this.isServer && + !preload && + (route.options.loader || route.options.beforeLoad) && + typeof pendingMs === 'number' && + pendingMs !== Infinity && + (route.options.pendingComponent ?? + this.options.defaultPendingComponent) + ) + if ( // If we are in the middle of a load, either of these will be present // (not to be confused with `loadPromise`, which is always defined) existingMatch.beforeLoadPromise || existingMatch.loaderPromise ) { + if (shouldPending) { + setTimeout(() => { + try { + // Update the match and prematurely resolve the loadMatches promise so that + // the pending component can start rendering + triggerOnReady() + } catch {} + }, pendingMs) + } + // Wait for the beforeLoad to resolve before we continue await existingMatch.beforeLoadPromise } else { @@ -1997,23 +2038,8 @@ export class Router< beforeLoadPromise: createControlledPromise(), })) - const route = this.looseRoutesById[routeId]! const abortController = new AbortController() - const pendingMs = - route.options.pendingMs ?? this.options.defaultPendingMs - - const shouldPending = !!( - onReady && - !this.isServer && - !preload && - (route.options.loader || route.options.beforeLoad) && - typeof pendingMs === 'number' && - pendingMs !== Infinity && - (route.options.pendingComponent ?? - this.options.defaultPendingComponent) - ) - let pendingTimeout: ReturnType if (shouldPending) { @@ -2076,6 +2102,7 @@ export class Router< this.navigate({ ...opts, _fromLocation: location }), buildLocation: this.buildLocation, cause: preload ? 'preload' : cause, + matches, } let beforeLoadContext = @@ -2136,7 +2163,7 @@ export class Router< (async () => { const { loaderPromise: prevLoaderPromise } = this.getMatch(matchId)! - + let loaderRunningAsync = false if (prevLoaderPromise) { await prevLoaderPromise } else { @@ -2248,11 +2275,6 @@ export class Router< componentsPromise, })) - // Lazy option can modify the route options, - // so we need to wait for it to resolve before - // we can use the options - await route._lazyPromise - // Kick off the loader! let loaderData = await route.options.loader?.(getLoaderContext()) @@ -2273,6 +2295,11 @@ export class Router< loaderData, ) + // Lazy option can modify the route options, + // so we need to wait for it to resolve before + // we can use the options + await route._lazyPromise + await potentialPendingMinPromise() const meta = route.options.meta?.({ @@ -2331,13 +2358,12 @@ export class Router< // If the route is successful and still fresh, just resolve const { status, invalid } = this.getMatch(matchId)! - - if (preload && route.options.preload === false) { - // Do nothing - } else if ( + loaderRunningAsync = status === 'success' && (invalid || (shouldReload ?? age > staleAge)) - ) { + if (preload && route.options.preload === false) { + // Do nothing + } else if (loaderRunningAsync) { ;(async () => { try { await runLoader() @@ -2356,7 +2382,7 @@ export class Router< updateMatch(matchId, (prev) => ({ ...prev, - isFetching: false, + isFetching: loaderRunningAsync ? prev.isFetching : false, loaderPromise: undefined, })) })(), @@ -2442,7 +2468,7 @@ export class Router< preloadRoute = async < TFrom extends RoutePaths | string = string, - TTo extends string = '', + TTo extends string | undefined = undefined, TMaskFrom extends RoutePaths | string = TFrom, TMaskTo extends string = '', >( @@ -2516,7 +2542,7 @@ export class Router< matchRoute = < TFrom extends RoutePaths = '/', - TTo extends string = '', + TTo extends string | undefined = undefined, TResolved = ResolveRelativePath>, >( location: ToOptions< @@ -2529,7 +2555,10 @@ export class Router< const matchLocation = { ...location, to: location.to - ? this.resolvePathWithBase((location.from || '') as string, location.to) + ? this.resolvePathWithBase( + (location.from || '') as string, + location.to as string, + ) : undefined, params: location.params || {}, leaveParams: true, diff --git a/packages/react-router/src/useLoaderData.tsx b/packages/react-router/src/useLoaderData.tsx index 43c38b4e76..bf12d61fb6 100644 --- a/packages/react-router/src/useLoaderData.tsx +++ b/packages/react-router/src/useLoaderData.tsx @@ -3,7 +3,7 @@ import type { RegisteredRouter } from './router' import type { AnyRoute } from './route' import type { MakeRouteMatch } from './Matches' import type { RouteIds } from './routeInfo' -import type { StrictOrFrom } from './utils' +import type { Constrain, StrictOrFrom } from './utils' export type UseLoaderDataOptions< TRouteTree extends AnyRoute, @@ -11,13 +11,13 @@ export type UseLoaderDataOptions< TStrict extends boolean, TRouteMatch extends MakeRouteMatch, TSelected, -> = StrictOrFrom & { +> = StrictOrFrom>, TStrict> & { select?: (match: Required['loaderData']) => TSelected } export function useLoaderData< TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], - TFrom extends RouteIds = RouteIds, + TFrom extends string | undefined = undefined, TStrict extends boolean = true, TRouteMatch extends MakeRouteMatch< TRouteTree, diff --git a/packages/react-router/src/useLoaderDeps.tsx b/packages/react-router/src/useLoaderDeps.tsx index add7f10de3..3a61502807 100644 --- a/packages/react-router/src/useLoaderDeps.tsx +++ b/packages/react-router/src/useLoaderDeps.tsx @@ -3,18 +3,18 @@ import type { RegisteredRouter } from './router' import type { AnyRoute } from './route' import type { MakeRouteMatch } from './Matches' import type { RouteIds } from './routeInfo' -import type { StrictOrFrom } from './utils' +import type { Constrain, StrictOrFrom } from './utils' export function useLoaderDeps< TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], - TFrom extends RouteIds = RouteIds, + TFrom extends string | undefined = undefined, TRouteMatch extends MakeRouteMatch = MakeRouteMatch< TRouteTree, TFrom >, TSelected = Required['loaderDeps'], >( - opts: StrictOrFrom & { + opts: StrictOrFrom>> & { select?: (match: TRouteMatch) => TSelected }, ): TSelected { diff --git a/packages/react-router/src/useMatch.tsx b/packages/react-router/src/useMatch.tsx index ac21808462..c912a993ae 100644 --- a/packages/react-router/src/useMatch.tsx +++ b/packages/react-router/src/useMatch.tsx @@ -6,7 +6,7 @@ import type { RegisteredRouter } from './router' import type { AnyRoute } from './route' import type { MakeRouteMatch } from './Matches' import type { RouteIds } from './routeInfo' -import type { StrictOrFrom } from './utils' +import type { Constrain, StrictOrFrom } from './utils' export type UseMatchOptions< TFrom, @@ -21,13 +21,19 @@ export type UseMatchOptions< export function useMatch< TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], - TFrom extends RouteIds = RouteIds, + TFrom extends string | undefined = undefined, TStrict extends boolean = true, TRouteMatch = MakeRouteMatch, TSelected = TRouteMatch, TThrow extends boolean = true, >( - opts: UseMatchOptions, + opts: UseMatchOptions< + Constrain>, + TStrict, + TRouteMatch, + TSelected, + TThrow + >, ): TThrow extends true ? TSelected : TSelected | undefined { const nearestMatchId = React.useContext(matchContext) diff --git a/packages/react-router/src/useNavigate.tsx b/packages/react-router/src/useNavigate.tsx index becc1b3699..a9701db874 100644 --- a/packages/react-router/src/useNavigate.tsx +++ b/packages/react-router/src/useNavigate.tsx @@ -5,10 +5,10 @@ import type { RoutePaths } from './routeInfo' import type { AnyRouter, RegisteredRouter } from './router' export type UseNavigateResult = < - TTo extends string, - TRouter extends AnyRouter = RegisteredRouter, - TFrom extends RoutePaths | string = TDefaultFrom, - TMaskFrom extends RoutePaths | string = TFrom, + TRouter extends RegisteredRouter, + TTo extends string | undefined, + TFrom extends string = TDefaultFrom, + TMaskFrom extends string = TFrom, TMaskTo extends string = '', >({ from, @@ -51,7 +51,7 @@ export function useNavigate< export function Navigate< TRouter extends AnyRouter = RegisteredRouter, TFrom extends RoutePaths | string = string, - TTo extends string = '', + TTo extends string | undefined = undefined, TMaskFrom extends RoutePaths | string = TFrom, TMaskTo extends string = '', >(props: NavigateOptions): null { @@ -61,7 +61,6 @@ export function Navigate< navigate({ ...props, } as any) - // eslint-disable-next-line react-hooks/exhaustive-deps }, []) return null diff --git a/packages/react-router/src/useParams.tsx b/packages/react-router/src/useParams.tsx index 3c29133778..1790c73211 100644 --- a/packages/react-router/src/useParams.tsx +++ b/packages/react-router/src/useParams.tsx @@ -2,7 +2,7 @@ import { useMatch } from './useMatch' import type { AnyRoute } from './route' import type { AllParams, RouteById, RouteIds } from './routeInfo' import type { RegisteredRouter } from './router' -import type { StrictOrFrom } from './utils' +import type { Constrain, StrictOrFrom } from './utils' export type UseParamsOptions< TFrom, @@ -15,13 +15,20 @@ export type UseParamsOptions< export function useParams< TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], - TFrom extends RouteIds = RouteIds, + TFrom extends string | undefined = undefined, TStrict extends boolean = true, TParams = TStrict extends false ? AllParams : RouteById['types']['allParams'], TSelected = TParams, ->(opts: UseParamsOptions): TSelected { +>( + opts: UseParamsOptions< + Constrain>, + TStrict, + TParams, + TSelected + >, +): TSelected { return useMatch({ ...opts, select: (match) => { diff --git a/packages/react-router/src/useRouteContext.ts b/packages/react-router/src/useRouteContext.ts index 772f1513e7..cbbcb7dc08 100644 --- a/packages/react-router/src/useRouteContext.ts +++ b/packages/react-router/src/useRouteContext.ts @@ -3,7 +3,7 @@ import type { MakeRouteMatch } from './Matches' import type { AnyRoute } from './route' import type { AllContext, RouteById, RouteIds } from './routeInfo' import type { RegisteredRouter } from './router' -import type { Expand, StrictOrFrom } from './utils' +import type { Constrain, Expand, StrictOrFrom } from './utils' export type UseRouteContextOptions< TFrom, @@ -16,14 +16,19 @@ export type UseRouteContextOptions< export function useRouteContext< TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], - TFrom extends RouteIds = RouteIds, + TFrom extends string | undefined = undefined, TStrict extends boolean = true, TRouteContext = TStrict extends false ? AllContext : Expand['types']['allContext']>, TSelected = TRouteContext, >( - opts: UseRouteContextOptions, + opts: UseRouteContextOptions< + Constrain>, + TStrict, + TRouteContext, + TSelected + >, ): TSelected { return useMatch({ ...(opts as any), diff --git a/packages/react-router/src/useSearch.tsx b/packages/react-router/src/useSearch.tsx index d4dbcebcb4..5b2b2017eb 100644 --- a/packages/react-router/src/useSearch.tsx +++ b/packages/react-router/src/useSearch.tsx @@ -3,7 +3,7 @@ import type { AnyRoute } from './route' import type { FullSearchSchema, RouteById, RouteIds } from './routeInfo' import type { RegisteredRouter } from './router' import type { MakeRouteMatch } from './Matches' -import type { Expand, StrictOrFrom } from './utils' +import type { Constrain, Expand, StrictOrFrom } from './utils' export type UseSearchOptions< TFrom, @@ -16,16 +16,23 @@ export type UseSearchOptions< export function useSearch< TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], - TFrom extends RouteIds = RouteIds, + TFrom extends string | undefined = undefined, TStrict extends boolean = true, TSearch = TStrict extends false ? FullSearchSchema : Expand['types']['fullSearchSchema']>, TSelected = TSearch, ->(opts: UseSearchOptions): TSelected { +>( + opts: UseSearchOptions< + Constrain>, + TStrict, + TSearch, + TSelected + >, +): TSelected { return useMatch({ ...opts, - select: (match: MakeRouteMatch) => { + select: (match) => { return opts.select ? opts.select(match.search) : match.search }, }) diff --git a/packages/react-router/tests/Matches.test-d.tsx b/packages/react-router/tests/Matches.test-d.tsx index 82e26e8aef..00f8734d86 100644 --- a/packages/react-router/tests/Matches.test-d.tsx +++ b/packages/react-router/tests/Matches.test-d.tsx @@ -1,8 +1,6 @@ import { expectTypeOf, test } from 'vitest' import { - type AnyRouteMatch, MatchRoute, - type RouteMatch, createRootRoute, createRoute, createRouter, @@ -10,7 +8,7 @@ import { useMatchRoute, useMatches, } from '../src' -import { FindValueByKey } from '../src/Matches' +import type { AnyRouteMatch, RouteMatch } from '../src' const rootRoute = createRootRoute() diff --git a/packages/react-router/tests/Matches.test.tsx b/packages/react-router/tests/Matches.test.tsx index fe6b86f0db..61fb2461bd 100644 --- a/packages/react-router/tests/Matches.test.tsx +++ b/packages/react-router/tests/Matches.test.tsx @@ -1,13 +1,13 @@ import { expect, test } from 'vitest' import { fireEvent, render, screen } from '@testing-library/react' import { + Link, + Outlet, + RouterProvider, createRootRoute, createRoute, createRouter, - Outlet, isMatch, - Link, - RouterProvider, useMatches, } from '../src' diff --git a/packages/react-router/tests/blocker.test.tsx b/packages/react-router/tests/blocker.test.tsx index 32ba93da30..c598e49402 100644 --- a/packages/react-router/tests/blocker.test.tsx +++ b/packages/react-router/tests/blocker.test.tsx @@ -10,12 +10,14 @@ import { createRootRoute, createRoute, createRouter, + redirect, useBlocker, useNavigate, } from '../src' afterEach(() => { window.history.replaceState(null, 'root', '/') + vi.resetAllMocks() cleanup() }) @@ -29,15 +31,16 @@ async function setup({ condition, ignoreBlocker }: BlockerTestOpts) { const indexRoute = createRoute({ getParentRoute: () => rootRoute, path: '/', - component: () => { + component: function Setup() { const navigate = useNavigate() useBlocker({ condition, blockerFn }) return (

Index

- link + link to posts + link to foo @@ -56,20 +59,49 @@ async function setup({ condition, ignoreBlocker }: BlockerTestOpts) { ), }) + const fooRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/foo', + beforeLoad: () => { + throw redirect({ to: '/bar' }) + }, + component: () => ( + +

Foo

+
+ ), + }) + + const barRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/bar', + component: () => ( + +

Bar

+
+ ), + }) + const router = createRouter({ - routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + routeTree: rootRoute.addChildren([ + indexRoute, + postsRoute, + fooRoute, + barRoute, + ]), }) render() expect(window.location.pathname).toBe('/') - const link = await screen.findByRole('link', { name: 'link' }) + const postsLink = await screen.findByRole('link', { name: 'link to posts' }) + const fooLink = await screen.findByRole('link', { name: 'link to foo' }) const button = await screen.findByRole('button', { name: 'button' }) - return { router, clickable: { link, button }, blockerFn } + return { router, clickable: { postsLink, fooLink, button }, blockerFn } } -const clickTarget = ['link' as const, 'button' as const] +const clickTarget = ['postsLink' as const, 'button' as const] describe('Blocker', () => { const doesNotBlockTextMatrix = combinate({ @@ -115,4 +147,17 @@ describe('Blocker', () => { expect(blockerFn).toHaveBeenCalledOnce() }, ) + + test('blocker function is only called once when navigating to a route that redirects', async () => { + const { clickable, blockerFn } = await setup({ + condition: true, + ignoreBlocker: false, + }) + blockerFn.mockImplementationOnce(() => true).mockImplementation(() => false) + fireEvent.click(clickable.fooLink) + expect( + await screen.findByRole('heading', { name: 'Bar' }), + ).toBeInTheDocument() + expect(window.location.pathname).toBe('/bar') + }) }) diff --git a/packages/react-router/tests/createRoute.test.ts b/packages/react-router/tests/createRoute.test.ts deleted file mode 100644 index efa13c814d..0000000000 --- a/packages/react-router/tests/createRoute.test.ts +++ /dev/null @@ -1,330 +0,0 @@ -import { describe, it } from 'vitest' -import { z } from 'zod' -import { createMemoryHistory, RootRoute, Route, createRouter } from '../src' - -const lazyTest = (comp: any, key: any) => { - comp.preload = () => {} - return comp -} - -// Write a test -describe('everything', () => { - it('should work', () => { - // // Build our routes. We could do this in our component, too. - // const rootRoute = createRootRoute() - // const indexRoute = createRoute({ - // getParentRoute: () => rootRoute, - // path: '/', - // validateSearch: (search) => - // z - // .object({ - // version: z.number(), - // }) - // .parse(search), - // }) - // const testRoute = createRoute({ - // getParentRoute: () => rootRoute, - // component: lazyTest(() => import('./TestComponent'), 'NamedComponent'), - // path: 'test', - // validateSearch: (search) => - // z - // .object({ - // version: z.number(), - // isGood: z.boolean(), - // }) - // .parse(search), - // }) - // const dashboardRoute = createRoute({ - // getParentRoute: () => rootRoute, - // path: 'dashboard', - // loader: async () => { - // console.info('Fetching all invoices...') - // return { - // invoices: 'await fetchInvoices()', - // } - // }, - // }) - // const dashboardIndexRoute = createRoute({ - // getParentRoute: () => dashboardRoute, - // path: '/', - // }) - // const invoicesRoute = createRoute({ - // getParentRoute: () => dashboardRoute, - // path: 'invoices', - // }) - // const invoicesIndexRoute = createRoute({ - // getParentRoute: () => invoicesRoute, - // path: '/', - // }) - // const invoiceRoute = createRoute({ - // getParentRoute: () => invoicesRoute, - // path: '$invoiceId', - // parseParams: ({ invoiceId }) => ({ invoiceId: Number(invoiceId) }), - // stringifyParams: ({ invoiceId }) => ({ - // invoiceId: String(invoiceId), - // }), - // loader: async ({ params: { invoiceId } }) => { - // console.info('Fetching invoice...') - // return { - // invoice: 'await fetchInvoiceById(invoiceId!)', - // } - // }, - // }) - // const usersRoute = createRoute({ - // getParentRoute: () => dashboardRoute, - // path: 'users', - // loader: async () => { - // return { - // users: 'await fetchUsers()', - // } - // }, - // validateSearch: (search) => - // z - // .object({ - // usersView: z - // .object({ - // sortBy: z.enum(['name', 'id', 'email']).optional(), - // filterBy: z.string().optional(), - // }) - // .optional(), - // }) - // .parse(search), - // preSearchFilters: [ - // // Keep the usersView search param around - // // while in this route (or it's children!) - // (search) => ({ - // ...search, - // usersView: { - // ...search.usersView, - // }, - // }), - // ], - // }) - // const userRoute = createRoute({ - // getParentRoute: () => usersRoute, - // path: '$userId', - // loader: async ({ params: { userId }, search }) => { - // return { - // user: 'await fetchUserById(userId!)', - // } - // }, - // }) - // const authenticatedRoute = createRoute({ - // getParentRoute: () => rootRoute, - // path: 'authenticated/', // Trailing slash doesn't mean anything - // }) - // const authenticatedIndexRoute = createRoute({ - // getParentRoute: () => authenticatedRoute, - // path: '/', - // }) - // const layoutRoute = createRoute({ - // getParentRoute: () => rootRoute, - // id: 'layout', - // component: () => 'layout-wrapper', - // validateSearch: (search) => - // z - // .object({ - // isLayout: z.boolean(), - // }) - // .parse(search), - // }) - // const layoutARoute = createRoute({ - // getParentRoute: () => layoutRoute, - // path: 'layout-a', - // component: () => 'layout-a', - // }) - // const layoutBRoute = createRoute({ - // getParentRoute: () => layoutRoute, - // path: 'layout-b', - // component: () => 'layout-b', - // }) - // const routeTree = rootRoute.addChildren([ - // indexRoute, - // testRoute, - // dashboardRoute.addChildren([ - // dashboardIndexRoute, - // invoicesRoute.addChildren([invoicesIndexRoute, invoiceRoute]), - // usersRoute.addChildren([userRoute]), - // ]), - // authenticatedRoute.addChildren([authenticatedIndexRoute]), - // layoutRoute.addChildren([layoutARoute, layoutBRoute]), - // ]) - // const router = createRouter({ - // routeTree, - // history: createMemoryHistory({ - // initialEntries: ['/?version=1'], - // }), - // }) - // const route = router.getRoute('/dashboard/users/$userId') - // router.buildLink({ - // to: '/dashboard/users/$userId', - // params: { - // userId: '2', - // }, - // search: (prev) => ({ - // usersView: { - // sortBy: 'email', - // }, - // }), - // }) - // // @ts-expect-error - // router.buildLink({ - // from: '/', - // to: '/test', - // }) - // router.buildLink({ - // from: '/', - // to: '/test', - // search: () => { - // return { - // version: 2, - // isGood: true, - // } - // }, - // }) - // router.buildLink({ - // from: '/test', - // to: '/', - // }) - // router.buildLink({ - // from: route.id, - // to: '', - // }) - // router.buildLink({ - // from: '/dashboard', - // to: '/dashboard/invoices', - // params: { - // invoiceId: 2, - // }, - // }) - // router.buildLink({ - // from: '/dashboard', - // to: '/dashboard/invoices/$invoiceId', - // params: { - // // @ts-expect-error - // invoiceId: '2', - // }, - // }) - // router.buildLink({ - // to: '/dashboard/invoices/$invoiceId', - // params: { - // invoiceId: 2, - // }, - // }) - // router.buildLink({ - // to: '/', - // search: { - // version: 2, - // }, - // }) - // router.buildLink({ - // to: '/dashboard/users/$userId', - // // @ts-expect-error - // params: (current) => ({ - // userId: current?.invoiceId, - // }), - // search: (old) => ({ - // usersView: { - // sortBy: 'email' as const, - // filterBy: String(old.version), - // }, - // }), - // }) - // router.buildLink({ - // from: '/dashboard/invoices/$invoiceId', - // to: '/dashboard/users/$userId', - // params: (current) => ({ - // userId: `${current?.invoiceId}`, - // }), - // search: (prev) => { - // return { - // usersView: { - // sortBy: 'name' as const, - // filterBy: 'tanner', - // }, - // } - // }, - // }) - // router.buildLink({ - // from: '/dashboard/users/$userId', - // to: '/', - // search: (prev) => { - // return { - // version: 2, - // } - // }, - // }) - // router.buildLink({ - // from: '/', - // to: '/dashboard/users/$userId', - // params: { - // userId: '2', - // }, - // search: (prev) => ({ - // usersView: { - // sortBy: 'id', - // filterBy: `${prev.version}`, - // }, - // }), - // }) - // router.navigate({ - // search: (prev: any) => ({ - // version: prev.version, - // }), - // }) - // router.buildLink({ - // from: '/dashboard/invoices', - // to: '/dashboard', - // }) - // router.buildLink({ - // from: '/', - // // @ts-expect-error - // to: '/does-not-exist', - // }) - // router.buildLink({ - // to: '/dashboard/invoices/$invoiceId', - // params: { - // invoiceId: 2, - // }, - // }) - // router.buildLink({ - // from: '/dashboard/invoices/$invoiceId', - // to: '.', - // params: (d) => ({ - // invoiceId: d.invoiceId, - // }), - // }) - // router.buildLink({ - // from: '/dashboard/invoices/$invoiceId', - // to: testRoute.fullPath, - // search: { - // version: 2, - // isGood: true, - // }, - // }) - // router.buildLink({ - // to: '/layout-a', - // search: (current) => ({ - // isLayout: !!current.version, - // }), - // }) - // router.buildLink({ - // to: '/', - // state: true, - // }) - // router.buildLink({ - // to: '/', - // state: {}, - // }) - // router.buildLink({ - // to: '/', - // state: (prev) => prev, - // }) - // router.buildLink({ - // to: '/', - // state: (prev) => ({ - // test: true, - // }), - // }) - }) -}) diff --git a/packages/react-router/tests/link.test-d.tsx b/packages/react-router/tests/link.test-d.tsx index 3e2ba47fea..065df188af 100644 --- a/packages/react-router/tests/link.test-d.tsx +++ b/packages/react-router/tests/link.test-d.tsx @@ -1,11 +1,6 @@ import { expectTypeOf, test } from 'vitest' -import { - Link, - type SearchSchemaInput, - createRootRoute, - createRoute, - createRouter, -} from '../src' +import { Link, createRootRoute, createRoute, createRouter } from '../src' +import type { SearchSchemaInput } from '../src' const rootRoute = createRootRoute({ validateSearch: (): { rootPage?: number } => ({ rootPage: 0 }), @@ -393,7 +388,6 @@ test('when navigating from a route with no params and no search to the root', () | '..' | '.' | '/' - | '' | '/invoices' | '/invoices/$invoiceId' | '/invoices/$invoiceId/edit' @@ -413,7 +407,6 @@ test('when navigating from a route with no params and no search to the root', () | '..' | '.' | '/' - | '' | '/invoices' | '/invoices/$invoiceId' | '/invoices/$invoiceId/edit' @@ -446,14 +439,13 @@ test('when navigating from a route with no params and no search to the root', () | undefined >() - expectTypeOf(Link) + expectTypeOf(Link) .parameter(0) .toHaveProperty('to') .toEqualTypeOf< | '..' | '.' | '/' - | '' | '/invoices' | '/invoices/$invoiceId' | '/invoices/$invoiceId/edit' @@ -610,25 +602,25 @@ test('when navigating from a route with no params and no search to the root', () }) test('when navigating from a route with no params and no search to the current route', () => { - expectTypeOf(Link) + expectTypeOf(Link) .parameter(0) .toHaveProperty('to') - .toEqualTypeOf<'./$postId' | undefined | './' | '.'>() + .toEqualTypeOf<'./$postId' | undefined | '.'>() - expectTypeOf(Link) + expectTypeOf(Link) .parameter(0) .toHaveProperty('to') - .toEqualTypeOf<'./$postId' | undefined | './' | '.'>() + .toEqualTypeOf<'./$postId' | undefined | '.'>() expectTypeOf(Link) .parameter(0) .toHaveProperty('to') .toEqualTypeOf<'./$postId/' | undefined | './'>() - expectTypeOf(Link) + expectTypeOf(Link) .parameter(0) .toHaveProperty('to') - .toEqualTypeOf<'./$postId' | undefined | './' | '.'>() + .toEqualTypeOf<'./$postId' | undefined | '.'>() expectTypeOf(Link) .parameter(0) diff --git a/packages/react-router/tests/link.test.tsx b/packages/react-router/tests/link.test.tsx index 9bf54202b0..76ca8fa9b7 100644 --- a/packages/react-router/tests/link.test.tsx +++ b/packages/react-router/tests/link.test.tsx @@ -28,7 +28,7 @@ import { useRouterState, useSearch, } from '../src' -import { getIntersectionObserverMock } from './utils' +import { getIntersectionObserverMock, sleep } from './utils' const ioObserveMock = vi.fn() const ioDisconnectMock = vi.fn() @@ -47,6 +47,8 @@ afterEach(() => { cleanup() }) +const WAIT_TIME = 300 + describe('Link', () => { test('when using renderHook it returns a hook with same content to prove rerender works', async () => { /** @@ -661,8 +663,6 @@ describe('Link', () => { const postsRoute = createRoute({ getParentRoute: () => rootRoute, path: 'posts', - loaderDeps: (opts) => ({ page: opts.search }), - loader: loader, validateSearch: (input: Record) => { const page = Number(input.page) @@ -672,6 +672,8 @@ describe('Link', () => { page, } }, + loaderDeps: (opts) => ({ page: opts.search }), + loader: loader, component: PostsComponent, }) @@ -724,12 +726,6 @@ describe('Link', () => { const postsRoute = createRoute({ getParentRoute: () => rootRoute, path: 'posts', - loaderDeps: (opts) => ({ page: opts.search }), - loader: () => { - throw new Error() - }, - onError, - errorComponent: () => Something went wrong!, validateSearch: (input: Record) => { const page = Number(input.page) @@ -739,6 +735,12 @@ describe('Link', () => { page, } }, + loaderDeps: (opts) => ({ page: opts.search }), + onError, + errorComponent: () => Something went wrong!, + loader: () => { + throw new Error() + }, component: PostsComponent, }) @@ -760,6 +762,77 @@ describe('Link', () => { expect(onError).toHaveBeenCalledOnce() }) + test('when navigating away from a route with a loader that errors', async () => { + const postsOnError = vi.fn() + const indexOnError = vi.fn() + const rootRoute = createRootRoute({ + component: () => ( + <> +
+ Index Posts +
+
+ + + ), + }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => { + return ( + <> +

Index

+ + ) + }, + onError: indexOnError, + errorComponent: () => IndexError, + }) + + const error = new Error('Something went wrong!') + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + loaderDeps: (opts) => ({ page: opts.search }), + loader: () => { + throw error + }, + onError: postsOnError, + errorComponent: () => PostsError, + component: () => { + return ( + <> +

Posts

+ + ) + }, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + }) + + render() + + const postsLink = await screen.findByRole('link', { name: 'Posts' }) + + fireEvent.click(postsLink) + + const postsErrorText = await screen.findByText('PostsError') + expect(postsErrorText).toBeInTheDocument() + + expect(postsOnError).toHaveBeenCalledOnce() + expect(postsOnError).toHaveBeenCalledWith(error) + + const indexLink = await screen.findByRole('link', { name: 'Index' }) + fireEvent.click(indexLink) + + expect(screen.findByText('IndexError')).rejects.toThrow() + expect(indexOnError).not.toHaveBeenCalledOnce() + }) + test('when navigating to /posts with a beforeLoad that redirects', async () => { const rootRoute = createRootRoute() const indexRoute = createRoute({ @@ -3528,6 +3601,57 @@ describe('Link', () => { expect(ioObserveMock).not.toBeCalled() }) + + test('Router.preload="intent", pendingComponent renders during unresolved route loader', async () => { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => { + return ( +
+

Index page

+ + link to posts + +
+ ) + }, + }) + + const postRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + loader: () => sleep(WAIT_TIME), + component: () =>
Posts page
, + }) + + const routeTree = rootRoute.addChildren([postRoute, indexRoute]) + const router = createRouter({ + routeTree, + defaultPreload: 'intent', + defaultPendingMs: 200, + defaultPendingComponent: () =>

Loading...

, + }) + + render() + + const linkToPosts = await screen.findByRole('link', { + name: 'link to posts', + }) + expect(linkToPosts).toBeInTheDocument() + + fireEvent.focus(linkToPosts) + fireEvent.click(linkToPosts) + + const loadingElement = await screen.findByText('Loading...') + expect(loadingElement).toBeInTheDocument() + + const postsElement = await screen.findByText('Posts page') + expect(postsElement).toBeInTheDocument() + + expect(window.location.pathname).toBe('/posts') + }) }) describe('createLink', () => { diff --git a/packages/react-router/tests/loaders.test.tsx b/packages/react-router/tests/loaders.test.tsx index 277dc90949..0ca8520441 100644 --- a/packages/react-router/tests/loaders.test.tsx +++ b/packages/react-router/tests/loaders.test.tsx @@ -163,7 +163,7 @@ describe('loaders parentMatchPromise', () => { expect(fooElement).toBeInTheDocument() expect(nestedLoaderMock).toHaveBeenCalled() - expect(nestedLoaderMock.mock.calls[0][0]).toBeInstanceOf(Promise) + expect(nestedLoaderMock.mock.calls[0]?.[0]).toBeInstanceOf(Promise) }) }) diff --git a/packages/react-router/tests/navigate.test.tsx b/packages/react-router/tests/navigate.test.tsx index 61e34f55cd..21f4865bb4 100644 --- a/packages/react-router/tests/navigate.test.tsx +++ b/packages/react-router/tests/navigate.test.tsx @@ -1,12 +1,12 @@ import { afterEach, describe, expect, it, vi } from 'vitest' import { - type RouterHistory, createMemoryHistory, createRootRoute, createRoute, createRouter, } from '../src' +import type { RouterHistory } from '../src' afterEach(() => { vi.clearAllMocks() @@ -68,6 +68,15 @@ function createTestRouter(initialHistory?: RouterHistory) { getParentRoute: () => gLayoutRoute, path: '$username', }) + const searchRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'search', + validateSearch: (search: Record) => { + return { + ['foo=bar']: Number(search['foo=bar'] ?? 1), + } + }, + }) const projectTree = projectRoute.addChildren([ projectIdRoute.addChildren([ @@ -130,7 +139,7 @@ describe('router.navigate navigation using a single path param - object syntax f await router.navigate({ params: { slug: 'tkdodo' }, - }) + } as any) await router.invalidate() expect(router.state.location.pathname).toBe('/posts/tkdodo') @@ -167,7 +176,7 @@ describe('router.navigate navigation using a single path param - function syntax await router.navigate({ params: (p: any) => ({ ...p, slug: 'tkdodo' }), - }) + } as any) await router.invalidate() expect(router.state.location.pathname).toBe('/posts/tkdodo') @@ -204,7 +213,7 @@ describe('router.navigate navigation using multiple path params - object syntax await router.navigate({ params: { projectId: 'query' }, - }) + } as any) await router.invalidate() expect(router.state.location.pathname).toBe('/p/query/v1/react') @@ -239,7 +248,7 @@ describe('router.navigate navigation using multiple path params - object syntax await router.navigate({ params: { version: 'v3' }, - }) + } as any) await router.invalidate() expect(router.state.location.pathname).toBe('/p/router/v3/react') @@ -274,7 +283,7 @@ describe('router.navigate navigation using multiple path params - object syntax await router.navigate({ params: { framework: 'vue' }, - }) + } as any) await router.invalidate() expect(router.state.location.pathname).toBe('/p/router/v1/vue') @@ -311,7 +320,7 @@ describe('router.navigate navigation using multiple path params - function synta await router.navigate({ params: (p: any) => ({ ...p, projectId: 'query' }), - }) + } as any) await router.invalidate() expect(router.state.location.pathname).toBe('/p/query/v1/react') @@ -346,7 +355,7 @@ describe('router.navigate navigation using multiple path params - function synta await router.navigate({ params: (p: any) => ({ ...p, version: 'v3' }), - }) + } as any) await router.invalidate() expect(router.state.location.pathname).toBe('/p/router/v3/react') @@ -381,14 +390,14 @@ describe('router.navigate navigation using multiple path params - function synta await router.navigate({ params: (p: any) => ({ ...p, framework: 'vue' }), - }) + } as any) await router.invalidate() expect(router.state.location.pathname).toBe('/p/router/v1/vue') }) }) -describe('router.navigate navigation using layout routes resolves correctly', async () => { +describe('router.navigate navigation using layout routes resolves correctly', () => { it('should resolve "/u/tanner" in "/u/_layout/$username" to "/u/tkdodo"', async () => { const { router } = createTestRouter( createMemoryHistory({ initialEntries: ['/u/tanner'] }), @@ -419,7 +428,7 @@ describe('router.navigate navigation using layout routes resolves correctly', as await router.navigate({ params: { username: 'tkdodo' }, - }) + } as any) await router.invalidate() expect(router.state.location.pathname).toBe('/u/tkdodo') @@ -455,9 +464,27 @@ describe('router.navigate navigation using layout routes resolves correctly', as await router.navigate({ params: { username: 'tkdodo' }, - }) + } as any) await router.invalidate() expect(router.state.location.pathname).toBe('/g/tkdodo') }) + + it('should handle search params with special characters', async () => { + const { router } = createTestRouter( + createMemoryHistory({ initialEntries: ['/search?foo%3Dbar=2'] }), + ) + + await router.load() + + expect(router.state.location.pathname).toBe('/search') + expect(router.state.location.search).toStrictEqual({ 'foo=bar': 2 }) + + await router.navigate({ + search: { 'foo=bar': 3 }, + } as any) + await router.invalidate() + + expect(router.state.location.search).toStrictEqual({ 'foo=bar': 3 }) + }) }) diff --git a/packages/react-router/tests/qss.test.ts b/packages/react-router/tests/qss.test.ts index b7aebec203..7f1bbca239 100644 --- a/packages/react-router/tests/qss.test.ts +++ b/packages/react-router/tests/qss.test.ts @@ -32,6 +32,12 @@ describe('encode function', () => { const queryString = encode(obj) expect(queryString).toEqual('token=foo%3F&key=value%3D') }) + + it('should handle encoding a top-level key with a special character', () => { + const obj = { 'foo=bar': 1 } + const queryString = encode(obj) + expect(queryString).toEqual('foo%3Dbar=1') + }) }) describe('decode function', () => { @@ -64,4 +70,22 @@ describe('decode function', () => { const decodedObj = decode(queryString) expect(decodedObj).toEqual({ token: 'foo?', key: 'value=' }) }) + + it('should handle decoding a top-level key with a special character', () => { + const queryString = 'foo%3Dbar=1' + const decodedObj = decode(queryString) + expect(decodedObj).toEqual({ 'foo=bar': 1 }) + }) + + it('should handle decoding a top-level key with a special character and without a value', () => { + const queryString = 'foo%3Dbar=' + const decodedObj = decode(queryString) + expect(decodedObj).toEqual({ 'foo=bar': '' }) + }) + + it('should handle decoding a value-less top-level key with a special character', () => { + const queryString = 'foo%3Dbar' + const decodedObj = decode(queryString) + expect(decodedObj).toEqual({ 'foo=bar': '' }) + }) }) diff --git a/packages/react-router/tests/redirects.test-d.tsx b/packages/react-router/tests/redirects.test-d.tsx index faee64f146..2516f14ec0 100644 --- a/packages/react-router/tests/redirects.test-d.tsx +++ b/packages/react-router/tests/redirects.test-d.tsx @@ -36,7 +36,7 @@ const defaultRouter = createRouter({ type DefaultRouter = typeof defaultRouter test('can redirect to valid route', () => { - expectTypeOf(redirect) + expectTypeOf(redirect) .parameter(0) .toHaveProperty('to') .toEqualTypeOf< diff --git a/packages/react-router/tests/route.test-d.tsx b/packages/react-router/tests/route.test-d.tsx index c005f052dc..9becb50205 100644 --- a/packages/react-router/tests/route.test-d.tsx +++ b/packages/react-router/tests/route.test-d.tsx @@ -16,6 +16,7 @@ import type { Route, SearchSchemaInput, } from '../src' +import type { MakeRouteMatchUnion } from '../src/Matches' test('when creating the root', () => { const rootRoute = createRootRoute() @@ -38,6 +39,7 @@ test('when creating the root with routeContext', () => { cause: 'preload' | 'enter' | 'stay' context: {} search: {} + matches: Array }>() }, }) @@ -60,6 +62,7 @@ test('when creating the root with beforeLoad', () => { cause: 'preload' | 'enter' | 'stay' context: {} search: {} + matches: Array }>() }, }) @@ -107,6 +110,7 @@ test('when creating the root route with context and routeContext', () => { cause: 'preload' | 'enter' | 'stay' context: { userId: string } search: {} + matches: Array }>() }, }) @@ -141,6 +145,7 @@ test('when creating the root route with context and beforeLoad', () => { cause: 'preload' | 'enter' | 'stay' context: { userId: string } search: {} + matches: Array }>() }, }) @@ -210,6 +215,7 @@ test('when creating the root route with context, routeContext, beforeLoad and a cause: 'preload' | 'enter' | 'stay' context: { userId: string } search: {} + matches: Array }>() return { @@ -227,6 +233,7 @@ test('when creating the root route with context, routeContext, beforeLoad and a cause: 'preload' | 'enter' | 'stay' context: { userId: string; env: 'env1' } search: {} + matches: Array }>() return { permission: 'view' as const } }, @@ -319,6 +326,7 @@ test('when creating a child route with routeContext from the root route with con cause: 'preload' | 'enter' | 'stay' context: { userId: string } search: {} + matches: Array }>() return { @@ -345,6 +353,7 @@ test('when creating a child route with beforeLoad from the root route with conte cause: 'preload' | 'enter' | 'stay' context: { userId: string } search: {} + matches: Array }>() }, }) @@ -356,7 +365,7 @@ test('when creating a child route with a loader from the root route', () => { const invoicesRoute = createRoute({ path: 'invoices', getParentRoute: () => rootRoute, - loader: async (opt) => { + loader: (opt) => { expectTypeOf(opt).toEqualTypeOf<{ abortController: AbortController preload: boolean @@ -398,7 +407,7 @@ test('when creating a child route with a loader from the root route with context const invoicesRoute = createRoute({ path: 'invoices', getParentRoute: () => rootRoute, - loader: async (opts) => { + loader: (opts) => { expectTypeOf(opts).toEqualTypeOf<{ abortController: AbortController preload: boolean @@ -614,6 +623,7 @@ test('when creating a child route with params, search with routeContext from the cause: 'preload' | 'enter' | 'stay' context: { userId: string } search: { page: number } + matches: Array }>() }, }) @@ -637,6 +647,7 @@ test('when creating a child route with params, search with beforeLoad from the r cause: 'preload' | 'enter' | 'stay' context: { userId: string } search: { page: number } + matches: Array }>() }, }) @@ -660,6 +671,7 @@ test('when creating a child route with params, search with routeContext, beforeL cause: 'preload' | 'enter' | 'stay' context: { userId: string } search: { page: number } + matches: Array }>() return { env: 'env1', @@ -676,6 +688,7 @@ test('when creating a child route with params, search with routeContext, beforeL cause: 'preload' | 'enter' | 'stay' context: { userId: string; env: string } search: { page: number } + matches: Array }>() return { permission: 'view' } as const }, @@ -774,6 +787,7 @@ test('when creating a child route with routeContext from a parent with routeCont cause: 'preload' | 'enter' | 'stay' context: { userId: string } search: {} + matches: Array }>() return { invoiceId: 'invoiceId1' } @@ -794,6 +808,7 @@ test('when creating a child route with routeContext from a parent with routeCont cause: 'preload' | 'enter' | 'stay' context: { userId: string; invoiceId: string } search: {} + matches: Array }>() return { detailId: 'detailId1' } @@ -826,7 +841,7 @@ test('when creating a child route with beforeLoad from a parent with beforeLoad' const invoicesRoute = createRoute({ path: 'invoices', getParentRoute: () => rootRoute, - beforeLoad: async (opt) => { + beforeLoad: (opt) => { expectTypeOf(opt).toEqualTypeOf<{ abortController: AbortController preload: boolean @@ -837,6 +852,7 @@ test('when creating a child route with beforeLoad from a parent with beforeLoad' cause: 'preload' | 'enter' | 'stay' context: { userId: string } search: {} + matches: Array }>() return { invoiceId: 'invoiceId1' } }, @@ -845,7 +861,7 @@ test('when creating a child route with beforeLoad from a parent with beforeLoad' const detailsRoute = createRoute({ path: 'details', getParentRoute: () => invoicesRoute, - beforeLoad: async (opt) => { + beforeLoad: (opt) => { expectTypeOf(opt).toEqualTypeOf<{ abortController: AbortController preload: boolean @@ -856,6 +872,7 @@ test('when creating a child route with beforeLoad from a parent with beforeLoad' cause: 'preload' | 'enter' | 'stay' context: { userId: string; invoiceId: string } search: {} + matches: Array }>() return { detailId: 'detailId1' } }, @@ -899,6 +916,7 @@ test('when creating a child route with routeContext, beforeLoad, search, params, cause: 'preload' | 'enter' | 'stay' context: { userId: string } search: { page: number } + matches: Array }>() return { env: 'env1' } }, @@ -913,6 +931,7 @@ test('when creating a child route with routeContext, beforeLoad, search, params, cause: 'preload' | 'enter' | 'stay' context: { userId: string; env: string } search: { page: number } + matches: Array }>() return { invoicePermissions: ['view'] as const } }, @@ -942,6 +961,7 @@ test('when creating a child route with routeContext, beforeLoad, search, params, invoicePermissions: readonly ['view'] } search: { page: number; detailPage: number } + matches: Array }>() return { detailEnv: 'detailEnv' } }, @@ -961,6 +981,7 @@ test('when creating a child route with routeContext, beforeLoad, search, params, invoicePermissions: readonly ['view'] } search: { page: number; detailPage: number } + matches: Array }>() return { detailsPermissions: ['view'] as const } }, @@ -1030,17 +1051,16 @@ test('when creating a child route with context, search, params and beforeLoad', invoicePermissions: readonly ['view'] } }>() - expectTypeOf(opts.buildLocation<'/', Router>) + expectTypeOf(opts.buildLocation) .parameter(0) .toHaveProperty('to') .toEqualTypeOf< - | '/' - | '/invoices' - | '/invoices/$invoiceId' - | '/invoices/$invoiceId/details' - | '/invoices/$invoiceId/details/$detailId' | '.' - | '..' + | './' + | './invoices' + | './invoices/$invoiceId' + | './invoices/$invoiceId/details' + | './invoices/$invoiceId/details/$detailId' | undefined >() }, @@ -1105,11 +1125,11 @@ test('when creating a child route with context, search, params, loader, loaderDe createRoute({ path: '$detailId', getParentRoute: () => detailsRoute, + beforeLoad: () => ({ detailPermission: true }), loaderDeps: (deps) => ({ detailPage: deps.search.detailPage, invoicePage: deps.search.page, }), - beforeLoad: () => ({ detailPermission: true }), loader: () => ({ detailLoader: 'detailResult' }) as const, onEnter: (match) => expectTypeOf(match).toMatchTypeOf(), onStay: (match) => expectTypeOf(match).toMatchTypeOf(), @@ -1438,18 +1458,18 @@ test('when creating a child route with no explicit search input', () => { const navigate = indexRoute.useNavigate() - expectTypeOf(navigate<'/', typeof router, '/'>) + expectTypeOf(navigate) .parameter(0) .toHaveProperty('search') .exclude() .toEqualTypeOf<{ page: number }>() - expectTypeOf(navigate<'/', typeof router, '/'>) + expectTypeOf(navigate) .parameter(0) .toHaveProperty('search') .returns.toEqualTypeOf<{ page: number }>() - expectTypeOf(navigate<'/', typeof router, '/'>) + expectTypeOf(navigate) .parameter(0) .toHaveProperty('search') .parameter(0) @@ -1497,18 +1517,18 @@ test('when creating a child route with an explicit search input', () => { const navigate = indexRoute.useNavigate() - expectTypeOf(navigate<'/', typeof router, '/'>) + expectTypeOf(navigate) .parameter(0) .toHaveProperty('search') .exclude() .toEqualTypeOf<{ input: string }>() - expectTypeOf(navigate<'/', typeof router, '/'>) + expectTypeOf(navigate) .parameter(0) .toHaveProperty('search') .returns.toEqualTypeOf<{ input: string }>() - expectTypeOf(navigate<'/', typeof router, '/'>) + expectTypeOf(navigate) .parameter(0) .toHaveProperty('search') .parameter(0) diff --git a/packages/react-router/tests/route.test.ts b/packages/react-router/tests/route.test.ts deleted file mode 100644 index a001f7bfa7..0000000000 --- a/packages/react-router/tests/route.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -/* eslint-disable */ -import { describe, it, expect } from 'vitest' -import { getRouteApi, createRoute } from '../src' - -describe('getRouteApi', () => { - it('should have the useMatch hook', () => { - const api = getRouteApi('foo') - expect(api.useMatch).toBeDefined() - }) - - it('should have the useRouteContext hook', () => { - const api = getRouteApi('foo') - expect(api.useRouteContext).toBeDefined() - }) - - it('should have the useSearch hook', () => { - const api = getRouteApi('foo') - expect(api.useSearch).toBeDefined() - }) - - it('should have the useParams hook', () => { - const api = getRouteApi('foo') - expect(api.useParams).toBeDefined() - }) - - it('should have the useLoaderData hook', () => { - const api = getRouteApi('foo') - expect(api.useLoaderData).toBeDefined() - }) - - it('should have the useLoaderDeps hook', () => { - const api = getRouteApi('foo') - expect(api.useLoaderDeps).toBeDefined() - }) - - it('should have the useNavigate hook', () => { - const api = getRouteApi('foo') - expect(api.useNavigate).toBeDefined() - }) -}) - -describe('createRoute has the same hooks as getRouteApi', () => { - const routeApi = getRouteApi('foo') - const hookNames = Object.keys(routeApi).filter((key) => key.startsWith('use')) - const route = createRoute({} as any) - - it.each(hookNames.map((name) => [name]))( - 'should have the "%s" hook defined', - (hookName) => { - expect(route[hookName as keyof typeof route]).toBeDefined() - }, - ) -}) diff --git a/packages/react-router/tests/route.test.tsx b/packages/react-router/tests/route.test.tsx new file mode 100644 index 0000000000..e09642ba35 --- /dev/null +++ b/packages/react-router/tests/route.test.tsx @@ -0,0 +1,196 @@ +import React from 'react' +import { afterEach, describe, expect, it, vi } from 'vitest' +import { cleanup, render, screen } from '@testing-library/react' + +import { + RouterProvider, + createRootRoute, + createRoute, + createRouter, + getRouteApi, + useNavigate, +} from '../src' + +afterEach(() => { + vi.resetAllMocks() + window.history.replaceState(null, 'root', '/') + cleanup() +}) + +describe('getRouteApi', () => { + it('should have the useMatch hook', () => { + const api = getRouteApi('foo') + expect(api.useMatch).toBeDefined() + }) + + it('should have the useRouteContext hook', () => { + const api = getRouteApi('foo') + expect(api.useRouteContext).toBeDefined() + }) + + it('should have the useSearch hook', () => { + const api = getRouteApi('foo') + expect(api.useSearch).toBeDefined() + }) + + it('should have the useParams hook', () => { + const api = getRouteApi('foo') + expect(api.useParams).toBeDefined() + }) + + it('should have the useLoaderData hook', () => { + const api = getRouteApi('foo') + expect(api.useLoaderData).toBeDefined() + }) + + it('should have the useLoaderDeps hook', () => { + const api = getRouteApi('foo') + expect(api.useLoaderDeps).toBeDefined() + }) + + it('should have the useNavigate hook', () => { + const api = getRouteApi('foo') + expect(api.useNavigate).toBeDefined() + }) +}) + +describe('createRoute has the same hooks as getRouteApi', () => { + const routeApi = getRouteApi('foo') + const hookNames = Object.keys(routeApi).filter((key) => key.startsWith('use')) + const route = createRoute({} as any) + + it.each(hookNames.map((name) => [name]))( + 'should have the "%s" hook defined', + (hookName) => { + expect(route[hookName as keyof typeof route]).toBeDefined() + }, + ) +}) + +/* disabled until HMR bug is fixed +describe('throws invariant exception when trying to access properties before `createRouter` completed', () => { + function setup() { + const rootRoute = createRootRoute() + + const IndexComponent = () => { + const navigate = useNavigate() + return ( + +

Index

+ + +
+ ) + } + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: IndexComponent, + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + component: () => { + return ( + +

Posts

+
+ ) + }, + }) + const initRouter = () => + createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + }) + return { initRouter, rootRoute, indexRoute, postsRoute } + } + + it('to', () => { + const { initRouter, indexRoute, postsRoute } = setup() + + const expectedError = `Invariant failed: trying to access property 'to' on a route which is not initialized yet. Route properties are only available after 'createRouter' completed.` + expect(() => indexRoute.to).toThrowError(expectedError) + expect(() => postsRoute.to).toThrowError(expectedError) + + initRouter() + + expect(indexRoute.to).toBe('/') + expect(postsRoute.to).toBe('/posts') + }) + + it('fullPath', () => { + const { initRouter, indexRoute, postsRoute } = setup() + + const expectedError = `trying to access property 'fullPath' on a route which is not initialized yet. Route properties are only available after 'createRouter' completed.` + expect(() => indexRoute.fullPath).toThrowError(expectedError) + expect(() => postsRoute.fullPath).toThrowError(expectedError) + + initRouter() + + expect(indexRoute.fullPath).toBe('/') + expect(postsRoute.fullPath).toBe('/posts') + }) + + it('id', () => { + const { initRouter, indexRoute, postsRoute } = setup() + + const expectedError = `Invariant failed: trying to access property 'id' on a route which is not initialized yet. Route properties are only available after 'createRouter' completed.` + expect(() => indexRoute.id).toThrowError(expectedError) + expect(() => postsRoute.id).toThrowError(expectedError) + + initRouter() + + expect(indexRoute.to).toBe('/') + expect(postsRoute.to).toBe('/posts') + }) +}) +*/ + +describe('onEnter event', () => { + it('should have router context defined in router.load()', async () => { + const fn = vi.fn() + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => { + return

Index

+ }, + onEnter: ({ context }) => { + fn(context) + }, + }) + const routeTree = rootRoute.addChildren([indexRoute]) + const router = createRouter({ routeTree, context: { foo: 'bar' } }) + + await router.load() + + expect(fn).toHaveBeenCalledWith({ foo: 'bar' }) + }) + + it('should have router context defined in ', async () => { + const fn = vi.fn() + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => { + return

Index

+ }, + onEnter: ({ context }) => { + fn(context) + }, + }) + const routeTree = rootRoute.addChildren([indexRoute]) + const router = createRouter({ routeTree, context: { foo: 'bar' } }) + + render() + + const indexElem = await screen.findByText('Index') + expect(indexElem).toBeInTheDocument() + + expect(fn).toHaveBeenCalledWith({ foo: 'bar' }) + }) +}) diff --git a/packages/react-router/tests/routeApi.test-d.tsx b/packages/react-router/tests/routeApi.test-d.tsx index 927cd6a536..467bfb7263 100644 --- a/packages/react-router/tests/routeApi.test-d.tsx +++ b/packages/react-router/tests/routeApi.test-d.tsx @@ -1,6 +1,6 @@ import { describe, expectTypeOf, test } from 'vitest' import { createRootRoute, createRoute, createRouter, getRouteApi } from '../src' -import type { UseNavigateResult } from '../src' +import type { MakeRouteMatch, UseNavigateResult } from '../src' const rootRoute = createRootRoute() @@ -23,6 +23,9 @@ const invoiceRoute = createRoute({ getParentRoute: () => invoicesRoute, path: '$invoiceId', validateSearch: () => ({ page: 0 }), + beforeLoad: () => ({ beforeLoadContext: 0 }), + loaderDeps: () => ({ dep: 0 }), + loader: () => ({ data: 0 }), }) const routeTree = rootRoute.addChildren([ @@ -40,7 +43,7 @@ type ExtractDefaultFrom = T extends UseNavigateResult ? DefaultFrom : never describe('getRouteApi', () => { - const invoiceRouteApi = getRouteApi<'/invoices/$invoiceId', DefaultRouter>( + const invoiceRouteApi = getRouteApi( '/invoices/$invoiceId', ) describe('useNavigate', () => { @@ -52,6 +55,36 @@ describe('getRouteApi', () => { >().toEqualTypeOf<'/invoices/$invoiceId'>() }) }) + test('useParams', () => { + expectTypeOf(invoiceRouteApi.useParams()).toEqualTypeOf<{ + invoiceId: string + }>() + }) + test('useContext', () => { + expectTypeOf(invoiceRouteApi.useRouteContext()).toEqualTypeOf<{ + beforeLoadContext: number + }>() + }) + test('useSearch', () => { + expectTypeOf(invoiceRouteApi.useSearch()).toEqualTypeOf<{ + page: number + }>() + }) + test('useLoaderData', () => { + expectTypeOf(invoiceRouteApi.useLoaderData()).toEqualTypeOf<{ + data: number + }>() + }) + test('useLoaderDeps', () => { + expectTypeOf(invoiceRouteApi.useLoaderDeps()).toEqualTypeOf<{ + dep: number + }>() + }) + test('useMatch', () => { + expectTypeOf(invoiceRouteApi.useMatch()).toEqualTypeOf< + MakeRouteMatch + >() + }) }) describe('createRoute', () => { diff --git a/packages/react-router/tests/routeContext.test.tsx b/packages/react-router/tests/routeContext.test.tsx index 934883ef61..ed2d06d474 100644 --- a/packages/react-router/tests/routeContext.test.tsx +++ b/packages/react-router/tests/routeContext.test.tsx @@ -2170,7 +2170,7 @@ describe('useRouteContext in the component', () => { path: '/', component: () => { const context = indexRoute.useRouteContext() - // eslint-disable-next-line ts/no-unnecessary-condition + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (context === undefined) { throw new Error('context is undefined') } @@ -2503,13 +2503,13 @@ describe('useRouteContext in the component', () => { expect(linkToAbout).toBeInTheDocument() fireEvent.click(linkToAbout) - expect(router.state.location.href).toBe('/nested/about') - expect(window.location.pathname).toBe('/nested/about') - const content = await screen.findByText( JSON.stringify({ foo: 'bar', layout: 'nested' }), ) + expect(router.state.location.href).toBe('/nested/about') + expect(window.location.pathname).toBe('/nested/about') + expect(content).toBeInTheDocument() }) diff --git a/packages/react-router/tests/router.test-d.tsx b/packages/react-router/tests/router.test-d.tsx index 9ec12d7223..8d565b805b 100644 --- a/packages/react-router/tests/router.test-d.tsx +++ b/packages/react-router/tests/router.test-d.tsx @@ -28,6 +28,74 @@ test('when creating a router without context', () => { }>() }) +test('when navigating using router', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + validateSearch: () => ({ + page: 0, + }), + }) + + const routeTree = rootRoute.addChildren([indexRoute, postsRoute]) + + const router = createRouter({ + routeTree, + }) + + expectTypeOf(router.navigate) + .parameter(0) + .toHaveProperty('to') + .toEqualTypeOf<'/posts' | '/' | '.' | '..' | undefined>() + + expectTypeOf(router.navigate) + .parameter(0) + .toHaveProperty('search') + .exclude<(...args: Array) => any>() + .toEqualTypeOf<{ page: number }>() +}) + +test('when building location using router', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + validateSearch: () => ({ + page: 0, + }), + }) + + const routeTree = rootRoute.addChildren([indexRoute, postsRoute]) + + const router = createRouter({ + routeTree, + }) + + expectTypeOf(router.buildLocation) + .parameter(0) + .toHaveProperty('to') + .toEqualTypeOf<'/posts' | '/' | '.' | '..' | undefined>() + + expectTypeOf(router.buildLocation) + .parameter(0) + .toHaveProperty('search') + .exclude<(...args: Array) => any>() + .toEqualTypeOf<{ page: number }>() +}) + test('when creating a router with context', () => { const rootRoute = createRootRouteWithContext<{ userId: string }>()() diff --git a/packages/react-router/tests/router.test.tsx b/packages/react-router/tests/router.test.tsx index 4c2f375331..29ebd08b77 100644 --- a/packages/react-router/tests/router.test.tsx +++ b/packages/react-router/tests/router.test.tsx @@ -383,11 +383,21 @@ describe('encoding: URL path segment', () => { output: '/path-segment/πŸš€', type: 'encoded', }, + { + input: '/path-segment/%F0%9F%9A%80to%2Fthe%2Fmoon', + output: '/path-segment/πŸš€to%2Fthe%2Fmoon', + type: 'encoded', + }, { input: '/path-segment/πŸš€', output: '/path-segment/πŸš€', type: 'not encoded', }, + { + input: '/path-segment/πŸš€to%2Fthe%2Fmoon', + output: '/path-segment/πŸš€to%2Fthe%2Fmoon', + type: 'not encoded', + }, ])( 'should resolve $input to $output when the path segment is $type', async ({ input, output }) => { diff --git a/packages/react-router/tests/useLoaderData.test-d.tsx b/packages/react-router/tests/useLoaderData.test-d.tsx index 2332d70cac..b38d58bb9d 100644 --- a/packages/react-router/tests/useLoaderData.test-d.tsx +++ b/packages/react-router/tests/useLoaderData.test-d.tsx @@ -5,7 +5,7 @@ import { createRouter, useLoaderData, } from '../src' -import { type MakeRouteMatch } from '../src/Matches' +import type { MakeRouteMatch } from '../src/Matches' test('when there is no loaders', () => { const rootRoute = createRootRoute() diff --git a/packages/react-router/tests/useLocation.test-d.tsx b/packages/react-router/tests/useLocation.test-d.tsx index 8643f3a60d..c09e8025d0 100644 --- a/packages/react-router/tests/useLocation.test-d.tsx +++ b/packages/react-router/tests/useLocation.test-d.tsx @@ -1,12 +1,6 @@ import { expectTypeOf, test } from 'vitest' -import { - createRootRoute, - createRoute, - createRouter, - useLocation, - type ParsedLocation, - type RouterState, -} from '../src' +import { createRootRoute, createRoute, createRouter, useLocation } from '../src' +import type { ParsedLocation, RouterState } from '../src' const rootRoute = createRootRoute() diff --git a/packages/react-router/tests/useNavigate.test-d.tsx b/packages/react-router/tests/useNavigate.test-d.tsx index 9e79bc7a9f..7c19c09887 100644 --- a/packages/react-router/tests/useNavigate.test-d.tsx +++ b/packages/react-router/tests/useNavigate.test-d.tsx @@ -38,7 +38,7 @@ type DefaultRouter = typeof defaultRouter test('when navigating to a route', () => { const navigate = useNavigate() - expectTypeOf(navigate<'/invoices', DefaultRouter>) + expectTypeOf(navigate) .parameter(0) .toHaveProperty('to') .toEqualTypeOf< diff --git a/packages/react-router/tests/useNavigate.test.tsx b/packages/react-router/tests/useNavigate.test.tsx index ec6bbb5d6a..c00b108ea9 100644 --- a/packages/react-router/tests/useNavigate.test.tsx +++ b/packages/react-router/tests/useNavigate.test.tsx @@ -3,15 +3,16 @@ import '@testing-library/jest-dom/vitest' import { afterEach, expect, test } from 'vitest' import { cleanup, fireEvent, render, screen } from '@testing-library/react' +import { z } from 'zod' import { + Outlet, + RouterProvider, createRootRoute, createRoute, + createRouteMask, createRouter, - useParams, - Outlet, useNavigate, - RouterProvider, - createRouteMask, + useParams, } from '../src' afterEach(() => { @@ -1231,3 +1232,57 @@ test('when navigating to /posts/$postId/info which is imperatively masked as /po expect(window.location.pathname).toEqual('/posts/id1') }) + +test('when setting search params with 2 parallel navigate calls', async () => { + const rootRoute = createRootRoute() + + const IndexComponent = () => { + const navigate = useNavigate() + return ( + +

Index

+ +
+ ) + } + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: IndexComponent, + validateSearch: z.object({ + param1: z.string().default('param1-default'), + param2: z.string().default('param2-default'), + }), + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute]), + }) + + render() + expect(router.state.location.search).toEqual({ + param1: 'param1-default', + param2: 'param2-default', + }) + + const postsButton = await screen.findByRole('button', { name: 'search' }) + + fireEvent.click(postsButton) + + expect(router.state.location.search).toEqual({ param1: 'foo', param2: 'bar' }) +}) diff --git a/packages/react-router/tests/useParams.test-d.tsx b/packages/react-router/tests/useParams.test-d.tsx index cf1e940800..4be82a8f6c 100644 --- a/packages/react-router/tests/useParams.test-d.tsx +++ b/packages/react-router/tests/useParams.test-d.tsx @@ -1,11 +1,6 @@ import { expectTypeOf, test } from 'vitest' -import { - type FullSearchSchema, - createRootRoute, - createRoute, - createRouter, - useParams, -} from '../src' +import { createRootRoute, createRoute, createRouter, useParams } from '../src' +import type { FullSearchSchema } from '../src' test('when there are no params', () => { const rootRoute = createRootRoute() diff --git a/packages/react-router/tests/useRouteContext.test-d.tsx b/packages/react-router/tests/useRouteContext.test-d.tsx index f29713def1..e94a588668 100644 --- a/packages/react-router/tests/useRouteContext.test-d.tsx +++ b/packages/react-router/tests/useRouteContext.test-d.tsx @@ -1,12 +1,12 @@ import { expectTypeOf, test } from 'vitest' import { - type FullSearchSchema, createRootRoute, createRootRouteWithContext, createRoute, createRouter, useRouteContext, } from '../src' +import type { FullSearchSchema } from '../src' test('when there is no context', () => { const rootRoute = createRootRoute() diff --git a/packages/react-router/tests/useSearch.test-d.tsx b/packages/react-router/tests/useSearch.test-d.tsx index 2fa578b788..0828614b3b 100644 --- a/packages/react-router/tests/useSearch.test-d.tsx +++ b/packages/react-router/tests/useSearch.test-d.tsx @@ -1,12 +1,6 @@ import { expectTypeOf, test } from 'vitest' -import { - type FullSearchSchema, - SearchSchemaInput, - createRootRoute, - createRoute, - createRouter, - useSearch, -} from '../src' +import { createRootRoute, createRoute, createRouter, useSearch } from '../src' +import type { FullSearchSchema, SearchSchemaInput } from '../src' test('when there are no search params', () => { const rootRoute = createRootRoute() diff --git a/packages/react-router/tsconfig.json b/packages/react-router/tsconfig.json index aad3c58492..2c71ee70f6 100644 --- a/packages/react-router/tsconfig.json +++ b/packages/react-router/tsconfig.json @@ -8,6 +8,7 @@ "src", "tests", "vite.config.ts", + "eslint.config.ts", "../start/src/client/DehydrateRouter.tsx" ] } diff --git a/packages/react-router/vite.config.ts b/packages/react-router/vite.config.ts index 5bf850949b..b53262bcf2 100644 --- a/packages/react-router/vite.config.ts +++ b/packages/react-router/vite.config.ts @@ -2,9 +2,10 @@ import { defineConfig, mergeConfig } from 'vitest/config' import { tanstackViteConfig } from '@tanstack/config/vite' import react from '@vitejs/plugin-react' import packageJson from './package.json' +import type { UserConfig } from 'vitest/config' const config = defineConfig({ - plugins: [react()], + plugins: [react()] as UserConfig['plugins'], test: { name: packageJson.name, dir: './tests', diff --git a/packages/router-arktype-adapter/package.json b/packages/router-arktype-adapter/package.json index bab89c2c94..a460b82648 100644 --- a/packages/router-arktype-adapter/package.json +++ b/packages/router-arktype-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/router-arktype-adapter", - "version": "1.51.2", + "version": "1.58.3", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -27,15 +27,15 @@ "clean": "rimraf ./dist && rimraf ./coverage", "test:eslint": "eslint ./src", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", - "test:types:ts55": "tsc", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "tsc", "test:unit": "vitest", "test:unit:dev": "pnpm run test:unit --watch --typecheck", - "test:build": "publint --strict", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", "build": "vite build" }, "type": "module", @@ -64,10 +64,10 @@ "node": ">=12" }, "devDependencies": { - "@testing-library/jest-dom": "^6.4.6", - "@testing-library/react": "^16.0.0", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", "@tanstack/react-router": "workspace:*", - "arktype": "^2.0.0-beta.2" + "arktype": "^2.0.0-rc.8" }, "peerDependencies": { "arktype": ">=2.0.0-beta <3", diff --git a/packages/router-arktype-adapter/src/index.ts b/packages/router-arktype-adapter/src/index.ts index 2a77d92104..a5957a6283 100644 --- a/packages/router-arktype-adapter/src/index.ts +++ b/packages/router-arktype-adapter/src/index.ts @@ -1,4 +1,4 @@ -import { type SearchValidatorAdapter } from '@tanstack/react-router' +import type { SearchValidatorAdapter } from '@tanstack/react-router' export interface ArkTypeLike { infer: any diff --git a/packages/router-cli/package.json b/packages/router-cli/package.json index f9ab38d846..1c7fc76c2d 100644 --- a/packages/router-cli/package.json +++ b/packages/router-cli/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/router-cli", - "version": "1.51.0", + "version": "1.58.1", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -27,13 +27,13 @@ "clean": "rimraf ./dist && rimraf ./coverage", "test:eslint": "eslint ./src", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", - "test:types:ts55": "tsc", - "test:build": "publint --strict", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "tsc", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", "build": "vite build" }, "type": "module", @@ -70,7 +70,6 @@ "yargs": "^17.7.2" }, "devDependencies": { - "@types/yargs": "^17.0.32", - "vite": "^5.3.5" + "@types/yargs": "^17.0.33" } } diff --git a/packages/router-devtools/package.json b/packages/router-devtools/package.json index c51e7406a7..b6f8423925 100644 --- a/packages/router-devtools/package.json +++ b/packages/router-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/router-devtools", - "version": "1.51.2", + "version": "1.58.3", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -27,13 +27,13 @@ "clean": "rimraf ./dist && rimraf ./coverage", "test:eslint": "eslint ./src", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", - "test:types:ts55": "tsc", - "test:build": "publint --strict", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "tsc", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", "build": "vite build" }, "type": "module", diff --git a/packages/router-devtools/vite.config.ts b/packages/router-devtools/vite.config.ts index 2573959ec6..2d87d3ac19 100644 --- a/packages/router-devtools/vite.config.ts +++ b/packages/router-devtools/vite.config.ts @@ -1,9 +1,10 @@ import { defineConfig, mergeConfig } from 'vitest/config' import { tanstackViteConfig } from '@tanstack/config/vite' import react from '@vitejs/plugin-react' +import type { UserConfig } from 'vitest/config' const config = defineConfig({ - plugins: [react()], + plugins: [react()] as UserConfig['plugins'], }) export default mergeConfig( diff --git a/packages/router-generator/package.json b/packages/router-generator/package.json index f17de4edff..c07273e816 100644 --- a/packages/router-generator/package.json +++ b/packages/router-generator/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/router-generator", - "version": "1.51.0", + "version": "1.58.1", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -25,16 +25,17 @@ ], "scripts": { "clean": "rimraf ./dist && rimraf ./coverage", + "clean:snapshots": "rimraf **/*snapshot* --glob", "test:eslint": "eslint ./src", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", - "test:types:ts55": "tsc", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "tsc", "test:unit": "vitest", - "test:build": "publint --strict", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", "build": "vite build" }, "type": "module", @@ -63,6 +64,8 @@ "node": ">=12" }, "dependencies": { + "@tanstack/virtual-file-routes": "workspace:^", + "tsx": "^4.19.1", "prettier": "^3.3.3", "zod": "^3.23.8" } diff --git a/packages/router-generator/src/config.ts b/packages/router-generator/src/config.ts index 9c96132b42..9a6c562f03 100644 --- a/packages/router-generator/src/config.ts +++ b/packages/router-generator/src/config.ts @@ -1,8 +1,10 @@ import path from 'node:path' import { existsSync, readFileSync } from 'node:fs' import { z } from 'zod' +import { virtualRootRouteSchema } from './filesystem/virtual/config' export const configSchema = z.object({ + virtualRouteConfig: virtualRootRouteSchema.optional(), routeFilePrefix: z.string().optional(), routeFileIgnorePrefix: z.string().optional().default('-'), routeFileIgnorePattern: z.string().optional(), @@ -29,6 +31,8 @@ export const configSchema = z.object({ .optional() .default(['/* prettier-ignore-end */']), autoCodeSplitting: z.boolean().optional(), + indexToken: z.string().optional().default('index'), + routeToken: z.string().optional().default('route'), experimental: z .object({ // TODO: Remove this option in the next major release (v2). @@ -94,5 +98,36 @@ export function getConfig( } } + validateConfig(config) + return config +} + +function validateConfig(config: Config) { + if (typeof config.experimental?.enableCodeSplitting !== 'undefined') { + const message = ` +------ +⚠️ ⚠️ ⚠️ +ERROR: The "experimental.enableCodeSplitting" flag has been made stable and is now "autoCodeSplitting". Please update your configuration file to use "autoCodeSplitting" instead of "experimental.enableCodeSplitting". +------ +` + console.error(message) + throw new Error(message) + } + + if (config.indexToken === config.routeToken) { + throw new Error( + `The "indexToken" and "routeToken" options must be different.`, + ) + } + + if ( + config.routeFileIgnorePrefix && + config.routeFileIgnorePrefix.trim() === '_' + ) { + throw new Error( + `The "routeFileIgnorePrefix" cannot be an underscore ("_"). This is a reserved character used to denote a pathless route. Please use a different prefix.`, + ) + } + return config } diff --git a/packages/router-generator/src/filesystem/physical/getRouteNodes.ts b/packages/router-generator/src/filesystem/physical/getRouteNodes.ts new file mode 100644 index 0000000000..560a38b6ad --- /dev/null +++ b/packages/router-generator/src/filesystem/physical/getRouteNodes.ts @@ -0,0 +1,197 @@ +import path from 'node:path' +import * as fsp from 'node:fs/promises' +import { + determineInitialRoutePath, + logging, + removeExt, + removeTrailingSlash, + replaceBackslash, + routePathToVariable, +} from '../../utils' +import { getRouteNodes as getRouteNodesVirtual } from '../virtual/getRouteNodes' +import { loadConfigFile } from '../virtual/loadConfigFile' +import { rootPathId } from './rootPathId' +import type { + VirtualRootRoute, + VirtualRouteSubtreeConfig, +} from '@tanstack/virtual-file-routes' +import type { GetRouteNodesResult, RouteNode } from '../../types' +import type { Config } from '../../config' + +const disallowedRouteGroupConfiguration = /\(([^)]+)\).(ts|js|tsx|jsx)/ + +export async function getRouteNodes( + config: Config, +): Promise { + const { routeFilePrefix, routeFileIgnorePrefix, routeFileIgnorePattern } = + config + const logger = logging({ disabled: config.disableLogging }) + const routeFileIgnoreRegExp = new RegExp(routeFileIgnorePattern ?? '', 'g') + + const routeNodes: Array = [] + + async function recurse(dir: string) { + const fullDir = path.resolve(config.routesDirectory, dir) + let dirList = await fsp.readdir(fullDir, { withFileTypes: true }) + + dirList = dirList.filter((d) => { + if ( + d.name.startsWith('.') || + (routeFileIgnorePrefix && d.name.startsWith(routeFileIgnorePrefix)) + ) { + return false + } + + if (routeFilePrefix) { + return d.name.startsWith(routeFilePrefix) + } + + if (routeFileIgnorePattern) { + return !d.name.match(routeFileIgnoreRegExp) + } + + return true + }) + + const virtualConfigFile = dirList.find((dirent) => { + return dirent.isFile() && dirent.name.match(/__virtual\.[mc]?[jt]s$/) + }) + + if (virtualConfigFile !== undefined) { + const virtualRouteConfigExport = await loadConfigFile( + path.resolve(fullDir, virtualConfigFile.name), + ) + let virtualRouteSubtreeConfig: VirtualRouteSubtreeConfig + if (typeof virtualRouteConfigExport.default === 'function') { + virtualRouteSubtreeConfig = await virtualRouteConfigExport.default() + } else { + virtualRouteSubtreeConfig = virtualRouteConfigExport.default + } + const dummyRoot: VirtualRootRoute = { + type: 'root', + file: '', + children: virtualRouteSubtreeConfig, + } + const { routeNodes: virtualRouteNodes } = await getRouteNodesVirtual({ + ...config, + routesDirectory: fullDir, + virtualRouteConfig: dummyRoot, + }) + virtualRouteNodes.forEach((node) => { + const filePath = replaceBackslash(path.join(dir, node.filePath)) + const routePath = `/${dir}${node.routePath}` + + node.variableName = routePathToVariable( + `${dir}/${removeExt(node.filePath)}`, + ) + node.routePath = routePath + node.filePath = filePath + }) + + routeNodes.push(...virtualRouteNodes) + + return + } + + await Promise.all( + dirList.map(async (dirent) => { + const fullPath = path.join(fullDir, dirent.name) + const relativePath = path.join(dir, dirent.name) + + if (dirent.isDirectory()) { + await recurse(relativePath) + } else if (fullPath.match(/\.(tsx|ts|jsx|js)$/)) { + const filePath = replaceBackslash(path.join(dir, dirent.name)) + const filePathNoExt = removeExt(filePath) + let routePath = determineInitialRoutePath(filePathNoExt) + + if (routeFilePrefix) { + routePath = routePath.replaceAll(routeFilePrefix, '') + } + + if (disallowedRouteGroupConfiguration.test(dirent.name)) { + const errorMessage = `A route configuration for a route group was found at \`${filePath}\`. This is not supported. Did you mean to use a layout/pathless route instead?` + logger.error(`ERROR: ${errorMessage}`) + throw new Error(errorMessage) + } + + const variableName = routePathToVariable(routePath) + + const isLazy = routePath.endsWith('/lazy') + + if (isLazy) { + routePath = routePath.replace(/\/lazy$/, '') + } + + const isRoute = routePath.endsWith(`/${config.routeToken}`) + const isComponent = routePath.endsWith('/component') + const isErrorComponent = routePath.endsWith('/errorComponent') + const isPendingComponent = routePath.endsWith('/pendingComponent') + const isLoader = routePath.endsWith('/loader') + const isAPIRoute = routePath.startsWith( + `${removeTrailingSlash(config.apiBase)}/`, + ) + + const segments = routePath.split('/') + const lastRouteSegment = segments[segments.length - 1] + const isLayout = + (lastRouteSegment !== config.indexToken && + lastRouteSegment !== config.routeToken && + lastRouteSegment?.startsWith('_')) || + false + + ;( + [ + [isComponent, 'component'], + [isErrorComponent, 'errorComponent'], + [isPendingComponent, 'pendingComponent'], + [isLoader, 'loader'], + ] as const + ).forEach(([isType, type]) => { + if (isType) { + logger.warn( + `WARNING: The \`.${type}.tsx\` suffix used for the ${filePath} file is deprecated. Use the new \`.lazy.tsx\` suffix instead.`, + ) + } + }) + + routePath = routePath.replace( + new RegExp( + `/(component|errorComponent|pendingComponent|loader|${config.routeToken}|lazy)$`, + ), + '', + ) + + if (routePath === config.indexToken) { + routePath = '/' + } + + routePath = + routePath.replace(new RegExp(`/${config.indexToken}$`), '/') || '/' + + routeNodes.push({ + filePath, + fullPath, + routePath, + variableName, + isRoute, + isComponent, + isErrorComponent, + isPendingComponent, + isLoader, + isLazy, + isLayout, + isAPIRoute, + }) + } + }), + ) + + return routeNodes + } + + await recurse('./') + + const rootRouteNode = routeNodes.find((d) => d.routePath === `/${rootPathId}`) + return { rootRouteNode, routeNodes } +} diff --git a/packages/router-generator/src/filesystem/physical/rootPathId.ts b/packages/router-generator/src/filesystem/physical/rootPathId.ts new file mode 100644 index 0000000000..bb97d05ce6 --- /dev/null +++ b/packages/router-generator/src/filesystem/physical/rootPathId.ts @@ -0,0 +1 @@ +export const rootPathId = '__root' diff --git a/packages/router-generator/src/filesystem/virtual/config.ts b/packages/router-generator/src/filesystem/virtual/config.ts new file mode 100644 index 0000000000..db54aa6611 --- /dev/null +++ b/packages/router-generator/src/filesystem/virtual/config.ts @@ -0,0 +1,45 @@ +import { z } from 'zod' +import type { + LayoutRoute, + PhysicalSubtree, + Route, + VirtualRootRoute, +} from '@tanstack/virtual-file-routes' + +const indexRouteSchema = z.object({ + type: z.literal('index'), + file: z.string(), +}) + +const layoutRouteSchema: z.ZodType = z.object({ + type: z.literal('layout'), + id: z.string(), + file: z.string(), + children: z.array(z.lazy(() => virtualRouteNodeSchema)).optional(), +}) + +const routeSchema: z.ZodType = z.object({ + type: z.literal('route'), + file: z.string(), + path: z.string(), + children: z.array(z.lazy(() => virtualRouteNodeSchema)).optional(), +}) + +const physicalSubTreeSchema: z.ZodType = z.object({ + type: z.literal('physical'), + directory: z.string(), + pathPrefix: z.string(), +}) + +const virtualRouteNodeSchema = z.union([ + indexRouteSchema, + layoutRouteSchema, + routeSchema, + physicalSubTreeSchema, +]) + +export const virtualRootRouteSchema: z.ZodType = z.object({ + type: z.literal('root'), + file: z.string(), + children: z.array(virtualRouteNodeSchema).optional(), +}) diff --git a/packages/router-generator/src/filesystem/virtual/getRouteNodes.ts b/packages/router-generator/src/filesystem/virtual/getRouteNodes.ts new file mode 100644 index 0000000000..acb5687cce --- /dev/null +++ b/packages/router-generator/src/filesystem/virtual/getRouteNodes.ts @@ -0,0 +1,141 @@ +import { join, resolve } from 'node:path' +import { + removeExt, + removeLeadingSlash, + removeTrailingSlash, + routePathToVariable, +} from '../../utils' +import { getRouteNodes as getRouteNodesPhysical } from '../physical/getRouteNodes' +import type { VirtualRouteNode } from '@tanstack/virtual-file-routes' +import type { GetRouteNodesResult, RouteNode } from '../../types' +import type { Config } from '../../config' + +function ensureLeadingUnderScore(id: string) { + if (id.startsWith('_')) { + return id + } + return `_${id}` +} + +function flattenTree(node: RouteNode): Array { + const result = [node] + + if (node.children) { + for (const child of node.children) { + result.push(...flattenTree(child)) + } + } + delete node.children + + return result +} + +export async function getRouteNodes( + tsrConfig: Config, +): Promise { + const fullDir = resolve(tsrConfig.routesDirectory) + if (tsrConfig.virtualRouteConfig === undefined) { + throw new Error(`virtualRouteConfig is undefined`) + } + const children = await getRouteNodesRecursive( + tsrConfig, + fullDir, + tsrConfig.virtualRouteConfig.children, + ) + const allNodes = flattenTree({ + children, + filePath: tsrConfig.virtualRouteConfig.file, + fullPath: join(fullDir, tsrConfig.virtualRouteConfig.file), + variableName: 'rootRoute', + routePath: '/', + isRoot: true, + }) + + const rootRouteNode = allNodes[0] + const routeNodes = allNodes.slice(1) + + return { rootRouteNode, routeNodes } +} + +export async function getRouteNodesRecursive( + tsrConfig: Config, + fullDir: string, + nodes?: Array, + parent?: RouteNode, +): Promise> { + if (nodes === undefined) { + return [] + } + const children = await Promise.all( + nodes.map(async (node) => { + if (node.type === 'physical') { + const { routeNodes } = await getRouteNodesPhysical({ + ...tsrConfig, + routesDirectory: resolve(fullDir, node.directory), + }) + routeNodes.forEach((subtreeNode) => { + subtreeNode.variableName = routePathToVariable( + `${node.pathPrefix}/${removeExt(subtreeNode.filePath)}`, + ) + subtreeNode.routePath = `${parent?.routePath ?? ''}${node.pathPrefix}${subtreeNode.routePath}` + subtreeNode.filePath = `${node.directory}/${subtreeNode.filePath}` + }) + return routeNodes + } + + const filePath = node.file + const variableName = routePathToVariable(removeExt(filePath)) + const fullPath = join(fullDir, filePath) + const parentRoutePath = removeTrailingSlash(parent?.routePath ?? '/') + const isLayout = node.type === 'layout' + switch (node.type) { + case 'index': { + const routePath = `${parentRoutePath}/` + return { + filePath, + fullPath, + variableName, + routePath, + isLayout, + } satisfies RouteNode + } + + case 'route': + case 'layout': { + let lastSegment: string + if (node.type === 'layout') { + if (node.id !== undefined) { + node.id = ensureLeadingUnderScore(node.id) + } else { + node.id = '_layout' + } + lastSegment = node.id + } else { + lastSegment = node.path + } + const routePath = `${parentRoutePath}/${removeLeadingSlash(lastSegment)}` + + const routeNode: RouteNode = { + fullPath, + isLayout, + filePath, + variableName, + routePath, + } + + if (node.children !== undefined) { + const children = await getRouteNodesRecursive( + tsrConfig, + fullDir, + node.children, + routeNode, + ) + routeNode.children = children + } + return routeNode + } + } + }), + ) + return children.flat() +} diff --git a/packages/router-generator/src/filesystem/virtual/loadConfigFile.ts b/packages/router-generator/src/filesystem/virtual/loadConfigFile.ts new file mode 100644 index 0000000000..92c63356b2 --- /dev/null +++ b/packages/router-generator/src/filesystem/virtual/loadConfigFile.ts @@ -0,0 +1,6 @@ +import { tsImport } from 'tsx/esm/api' + +export async function loadConfigFile(filePath: string) { + const loaded = await tsImport(filePath, import.meta.url) + return loaded +} diff --git a/packages/router-generator/src/generator.ts b/packages/router-generator/src/generator.ts index 90622fd0a2..f2deeda789 100644 --- a/packages/router-generator/src/generator.ts +++ b/packages/router-generator/src/generator.ts @@ -2,168 +2,27 @@ import path from 'node:path' import * as fs from 'node:fs' import * as fsp from 'node:fs/promises' import * as prettier from 'prettier' -import { cleanPath, logging, trimPathLeft } from './utils' +import { + determineInitialRoutePath, + logging, + multiSortBy, + removeExt, + removeTrailingSlash, + removeUnderscores, + replaceBackslash, + routePathToVariable, + trimPathLeft, + writeIfDifferent, +} from './utils' +import { getRouteNodes as physicalGetRouteNodes } from './filesystem/physical/getRouteNodes' +import { getRouteNodes as virtualGetRouteNodes } from './filesystem/virtual/getRouteNodes' +import { rootPathId } from './filesystem/physical/rootPathId' +import type { GetRouteNodesResult, RouteNode } from './types' import type { Config } from './config' let latestTask = 0 -export const rootPathId = '__root' const routeGroupPatternRegex = /\(.+\)/g const possiblyNestedRouteGroupPatternRegex = /\([^/]+\)\/?/g -const disallowedRouteGroupConfiguration = /\(([^)]+)\).(ts|js|tsx|jsx)/ - -export type RouteNode = { - filePath: string - fullPath: string - variableName: string - routePath?: string - cleanedPath?: string - path?: string - isNonPath?: boolean - isNonLayout?: boolean - isLayout?: boolean - isVirtualParentRequired?: boolean - isVirtualParentRoute?: boolean - isRoute?: boolean - isAPIRoute?: boolean - isLoader?: boolean - isComponent?: boolean - isErrorComponent?: boolean - isPendingComponent?: boolean - isVirtual?: boolean - isLazy?: boolean - isRoot?: boolean - children?: Array - parent?: RouteNode -} - -async function getRouteNodes(config: Config) { - const { routeFilePrefix, routeFileIgnorePrefix, routeFileIgnorePattern } = - config - const logger = logging({ disabled: config.disableLogging }) - const routeFileIgnoreRegExp = new RegExp(routeFileIgnorePattern ?? '', 'g') - - const routeNodes: Array = [] - - async function recurse(dir: string) { - const fullDir = path.resolve(config.routesDirectory, dir) - let dirList = await fsp.readdir(fullDir, { withFileTypes: true }) - - dirList = dirList.filter((d) => { - if ( - d.name.startsWith('.') || - (routeFileIgnorePrefix && d.name.startsWith(routeFileIgnorePrefix)) - ) { - return false - } - - if (routeFilePrefix) { - return d.name.startsWith(routeFilePrefix) - } - - if (routeFileIgnorePattern) { - return !d.name.match(routeFileIgnoreRegExp) - } - - return true - }) - - await Promise.all( - dirList.map(async (dirent) => { - const fullPath = path.join(fullDir, dirent.name) - const relativePath = path.join(dir, dirent.name) - - if (dirent.isDirectory()) { - await recurse(relativePath) - } else if (fullPath.match(/\.(tsx|ts|jsx|js)$/)) { - const filePath = replaceBackslash(path.join(dir, dirent.name)) - const filePathNoExt = removeExt(filePath) - let routePath = determineInitialRoutePath(filePathNoExt) - - if (routeFilePrefix) { - routePath = routePath.replaceAll(routeFilePrefix, '') - } - - if (disallowedRouteGroupConfiguration.test(dirent.name)) { - const errorMessage = `A route configuration for a route group was found at \`${filePath}\`. This is not supported. Did you mean to use a layout/pathless route instead?` - logger.error(`ERROR: ${errorMessage}`) - throw new Error(errorMessage) - } - - const variableName = routePathToVariable(routePath) - - // Remove the index from the route path and - // if the route path is empty, use `/' - - const isLazy = routePath.endsWith('/lazy') - - if (isLazy) { - routePath = routePath.replace(/\/lazy$/, '') - } - - const isRoute = routePath.endsWith('/route') - const isComponent = routePath.endsWith('/component') - const isErrorComponent = routePath.endsWith('/errorComponent') - const isPendingComponent = routePath.endsWith('/pendingComponent') - const isLoader = routePath.endsWith('/loader') - const isAPIRoute = routePath.startsWith( - `${removeTrailingSlash(config.apiBase)}/`, - ) - - const segments = routePath.split('/') - const isLayout = - segments[segments.length - 1]?.startsWith('_') || false - - ;( - [ - [isComponent, 'component'], - [isErrorComponent, 'errorComponent'], - [isPendingComponent, 'pendingComponent'], - [isLoader, 'loader'], - ] as const - ).forEach(([isType, type]) => { - if (isType) { - logger.warn( - `WARNING: The \`.${type}.tsx\` suffix used for the ${filePath} file is deprecated. Use the new \`.lazy.tsx\` suffix instead.`, - ) - } - }) - - routePath = routePath.replace( - /\/(component|errorComponent|pendingComponent|loader|route|lazy)$/, - '', - ) - - if (routePath === 'index') { - routePath = '/' - } - - routePath = routePath.replace(/\/index$/, '/') || '/' - - routeNodes.push({ - filePath, - fullPath, - routePath, - variableName, - isRoute, - isComponent, - isErrorComponent, - isPendingComponent, - isLoader, - isLazy, - isLayout, - isAPIRoute, - }) - } - }), - ) - - return routeNodes - } - - await recurse('./') - - return routeNodes -} let isFirst = false let skipMessage = false @@ -203,29 +62,44 @@ export async function generator(config: Config) { const start = Date.now() + const TYPES_DISABLED = config.disableTypes + const prettierOptions: prettier.Options = { semi: config.semicolons, singleQuote: config.quoteStyle === 'single', parser: 'typescript', } - const routePathIdPrefix = config.routeFilePrefix ?? '' - const beforeRouteNodes = await getRouteNodes(config) - const rootRouteNode = beforeRouteNodes.find( - (d) => d.routePath === `/${rootPathId}`, - ) + let getRouteNodesResult: GetRouteNodesResult + + if (config.virtualRouteConfig) { + getRouteNodesResult = await virtualGetRouteNodes(config) + } else { + getRouteNodesResult = await physicalGetRouteNodes(config) + } + + const { rootRouteNode, routeNodes: beforeRouteNodes } = getRouteNodesResult + if (rootRouteNode === undefined) { + let errorMessage = `rootRouteNode must not be undefined. Make sure you've added your root route into the route-tree.` + if (!config.virtualRouteConfig) { + errorMessage += `\nMake sure that you add a "${rootPathId}.${config.disableTypes ? 'js' : 'tsx'}" file to your routes directory.\nAdd the file in: "${config.routesDirectory}/${rootPathId}.${config.disableTypes ? 'js' : 'tsx'}"` + } + throw new Error(errorMessage) + } const preRouteNodes = multiSortBy(beforeRouteNodes, [ (d) => (d.routePath === '/' ? -1 : 1), (d) => d.routePath?.split('/').length, - (d) => (d.filePath.match(/[./]index[.]/) ? 1 : -1), + (d) => + d.filePath.match(new RegExp(`[./]${config.indexToken}[.]`)) ? 1 : -1, (d) => d.filePath.match( /[./](component|errorComponent|pendingComponent|loader|lazy)[.]/, ) ? 1 : -1, - (d) => (d.filePath.match(/[./]route[.]/) ? -1 : 1), + (d) => + d.filePath.match(new RegExp(`[./]${config.routeToken}[.]`)) ? -1 : 1, (d) => (d.routePath?.endsWith('/') ? -1 : 1), (d) => d.routePath, ]).filter((d) => ![`/${rootPathId}`].includes(d.routePath || '')) @@ -298,13 +172,11 @@ export const Route = createRootRoute({ const trimmedPath = trimPathLeft(node.path ?? '') const split = trimmedPath.split('/') - const first = split[0] ?? trimmedPath const lastRouteSegment = split[split.length - 1] ?? trimmedPath node.isNonPath = lastRouteSegment.startsWith('_') || routeGroupPatternRegex.test(lastRouteSegment) - node.isNonLayout = first.endsWith('_') node.cleanedPath = removeGroups( removeUnderscores(removeLayoutSegments(node.path)) ?? '', @@ -360,10 +232,17 @@ export const Route = createRootRoute({ ) } - if (replaced !== routeCode) { - logger.log(`🟑 Updating ${node.fullPath}`) - await fsp.writeFile(node.fullPath, replaced) - } + await writeIfDifferent( + node.fullPath, + prettierOptions, + routeCode, + replaced, + { + beforeWrite: () => { + logger.log(`🟑 Updating ${node.fullPath}`) + }, + }, + ) } if ( @@ -495,18 +374,20 @@ export const Route = createAPIFileRoute('${escapedRoutePath}')({ await prettier.format(replaced, prettierOptions), ) } else { - const copied = routeCode.replace( - /(createAPIFileRoute\(\s*['"])([^\s]*)(['"],?\s*\))/g, - (_, p1, __, p3) => `${p1}${escapedRoutePath}${p3}`, + await writeIfDifferent( + node.fullPath, + prettierOptions, + routeCode, + routeCode.replace( + /(createAPIFileRoute\(\s*['"])([^\s]*)(['"],?\s*\))/g, + (_, p1, __, p3) => `${p1}${escapedRoutePath}${p3}`, + ), + { + beforeWrite: () => { + logger.log(`🟑 Updating ${node.fullPath}`) + }, + }, ) - - if (copied !== routeCode) { - logger.log(`🟑 Updating ${node.fullPath}`) - await fsp.writeFile( - node.fullPath, - await prettier.format(copied, prettierOptions), - ) - } } } @@ -528,13 +409,31 @@ export const Route = createAPIFileRoute('${escapedRoutePath}')({ if (node.children?.length) { const childConfigs = buildRouteTreeConfig(node.children, depth + 1) - return `${route}: ${route}.addChildren({${spaces(depth * 4)}${childConfigs}})` + + const childrenDeclaration = TYPES_DISABLED + ? '' + : `interface ${route}Children { + ${node.children.map((child) => `${child.variableName}Route: typeof ${getResolvedRouteNodeVariableName(child)}`).join(',')} +}` + + const children = `const ${route}Children${TYPES_DISABLED ? '' : `: ${route}Children`} = { + ${node.children.map((child) => `${child.variableName}Route: ${getResolvedRouteNodeVariableName(child)}`).join(',')} +}` + + const routeWithChildren = `const ${route}WithChildren = ${route}._addFileChildren(${route}Children)` + + return [ + childConfigs, + childrenDeclaration, + children, + routeWithChildren, + ].join('\n\n') } - return route + return undefined }) - return children.filter(Boolean).join(`,`) + return children.filter(Boolean).join('\n\n') } const routeConfigChildrenText = buildRouteTreeConfig(routeTree) @@ -542,7 +441,7 @@ export const Route = createAPIFileRoute('${escapedRoutePath}')({ const sortedRouteNodes = multiSortBy(routeNodes, [ (d) => (d.routePath?.includes(`/${rootPathId}`) ? -1 : 1), (d) => d.routePath?.split('/').length, - (d) => (d.routePath?.endsWith("index'") ? -1 : 1), + (d) => (d.routePath?.endsWith(config.indexToken) ? -1 : 1), (d) => d, ]) @@ -562,11 +461,18 @@ export const Route = createAPIFileRoute('${escapedRoutePath}')({ .map((d) => d[0]) const virtualRouteNodes = sortedRouteNodes.filter((d) => d.isVirtual) - const rootPathIdExtension = - config.addExtensions && rootRouteNode - ? path.extname(rootRouteNode.filePath) - : '' + function getImportPath(node: RouteNode) { + return replaceBackslash( + removeExt( + path.relative( + path.dirname(config.generatedRouteTree), + path.resolve(config.routesDirectory, node.filePath), + ), + config.addExtensions, + ), + ) + } const routeImports = [ ...config.routeTreeFileHeader, '// This file is auto-generated by TanStack Router', @@ -575,29 +481,13 @@ export const Route = createAPIFileRoute('${escapedRoutePath}')({ : '', '// Import Routes', [ - `import { Route as rootRoute } from './${replaceBackslash( - path.relative( - path.dirname(config.generatedRouteTree), - path.resolve( - config.routesDirectory, - `${routePathIdPrefix}${rootPathId}${rootPathIdExtension}`, - ), - ), - )}'`, + `import { Route as rootRoute } from './${getImportPath(rootRouteNode)}'`, ...sortedRouteNodes .filter((d) => !d.isVirtual) .map((node) => { return `import { Route as ${ node.variableName - }Import } from './${replaceBackslash( - removeExt( - path.relative( - path.dirname(config.generatedRouteTree), - path.resolve(config.routesDirectory, node.filePath), - ), - config.addExtensions, - ), - )}'` + }Import } from './${getImportPath(node)}'` }), ].join('\n'), virtualRouteNodes.length ? '// Create Virtual Routes' : '', @@ -631,7 +521,7 @@ export const Route = createAPIFileRoute('${escapedRoutePath}')({ ] .filter(Boolean) .join(',')} - }${config.disableTypes ? '' : 'as any'})`, + }${TYPES_DISABLED ? '' : 'as any'})`, loaderNode ? `.updateLoader({ loader: lazyFn(() => import('./${replaceBackslash( removeExt( @@ -686,7 +576,7 @@ export const Route = createAPIFileRoute('${escapedRoutePath}')({ ].join('') }) .join('\n\n'), - ...(config.disableTypes + ...(TYPES_DISABLED ? [] : [ '// Populate the FileRoutesByPath interface', @@ -695,7 +585,7 @@ export const Route = createAPIFileRoute('${escapedRoutePath}')({ ${routeNodes .map((routeNode) => { const [filePathId, routeId] = getFilePathIdAndRouteIdFromPath( - routeNode.routePath!, + routeNode.routePath, ) return `'${filePathId}': { @@ -717,7 +607,44 @@ export const Route = createAPIFileRoute('${escapedRoutePath}')({ }`, ]), '// Create and export the route tree', - `export const routeTree = rootRoute.addChildren({${routeConfigChildrenText}})`, + routeConfigChildrenText, + ...(TYPES_DISABLED + ? [] + : [ + `export interface FileRoutesByFullPath { + ${[...createRouteNodesByFullPath(routeNodes).entries()].map( + ([fullPath, routeNode]) => { + return `'${fullPath}': typeof ${getResolvedRouteNodeVariableName(routeNode)}` + }, + )} +}`, + `export interface FileRoutesByTo { + ${[...createRouteNodesByTo(routeNodes).entries()].map(([to, routeNode]) => { + return `'${to}': typeof ${getResolvedRouteNodeVariableName(routeNode)}` + })} +}`, + `export interface FileRoutesById { + '__root__': typeof rootRoute, + ${[...createRouteNodesById(routeNodes).entries()].map(([id, routeNode]) => { + return `'${id}': typeof ${getResolvedRouteNodeVariableName(routeNode)}` + })} +}`, + `export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: ${routeNodes.length > 0 ? [...createRouteNodesByFullPath(routeNodes).keys()].map((fullPath) => `'${fullPath}'`).join('|') : 'never'} + fileRoutesByTo: FileRoutesByTo + to: ${routeNodes.length > 0 ? [...createRouteNodesByTo(routeNodes).keys()].map((to) => `'${to}'`).join('|') : 'never'} + id: ${[`'__root__'`, ...[...createRouteNodesById(routeNodes).keys()].map((id) => `'${id}'`)].join('|')} + fileRoutesById: FileRoutesById +}`, + `export interface RootRouteChildren { + ${routeTree.map((child) => `${child.variableName}Route: typeof ${getResolvedRouteNodeVariableName(child)}`).join(',')} +}`, + ]), + `const rootRouteChildren${TYPES_DISABLED ? '' : ': RootRouteChildren'} = { + ${routeTree.map((child) => `${child.variableName}Route: ${getResolvedRouteNodeVariableName(child)}`).join(',')} +}`, + `export const routeTree = rootRoute._addFileChildren(rootRouteChildren)${TYPES_DISABLED ? '' : '._addFileTypes()'}`, ...config.routeTreeFileFooter, ] .filter(Boolean) @@ -726,14 +653,14 @@ export const Route = createAPIFileRoute('${escapedRoutePath}')({ const createRouteManifest = () => { const routesManifest = { __root__: { - filePath: rootRouteNode?.filePath, + filePath: rootRouteNode.filePath, children: routeTree.map( - (d) => getFilePathIdAndRouteIdFromPath(d.routePath!)[1], + (d) => getFilePathIdAndRouteIdFromPath(d.routePath)[1], ), }, ...Object.fromEntries( routeNodes.map((d) => { - const [_, routeId] = getFilePathIdAndRouteIdFromPath(d.routePath!) + const [_, routeId] = getFilePathIdAndRouteIdFromPath(d.routePath) return [ routeId, @@ -744,7 +671,7 @@ export const Route = createAPIFileRoute('${escapedRoutePath}')({ : undefined, children: d.children?.map( (childRoute) => - getFilePathIdAndRouteIdFromPath(childRoute.routePath!)[1], + getFilePathIdAndRouteIdFromPath(childRoute.routePath)[1], ), }, ] @@ -761,18 +688,15 @@ export const Route = createAPIFileRoute('${escapedRoutePath}')({ ) } - const routeConfigFileContent = await prettier.format( - config.disableManifestGeneration - ? routeImports - : [ - routeImports, - '\n', - '/* ROUTE_MANIFEST_START', - createRouteManifest(), - 'ROUTE_MANIFEST_END */', - ].join('\n'), - prettierOptions, - ) + const routeConfigFileContent = config.disableManifestGeneration + ? routeImports + : [ + routeImports, + '\n', + '/* ROUTE_MANIFEST_START', + createRouteManifest(), + 'ROUTE_MANIFEST_END */', + ].join('\n') if (!checkLatest()) return @@ -796,12 +720,19 @@ export const Route = createAPIFileRoute('${escapedRoutePath}')({ if (!checkLatest()) return // Write the route tree file, if it has changed - if (existingRouteTreeContent !== routeConfigFileContent) { - await fsp.writeFile( - path.resolve(config.generatedRouteTree), - routeConfigFileContent, - ) - if (!checkLatest()) return + const routeTreeWriteResult = await writeIfDifferent( + path.resolve(config.generatedRouteTree), + prettierOptions, + existingRouteTreeContent, + routeConfigFileContent, + { + beforeWrite: () => { + logger.log(`🟑 Updating ${config.generatedRouteTree}`) + }, + }, + ) + if (routeTreeWriteResult && !checkLatest()) { + return } logger.log( @@ -811,89 +742,20 @@ export const Route = createAPIFileRoute('${escapedRoutePath}')({ ) } -function routePathToVariable(routePath: string): string { - return ( - removeUnderscores(routePath) - ?.replace(/\/\$\//g, '/splat/') - .replace(/\$$/g, 'splat') - .replace(/\$/g, '') - .split(/[/-]/g) - .map((d, i) => (i > 0 ? capitalize(d) : d)) - .join('') - .replace(/([^a-zA-Z0-9]|[.])/gm, '') - .replace(/^(\d)/g, 'R$1') ?? '' - ) -} - -export function removeExt(d: string, keepExtension: boolean = false) { - return keepExtension ? d : d.substring(0, d.lastIndexOf('.')) || d -} - function spaces(d: number): string { return Array.from({ length: d }) .map(() => ' ') .join('') } -export function multiSortBy( - arr: Array, - accessors: Array<(item: T) => any> = [(d) => d], -): Array { - return arr - .map((d, i) => [d, i] as const) - .sort(([a, ai], [b, bi]) => { - for (const accessor of accessors) { - const ao = accessor(a) - const bo = accessor(b) - - if (typeof ao === 'undefined') { - if (typeof bo === 'undefined') { - continue - } - return 1 - } - - if (ao === bo) { - continue - } - - return ao > bo ? 1 : -1 - } - - return ai - bi - }) - .map(([d]) => d) -} - -function capitalize(s: string) { - if (typeof s !== 'string') return '' - return s.charAt(0).toUpperCase() + s.slice(1) -} - -function removeUnderscores(s?: string) { - return s?.replaceAll(/(^_|_$)/gi, '').replaceAll(/(\/_|_\/)/gi, '/') -} - function removeTrailingUnderscores(s?: string) { return s?.replaceAll(/(_$)/gi, '').replaceAll(/(_\/)/gi, '/') } -function replaceBackslash(s: string) { - return s.replaceAll(/\\/gi, '/') -} - function removeGroups(s: string) { return s.replace(possiblyNestedRouteGroupPatternRegex, '') } -function removeTrailingSlash(s: string) { - return s.replace(/\/$/, '') -} - -function determineInitialRoutePath(routePath: string) { - return cleanPath(`/${routePath.split('.').join('/')}`) || '' -} - /** * The `node.path` is used as the `id` in the route definition. * This function checks if the given node has a parent and if so, it determines the correct path for the given node. @@ -902,7 +764,7 @@ function determineInitialRoutePath(routePath: string) { */ function determineNodePath(node: RouteNode) { return (node.path = node.parent - ? node.routePath?.replace(node.parent.routePath!, '') || '/' + ? node.routePath?.replace(node.parent.routePath ?? '', '') || '/' : node.routePath) } @@ -966,6 +828,56 @@ export function hasParentRoute( return hasParentRoute(routes, node, parentRoutePath) } +/** + * Gets the final variable name for a route + */ +export const getResolvedRouteNodeVariableName = ( + routeNode: RouteNode, +): string => { + return routeNode.children?.length + ? `${routeNode.variableName}RouteWithChildren` + : `${routeNode.variableName}Route` +} + +/** + * Creates a map from fullPath to routeNode + */ +export const createRouteNodesByFullPath = ( + routeNodes: Array, +): Map => { + return new Map( + routeNodes.map((routeNode) => [inferFullPath(routeNode), routeNode]), + ) +} + +/** + * Create a map from 'to' to a routeNode + */ +export const createRouteNodesByTo = ( + routeNodes: Array, +): Map => { + return new Map( + dedupeBranchesAndIndexRoutes(routeNodes).map((routeNode) => [ + inferTo(routeNode), + routeNode, + ]), + ) +} + +/** + * Create a map from 'id' to a routeNode + */ +export const createRouteNodesById = ( + routeNodes: Array, +): Map => { + return new Map( + routeNodes.map((routeNode) => { + const [_, id] = getFilePathIdAndRouteIdFromPath(routeNode.routePath) + return [id, routeNode] + }), + ) +} + /** * Infers the full path for use by TS */ @@ -986,7 +898,30 @@ export const inferPath = (routeNode: RouteNode): string => { : (routeNode.cleanedPath?.replace(/\/$/, '') ?? '') } -function getFilePathIdAndRouteIdFromPath(pathname: string) { +/** + * Infers to path + */ +export const inferTo = (routeNode: RouteNode): string => { + const fullPath = inferFullPath(routeNode) + + if (fullPath === '/') return fullPath + + return fullPath.replace(/\/$/, '') +} + +/** + * Dedupes branches and index routes + */ +export const dedupeBranchesAndIndexRoutes = ( + routes: Array, +): Array => { + return routes.filter((route) => { + if (route.children?.find((child) => child.cleanedPath === '/')) return false + return true + }) +} + +function getFilePathIdAndRouteIdFromPath(pathname?: string) { const filePathId = removeTrailingUnderscores(pathname) const id = removeGroups(filePathId ?? '') @@ -1044,13 +979,14 @@ export type StartAPIRoutePathSegment = { */ export function startAPIRouteSegmentsFromTSRFilePath( src: string, + config: Config, ): Array { const routePath = determineInitialRoutePath(src) const parts = routePath .replaceAll('.', '/') .split('/') - .filter((p) => !!p && p !== 'index') + .filter((p) => !!p && p !== config.indexToken) const segments: Array = parts.map((part) => { if (part.startsWith('$')) { if (part === '$') { diff --git a/packages/router-generator/src/types.ts b/packages/router-generator/src/types.ts new file mode 100644 index 0000000000..cf1b7ee9e2 --- /dev/null +++ b/packages/router-generator/src/types.ts @@ -0,0 +1,28 @@ +export type RouteNode = { + filePath: string + fullPath: string + variableName: string + routePath?: string + cleanedPath?: string + path?: string + isNonPath?: boolean + isLayout?: boolean + isVirtualParentRequired?: boolean + isVirtualParentRoute?: boolean + isRoute?: boolean + isAPIRoute?: boolean + isLoader?: boolean + isComponent?: boolean + isErrorComponent?: boolean + isPendingComponent?: boolean + isVirtual?: boolean + isLazy?: boolean + isRoot?: boolean + children?: Array + parent?: RouteNode +} + +export interface GetRouteNodesResult { + rootRouteNode?: RouteNode + routeNodes: Array +} diff --git a/packages/router-generator/src/utils.ts b/packages/router-generator/src/utils.ts index 5a57168353..cc91b77b55 100644 --- a/packages/router-generator/src/utils.ts +++ b/packages/router-generator/src/utils.ts @@ -1,3 +1,36 @@ +import * as fs from 'node:fs' +import * as prettier from 'prettier' + +export function multiSortBy( + arr: Array, + accessors: Array<(item: T) => any> = [(d) => d], +): Array { + return arr + .map((d, i) => [d, i] as const) + .sort(([a, ai], [b, bi]) => { + for (const accessor of accessors) { + const ao = accessor(a) + const bo = accessor(b) + + if (typeof ao === 'undefined') { + if (typeof bo === 'undefined') { + continue + } + return 1 + } + + if (ao === bo) { + continue + } + + return ao > bo ? 1 : -1 + } + + return ai - bi + }) + .map(([d]) => d) +} + export function cleanPath(path: string) { // remove double slashes return path.replace(/\/{2,}/g, '/') @@ -26,3 +59,78 @@ export function logging(config: { disabled: boolean }) { }, } } + +export function removeLeadingSlash(path: string): string { + return path.replace(/^\//, '') +} + +export function removeTrailingSlash(s: string) { + return s.replace(/\/$/, '') +} + +export function determineInitialRoutePath(routePath: string) { + return cleanPath(`/${routePath.split('.').join('/')}`) || '' +} + +export function replaceBackslash(s: string) { + return s.replaceAll(/\\/gi, '/') +} + +export function routePathToVariable(routePath: string): string { + return ( + removeUnderscores(routePath) + ?.replace(/\/\$\//g, '/splat/') + .replace(/\$$/g, 'splat') + .replace(/\$/g, '') + .split(/[/-]/g) + .map((d, i) => (i > 0 ? capitalize(d) : d)) + .join('') + .replace(/([^a-zA-Z0-9]|[.])/gm, '') + .replace(/^(\d)/g, 'R$1') ?? '' + ) +} + +export function removeUnderscores(s?: string) { + return s?.replaceAll(/(^_|_$)/gi, '').replaceAll(/(\/_|_\/)/gi, '/') +} + +export function capitalize(s: string) { + if (typeof s !== 'string') return '' + return s.charAt(0).toUpperCase() + s.slice(1) +} + +export function removeExt(d: string, keepExtension: boolean = false) { + return keepExtension ? d : d.substring(0, d.lastIndexOf('.')) || d +} + +/** + * This function writes to a file if the content is different. + * + * @param filepath The path to the file + * @param prettierOptions Prettier options + * @param content Original content + * @param incomingContent New content + * @param callbacks Callbacks to run before and after writing + * @returns Whether the file was written + */ +export async function writeIfDifferent( + filepath: string, + prettierOptions: prettier.Options, + content: string, + incomingContent: string, + callbacks?: { beforeWrite?: () => void; afterWrite?: () => void }, +): Promise { + const [formattedContent, updatedContent] = await Promise.all([ + prettier.format(content, prettierOptions), + prettier.format(incomingContent, prettierOptions), + ]) + + if (formattedContent !== updatedContent) { + callbacks?.beforeWrite?.() + fs.writeFileSync(filepath, updatedContent) + callbacks?.afterWrite?.() + return true + } + + return false +} diff --git a/packages/router-generator/tests/generator.test.ts b/packages/router-generator/tests/generator.test.ts index 218c1bda32..4ca9b4df0f 100644 --- a/packages/router-generator/tests/generator.test.ts +++ b/packages/router-generator/tests/generator.test.ts @@ -2,6 +2,13 @@ import fs from 'node:fs/promises' import { join } from 'node:path' import { describe, expect, it } from 'vitest' +import { + index, + layout, + physical, + rootRoute, + route, +} from '@tanstack/virtual-file-routes' import { generator, getConfig } from '../src' import type { Config } from '../src' @@ -47,6 +54,33 @@ function rewriteConfigByFolderName(folderName: string, config: Config) { case 'no-manifest': config.disableManifestGeneration = true break + case 'custom-tokens': + config.indexToken = '_1nd3x' + config.routeToken = '_r0ut3_' + break + case 'virtual': + { + const virtualRouteConfig = rootRoute('root.tsx', [ + index('index.tsx'), + layout('layout.tsx', [ + route('/dashboard', 'db/dashboard.tsx', [ + index('db/dashboard-index.tsx'), + route('/invoices', 'db/dashboard-invoices.tsx', [ + index('db/invoices-index.tsx'), + route('$id', 'db/invoice-detail.tsx'), + ]), + ]), + physical('/hello', 'subtree'), + ]), + ]) + config.virtualRouteConfig = virtualRouteConfig + } + break + case 'types-disabled': + config.disableTypes = true + config.generatedRouteTree = + makeFolderDir(folderName) + '/routeTree.gen.js' + break default: break } @@ -115,7 +149,11 @@ describe('generator works', async () => { const generatedRouteTree = await getRouteTreeFileText(config) expect(generatedRouteTree).toMatchFileSnapshot( - join('generator', folderName, 'routeTree.snapshot.ts'), + join( + 'generator', + folderName, + `routeTree.snapshot.${config.disableTypes ? 'js' : 'ts'}`, + ), ) await postprocess(folderName) }, diff --git a/packages/router-generator/tests/generator/append-and-prepend/routeTree.snapshot.ts b/packages/router-generator/tests/generator/append-and-prepend/routeTree.snapshot.ts index 9ce8734674..8c70533d27 100644 --- a/packages/router-generator/tests/generator/append-and-prepend/routeTree.snapshot.ts +++ b/packages/router-generator/tests/generator/append-and-prepend/routeTree.snapshot.ts @@ -32,7 +32,39 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ IndexRoute }) +export interface FileRoutesByFullPath { + '/': typeof IndexRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' + fileRoutesByTo: FileRoutesByTo + to: '/' + id: '__root__' | '/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() // append1 diff --git a/packages/router-generator/tests/generator/append-and-prepend/routes/__root.tsx b/packages/router-generator/tests/generator/append-and-prepend/routes/__root.tsx index ab504e42e9..83a28ec7da 100644 --- a/packages/router-generator/tests/generator/append-and-prepend/routes/__root.tsx +++ b/packages/router-generator/tests/generator/append-and-prepend/routes/__root.tsx @@ -1 +1,3 @@ -/** */ +import { createRootRoute } from '@tanstack/react-router' + +export const Route = createRootRoute({}) diff --git a/packages/router-generator/tests/generator/append-and-prepend/routes/index.tsx b/packages/router-generator/tests/generator/append-and-prepend/routes/index.tsx index ab504e42e9..a525ebff0c 100644 --- a/packages/router-generator/tests/generator/append-and-prepend/routes/index.tsx +++ b/packages/router-generator/tests/generator/append-and-prepend/routes/index.tsx @@ -1 +1,17 @@ -/** */ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: Home, + validateSearch: () => ({ + indexSearch: 'indexSearch', + }), +}) + +function Home() { + return ( +
+

Welcome Home!

+
+ ) +} diff --git a/packages/router-generator/tests/generator/custom-tokens/routeTree.snapshot.ts b/packages/router-generator/tests/generator/custom-tokens/routeTree.snapshot.ts new file mode 100644 index 0000000000..c24b7a6d0f --- /dev/null +++ b/packages/router-generator/tests/generator/custom-tokens/routeTree.snapshot.ts @@ -0,0 +1,293 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/__root' +import { Route as PostsR0ut3Import } from './routes/posts/_r0ut3_' +import { Route as BlogR0ut3Import } from './routes/blog/_r0ut3_' +import { Route as R1nd3xImport } from './routes/_1nd3x' +import { Route as Posts1nd3xImport } from './routes/posts/_1nd3x' +import { Route as Blog1nd3xImport } from './routes/blog/_1nd3x' +import { Route as BlogSlugImport } from './routes/blog/$slug' +import { Route as PostsPostId1nd3xImport } from './routes/posts/$postId/_1nd3x' +import { Route as PostsPostIdDeepImport } from './routes/posts/$postId/deep' + +// Create/Update Routes + +const PostsR0ut3Route = PostsR0ut3Import.update({ + path: '/posts', + getParentRoute: () => rootRoute, +} as any) + +const BlogR0ut3Route = BlogR0ut3Import.update({ + path: '/blog', + getParentRoute: () => rootRoute, +} as any) + +const R1nd3xRoute = R1nd3xImport.update({ + path: '/', + getParentRoute: () => rootRoute, +} as any) + +const Posts1nd3xRoute = Posts1nd3xImport.update({ + path: '/', + getParentRoute: () => PostsR0ut3Route, +} as any) + +const Blog1nd3xRoute = Blog1nd3xImport.update({ + path: '/', + getParentRoute: () => BlogR0ut3Route, +} as any) + +const BlogSlugRoute = BlogSlugImport.update({ + path: '/$slug', + getParentRoute: () => BlogR0ut3Route, +} as any) + +const PostsPostId1nd3xRoute = PostsPostId1nd3xImport.update({ + path: '/$postId/', + getParentRoute: () => PostsR0ut3Route, +} as any) + +const PostsPostIdDeepRoute = PostsPostIdDeepImport.update({ + path: '/$postId/deep', + getParentRoute: () => PostsR0ut3Route, +} as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof R1nd3xImport + parentRoute: typeof rootRoute + } + '/blog': { + id: '/blog' + path: '/blog' + fullPath: '/blog' + preLoaderRoute: typeof BlogR0ut3Import + parentRoute: typeof rootRoute + } + '/posts': { + id: '/posts' + path: '/posts' + fullPath: '/posts' + preLoaderRoute: typeof PostsR0ut3Import + parentRoute: typeof rootRoute + } + '/blog/$slug': { + id: '/blog/$slug' + path: '/$slug' + fullPath: '/blog/$slug' + preLoaderRoute: typeof BlogSlugImport + parentRoute: typeof BlogR0ut3Import + } + '/blog/': { + id: '/blog/' + path: '/' + fullPath: '/blog/' + preLoaderRoute: typeof Blog1nd3xImport + parentRoute: typeof BlogR0ut3Import + } + '/posts/': { + id: '/posts/' + path: '/' + fullPath: '/posts/' + preLoaderRoute: typeof Posts1nd3xImport + parentRoute: typeof PostsR0ut3Import + } + '/posts/$postId/deep': { + id: '/posts/$postId/deep' + path: '/$postId/deep' + fullPath: '/posts/$postId/deep' + preLoaderRoute: typeof PostsPostIdDeepImport + parentRoute: typeof PostsR0ut3Import + } + '/posts/$postId/': { + id: '/posts/$postId/' + path: '/$postId' + fullPath: '/posts/$postId' + preLoaderRoute: typeof PostsPostId1nd3xImport + parentRoute: typeof PostsR0ut3Import + } + } +} + +// Create and export the route tree + +interface BlogR0ut3RouteChildren { + BlogSlugRoute: typeof BlogSlugRoute + Blog1nd3xRoute: typeof Blog1nd3xRoute +} + +const BlogR0ut3RouteChildren: BlogR0ut3RouteChildren = { + BlogSlugRoute: BlogSlugRoute, + Blog1nd3xRoute: Blog1nd3xRoute, +} + +const BlogR0ut3RouteWithChildren = BlogR0ut3Route._addFileChildren( + BlogR0ut3RouteChildren, +) + +interface PostsR0ut3RouteChildren { + Posts1nd3xRoute: typeof Posts1nd3xRoute + PostsPostIdDeepRoute: typeof PostsPostIdDeepRoute + PostsPostId1nd3xRoute: typeof PostsPostId1nd3xRoute +} + +const PostsR0ut3RouteChildren: PostsR0ut3RouteChildren = { + Posts1nd3xRoute: Posts1nd3xRoute, + PostsPostIdDeepRoute: PostsPostIdDeepRoute, + PostsPostId1nd3xRoute: PostsPostId1nd3xRoute, +} + +const PostsR0ut3RouteWithChildren = PostsR0ut3Route._addFileChildren( + PostsR0ut3RouteChildren, +) + +export interface FileRoutesByFullPath { + '/': typeof R1nd3xRoute + '/blog': typeof BlogR0ut3RouteWithChildren + '/posts': typeof PostsR0ut3RouteWithChildren + '/blog/$slug': typeof BlogSlugRoute + '/blog/': typeof Blog1nd3xRoute + '/posts/': typeof Posts1nd3xRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute + '/posts/$postId': typeof PostsPostId1nd3xRoute +} + +export interface FileRoutesByTo { + '/': typeof R1nd3xRoute + '/blog/$slug': typeof BlogSlugRoute + '/blog': typeof Blog1nd3xRoute + '/posts': typeof Posts1nd3xRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute + '/posts/$postId': typeof PostsPostId1nd3xRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof R1nd3xRoute + '/blog': typeof BlogR0ut3RouteWithChildren + '/posts': typeof PostsR0ut3RouteWithChildren + '/blog/$slug': typeof BlogSlugRoute + '/blog/': typeof Blog1nd3xRoute + '/posts/': typeof Posts1nd3xRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute + '/posts/$postId/': typeof PostsPostId1nd3xRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/' + | '/posts/' + | '/posts/$postId/deep' + | '/posts/$postId' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '/blog/$slug' + | '/blog' + | '/posts' + | '/posts/$postId/deep' + | '/posts/$postId' + id: + | '__root__' + | '/' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/' + | '/posts/' + | '/posts/$postId/deep' + | '/posts/$postId/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + R1nd3xRoute: typeof R1nd3xRoute + BlogR0ut3Route: typeof BlogR0ut3RouteWithChildren + PostsR0ut3Route: typeof PostsR0ut3RouteWithChildren +} + +const rootRouteChildren: RootRouteChildren = { + R1nd3xRoute: R1nd3xRoute, + BlogR0ut3Route: BlogR0ut3RouteWithChildren, + PostsR0ut3Route: PostsR0ut3RouteWithChildren, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [ + "/", + "/blog", + "/posts" + ] + }, + "/": { + "filePath": "_1nd3x.tsx" + }, + "/blog": { + "filePath": "blog/_r0ut3_.tsx", + "children": [ + "/blog/$slug", + "/blog/" + ] + }, + "/posts": { + "filePath": "posts/_r0ut3_.tsx", + "children": [ + "/posts/", + "/posts/$postId/deep", + "/posts/$postId/" + ] + }, + "/blog/$slug": { + "filePath": "blog/$slug.tsx", + "parent": "/blog" + }, + "/blog/": { + "filePath": "blog/_1nd3x.tsx", + "parent": "/blog" + }, + "/posts/": { + "filePath": "posts/_1nd3x.tsx", + "parent": "/posts" + }, + "/posts/$postId/deep": { + "filePath": "posts/$postId/deep.tsx", + "parent": "/posts" + }, + "/posts/$postId/": { + "filePath": "posts/$postId/_1nd3x.tsx", + "parent": "/posts" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/packages/router-generator/tests/generator/custom-tokens/routes/_1nd3x.tsx b/packages/router-generator/tests/generator/custom-tokens/routes/_1nd3x.tsx new file mode 100644 index 0000000000..a680913ded --- /dev/null +++ b/packages/router-generator/tests/generator/custom-tokens/routes/_1nd3x.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: () =>
Hello /!
, +}) diff --git a/packages/router-generator/tests/generator/custom-tokens/routes/__root.tsx b/packages/router-generator/tests/generator/custom-tokens/routes/__root.tsx new file mode 100644 index 0000000000..f89644e82d --- /dev/null +++ b/packages/router-generator/tests/generator/custom-tokens/routes/__root.tsx @@ -0,0 +1,11 @@ +import * as React from 'react' +import { Outlet, createRootRoute } from '@tanstack/react-router' + +export const Route = createRootRoute({ + component: () => ( + +
Hello "__root"!
+ +
+ ), +}) diff --git a/packages/router-generator/tests/generator/custom-tokens/routes/blog/$slug.tsx b/packages/router-generator/tests/generator/custom-tokens/routes/blog/$slug.tsx new file mode 100644 index 0000000000..0389370c39 --- /dev/null +++ b/packages/router-generator/tests/generator/custom-tokens/routes/blog/$slug.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/blog/$slug')({ + component: () =>
Hello /blog/$slug!
, +}) diff --git a/packages/router-generator/tests/generator/custom-tokens/routes/blog/_1nd3x.tsx b/packages/router-generator/tests/generator/custom-tokens/routes/blog/_1nd3x.tsx new file mode 100644 index 0000000000..6fab51efb1 --- /dev/null +++ b/packages/router-generator/tests/generator/custom-tokens/routes/blog/_1nd3x.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/blog/')({ + component: () =>
Hello /blog/!
, +}) diff --git a/packages/router-generator/tests/generator/custom-tokens/routes/blog/_r0ut3_.tsx b/packages/router-generator/tests/generator/custom-tokens/routes/blog/_r0ut3_.tsx new file mode 100644 index 0000000000..2833fcc588 --- /dev/null +++ b/packages/router-generator/tests/generator/custom-tokens/routes/blog/_r0ut3_.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/blog')({ + component: () =>
Hello /blog!
, +}) diff --git a/packages/router-generator/tests/generator/custom-tokens/routes/posts/$postId/_1nd3x.tsx b/packages/router-generator/tests/generator/custom-tokens/routes/posts/$postId/_1nd3x.tsx new file mode 100644 index 0000000000..3b2884f8aa --- /dev/null +++ b/packages/router-generator/tests/generator/custom-tokens/routes/posts/$postId/_1nd3x.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/$postId/')({ + component: () =>
Hello /posts/$postId/!
, +}) diff --git a/packages/router-generator/tests/generator/custom-tokens/routes/posts/$postId/deep.tsx b/packages/router-generator/tests/generator/custom-tokens/routes/posts/$postId/deep.tsx new file mode 100644 index 0000000000..0e0463301d --- /dev/null +++ b/packages/router-generator/tests/generator/custom-tokens/routes/posts/$postId/deep.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/$postId/deep')({ + component: () =>
Hello /posts/$postId/deep!
, +}) diff --git a/packages/router-generator/tests/generator/custom-tokens/routes/posts/_1nd3x.tsx b/packages/router-generator/tests/generator/custom-tokens/routes/posts/_1nd3x.tsx new file mode 100644 index 0000000000..f3c995416c --- /dev/null +++ b/packages/router-generator/tests/generator/custom-tokens/routes/posts/_1nd3x.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/')({ + component: () =>
Hello /posts/!
, +}) diff --git a/packages/router-generator/tests/generator/custom-tokens/routes/posts/_r0ut3_.tsx b/packages/router-generator/tests/generator/custom-tokens/routes/posts/_r0ut3_.tsx new file mode 100644 index 0000000000..c298ab4675 --- /dev/null +++ b/packages/router-generator/tests/generator/custom-tokens/routes/posts/_r0ut3_.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts')({ + component: () =>
Hello /posts!
, +}) diff --git a/packages/router-generator/tests/generator/file-modification/snapshot/empty.lazy.tsx b/packages/router-generator/tests/generator/file-modification/post.$postId.tsx similarity index 84% rename from packages/router-generator/tests/generator/file-modification/snapshot/empty.lazy.tsx rename to packages/router-generator/tests/generator/file-modification/post.$postId.tsx index fe317a8ef6..b51b2f5ad4 100644 --- a/packages/router-generator/tests/generator/file-modification/snapshot/empty.lazy.tsx +++ b/packages/router-generator/tests/generator/file-modification/post.$postId.tsx @@ -6,8 +6,12 @@ import { createFileRoute, } from '@tanstack/react-router' -export const Route = createFileRoute('/(test)/foo')({ - loader: async ({ params: { postId } }) => ({ postId }), +export const Route = createFileRoute('/posts/$postId/')({ + loader: async ({ params: { postId } }) => ({ + id: postId, + title: 'title', + body: 'body', + }), errorComponent: PostErrorComponent as any, notFoundComponent: () => { return

Post not found

diff --git a/packages/router-generator/tests/generator/file-modification/routeTree.snapshot.ts b/packages/router-generator/tests/generator/file-modification/routeTree.snapshot.ts index 4f06f53a23..9e8e4be5c2 100644 --- a/packages/router-generator/tests/generator/file-modification/routeTree.snapshot.ts +++ b/packages/router-generator/tests/generator/file-modification/routeTree.snapshot.ts @@ -86,12 +86,54 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ - testFooRoute, - testInitiallyEmptyRoute, - testInitiallyLazyRoute, - testBarLazyRoute, -}) +export interface FileRoutesByFullPath { + '/foo': typeof testFooRoute + '/initiallyEmpty': typeof testInitiallyEmptyRoute + '/initiallyLazy': typeof testInitiallyLazyRoute + '/bar': typeof testBarLazyRoute +} + +export interface FileRoutesByTo { + '/foo': typeof testFooRoute + '/initiallyEmpty': typeof testInitiallyEmptyRoute + '/initiallyLazy': typeof testInitiallyLazyRoute + '/bar': typeof testBarLazyRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/foo': typeof testFooRoute + '/initiallyEmpty': typeof testInitiallyEmptyRoute + '/initiallyLazy': typeof testInitiallyLazyRoute + '/bar': typeof testBarLazyRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/foo' | '/initiallyEmpty' | '/initiallyLazy' | '/bar' + fileRoutesByTo: FileRoutesByTo + to: '/foo' | '/initiallyEmpty' | '/initiallyLazy' | '/bar' + id: '__root__' | '/foo' | '/initiallyEmpty' | '/initiallyLazy' | '/bar' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + testFooRoute: typeof testFooRoute + testInitiallyEmptyRoute: typeof testInitiallyEmptyRoute + testInitiallyLazyRoute: typeof testInitiallyLazyRoute + testBarLazyRoute: typeof testBarLazyRoute +} + +const rootRouteChildren: RootRouteChildren = { + testFooRoute: testFooRoute, + testInitiallyEmptyRoute: testInitiallyEmptyRoute, + testInitiallyLazyRoute: testInitiallyLazyRoute, + testBarLazyRoute: testBarLazyRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ diff --git a/packages/router-generator/tests/generator/file-modification/routes/__root.tsx b/packages/router-generator/tests/generator/file-modification/routes/__root.tsx index ab504e42e9..f89644e82d 100644 --- a/packages/router-generator/tests/generator/file-modification/routes/__root.tsx +++ b/packages/router-generator/tests/generator/file-modification/routes/__root.tsx @@ -1 +1,11 @@ -/** */ +import * as React from 'react' +import { Outlet, createRootRoute } from '@tanstack/react-router' + +export const Route = createRootRoute({ + component: () => ( + +
Hello "__root"!
+ +
+ ), +}) diff --git a/packages/router-generator/tests/generator/file-modification/snapshot/bar.lazy.tsx b/packages/router-generator/tests/generator/file-modification/snapshot/bar.lazy.tsx index fe317a8ef6..d8a6feca9b 100644 --- a/packages/router-generator/tests/generator/file-modification/snapshot/bar.lazy.tsx +++ b/packages/router-generator/tests/generator/file-modification/snapshot/bar.lazy.tsx @@ -1,3 +1,5 @@ +// @ts-nocheck + import * as React from 'react' import { ErrorComponent, @@ -7,7 +9,12 @@ import { } from '@tanstack/react-router' export const Route = createFileRoute('/(test)/foo')({ - loader: async ({ params: { postId } }) => ({ postId }), + loader: async ({ params: { postId } }) => ({ + postId, + title: 'title', + body: 'body', + id: 'id', + }), errorComponent: PostErrorComponent as any, notFoundComponent: () => { return

Post not found

diff --git a/packages/router-generator/tests/generator/file-modification/snapshot/foo.tsx b/packages/router-generator/tests/generator/file-modification/snapshot/foo.tsx index fe317a8ef6..d8a6feca9b 100644 --- a/packages/router-generator/tests/generator/file-modification/snapshot/foo.tsx +++ b/packages/router-generator/tests/generator/file-modification/snapshot/foo.tsx @@ -1,3 +1,5 @@ +// @ts-nocheck + import * as React from 'react' import { ErrorComponent, @@ -7,7 +9,12 @@ import { } from '@tanstack/react-router' export const Route = createFileRoute('/(test)/foo')({ - loader: async ({ params: { postId } }) => ({ postId }), + loader: async ({ params: { postId } }) => ({ + postId, + title: 'title', + body: 'body', + id: 'id', + }), errorComponent: PostErrorComponent as any, notFoundComponent: () => { return

Post not found

diff --git a/packages/router-generator/tests/generator/file-modification/snapshot/initiallyEmpty.lazy.tsx b/packages/router-generator/tests/generator/file-modification/snapshot/initiallyEmpty.lazy.tsx index fe317a8ef6..d8a6feca9b 100644 --- a/packages/router-generator/tests/generator/file-modification/snapshot/initiallyEmpty.lazy.tsx +++ b/packages/router-generator/tests/generator/file-modification/snapshot/initiallyEmpty.lazy.tsx @@ -1,3 +1,5 @@ +// @ts-nocheck + import * as React from 'react' import { ErrorComponent, @@ -7,7 +9,12 @@ import { } from '@tanstack/react-router' export const Route = createFileRoute('/(test)/foo')({ - loader: async ({ params: { postId } }) => ({ postId }), + loader: async ({ params: { postId } }) => ({ + postId, + title: 'title', + body: 'body', + id: 'id', + }), errorComponent: PostErrorComponent as any, notFoundComponent: () => { return

Post not found

diff --git a/packages/router-generator/tests/generator/file-modification/snapshot/initiallyEmpty.tsx b/packages/router-generator/tests/generator/file-modification/snapshot/initiallyEmpty.tsx index fe317a8ef6..d8a6feca9b 100644 --- a/packages/router-generator/tests/generator/file-modification/snapshot/initiallyEmpty.tsx +++ b/packages/router-generator/tests/generator/file-modification/snapshot/initiallyEmpty.tsx @@ -1,3 +1,5 @@ +// @ts-nocheck + import * as React from 'react' import { ErrorComponent, @@ -7,7 +9,12 @@ import { } from '@tanstack/react-router' export const Route = createFileRoute('/(test)/foo')({ - loader: async ({ params: { postId } }) => ({ postId }), + loader: async ({ params: { postId } }) => ({ + postId, + title: 'title', + body: 'body', + id: 'id', + }), errorComponent: PostErrorComponent as any, notFoundComponent: () => { return

Post not found

diff --git a/packages/router-generator/tests/generator/file-modification/snapshot/initiallyLazy.tsx b/packages/router-generator/tests/generator/file-modification/snapshot/initiallyLazy.tsx index fe317a8ef6..d8a6feca9b 100644 --- a/packages/router-generator/tests/generator/file-modification/snapshot/initiallyLazy.tsx +++ b/packages/router-generator/tests/generator/file-modification/snapshot/initiallyLazy.tsx @@ -1,3 +1,5 @@ +// @ts-nocheck + import * as React from 'react' import { ErrorComponent, @@ -7,7 +9,12 @@ import { } from '@tanstack/react-router' export const Route = createFileRoute('/(test)/foo')({ - loader: async ({ params: { postId } }) => ({ postId }), + loader: async ({ params: { postId } }) => ({ + postId, + title: 'title', + body: 'body', + id: 'id', + }), errorComponent: PostErrorComponent as any, notFoundComponent: () => { return

Post not found

diff --git a/packages/router-generator/tests/generator/file-modification/template.lazy.tsx b/packages/router-generator/tests/generator/file-modification/template.lazy.tsx index 7e5e1d0f36..76dc2c74c3 100644 --- a/packages/router-generator/tests/generator/file-modification/template.lazy.tsx +++ b/packages/router-generator/tests/generator/file-modification/template.lazy.tsx @@ -1,3 +1,5 @@ +// @ts-nocheck + import { createLazyFileRoute, Link } from '@tanstack/react-router' export const Route = createLazyFileRoute('/(test)/lazy')({ diff --git a/packages/router-generator/tests/generator/file-modification/template.tsx b/packages/router-generator/tests/generator/file-modification/template.tsx index cd204621ed..918119d3f0 100644 --- a/packages/router-generator/tests/generator/file-modification/template.tsx +++ b/packages/router-generator/tests/generator/file-modification/template.tsx @@ -1,3 +1,5 @@ +// @ts-nocheck + import * as React from 'react' import { ErrorComponent, @@ -7,7 +9,12 @@ import { } from '@tanstack/react-router' export const Route = createFileRoute('/posts/$postId')({ - loader: async ({ params: { postId } }) => ({ postId }), + loader: async ({ params: { postId } }) => ({ + postId, + title: 'title', + body: 'body', + id: 'id', + }), errorComponent: PostErrorComponent as any, notFoundComponent: () => { return

Post not found

diff --git a/packages/router-generator/tests/generator/flat/routeTree.snapshot.ts b/packages/router-generator/tests/generator/flat/routeTree.snapshot.ts index f2347a1c82..88b18fccf6 100644 --- a/packages/router-generator/tests/generator/flat/routeTree.snapshot.ts +++ b/packages/router-generator/tests/generator/flat/routeTree.snapshot.ts @@ -140,19 +140,123 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ - IndexRoute, - BlogRouteRoute: BlogRouteRoute.addChildren({ - BlogIndexRoute, - BlogSlugIndexRoute, - }), - PostsRouteRoute: PostsRouteRoute.addChildren({ - PostsIndexRoute, - PostsPostIdDeepRoute, - PostsPostIdIndexRoute, - }), - BlogStatsRoute, -}) +interface BlogRouteRouteChildren { + BlogIndexRoute: typeof BlogIndexRoute + BlogSlugIndexRoute: typeof BlogSlugIndexRoute +} + +const BlogRouteRouteChildren: BlogRouteRouteChildren = { + BlogIndexRoute: BlogIndexRoute, + BlogSlugIndexRoute: BlogSlugIndexRoute, +} + +const BlogRouteRouteWithChildren = BlogRouteRoute._addFileChildren( + BlogRouteRouteChildren, +) + +interface PostsRouteRouteChildren { + PostsIndexRoute: typeof PostsIndexRoute + PostsPostIdDeepRoute: typeof PostsPostIdDeepRoute + PostsPostIdIndexRoute: typeof PostsPostIdIndexRoute +} + +const PostsRouteRouteChildren: PostsRouteRouteChildren = { + PostsIndexRoute: PostsIndexRoute, + PostsPostIdDeepRoute: PostsPostIdDeepRoute, + PostsPostIdIndexRoute: PostsPostIdIndexRoute, +} + +const PostsRouteRouteWithChildren = PostsRouteRoute._addFileChildren( + PostsRouteRouteChildren, +) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/blog': typeof BlogRouteRouteWithChildren + '/posts': typeof PostsRouteRouteWithChildren + '/blog/stats': typeof BlogStatsRoute + '/blog/': typeof BlogIndexRoute + '/posts/': typeof PostsIndexRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute + '/blog/$slug': typeof BlogSlugIndexRoute + '/posts/$postId': typeof PostsPostIdIndexRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/blog/stats': typeof BlogStatsRoute + '/blog': typeof BlogIndexRoute + '/posts': typeof PostsIndexRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute + '/blog/$slug': typeof BlogSlugIndexRoute + '/posts/$postId': typeof PostsPostIdIndexRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/blog': typeof BlogRouteRouteWithChildren + '/posts': typeof PostsRouteRouteWithChildren + '/blog/stats': typeof BlogStatsRoute + '/blog/': typeof BlogIndexRoute + '/posts/': typeof PostsIndexRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute + '/blog/$slug/': typeof BlogSlugIndexRoute + '/posts/$postId/': typeof PostsPostIdIndexRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '/blog' + | '/posts' + | '/blog/stats' + | '/blog/' + | '/posts/' + | '/posts/$postId/deep' + | '/blog/$slug' + | '/posts/$postId' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '/blog/stats' + | '/blog' + | '/posts' + | '/posts/$postId/deep' + | '/blog/$slug' + | '/posts/$postId' + id: + | '__root__' + | '/' + | '/blog' + | '/posts' + | '/blog/stats' + | '/blog/' + | '/posts/' + | '/posts/$postId/deep' + | '/blog/$slug/' + | '/posts/$postId/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + BlogRouteRoute: typeof BlogRouteRouteWithChildren + PostsRouteRoute: typeof PostsRouteRouteWithChildren + BlogStatsRoute: typeof BlogStatsRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + BlogRouteRoute: BlogRouteRouteWithChildren, + PostsRouteRoute: PostsRouteRouteWithChildren, + BlogStatsRoute: BlogStatsRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ diff --git a/packages/router-generator/tests/generator/nested-layouts/routeTree.snapshot.ts b/packages/router-generator/tests/generator/nested-layouts/routeTree.snapshot.ts index 5b4badb977..a41c906e07 100644 --- a/packages/router-generator/tests/generator/nested-layouts/routeTree.snapshot.ts +++ b/packages/router-generator/tests/generator/nested-layouts/routeTree.snapshot.ts @@ -353,41 +353,313 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ - IndexRoute, - JestedRouteRoute: JestedRouteRoute.addChildren({ - JestedLayoutB3Route: JestedLayoutB3Route.addChildren({ - JestedLayoutB3LayoutC2Route: JestedLayoutB3LayoutC2Route.addChildren({ - JestedLayoutB3LayoutC2BarRoute, - }), - JestedLayoutB3IndexRoute, - }), - JestedLayoutB4Route: JestedLayoutB4Route.addChildren({ - JestedLayoutB4FooRoute, - }), - }), - LayoutA1Route: LayoutA1Route.addChildren({ LayoutA1FooRoute }), - LayoutA2Route: LayoutA2Route.addChildren({ LayoutA2BarRoute }), - FooRoute: FooRoute.addChildren({ - FooLayoutB5RouteRoute: FooLayoutB5RouteRoute.addChildren({ - FooLayoutB5IdRoute, - FooLayoutB5IndexRoute, - }), - FooBarRoute, - }), - folderInFolderRoute, - NestedRoute: NestedRoute.addChildren({ - NestedLayoutB1Route: NestedLayoutB1Route.addChildren({ - NestedLayoutB1LayoutC1Route: NestedLayoutB1LayoutC1Route.addChildren({ - NestedLayoutB1LayoutC1BarRoute, - }), - NestedLayoutB1IndexRoute, - }), - NestedLayoutB2Route: NestedLayoutB2Route.addChildren({ - NestedLayoutB2FooRoute, - }), - }), -}) +interface JestedLayoutB3LayoutC2RouteChildren { + JestedLayoutB3LayoutC2BarRoute: typeof JestedLayoutB3LayoutC2BarRoute +} + +const JestedLayoutB3LayoutC2RouteChildren: JestedLayoutB3LayoutC2RouteChildren = + { + JestedLayoutB3LayoutC2BarRoute: JestedLayoutB3LayoutC2BarRoute, + } + +const JestedLayoutB3LayoutC2RouteWithChildren = + JestedLayoutB3LayoutC2Route._addFileChildren( + JestedLayoutB3LayoutC2RouteChildren, + ) + +interface JestedLayoutB3RouteChildren { + JestedLayoutB3LayoutC2Route: typeof JestedLayoutB3LayoutC2RouteWithChildren + JestedLayoutB3IndexRoute: typeof JestedLayoutB3IndexRoute +} + +const JestedLayoutB3RouteChildren: JestedLayoutB3RouteChildren = { + JestedLayoutB3LayoutC2Route: JestedLayoutB3LayoutC2RouteWithChildren, + JestedLayoutB3IndexRoute: JestedLayoutB3IndexRoute, +} + +const JestedLayoutB3RouteWithChildren = JestedLayoutB3Route._addFileChildren( + JestedLayoutB3RouteChildren, +) + +interface JestedLayoutB4RouteChildren { + JestedLayoutB4FooRoute: typeof JestedLayoutB4FooRoute +} + +const JestedLayoutB4RouteChildren: JestedLayoutB4RouteChildren = { + JestedLayoutB4FooRoute: JestedLayoutB4FooRoute, +} + +const JestedLayoutB4RouteWithChildren = JestedLayoutB4Route._addFileChildren( + JestedLayoutB4RouteChildren, +) + +interface JestedRouteRouteChildren { + JestedLayoutB3Route: typeof JestedLayoutB3RouteWithChildren + JestedLayoutB4Route: typeof JestedLayoutB4RouteWithChildren +} + +const JestedRouteRouteChildren: JestedRouteRouteChildren = { + JestedLayoutB3Route: JestedLayoutB3RouteWithChildren, + JestedLayoutB4Route: JestedLayoutB4RouteWithChildren, +} + +const JestedRouteRouteWithChildren = JestedRouteRoute._addFileChildren( + JestedRouteRouteChildren, +) + +interface LayoutA1RouteChildren { + LayoutA1FooRoute: typeof LayoutA1FooRoute +} + +const LayoutA1RouteChildren: LayoutA1RouteChildren = { + LayoutA1FooRoute: LayoutA1FooRoute, +} + +const LayoutA1RouteWithChildren = LayoutA1Route._addFileChildren( + LayoutA1RouteChildren, +) + +interface LayoutA2RouteChildren { + LayoutA2BarRoute: typeof LayoutA2BarRoute +} + +const LayoutA2RouteChildren: LayoutA2RouteChildren = { + LayoutA2BarRoute: LayoutA2BarRoute, +} + +const LayoutA2RouteWithChildren = LayoutA2Route._addFileChildren( + LayoutA2RouteChildren, +) + +interface FooLayoutB5RouteRouteChildren { + FooLayoutB5IdRoute: typeof FooLayoutB5IdRoute + FooLayoutB5IndexRoute: typeof FooLayoutB5IndexRoute +} + +const FooLayoutB5RouteRouteChildren: FooLayoutB5RouteRouteChildren = { + FooLayoutB5IdRoute: FooLayoutB5IdRoute, + FooLayoutB5IndexRoute: FooLayoutB5IndexRoute, +} + +const FooLayoutB5RouteRouteWithChildren = + FooLayoutB5RouteRoute._addFileChildren(FooLayoutB5RouteRouteChildren) + +interface FooRouteChildren { + FooLayoutB5RouteRoute: typeof FooLayoutB5RouteRouteWithChildren + FooBarRoute: typeof FooBarRoute +} + +const FooRouteChildren: FooRouteChildren = { + FooLayoutB5RouteRoute: FooLayoutB5RouteRouteWithChildren, + FooBarRoute: FooBarRoute, +} + +const FooRouteWithChildren = FooRoute._addFileChildren(FooRouteChildren) + +interface NestedLayoutB1LayoutC1RouteChildren { + NestedLayoutB1LayoutC1BarRoute: typeof NestedLayoutB1LayoutC1BarRoute +} + +const NestedLayoutB1LayoutC1RouteChildren: NestedLayoutB1LayoutC1RouteChildren = + { + NestedLayoutB1LayoutC1BarRoute: NestedLayoutB1LayoutC1BarRoute, + } + +const NestedLayoutB1LayoutC1RouteWithChildren = + NestedLayoutB1LayoutC1Route._addFileChildren( + NestedLayoutB1LayoutC1RouteChildren, + ) + +interface NestedLayoutB1RouteChildren { + NestedLayoutB1LayoutC1Route: typeof NestedLayoutB1LayoutC1RouteWithChildren + NestedLayoutB1IndexRoute: typeof NestedLayoutB1IndexRoute +} + +const NestedLayoutB1RouteChildren: NestedLayoutB1RouteChildren = { + NestedLayoutB1LayoutC1Route: NestedLayoutB1LayoutC1RouteWithChildren, + NestedLayoutB1IndexRoute: NestedLayoutB1IndexRoute, +} + +const NestedLayoutB1RouteWithChildren = NestedLayoutB1Route._addFileChildren( + NestedLayoutB1RouteChildren, +) + +interface NestedLayoutB2RouteChildren { + NestedLayoutB2FooRoute: typeof NestedLayoutB2FooRoute +} + +const NestedLayoutB2RouteChildren: NestedLayoutB2RouteChildren = { + NestedLayoutB2FooRoute: NestedLayoutB2FooRoute, +} + +const NestedLayoutB2RouteWithChildren = NestedLayoutB2Route._addFileChildren( + NestedLayoutB2RouteChildren, +) + +interface NestedRouteChildren { + NestedLayoutB1Route: typeof NestedLayoutB1RouteWithChildren + NestedLayoutB2Route: typeof NestedLayoutB2RouteWithChildren +} + +const NestedRouteChildren: NestedRouteChildren = { + NestedLayoutB1Route: NestedLayoutB1RouteWithChildren, + NestedLayoutB2Route: NestedLayoutB2RouteWithChildren, +} + +const NestedRouteWithChildren = + NestedRoute._addFileChildren(NestedRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/jested': typeof JestedLayoutB3LayoutC2RouteWithChildren + '': typeof LayoutA2RouteWithChildren + '/foo': typeof LayoutA1FooRoute + '/in-folder': typeof folderInFolderRoute + '/bar': typeof LayoutA2BarRoute + '/foo/bar': typeof FooBarRoute + '/nested': typeof NestedLayoutB1LayoutC1RouteWithChildren + '/foo/$id': typeof FooLayoutB5IdRoute + '/jested/foo': typeof JestedLayoutB4FooRoute + '/nested/foo': typeof NestedLayoutB2FooRoute + '/foo/': typeof FooLayoutB5IndexRoute + '/jested/': typeof JestedLayoutB3IndexRoute + '/nested/': typeof NestedLayoutB1IndexRoute + '/jested/bar': typeof JestedLayoutB3LayoutC2BarRoute + '/nested/bar': typeof NestedLayoutB1LayoutC1BarRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/jested': typeof JestedLayoutB3IndexRoute + '': typeof LayoutA2RouteWithChildren + '/foo': typeof FooLayoutB5IndexRoute + '/in-folder': typeof folderInFolderRoute + '/bar': typeof LayoutA2BarRoute + '/foo/bar': typeof FooBarRoute + '/nested': typeof NestedLayoutB1IndexRoute + '/foo/$id': typeof FooLayoutB5IdRoute + '/jested/foo': typeof JestedLayoutB4FooRoute + '/nested/foo': typeof NestedLayoutB2FooRoute + '/jested/bar': typeof JestedLayoutB3LayoutC2BarRoute + '/nested/bar': typeof NestedLayoutB1LayoutC1BarRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/jested': typeof JestedRouteRouteWithChildren + '/_layout-a1': typeof LayoutA1RouteWithChildren + '/_layout-a2': typeof LayoutA2RouteWithChildren + '/foo': typeof FooRouteWithChildren + '/foo/_layout-b5': typeof FooLayoutB5RouteRouteWithChildren + '/in-folder': typeof folderInFolderRoute + '/_layout-a1/foo': typeof LayoutA1FooRoute + '/_layout-a2/bar': typeof LayoutA2BarRoute + '/foo/bar': typeof FooBarRoute + '/jested/_layout-b3': typeof JestedLayoutB3RouteWithChildren + '/jested/_layout-b4': typeof JestedLayoutB4RouteWithChildren + '/nested': typeof NestedRouteWithChildren + '/nested/_layout-b1': typeof NestedLayoutB1RouteWithChildren + '/nested/_layout-b2': typeof NestedLayoutB2RouteWithChildren + '/foo/_layout-b5/$id': typeof FooLayoutB5IdRoute + '/jested/_layout-b3/_layout-c2': typeof JestedLayoutB3LayoutC2RouteWithChildren + '/jested/_layout-b4/foo': typeof JestedLayoutB4FooRoute + '/nested/_layout-b1/_layout-c1': typeof NestedLayoutB1LayoutC1RouteWithChildren + '/nested/_layout-b2/foo': typeof NestedLayoutB2FooRoute + '/foo/_layout-b5/': typeof FooLayoutB5IndexRoute + '/jested/_layout-b3/': typeof JestedLayoutB3IndexRoute + '/nested/_layout-b1/': typeof NestedLayoutB1IndexRoute + '/jested/_layout-b3/_layout-c2/bar': typeof JestedLayoutB3LayoutC2BarRoute + '/nested/_layout-b1/_layout-c1/bar': typeof NestedLayoutB1LayoutC1BarRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '/jested' + | '' + | '/foo' + | '/in-folder' + | '/bar' + | '/foo/bar' + | '/nested' + | '/foo/$id' + | '/jested/foo' + | '/nested/foo' + | '/foo/' + | '/jested/' + | '/nested/' + | '/jested/bar' + | '/nested/bar' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '/jested' + | '' + | '/foo' + | '/in-folder' + | '/bar' + | '/foo/bar' + | '/nested' + | '/foo/$id' + | '/jested/foo' + | '/nested/foo' + | '/jested/bar' + | '/nested/bar' + id: + | '__root__' + | '/' + | '/jested' + | '/_layout-a1' + | '/_layout-a2' + | '/foo' + | '/foo/_layout-b5' + | '/in-folder' + | '/_layout-a1/foo' + | '/_layout-a2/bar' + | '/foo/bar' + | '/jested/_layout-b3' + | '/jested/_layout-b4' + | '/nested' + | '/nested/_layout-b1' + | '/nested/_layout-b2' + | '/foo/_layout-b5/$id' + | '/jested/_layout-b3/_layout-c2' + | '/jested/_layout-b4/foo' + | '/nested/_layout-b1/_layout-c1' + | '/nested/_layout-b2/foo' + | '/foo/_layout-b5/' + | '/jested/_layout-b3/' + | '/nested/_layout-b1/' + | '/jested/_layout-b3/_layout-c2/bar' + | '/nested/_layout-b1/_layout-c1/bar' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + JestedRouteRoute: typeof JestedRouteRouteWithChildren + LayoutA1Route: typeof LayoutA1RouteWithChildren + LayoutA2Route: typeof LayoutA2RouteWithChildren + FooRoute: typeof FooRouteWithChildren + folderInFolderRoute: typeof folderInFolderRoute + NestedRoute: typeof NestedRouteWithChildren +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + JestedRouteRoute: JestedRouteRouteWithChildren, + LayoutA1Route: LayoutA1RouteWithChildren, + LayoutA2Route: LayoutA2RouteWithChildren, + FooRoute: FooRouteWithChildren, + folderInFolderRoute: folderInFolderRoute, + NestedRoute: NestedRouteWithChildren, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ diff --git a/packages/router-generator/tests/generator/nested/routeTree.snapshot.ts b/packages/router-generator/tests/generator/nested/routeTree.snapshot.ts index 3c86bcf804..d9b4c36100 100644 --- a/packages/router-generator/tests/generator/nested/routeTree.snapshot.ts +++ b/packages/router-generator/tests/generator/nested/routeTree.snapshot.ts @@ -140,16 +140,123 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ - IndexRoute, - BlogRouteRoute: BlogRouteRoute.addChildren({ BlogSlugRoute, BlogIndexRoute }), - PostsRouteRoute: PostsRouteRoute.addChildren({ - PostsIndexRoute, - PostsPostIdDeepRoute, - PostsPostIdIndexRoute, - }), - BlogStatsRoute, -}) +interface BlogRouteRouteChildren { + BlogSlugRoute: typeof BlogSlugRoute + BlogIndexRoute: typeof BlogIndexRoute +} + +const BlogRouteRouteChildren: BlogRouteRouteChildren = { + BlogSlugRoute: BlogSlugRoute, + BlogIndexRoute: BlogIndexRoute, +} + +const BlogRouteRouteWithChildren = BlogRouteRoute._addFileChildren( + BlogRouteRouteChildren, +) + +interface PostsRouteRouteChildren { + PostsIndexRoute: typeof PostsIndexRoute + PostsPostIdDeepRoute: typeof PostsPostIdDeepRoute + PostsPostIdIndexRoute: typeof PostsPostIdIndexRoute +} + +const PostsRouteRouteChildren: PostsRouteRouteChildren = { + PostsIndexRoute: PostsIndexRoute, + PostsPostIdDeepRoute: PostsPostIdDeepRoute, + PostsPostIdIndexRoute: PostsPostIdIndexRoute, +} + +const PostsRouteRouteWithChildren = PostsRouteRoute._addFileChildren( + PostsRouteRouteChildren, +) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/blog': typeof BlogRouteRouteWithChildren + '/posts': typeof PostsRouteRouteWithChildren + '/blog/$slug': typeof BlogSlugRoute + '/blog/stats': typeof BlogStatsRoute + '/blog/': typeof BlogIndexRoute + '/posts/': typeof PostsIndexRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute + '/posts/$postId': typeof PostsPostIdIndexRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/blog/$slug': typeof BlogSlugRoute + '/blog/stats': typeof BlogStatsRoute + '/blog': typeof BlogIndexRoute + '/posts': typeof PostsIndexRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute + '/posts/$postId': typeof PostsPostIdIndexRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/blog': typeof BlogRouteRouteWithChildren + '/posts': typeof PostsRouteRouteWithChildren + '/blog/$slug': typeof BlogSlugRoute + '/blog/stats': typeof BlogStatsRoute + '/blog/': typeof BlogIndexRoute + '/posts/': typeof PostsIndexRoute + '/posts/$postId/deep': typeof PostsPostIdDeepRoute + '/posts/$postId/': typeof PostsPostIdIndexRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/blog/' + | '/posts/' + | '/posts/$postId/deep' + | '/posts/$postId' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '/blog/$slug' + | '/blog/stats' + | '/blog' + | '/posts' + | '/posts/$postId/deep' + | '/posts/$postId' + id: + | '__root__' + | '/' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/blog/' + | '/posts/' + | '/posts/$postId/deep' + | '/posts/$postId/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + BlogRouteRoute: typeof BlogRouteRouteWithChildren + PostsRouteRoute: typeof PostsRouteRouteWithChildren + BlogStatsRoute: typeof BlogStatsRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + BlogRouteRoute: BlogRouteRouteWithChildren, + PostsRouteRoute: PostsRouteRouteWithChildren, + BlogStatsRoute: BlogStatsRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ diff --git a/packages/router-generator/tests/generator/nested/routes/__root.tsx b/packages/router-generator/tests/generator/nested/routes/__root.tsx index ab504e42e9..f89644e82d 100644 --- a/packages/router-generator/tests/generator/nested/routes/__root.tsx +++ b/packages/router-generator/tests/generator/nested/routes/__root.tsx @@ -1 +1,11 @@ -/** */ +import * as React from 'react' +import { Outlet, createRootRoute } from '@tanstack/react-router' + +export const Route = createRootRoute({ + component: () => ( + +
Hello "__root"!
+ +
+ ), +}) diff --git a/packages/router-generator/tests/generator/nested/routes/blog/$slug.tsx b/packages/router-generator/tests/generator/nested/routes/blog/$slug.tsx index ab504e42e9..0389370c39 100644 --- a/packages/router-generator/tests/generator/nested/routes/blog/$slug.tsx +++ b/packages/router-generator/tests/generator/nested/routes/blog/$slug.tsx @@ -1 +1,5 @@ -/** */ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/blog/$slug')({ + component: () =>
Hello /blog/$slug!
, +}) diff --git a/packages/router-generator/tests/generator/nested/routes/blog/index.tsx b/packages/router-generator/tests/generator/nested/routes/blog/index.tsx index ab504e42e9..6fab51efb1 100644 --- a/packages/router-generator/tests/generator/nested/routes/blog/index.tsx +++ b/packages/router-generator/tests/generator/nested/routes/blog/index.tsx @@ -1 +1,5 @@ -/** */ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/blog/')({ + component: () =>
Hello /blog/!
, +}) diff --git a/packages/router-generator/tests/generator/nested/routes/blog/route.tsx b/packages/router-generator/tests/generator/nested/routes/blog/route.tsx index ab504e42e9..2833fcc588 100644 --- a/packages/router-generator/tests/generator/nested/routes/blog/route.tsx +++ b/packages/router-generator/tests/generator/nested/routes/blog/route.tsx @@ -1 +1,5 @@ -/** */ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/blog')({ + component: () =>
Hello /blog!
, +}) diff --git a/packages/router-generator/tests/generator/nested/routes/blog_/stats.tsx b/packages/router-generator/tests/generator/nested/routes/blog_/stats.tsx index ab504e42e9..ee8a8181ef 100644 --- a/packages/router-generator/tests/generator/nested/routes/blog_/stats.tsx +++ b/packages/router-generator/tests/generator/nested/routes/blog_/stats.tsx @@ -1 +1,5 @@ -/** */ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/blog/stats')({ + component: () =>
Hello /blog/stats!
, +}) diff --git a/packages/router-generator/tests/generator/nested/routes/index.tsx b/packages/router-generator/tests/generator/nested/routes/index.tsx index ab504e42e9..a680913ded 100644 --- a/packages/router-generator/tests/generator/nested/routes/index.tsx +++ b/packages/router-generator/tests/generator/nested/routes/index.tsx @@ -1 +1,5 @@ -/** */ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: () =>
Hello /!
, +}) diff --git a/packages/router-generator/tests/generator/nested/routes/posts/$postId/deep.tsx b/packages/router-generator/tests/generator/nested/routes/posts/$postId/deep.tsx index ab504e42e9..eec00feafc 100644 --- a/packages/router-generator/tests/generator/nested/routes/posts/$postId/deep.tsx +++ b/packages/router-generator/tests/generator/nested/routes/posts/$postId/deep.tsx @@ -1 +1,8 @@ -/** */ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/$postId/deep')({ + context: () => ({ someContext: 'context' }), + loaderDeps: () => ({ dep: 1 }), + loader: () => ({ data: 'data' }), + component: () =>
Hello /posts/$postId/deep!
, +}) diff --git a/packages/router-generator/tests/generator/nested/routes/posts/$postId/index.tsx b/packages/router-generator/tests/generator/nested/routes/posts/$postId/index.tsx index ab504e42e9..1f0f31b0b2 100644 --- a/packages/router-generator/tests/generator/nested/routes/posts/$postId/index.tsx +++ b/packages/router-generator/tests/generator/nested/routes/posts/$postId/index.tsx @@ -1 +1,8 @@ -/** */ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/$postId/')({ + validateSearch: () => ({ + indexSearch: 'search', + }), + component: () =>
Hello /posts/$postId/!
, +}) diff --git a/packages/router-generator/tests/generator/nested/routes/posts/index.tsx b/packages/router-generator/tests/generator/nested/routes/posts/index.tsx index ab504e42e9..f3c995416c 100644 --- a/packages/router-generator/tests/generator/nested/routes/posts/index.tsx +++ b/packages/router-generator/tests/generator/nested/routes/posts/index.tsx @@ -1 +1,5 @@ -/** */ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/')({ + component: () =>
Hello /posts/!
, +}) diff --git a/packages/router-generator/tests/generator/nested/routes/posts/route.tsx b/packages/router-generator/tests/generator/nested/routes/posts/route.tsx index ab504e42e9..c298ab4675 100644 --- a/packages/router-generator/tests/generator/nested/routes/posts/route.tsx +++ b/packages/router-generator/tests/generator/nested/routes/posts/route.tsx @@ -1 +1,5 @@ -/** */ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts')({ + component: () =>
Hello /posts!
, +}) diff --git a/packages/router-generator/tests/generator/nested/tests.test-d.ts b/packages/router-generator/tests/generator/nested/tests.test-d.ts new file mode 100644 index 0000000000..93921b72b3 --- /dev/null +++ b/packages/router-generator/tests/generator/nested/tests.test-d.ts @@ -0,0 +1,534 @@ +import { + createRouter, + Link, + MakeRouteMatch, + redirect, + useLoaderData, + useLoaderDeps, + useMatch, + useNavigate, + useParams, + useRouteContext, + useSearch, +} from '@tanstack/react-router' +import { test, expectTypeOf } from 'vitest' +import { routeTree } from './routeTree.gen' + +const defaultRouter = createRouter({ + routeTree, +}) + +type DefaultRouter = typeof defaultRouter + +const alwaysTrailingSlashRouter = createRouter({ + routeTree, + trailingSlash: 'always', +}) + +const neverTrailingSlashRouter = createRouter({ + routeTree, + trailingSlash: 'never', +}) + +const preserveTrailingSlashRouter = createRouter({ + routeTree, + trailingSlash: 'preserve', +}) + +test('when navigating to the root', () => { + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('to') + .toEqualTypeOf< + | '/' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/posts/$postId/deep' + | '/posts/$postId' + | undefined + >() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('to') + .toEqualTypeOf< + | '/' + | '/blog/' + | '/posts/' + | '/blog/$slug/' + | '/blog/stats/' + | '/posts/$postId/deep/' + | '/posts/$postId/' + | undefined + >() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('to') + .toEqualTypeOf< + | '/' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/posts/$postId/deep' + | '/posts/$postId' + | undefined + >() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('to') + .toEqualTypeOf< + | '/' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/posts/$postId/deep' + | '/posts/$postId' + | '/blog/' + | '/posts/' + | '/blog/$slug/' + | '/blog/stats/' + | '/posts/$postId/deep/' + | '/posts/$postId/' + | undefined + >() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('from') + .toEqualTypeOf< + | '/' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/blog/' + | '/posts/' + | '/posts/$postId/deep' + | '/posts/$postId' + | undefined + >() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('search') + .exclude<(...args: any) => any>() + .toEqualTypeOf() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('search') + .exclude<(...args: any) => any>() + .toEqualTypeOf() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('search') + .exclude<(...args: any) => any>() + .toEqualTypeOf() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('search') + .exclude<(...args: any) => any>() + .toEqualTypeOf() +}) + +test('when navigating a index route with search and params', () => { + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('to') + .toEqualTypeOf< + | '.' + | '..' + | '/' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/posts/$postId/deep' + | '/posts/$postId' + | undefined + >() + + expectTypeOf( + Link, + ) + .parameter(0) + .toHaveProperty('to') + .toEqualTypeOf< + | './' + | '../' + | '/' + | '/blog/' + | '/posts/' + | '/blog/$slug/' + | '/blog/stats/' + | '/posts/$postId/deep/' + | '/posts/$postId/' + | undefined + >() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('to') + .toEqualTypeOf< + | '/' + | '/posts/$postId' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/posts/$postId/deep' + | '/posts/$postId' + | '.' + | '..' + | undefined + >() + + expectTypeOf( + Link, + ) + .parameter(0) + .toHaveProperty('to') + .toEqualTypeOf< + | '..' + | '../' + | '.' + | './' + | '/' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/posts/$postId/deep' + | '/posts/$postId' + | '/blog/' + | '/posts/' + | '/blog/$slug/' + | '/blog/stats/' + | '/posts/$postId/deep/' + | '/posts/$postId/' + | undefined + >() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('from') + .toEqualTypeOf< + | '/' + | '/posts/$postId' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/blog/' + | '/posts/' + | '/posts/$postId/deep' + | undefined + >() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('search') + .exclude<(...args: any) => any>() + .toEqualTypeOf<{ indexSearch: string }>() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('search') + .exclude<(...args: any) => any>() + .toEqualTypeOf() + + expectTypeOf( + Link, + ) + .parameter(0) + .toHaveProperty('search') + .exclude<(...args: any) => any>() + .toEqualTypeOf<{ indexSearch: string }>() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('search') + .exclude<(...args: any) => any>() + .toEqualTypeOf() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('search') + .exclude<(...args: any) => any>() + .toEqualTypeOf<{ indexSearch: string }>() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('search') + .exclude<(...args: any) => any>() + .toEqualTypeOf<{ indexSearch: string }>() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('search') + .exclude<(...args: any) => any>() + .toEqualTypeOf<{ indexSearch: string }>() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('params') + .exclude<(...args: any) => any>() + .toEqualTypeOf<{ postId: string }>() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('params') + .exclude<(...args: any) => any>() + .toEqualTypeOf() + + expectTypeOf( + Link, + ) + .parameter(0) + .toHaveProperty('params') + .exclude<(...args: any) => any>() + .toEqualTypeOf<{ postId: string }>() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('params') + .exclude<(...args: any) => any>() + .toEqualTypeOf() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('params') + .exclude<(...args: any) => any>() + .toEqualTypeOf<{ postId: string }>() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('params') + .exclude<(...args: any) => any>() + .toEqualTypeOf<{ postId: string }>() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('params') + .exclude<(...args: any) => any>() + .toEqualTypeOf<{ postId: string }>() +}) + +test('when navigating from a index route with search and params', () => { + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('from') + .toEqualTypeOf< + | '/' + | '/posts/$postId' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/blog/' + | '/posts/' + | '/posts/$postId/deep' + | undefined + >() + + expectTypeOf(Link) + .parameter(0) + .toHaveProperty('search') + .parameter(0) + .toEqualTypeOf<{ indexSearch: string }>() +}) + +test('when using useNavigate', () => { + const navigate = useNavigate() + + expectTypeOf(navigate) + .parameter(0) + .toHaveProperty('to') + .toEqualTypeOf< + | '/' + | '.' + | '..' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/posts/$postId/deep' + | '/posts/$postId' + | undefined + >() +}) + +test('when using redirect', () => { + expectTypeOf(redirect) + .parameter(0) + .toHaveProperty('to') + .toEqualTypeOf< + | '/' + | '/posts/$postId' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/posts/$postId/deep' + | undefined + >() +}) + +test('when using useSearch from a route with no search', () => { + expectTypeOf(useSearch) + .parameter(0) + .toHaveProperty('from') + .toEqualTypeOf< + | '/' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/blog/' + | '/posts/' + | '/posts/$postId/deep' + | '/posts/$postId/' + >() + + expectTypeOf( + useSearch, + ).returns.toEqualTypeOf<{}>() +}) + +test('when using useSearch from a route with search', () => { + expectTypeOf(useSearch) + .parameter(0) + .toHaveProperty('from') + .toEqualTypeOf< + | '/' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/blog/' + | '/posts/' + | '/posts/$postId/deep' + | '/posts/$postId/' + >() + + expectTypeOf( + useSearch, + ).returns.toEqualTypeOf<{ indexSearch: string }>() +}) + +test('when using useLoaderData from a route with loaderData', () => { + expectTypeOf(useLoaderData) + .parameter(0) + .toHaveProperty('from') + .toEqualTypeOf< + | '/' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/blog/' + | '/posts/' + | '/posts/$postId/deep' + | '/posts/$postId/' + >() + + expectTypeOf( + useLoaderData, + ).returns.toEqualTypeOf<{ data: string }>() +}) + +test('when using useLoaderDeps from a route with loaderDeps', () => { + expectTypeOf(useLoaderDeps) + .parameter(0) + .toHaveProperty('from') + .toEqualTypeOf< + | '/' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/blog/' + | '/posts/' + | '/posts/$postId/deep' + | '/posts/$postId/' + >() + + expectTypeOf( + useLoaderDeps, + ).returns.toEqualTypeOf<{ dep: number }>() +}) + +test('when using useMatch from a route', () => { + expectTypeOf(useMatch) + .parameter(0) + .toHaveProperty('from') + .toEqualTypeOf< + | '/' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/blog/' + | '/posts/' + | '/posts/$postId/deep' + | '/posts/$postId/' + >() + + expectTypeOf( + useMatch, + ).returns.toEqualTypeOf< + MakeRouteMatch + >() +}) + +test('when using useParams from a route', () => { + expectTypeOf(useParams) + .parameter(0) + .toHaveProperty('from') + .toEqualTypeOf< + | '/' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/blog/' + | '/posts/' + | '/posts/$postId/deep' + | '/posts/$postId/' + >() + + expectTypeOf( + useParams, + ).returns.toEqualTypeOf<{ postId: string }>() +}) + +test('when using useRouteContext from a route', () => { + expectTypeOf( + useRouteContext, + ) + .parameter(0) + .toHaveProperty('from') + .toEqualTypeOf< + | '/' + | '/blog' + | '/posts' + | '/blog/$slug' + | '/blog/stats' + | '/blog/' + | '/posts/' + | '/posts/$postId/deep' + | '/posts/$postId/' + >() + + expectTypeOf( + useRouteContext, + ).returns.toEqualTypeOf<{ someContext: string }>() +}) diff --git a/packages/router-generator/tests/generator/no-manifest/routeTree.snapshot.ts b/packages/router-generator/tests/generator/no-manifest/routeTree.snapshot.ts index 042241cd82..e411fcce0e 100644 --- a/packages/router-generator/tests/generator/no-manifest/routeTree.snapshot.ts +++ b/packages/router-generator/tests/generator/no-manifest/routeTree.snapshot.ts @@ -36,6 +36,38 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ IndexRoute }) +export interface FileRoutesByFullPath { + '/': typeof IndexRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' + fileRoutesByTo: FileRoutesByTo + to: '/' + id: '__root__' | '/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ diff --git a/packages/router-generator/tests/generator/only-root/routeTree.snapshot.ts b/packages/router-generator/tests/generator/only-root/routeTree.snapshot.ts new file mode 100644 index 0000000000..a65ec67d05 --- /dev/null +++ b/packages/router-generator/tests/generator/only-root/routeTree.snapshot.ts @@ -0,0 +1,61 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/__root' + +// Create/Update Routes + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath {} +} + +// Create and export the route tree + +export interface FileRoutesByFullPath {} + +export interface FileRoutesByTo {} + +export interface FileRoutesById { + __root__: typeof rootRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: never + fileRoutesByTo: FileRoutesByTo + to: never + id: '__root__' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren {} + +const rootRouteChildren: RootRouteChildren = {} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [] + } + } +} +ROUTE_MANIFEST_END */ diff --git a/packages/router-generator/tests/generator/only-root/routes/__root.tsx b/packages/router-generator/tests/generator/only-root/routes/__root.tsx new file mode 100644 index 0000000000..f89644e82d --- /dev/null +++ b/packages/router-generator/tests/generator/only-root/routes/__root.tsx @@ -0,0 +1,11 @@ +import * as React from 'react' +import { Outlet, createRootRoute } from '@tanstack/react-router' + +export const Route = createRootRoute({ + component: () => ( + +
Hello "__root"!
+ +
+ ), +}) diff --git a/packages/router-generator/tests/generator/route-groups/routeTree.snapshot.ts b/packages/router-generator/tests/generator/route-groups/routeTree.snapshot.ts index b859aa928a..06d86ac020 100644 --- a/packages/router-generator/tests/generator/route-groups/routeTree.snapshot.ts +++ b/packages/router-generator/tests/generator/route-groups/routeTree.snapshot.ts @@ -36,7 +36,39 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ fooAsdfbarIdRoute }) +export interface FileRoutesByFullPath { + '/asdf/$id': typeof fooAsdfbarIdRoute +} + +export interface FileRoutesByTo { + '/asdf/$id': typeof fooAsdfbarIdRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/asdf/$id': typeof fooAsdfbarIdRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/asdf/$id' + fileRoutesByTo: FileRoutesByTo + to: '/asdf/$id' + id: '__root__' | '/asdf/$id' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + fooAsdfbarIdRoute: typeof fooAsdfbarIdRoute +} + +const rootRouteChildren: RootRouteChildren = { + fooAsdfbarIdRoute: fooAsdfbarIdRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ diff --git a/packages/router-generator/tests/generator/single-level/routeTree.snapshot.ts b/packages/router-generator/tests/generator/single-level/routeTree.snapshot.ts index 67e435a985..2ca8187b37 100644 --- a/packages/router-generator/tests/generator/single-level/routeTree.snapshot.ts +++ b/packages/router-generator/tests/generator/single-level/routeTree.snapshot.ts @@ -49,7 +49,44 @@ declare module '@tanstack/react-router' { // Create and export the route tree -export const routeTree = rootRoute.addChildren({ IndexRoute, PostsRoute }) +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/posts': typeof PostsRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/posts': typeof PostsRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/posts': typeof PostsRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '/posts' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/posts' + id: '__root__' | '/' | '/posts' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + PostsRoute: typeof PostsRoute +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + PostsRoute: PostsRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() /* prettier-ignore-end */ diff --git a/packages/router-generator/tests/generator/types-disabled/routeTree.gen.js b/packages/router-generator/tests/generator/types-disabled/routeTree.gen.js new file mode 100644 index 0000000000..00ea7ce7f8 --- /dev/null +++ b/packages/router-generator/tests/generator/types-disabled/routeTree.gen.js @@ -0,0 +1,88 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/__root' +import { Route as PostsImport } from './routes/posts' +import { Route as IndexImport } from './routes/index' +import { Route as UsersUserIdImport } from './routes/users.$userId' +import { Route as PostsPostIdImport } from './routes/posts/$postId' + +// Create/Update Routes + +const PostsRoute = PostsImport.update({ + path: '/posts', + getParentRoute: () => rootRoute, +}) + +const IndexRoute = IndexImport.update({ + path: '/', + getParentRoute: () => rootRoute, +}) + +const UsersUserIdRoute = UsersUserIdImport.update({ + path: '/users/$userId', + getParentRoute: () => rootRoute, +}) + +const PostsPostIdRoute = PostsPostIdImport.update({ + path: '/$postId', + getParentRoute: () => PostsRoute, +}) + +// Create and export the route tree + +const PostsRouteChildren = { + PostsPostIdRoute: PostsPostIdRoute, +} + +const PostsRouteWithChildren = PostsRoute._addFileChildren(PostsRouteChildren) + +const rootRouteChildren = { + IndexRoute: IndexRoute, + PostsRoute: PostsRouteWithChildren, + UsersUserIdRoute: UsersUserIdRoute, +} + +export const routeTree = rootRoute._addFileChildren(rootRouteChildren) + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [ + "/", + "/posts", + "/users/$userId" + ] + }, + "/": { + "filePath": "index.tsx" + }, + "/posts": { + "filePath": "posts.tsx", + "children": [ + "/posts/$postId" + ] + }, + "/posts/$postId": { + "filePath": "posts/$postId.tsx", + "parent": "/posts" + }, + "/users/$userId": { + "filePath": "users.$userId.tsx" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/packages/router-generator/tests/generator/types-disabled/routeTree.snapshot.js b/packages/router-generator/tests/generator/types-disabled/routeTree.snapshot.js new file mode 100644 index 0000000000..00ea7ce7f8 --- /dev/null +++ b/packages/router-generator/tests/generator/types-disabled/routeTree.snapshot.js @@ -0,0 +1,88 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/__root' +import { Route as PostsImport } from './routes/posts' +import { Route as IndexImport } from './routes/index' +import { Route as UsersUserIdImport } from './routes/users.$userId' +import { Route as PostsPostIdImport } from './routes/posts/$postId' + +// Create/Update Routes + +const PostsRoute = PostsImport.update({ + path: '/posts', + getParentRoute: () => rootRoute, +}) + +const IndexRoute = IndexImport.update({ + path: '/', + getParentRoute: () => rootRoute, +}) + +const UsersUserIdRoute = UsersUserIdImport.update({ + path: '/users/$userId', + getParentRoute: () => rootRoute, +}) + +const PostsPostIdRoute = PostsPostIdImport.update({ + path: '/$postId', + getParentRoute: () => PostsRoute, +}) + +// Create and export the route tree + +const PostsRouteChildren = { + PostsPostIdRoute: PostsPostIdRoute, +} + +const PostsRouteWithChildren = PostsRoute._addFileChildren(PostsRouteChildren) + +const rootRouteChildren = { + IndexRoute: IndexRoute, + PostsRoute: PostsRouteWithChildren, + UsersUserIdRoute: UsersUserIdRoute, +} + +export const routeTree = rootRoute._addFileChildren(rootRouteChildren) + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [ + "/", + "/posts", + "/users/$userId" + ] + }, + "/": { + "filePath": "index.tsx" + }, + "/posts": { + "filePath": "posts.tsx", + "children": [ + "/posts/$postId" + ] + }, + "/posts/$postId": { + "filePath": "posts/$postId.tsx", + "parent": "/posts" + }, + "/users/$userId": { + "filePath": "users.$userId.tsx" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/packages/router-generator/tests/generator/types-disabled/routes/__root.tsx b/packages/router-generator/tests/generator/types-disabled/routes/__root.tsx new file mode 100644 index 0000000000..f89644e82d --- /dev/null +++ b/packages/router-generator/tests/generator/types-disabled/routes/__root.tsx @@ -0,0 +1,11 @@ +import * as React from 'react' +import { Outlet, createRootRoute } from '@tanstack/react-router' + +export const Route = createRootRoute({ + component: () => ( + +
Hello "__root"!
+ +
+ ), +}) diff --git a/packages/router-generator/tests/generator/types-disabled/routes/index.tsx b/packages/router-generator/tests/generator/types-disabled/routes/index.tsx new file mode 100644 index 0000000000..cebf9db135 --- /dev/null +++ b/packages/router-generator/tests/generator/types-disabled/routes/index.tsx @@ -0,0 +1,6 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: () =>
Hello /!
, +}) diff --git a/packages/router-generator/tests/generator/types-disabled/routes/posts.tsx b/packages/router-generator/tests/generator/types-disabled/routes/posts.tsx new file mode 100644 index 0000000000..ec0b3fcee7 --- /dev/null +++ b/packages/router-generator/tests/generator/types-disabled/routes/posts.tsx @@ -0,0 +1,6 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts')({ + component: () =>
Hello /posts!
, +}) diff --git a/packages/router-generator/tests/generator/types-disabled/routes/posts/$postId.tsx b/packages/router-generator/tests/generator/types-disabled/routes/posts/$postId.tsx new file mode 100644 index 0000000000..4528667792 --- /dev/null +++ b/packages/router-generator/tests/generator/types-disabled/routes/posts/$postId.tsx @@ -0,0 +1,6 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/posts/$postId')({ + component: () =>
Hello /posts/$postId!
, +}) diff --git a/packages/router-generator/tests/generator/types-disabled/routes/users.$userId.tsx b/packages/router-generator/tests/generator/types-disabled/routes/users.$userId.tsx new file mode 100644 index 0000000000..b6553fe98a --- /dev/null +++ b/packages/router-generator/tests/generator/types-disabled/routes/users.$userId.tsx @@ -0,0 +1,6 @@ +import * as React from 'react' +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/users/$userId')({ + component: () =>
Hello /users/$userId!
, +}) diff --git a/packages/router-generator/tests/generator/virtual-inside-nested/routeTree.snapshot.ts b/packages/router-generator/tests/generator/virtual-inside-nested/routeTree.snapshot.ts new file mode 100644 index 0000000000..d72aea4c63 --- /dev/null +++ b/packages/router-generator/tests/generator/virtual-inside-nested/routeTree.snapshot.ts @@ -0,0 +1,167 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/__root' +import { Route as IndexImport } from './routes/index' +import { Route as FooBarImport } from './routes/foo/bar' +import { Route as fooBarDetailsImport } from './routes/foo/bar/details' +import { Route as fooBarHomeImport } from './routes/foo/bar/home' + +// Create/Update Routes + +const IndexRoute = IndexImport.update({ + path: '/', + getParentRoute: () => rootRoute, +} as any) + +const FooBarRoute = FooBarImport.update({ + path: '/foo/bar', + getParentRoute: () => rootRoute, +} as any) + +const fooBarDetailsRoute = fooBarDetailsImport.update({ + path: '/$id', + getParentRoute: () => FooBarRoute, +} as any) + +const fooBarHomeRoute = fooBarHomeImport.update({ + path: '/', + getParentRoute: () => FooBarRoute, +} as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexImport + parentRoute: typeof rootRoute + } + '/foo/bar': { + id: '/foo/bar' + path: '/foo/bar' + fullPath: '/foo/bar' + preLoaderRoute: typeof FooBarImport + parentRoute: typeof rootRoute + } + '/foo/bar/': { + id: '/foo/bar/' + path: '/' + fullPath: '/foo/bar/' + preLoaderRoute: typeof fooBarHomeImport + parentRoute: typeof FooBarImport + } + '/foo/bar/$id': { + id: '/foo/bar/$id' + path: '/$id' + fullPath: '/foo/bar/$id' + preLoaderRoute: typeof fooBarDetailsImport + parentRoute: typeof FooBarImport + } + } +} + +// Create and export the route tree + +interface FooBarRouteChildren { + fooBarHomeRoute: typeof fooBarHomeRoute + fooBarDetailsRoute: typeof fooBarDetailsRoute +} + +const FooBarRouteChildren: FooBarRouteChildren = { + fooBarHomeRoute: fooBarHomeRoute, + fooBarDetailsRoute: fooBarDetailsRoute, +} + +const FooBarRouteWithChildren = + FooBarRoute._addFileChildren(FooBarRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/foo/bar': typeof FooBarRouteWithChildren + '/foo/bar/': typeof fooBarHomeRoute + '/foo/bar/$id': typeof fooBarDetailsRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/foo/bar': typeof fooBarHomeRoute + '/foo/bar/$id': typeof fooBarDetailsRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/foo/bar': typeof FooBarRouteWithChildren + '/foo/bar/': typeof fooBarHomeRoute + '/foo/bar/$id': typeof fooBarDetailsRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '/foo/bar' | '/foo/bar/' | '/foo/bar/$id' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/foo/bar' | '/foo/bar/$id' + id: '__root__' | '/' | '/foo/bar' | '/foo/bar/' | '/foo/bar/$id' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + FooBarRoute: typeof FooBarRouteWithChildren +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + FooBarRoute: FooBarRouteWithChildren, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [ + "/", + "/foo/bar" + ] + }, + "/": { + "filePath": "index.tsx" + }, + "/foo/bar": { + "filePath": "foo/bar.tsx", + "children": [ + "/foo/bar/", + "/foo/bar/$id" + ] + }, + "/foo/bar/": { + "filePath": "foo/bar/home.tsx", + "parent": "/foo/bar" + }, + "/foo/bar/$id": { + "filePath": "foo/bar/details.tsx", + "parent": "/foo/bar" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/packages/router-generator/tests/generator/virtual-inside-nested/routes/__root.tsx b/packages/router-generator/tests/generator/virtual-inside-nested/routes/__root.tsx new file mode 100644 index 0000000000..f89644e82d --- /dev/null +++ b/packages/router-generator/tests/generator/virtual-inside-nested/routes/__root.tsx @@ -0,0 +1,11 @@ +import * as React from 'react' +import { Outlet, createRootRoute } from '@tanstack/react-router' + +export const Route = createRootRoute({ + component: () => ( + +
Hello "__root"!
+ +
+ ), +}) diff --git a/packages/router-generator/tests/generator/virtual-inside-nested/routes/foo/bar.tsx b/packages/router-generator/tests/generator/virtual-inside-nested/routes/foo/bar.tsx new file mode 100644 index 0000000000..6ef5a1ca27 --- /dev/null +++ b/packages/router-generator/tests/generator/virtual-inside-nested/routes/foo/bar.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/foo/bar')({ + component: () =>
Hello /foo/bar!
, +}) diff --git a/packages/router-generator/tests/generator/virtual-inside-nested/routes/foo/bar/__virtual.ts b/packages/router-generator/tests/generator/virtual-inside-nested/routes/foo/bar/__virtual.ts new file mode 100644 index 0000000000..a732c66101 --- /dev/null +++ b/packages/router-generator/tests/generator/virtual-inside-nested/routes/foo/bar/__virtual.ts @@ -0,0 +1,10 @@ +import { + defineVirtualSubtreeConfig, + index, + route, +} from '@tanstack/virtual-file-routes' + +export default defineVirtualSubtreeConfig([ + index('home.tsx'), + route('$id', 'details.tsx'), +]) diff --git a/packages/router-generator/tests/generator/virtual-inside-nested/routes/foo/bar/details.tsx b/packages/router-generator/tests/generator/virtual-inside-nested/routes/foo/bar/details.tsx new file mode 100644 index 0000000000..59c29910fe --- /dev/null +++ b/packages/router-generator/tests/generator/virtual-inside-nested/routes/foo/bar/details.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/foo/bar/$id')({ + component: () =>
Hello /foo/bar/$id!
, +}) diff --git a/packages/router-generator/tests/generator/virtual-inside-nested/routes/foo/bar/home.tsx b/packages/router-generator/tests/generator/virtual-inside-nested/routes/foo/bar/home.tsx new file mode 100644 index 0000000000..b7a0742abf --- /dev/null +++ b/packages/router-generator/tests/generator/virtual-inside-nested/routes/foo/bar/home.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/foo/bar/')({ + component: () =>
Hello /foo/bar/!
, +}) diff --git a/packages/router-generator/tests/generator/virtual-inside-nested/routes/foo/bar/route.ts b/packages/router-generator/tests/generator/virtual-inside-nested/routes/foo/bar/route.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/router-generator/tests/generator/virtual-inside-nested/routes/index.tsx b/packages/router-generator/tests/generator/virtual-inside-nested/routes/index.tsx new file mode 100644 index 0000000000..a680913ded --- /dev/null +++ b/packages/router-generator/tests/generator/virtual-inside-nested/routes/index.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: () =>
Hello /!
, +}) diff --git a/packages/router-generator/tests/generator/virtual/routeTree.snapshot.ts b/packages/router-generator/tests/generator/virtual/routeTree.snapshot.ts new file mode 100644 index 0000000000..95c36d0759 --- /dev/null +++ b/packages/router-generator/tests/generator/virtual/routeTree.snapshot.ts @@ -0,0 +1,356 @@ +/* prettier-ignore-start */ + +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file is auto-generated by TanStack Router + +// Import Routes + +import { Route as rootRoute } from './routes/root' +import { Route as layoutImport } from './routes/layout' +import { Route as indexImport } from './routes/index' +import { Route as dbDashboardImport } from './routes/db/dashboard' +import { Route as HelloIndexImport } from './routes/subtree/index' +import { Route as dbDashboardInvoicesImport } from './routes/db/dashboard-invoices' +import { Route as dbDashboardIndexImport } from './routes/db/dashboard-index' +import { Route as HelloFooIndexImport } from './routes/subtree/foo/index' +import { Route as HelloFooIdImport } from './routes/subtree/foo/$id' +import { Route as dbInvoiceDetailImport } from './routes/db/invoice-detail' +import { Route as dbInvoicesIndexImport } from './routes/db/invoices-index' + +// Create/Update Routes + +const layoutRoute = layoutImport.update({ + id: '/_layout', + getParentRoute: () => rootRoute, +} as any) + +const indexRoute = indexImport.update({ + path: '/', + getParentRoute: () => rootRoute, +} as any) + +const dbDashboardRoute = dbDashboardImport.update({ + path: '/dashboard', + getParentRoute: () => layoutRoute, +} as any) + +const HelloIndexRoute = HelloIndexImport.update({ + path: '/hello/', + getParentRoute: () => layoutRoute, +} as any) + +const dbDashboardInvoicesRoute = dbDashboardInvoicesImport.update({ + path: '/invoices', + getParentRoute: () => dbDashboardRoute, +} as any) + +const dbDashboardIndexRoute = dbDashboardIndexImport.update({ + path: '/', + getParentRoute: () => dbDashboardRoute, +} as any) + +const HelloFooIndexRoute = HelloFooIndexImport.update({ + path: '/hello/foo/', + getParentRoute: () => layoutRoute, +} as any) + +const HelloFooIdRoute = HelloFooIdImport.update({ + path: '/hello/foo/$id', + getParentRoute: () => layoutRoute, +} as any) + +const dbInvoiceDetailRoute = dbInvoiceDetailImport.update({ + path: '/$id', + getParentRoute: () => dbDashboardInvoicesRoute, +} as any) + +const dbInvoicesIndexRoute = dbInvoicesIndexImport.update({ + path: '/', + getParentRoute: () => dbDashboardInvoicesRoute, +} as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof indexImport + parentRoute: typeof rootRoute + } + '/_layout': { + id: '/_layout' + path: '' + fullPath: '' + preLoaderRoute: typeof layoutImport + parentRoute: typeof rootRoute + } + '/_layout/dashboard': { + id: '/_layout/dashboard' + path: '/dashboard' + fullPath: '/dashboard' + preLoaderRoute: typeof dbDashboardImport + parentRoute: typeof layoutImport + } + '/_layout/dashboard/': { + id: '/_layout/dashboard/' + path: '/' + fullPath: '/dashboard/' + preLoaderRoute: typeof dbDashboardIndexImport + parentRoute: typeof dbDashboardImport + } + '/_layout/dashboard/invoices': { + id: '/_layout/dashboard/invoices' + path: '/invoices' + fullPath: '/dashboard/invoices' + preLoaderRoute: typeof dbDashboardInvoicesImport + parentRoute: typeof dbDashboardImport + } + '/_layout/hello/': { + id: '/_layout/hello/' + path: '/hello' + fullPath: '/hello' + preLoaderRoute: typeof HelloIndexImport + parentRoute: typeof layoutImport + } + '/_layout/dashboard/invoices/': { + id: '/_layout/dashboard/invoices/' + path: '/' + fullPath: '/dashboard/invoices/' + preLoaderRoute: typeof dbInvoicesIndexImport + parentRoute: typeof dbDashboardInvoicesImport + } + '/_layout/dashboard/invoices/$id': { + id: '/_layout/dashboard/invoices/$id' + path: '/$id' + fullPath: '/dashboard/invoices/$id' + preLoaderRoute: typeof dbInvoiceDetailImport + parentRoute: typeof dbDashboardInvoicesImport + } + '/_layout/hello/foo/$id': { + id: '/_layout/hello/foo/$id' + path: '/hello/foo/$id' + fullPath: '/hello/foo/$id' + preLoaderRoute: typeof HelloFooIdImport + parentRoute: typeof layoutImport + } + '/_layout/hello/foo/': { + id: '/_layout/hello/foo/' + path: '/hello/foo' + fullPath: '/hello/foo' + preLoaderRoute: typeof HelloFooIndexImport + parentRoute: typeof layoutImport + } + } +} + +// Create and export the route tree + +interface dbDashboardInvoicesRouteChildren { + dbInvoicesIndexRoute: typeof dbInvoicesIndexRoute + dbInvoiceDetailRoute: typeof dbInvoiceDetailRoute +} + +const dbDashboardInvoicesRouteChildren: dbDashboardInvoicesRouteChildren = { + dbInvoicesIndexRoute: dbInvoicesIndexRoute, + dbInvoiceDetailRoute: dbInvoiceDetailRoute, +} + +const dbDashboardInvoicesRouteWithChildren = + dbDashboardInvoicesRoute._addFileChildren(dbDashboardInvoicesRouteChildren) + +interface dbDashboardRouteChildren { + dbDashboardIndexRoute: typeof dbDashboardIndexRoute + dbDashboardInvoicesRoute: typeof dbDashboardInvoicesRouteWithChildren +} + +const dbDashboardRouteChildren: dbDashboardRouteChildren = { + dbDashboardIndexRoute: dbDashboardIndexRoute, + dbDashboardInvoicesRoute: dbDashboardInvoicesRouteWithChildren, +} + +const dbDashboardRouteWithChildren = dbDashboardRoute._addFileChildren( + dbDashboardRouteChildren, +) + +interface layoutRouteChildren { + dbDashboardRoute: typeof dbDashboardRouteWithChildren + HelloIndexRoute: typeof HelloIndexRoute + HelloFooIdRoute: typeof HelloFooIdRoute + HelloFooIndexRoute: typeof HelloFooIndexRoute +} + +const layoutRouteChildren: layoutRouteChildren = { + dbDashboardRoute: dbDashboardRouteWithChildren, + HelloIndexRoute: HelloIndexRoute, + HelloFooIdRoute: HelloFooIdRoute, + HelloFooIndexRoute: HelloFooIndexRoute, +} + +const layoutRouteWithChildren = + layoutRoute._addFileChildren(layoutRouteChildren) + +export interface FileRoutesByFullPath { + '/': typeof indexRoute + '': typeof layoutRouteWithChildren + '/dashboard': typeof dbDashboardRouteWithChildren + '/dashboard/': typeof dbDashboardIndexRoute + '/dashboard/invoices': typeof dbDashboardInvoicesRouteWithChildren + '/hello': typeof HelloIndexRoute + '/dashboard/invoices/': typeof dbInvoicesIndexRoute + '/dashboard/invoices/$id': typeof dbInvoiceDetailRoute + '/hello/foo/$id': typeof HelloFooIdRoute + '/hello/foo': typeof HelloFooIndexRoute +} + +export interface FileRoutesByTo { + '/': typeof indexRoute + '': typeof layoutRouteWithChildren + '/dashboard': typeof dbDashboardIndexRoute + '/hello': typeof HelloIndexRoute + '/dashboard/invoices': typeof dbInvoicesIndexRoute + '/dashboard/invoices/$id': typeof dbInvoiceDetailRoute + '/hello/foo/$id': typeof HelloFooIdRoute + '/hello/foo': typeof HelloFooIndexRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof indexRoute + '/_layout': typeof layoutRouteWithChildren + '/_layout/dashboard': typeof dbDashboardRouteWithChildren + '/_layout/dashboard/': typeof dbDashboardIndexRoute + '/_layout/dashboard/invoices': typeof dbDashboardInvoicesRouteWithChildren + '/_layout/hello/': typeof HelloIndexRoute + '/_layout/dashboard/invoices/': typeof dbInvoicesIndexRoute + '/_layout/dashboard/invoices/$id': typeof dbInvoiceDetailRoute + '/_layout/hello/foo/$id': typeof HelloFooIdRoute + '/_layout/hello/foo/': typeof HelloFooIndexRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '' + | '/dashboard' + | '/dashboard/' + | '/dashboard/invoices' + | '/hello' + | '/dashboard/invoices/' + | '/dashboard/invoices/$id' + | '/hello/foo/$id' + | '/hello/foo' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '' + | '/dashboard' + | '/hello' + | '/dashboard/invoices' + | '/dashboard/invoices/$id' + | '/hello/foo/$id' + | '/hello/foo' + id: + | '__root__' + | '/' + | '/_layout' + | '/_layout/dashboard' + | '/_layout/dashboard/' + | '/_layout/dashboard/invoices' + | '/_layout/hello/' + | '/_layout/dashboard/invoices/' + | '/_layout/dashboard/invoices/$id' + | '/_layout/hello/foo/$id' + | '/_layout/hello/foo/' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + indexRoute: typeof indexRoute + layoutRoute: typeof layoutRouteWithChildren +} + +const rootRouteChildren: RootRouteChildren = { + indexRoute: indexRoute, + layoutRoute: layoutRouteWithChildren, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* prettier-ignore-end */ + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "root.tsx", + "children": [ + "/", + "/_layout" + ] + }, + "/": { + "filePath": "index.tsx" + }, + "/_layout": { + "filePath": "layout.tsx", + "children": [ + "/_layout/dashboard", + "/_layout/hello/", + "/_layout/hello/foo/$id", + "/_layout/hello/foo/" + ] + }, + "/_layout/dashboard": { + "filePath": "db/dashboard.tsx", + "parent": "/_layout", + "children": [ + "/_layout/dashboard/", + "/_layout/dashboard/invoices" + ] + }, + "/_layout/dashboard/": { + "filePath": "db/dashboard-index.tsx", + "parent": "/_layout/dashboard" + }, + "/_layout/dashboard/invoices": { + "filePath": "db/dashboard-invoices.tsx", + "parent": "/_layout/dashboard", + "children": [ + "/_layout/dashboard/invoices/", + "/_layout/dashboard/invoices/$id" + ] + }, + "/_layout/hello/": { + "filePath": "subtree/index.tsx", + "parent": "/_layout" + }, + "/_layout/dashboard/invoices/": { + "filePath": "db/invoices-index.tsx", + "parent": "/_layout/dashboard/invoices" + }, + "/_layout/dashboard/invoices/$id": { + "filePath": "db/invoice-detail.tsx", + "parent": "/_layout/dashboard/invoices" + }, + "/_layout/hello/foo/$id": { + "filePath": "subtree/foo/$id.tsx", + "parent": "/_layout" + }, + "/_layout/hello/foo/": { + "filePath": "subtree/foo/index.tsx", + "parent": "/_layout" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/packages/router-generator/tests/generator/virtual/routes/db/dashboard-index.tsx b/packages/router-generator/tests/generator/virtual/routes/db/dashboard-index.tsx new file mode 100644 index 0000000000..a92fc772c3 --- /dev/null +++ b/packages/router-generator/tests/generator/virtual/routes/db/dashboard-index.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/dashboard/')({ + component: () =>
Hello !
, +}) diff --git a/packages/router-generator/tests/generator/virtual/routes/db/dashboard-invoices.tsx b/packages/router-generator/tests/generator/virtual/routes/db/dashboard-invoices.tsx new file mode 100644 index 0000000000..bf7e5a02b2 --- /dev/null +++ b/packages/router-generator/tests/generator/virtual/routes/db/dashboard-invoices.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/dashboard/invoices')({ + component: () =>
Hello !
, +}) diff --git a/packages/router-generator/tests/generator/virtual/routes/db/dashboard.tsx b/packages/router-generator/tests/generator/virtual/routes/db/dashboard.tsx new file mode 100644 index 0000000000..d5b4f49706 --- /dev/null +++ b/packages/router-generator/tests/generator/virtual/routes/db/dashboard.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/dashboard')({ + component: () =>
Hello !
, +}) diff --git a/packages/router-generator/tests/generator/virtual/routes/db/invoice-detail.tsx b/packages/router-generator/tests/generator/virtual/routes/db/invoice-detail.tsx new file mode 100644 index 0000000000..e7be6c1910 --- /dev/null +++ b/packages/router-generator/tests/generator/virtual/routes/db/invoice-detail.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/dashboard/invoices/$id')({ + component: () =>
Hello /_layout/dashboard/invoices/$id!
, +}) diff --git a/packages/router-generator/tests/generator/virtual/routes/db/invoices-index.tsx b/packages/router-generator/tests/generator/virtual/routes/db/invoices-index.tsx new file mode 100644 index 0000000000..f2e56721b6 --- /dev/null +++ b/packages/router-generator/tests/generator/virtual/routes/db/invoices-index.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/dashboard/invoices/')({ + component: () =>
Hello /_layout/dashboard/invoices/!
, +}) diff --git a/packages/router-generator/tests/generator/virtual/routes/index.tsx b/packages/router-generator/tests/generator/virtual/routes/index.tsx new file mode 100644 index 0000000000..a294139860 --- /dev/null +++ b/packages/router-generator/tests/generator/virtual/routes/index.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: () =>
Hello !
, +}) diff --git a/packages/router-generator/tests/generator/virtual/routes/layout.tsx b/packages/router-generator/tests/generator/virtual/routes/layout.tsx new file mode 100644 index 0000000000..2e48e48410 --- /dev/null +++ b/packages/router-generator/tests/generator/virtual/routes/layout.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout')({ + component: () =>
Hello !
, +}) diff --git a/packages/router-generator/tests/generator/virtual/routes/root.tsx b/packages/router-generator/tests/generator/virtual/routes/root.tsx new file mode 100644 index 0000000000..a294139860 --- /dev/null +++ b/packages/router-generator/tests/generator/virtual/routes/root.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: () =>
Hello !
, +}) diff --git a/packages/router-generator/tests/generator/virtual/routes/subtree/foo/$id.tsx b/packages/router-generator/tests/generator/virtual/routes/subtree/foo/$id.tsx new file mode 100644 index 0000000000..d8cbd795a7 --- /dev/null +++ b/packages/router-generator/tests/generator/virtual/routes/subtree/foo/$id.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/hello/foo/$id')({ + component: () =>
Hello /foo/$id!
, +}) diff --git a/packages/router-generator/tests/generator/virtual/routes/subtree/foo/index.tsx b/packages/router-generator/tests/generator/virtual/routes/subtree/foo/index.tsx new file mode 100644 index 0000000000..10233de496 --- /dev/null +++ b/packages/router-generator/tests/generator/virtual/routes/subtree/foo/index.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/hello/foo/')({ + component: () =>
Hello /foo/!
, +}) diff --git a/packages/router-generator/tests/generator/virtual/routes/subtree/index.tsx b/packages/router-generator/tests/generator/virtual/routes/subtree/index.tsx new file mode 100644 index 0000000000..3367799b96 --- /dev/null +++ b/packages/router-generator/tests/generator/virtual/routes/subtree/index.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/_layout/hello/')({ + component: () =>
Hello /!
, +}) diff --git a/packages/router-generator/tests/utils.test.ts b/packages/router-generator/tests/utils.test.ts new file mode 100644 index 0000000000..22cb05f204 --- /dev/null +++ b/packages/router-generator/tests/utils.test.ts @@ -0,0 +1,125 @@ +import { describe, expect, it } from 'vitest' +import { + cleanPath, + determineInitialRoutePath, + multiSortBy, + removeExt, + removeUnderscores, + routePathToVariable, +} from '../src/utils' + +describe('cleanPath', () => { + it('keeps path with leading slash and trailing slash', () => { + expect(cleanPath('/test/')).toBe('/test/') + }) +}) + +describe('determineInitialRoutePath', () => { + it('removes dots and adds slashes', () => { + expect(determineInitialRoutePath('test.test')).toBe('/test/test') + }) + + it('keeps leading slash', () => { + expect(determineInitialRoutePath('/test.test')).toBe('/test/test') + }) + + it('keeps trailing slash', () => { + expect(determineInitialRoutePath('test.test/')).toBe('/test/test/') + }) + + it('removes dots and adds slashes with leading and trailing slashes', () => { + expect(determineInitialRoutePath('/test.test/')).toBe('/test/test/') + }) + + it("returns '/' if path is empty", () => { + expect(determineInitialRoutePath('')).toBe('/') + }) + + it("returns '/' if path is '.'", () => { + expect(determineInitialRoutePath('.')).toBe('/') + }) + + it("returns '/' if path is './'", () => { + expect(determineInitialRoutePath('./')).toBe('/') + }) +}) + +describe('multiSortBy', () => { + it('sorts by multiple criteria', () => { + const data = [ + { routePath: '/test/1/2/index', f: 'b' }, + { routePath: '/test/1', f: 'b' }, + { routePath: '/test/1/2/3/4/index', f: 'b' }, + { routePath: '/test/1/2/3', f: 'b' }, + { routePath: '/test/1/2/3/index', f: 'b' }, + { routePath: '/test/1/2', f: 'b' }, + { routePath: '/test/1/2/3/4', f: 'b' }, + ] + + const sorted = multiSortBy(data, [ + (d) => (d.routePath.includes('1') ? -1 : 1), + (d) => d.routePath.split('/').length, + (d) => (d.routePath.endsWith('index') ? -1 : 1), + (d) => d, + ]) + + expect(sorted).toEqual([ + { routePath: '/test/1', f: 'b' }, + { routePath: '/test/1/2', f: 'b' }, + { routePath: '/test/1/2/index', f: 'b' }, + { routePath: '/test/1/2/3', f: 'b' }, + { routePath: '/test/1/2/3/index', f: 'b' }, + { routePath: '/test/1/2/3/4', f: 'b' }, + { routePath: '/test/1/2/3/4/index', f: 'b' }, + ]) + }) +}) + +describe('removeExt', () => { + it('removes extension', () => { + expect(removeExt('test.ts')).toBe('test') + }) + + it('does not remove extension if no extension', () => { + expect(removeExt('test')).toBe('test') + }) + + it('removes extension with multiple dots', () => { + expect(removeExt('test.test.ts')).toBe('test.test') + }) + + it('removes extension with leading dot', () => { + expect(removeExt('.test.ts')).toBe('.test') + }) + + it('removes extension when in a route path', () => { + expect(removeExt('/test/test.ts')).toBe('/test/test') + }) +}) + +describe('removeUnderscores', () => { + it('removes leading underscore', () => { + expect(removeUnderscores('_test')).toBe('test') + }) + + it('removes trailing underscore', () => { + expect(removeUnderscores('test_')).toBe('test') + }) + + it('removes leading and trailing underscores', () => { + expect(removeUnderscores('_test_')).toBe('test') + }) +}) + +describe('routePathToVariable', () => { + it.each([ + ['/test/$/index', 'TestSplatIndex'], + ['/test/$', 'TestSplat'], + ['/test/$/', 'TestSplat'], + ['/test/index', 'TestIndex'], + ['/test', 'Test'], + ['/test/', 'Test'], + ])(`converts "%s" to "%s"`, (routePath, expected) => { + expect(routePathToVariable(routePath)).toBe(expected) + }) +}) diff --git a/packages/router-plugin/package.json b/packages/router-plugin/package.json index 156d6912bb..2bd0e172da 100644 --- a/packages/router-plugin/package.json +++ b/packages/router-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/router-plugin", - "version": "1.51.0", + "version": "1.58.4", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -30,13 +30,13 @@ "test:unit:dev": "vitest --watch", "test:eslint": "eslint ./src", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", - "test:types:ts55": "tsc", - "test:build": "publint --strict", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "tsc", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", "build": "vite build" }, "type": "module", @@ -93,14 +93,15 @@ }, "dependencies": { "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/plugin-syntax-typescript": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.25.4", "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "@babel/types": "^7.25.2", + "@babel/traverse": "^7.25.6", + "@babel/types": "^7.25.6", "@tanstack/router-generator": "workspace:^", + "@tanstack/virtual-file-routes": "workspace:^", "@types/babel__core": "^7.20.5", "@types/babel__generator": "^7.6.8", "@types/babel__template": "^7.4.4", @@ -111,7 +112,7 @@ "zod": "^3.23.8" }, "peerDependencies": { - "@rsbuild/core": ">=1.0.0", + "@rsbuild/core": ">=1.0.2", "vite": ">=5.0.0", "webpack": ">=5.92.0" }, diff --git a/packages/router-plugin/src/core/code-splitter/compilers.ts b/packages/router-plugin/src/core/code-splitter/compilers.ts index b7feabd10c..79382d59b3 100644 --- a/packages/router-plugin/src/core/code-splitter/compilers.ts +++ b/packages/router-plugin/src/core/code-splitter/compilers.ts @@ -98,6 +98,8 @@ export function compileCodeSplitReferenceRoute(opts: ParseAstOptions) { if (prop.key.name === 'component') { const value = prop.value + let shouldSplit = true + if (t.isIdentifier(value)) { existingCompImportPath = getImportSpecifierAndPathFromLocalName( @@ -105,51 +107,63 @@ export function compileCodeSplitReferenceRoute(opts: ParseAstOptions) { value.name, ).path - removeIdentifierLiteral(path, value) - } - - // Prepend the import statement to the program along with the importer function - // Check to see if lazyRouteComponent is already imported before attempting - // to import it again + // exported identifiers should not be split + // since they are already being imported + // and need to be retained in the compiled file + const isExported = hasExport(ast, value) + shouldSplit = !isExported - if ( - !hasImportedOrDefinedIdentifier( - 'lazyRouteComponent', - ) - ) { - programPath.unshiftContainer('body', [ - template.statement( - `import { lazyRouteComponent } from '@tanstack/react-router'`, - )(), - ]) + if (shouldSplit) { + removeIdentifierLiteral(path, value) + } } - if ( - !hasImportedOrDefinedIdentifier( - '$$splitComponentImporter', - ) - ) { - programPath.unshiftContainer('body', [ + if (shouldSplit) { + // Prepend the import statement to the program along with the importer function + // Check to see if lazyRouteComponent is already imported before attempting + // to import it again + + if ( + !hasImportedOrDefinedIdentifier( + 'lazyRouteComponent', + ) + ) { + programPath.unshiftContainer('body', [ + template.statement( + `import { lazyRouteComponent } from '@tanstack/react-router'`, + )(), + ]) + } + + if ( + !hasImportedOrDefinedIdentifier( + '$$splitComponentImporter', + ) + ) { + programPath.unshiftContainer('body', [ + template.statement( + `const $$splitComponentImporter = () => import('${splitUrl}')`, + )(), + ]) + } + + prop.value = template.expression( + `lazyRouteComponent($$splitComponentImporter, 'component')`, + )() + + programPath.pushContainer('body', [ template.statement( - `const $$splitComponentImporter = () => import('${splitUrl}')`, + `function DummyComponent() { return null }`, )(), ]) - } - - prop.value = template.expression( - `lazyRouteComponent($$splitComponentImporter, 'component')`, - )() - - programPath.pushContainer('body', [ - template.statement( - `function DummyComponent() { return null }`, - )(), - ]) - found = true + found = true + } } else if (prop.key.name === 'loader') { const value = prop.value + let shouldSplit = true + if (t.isIdentifier(value)) { existingLoaderImportPath = getImportSpecifierAndPathFromLocalName( @@ -157,36 +171,45 @@ export function compileCodeSplitReferenceRoute(opts: ParseAstOptions) { value.name, ).path - removeIdentifierLiteral(path, value) - } - - // Prepend the import statement to the program along with the importer function + // exported identifiers should not be split + // since they are already being imported + // and need to be retained in the compiled file + const isExported = hasExport(ast, value) + shouldSplit = !isExported - if (!hasImportedOrDefinedIdentifier('lazyFn')) { - programPath.unshiftContainer('body', [ - template.smart( - `import { lazyFn } from '@tanstack/react-router'`, - )() as t.Statement, - ]) + if (shouldSplit) { + removeIdentifierLiteral(path, value) + } } - if ( - !hasImportedOrDefinedIdentifier( - '$$splitLoaderImporter', - ) - ) { - programPath.unshiftContainer('body', [ - template.statement( - `const $$splitLoaderImporter = () => import('${splitUrl}')`, - )(), - ]) + if (shouldSplit) { + // Prepend the import statement to the program along with the importer function + if (!hasImportedOrDefinedIdentifier('lazyFn')) { + programPath.unshiftContainer('body', [ + template.smart( + `import { lazyFn } from '@tanstack/react-router'`, + )() as t.Statement, + ]) + } + + if ( + !hasImportedOrDefinedIdentifier( + '$$splitLoaderImporter', + ) + ) { + programPath.unshiftContainer('body', [ + template.statement( + `const $$splitLoaderImporter = () => import('${splitUrl}')`, + )(), + ]) + } + + prop.value = template.expression( + `lazyFn($$splitLoaderImporter, 'loader')`, + )() + + found = true } - - prop.value = template.expression( - `lazyFn($$splitLoaderImporter, 'loader')`, - )() - - found = true } } } @@ -236,7 +259,6 @@ export function compileCodeSplitReferenceRoute(opts: ParseAstOptions) { return generate(ast, { sourceMaps: true, - minified: process.env.NODE_ENV === 'production', }) } @@ -252,6 +274,8 @@ export function compileCodeSplitVirtualRoute(opts: ParseAstOptions) { ) } + const knownExportedIdents = new Set() + babel.traverse(ast, { Program: { enter(programPath, programState) { @@ -288,12 +312,31 @@ export function compileCodeSplitVirtualRoute(opts: ParseAstOptions) { if (t.isObjectExpression(options)) { options.properties.forEach((prop) => { if (t.isObjectProperty(prop)) { - splitNodeTypes.forEach((type) => { - if (t.isIdentifier(prop.key)) { - if (prop.key.name === type) { - splitNodesByType[type] = prop.value + splitNodeTypes.forEach((splitType) => { + if ( + !t.isIdentifier(prop.key) || + prop.key.name !== splitType + ) { + return + } + + const value = prop.value + + let isExported = false + if (t.isIdentifier(value)) { + isExported = hasExport(ast, value) + if (isExported) { + knownExportedIdents.add(value.name) } } + + // If the node is exported, we need to remove + // the export from the split file + if (isExported && t.isIdentifier(value)) { + removeExports(ast, value) + } else { + splitNodesByType[splitType] = prop.value + } }) } }) @@ -449,9 +492,30 @@ export function compileCodeSplitVirtualRoute(opts: ParseAstOptions) { deadCodeElimination(ast) + // if there are exported identifiers, then we need to add a warning + // to the file to let the user know that the exported identifiers + // will not in the split file but in the original file, therefore + // increasing the bundle size + if (knownExportedIdents.size > 0) { + const list = Array.from(knownExportedIdents).reduce((str, ident) => { + str += `\n- ${ident}` + return str + }, '') + + const warningMessage = `These exports from "${opts.filename.replace('?' + splitPrefix, '')}" are not being code-split and will increase your bundle size: ${list}\nThese should either have their export statements removed or be imported from another file that is not a route.` + console.warn(warningMessage) + + // append this warning to the file using a template + if (process.env.NODE_ENV !== 'production') { + const warningTemplate = template.statement( + `console.warn(${JSON.stringify(warningMessage)})`, + )() + ast.program.body.unshift(warningTemplate) + } + } + return generate(ast, { sourceMaps: true, - minified: process.env.NODE_ENV === 'production', }) } @@ -517,3 +581,85 @@ function removeIdentifierLiteral(path: any, node: any) { } } } + +function hasExport(ast: t.File, node: t.Identifier): boolean { + let found = false + + babel.traverse(ast, { + ExportNamedDeclaration(path) { + if (path.node.declaration) { + // declared as `const loaderFn = () => {}` + if (t.isVariableDeclaration(path.node.declaration)) { + path.node.declaration.declarations.forEach((decl) => { + if (t.isVariableDeclarator(decl)) { + if (t.isIdentifier(decl.id)) { + if (decl.id.name === node.name) { + found = true + } + } + } + }) + } + + // declared as `function loaderFn() {}` + if (t.isFunctionDeclaration(path.node.declaration)) { + if (t.isIdentifier(path.node.declaration.id)) { + if (path.node.declaration.id.name === node.name) { + found = true + } + } + } + } + }, + ExportDefaultDeclaration(path) { + if (t.isIdentifier(path.node.declaration)) { + if (path.node.declaration.name === node.name) { + found = true + } + } + }, + }) + + return found +} + +function removeExports(ast: t.File, node: t.Identifier): boolean { + let removed = false + + babel.traverse(ast, { + ExportNamedDeclaration(path) { + if (path.node.declaration) { + // declared as `const loaderFn = () => {}` + if (t.isVariableDeclaration(path.node.declaration)) { + path.node.declaration.declarations.forEach((decl) => { + if (t.isVariableDeclarator(decl)) { + if (t.isIdentifier(decl.id)) { + if (decl.id.name === node.name) { + path.remove() + removed = true + } + } + } + }) + } else if (t.isFunctionDeclaration(path.node.declaration)) { + if (t.isIdentifier(path.node.declaration.id)) { + if (path.node.declaration.id.name === node.name) { + path.remove() + removed = true + } + } + } + } + }, + ExportDefaultDeclaration(path) { + if (t.isIdentifier(path.node.declaration)) { + if (path.node.declaration.name === node.name) { + path.remove() + removed = true + } + } + }, + }) + + return removed +} diff --git a/packages/router-plugin/src/core/router-code-splitter-plugin.ts b/packages/router-plugin/src/core/router-code-splitter-plugin.ts index 54264722c0..c9de306416 100644 --- a/packages/router-plugin/src/core/router-code-splitter-plugin.ts +++ b/packages/router-plugin/src/core/router-code-splitter-plugin.ts @@ -1,4 +1,4 @@ -import { isAbsolute, join } from 'node:path' +import { isAbsolute, join, normalize } from 'node:path' import { fileURLToPath, pathToFileURL } from 'node:url' import { getConfig } from './config' @@ -15,12 +15,17 @@ function capitalizeFirst(str: string): string { return str.charAt(0).toUpperCase() + str.slice(1) } -function fileIsInRoutesDirectory(filePath: string, routesDirectory: string) { +function fileIsInRoutesDirectory( + filePath: string, + routesDirectory: string, +): boolean { const routesDirectoryPath = isAbsolute(routesDirectory) ? routesDirectory : join(process.cwd(), routesDirectory) - return filePath.startsWith(routesDirectoryPath) + const path = normalize(filePath) + + return path.startsWith(routesDirectoryPath) } type BannedBeforeExternalPlugin = { @@ -172,7 +177,7 @@ export const unpluginRouterCodeSplitterFactory: UnpluginFactory< configResolved(config) { ROOT = config.root - userConfig = CHECK_USER_FLAGS_TO_BE_CHANGED(getConfig(options, ROOT)) + userConfig = getConfig(options, ROOT) }, }, @@ -193,7 +198,7 @@ export const unpluginRouterCodeSplitterFactory: UnpluginFactory< ) }) - userConfig = CHECK_USER_FLAGS_TO_BE_CHANGED(getConfig(options, ROOT)) + userConfig = getConfig(options, ROOT) }, webpack(compiler) { @@ -213,7 +218,7 @@ export const unpluginRouterCodeSplitterFactory: UnpluginFactory< ) }) - userConfig = CHECK_USER_FLAGS_TO_BE_CHANGED(getConfig(options, ROOT)) + userConfig = getConfig(options, ROOT) if ( userConfig.autoCodeSplitting && @@ -229,18 +234,3 @@ export const unpluginRouterCodeSplitterFactory: UnpluginFactory< }, } } - -function CHECK_USER_FLAGS_TO_BE_CHANGED(config: Config): Config { - if (typeof config.experimental?.enableCodeSplitting !== 'undefined') { - const message = ` ------- -⚠️ ⚠️ ⚠️ -ERROR: The "experimental.enableCodeSplitting" flag has been made stable and is now "autoCodeSplitting". Please update your configuration file to use "autoCodeSplitting" instead of "experimental.enableCodeSplitting". ------- -` - console.error(message) - throw new Error(message) - } - - return config -} diff --git a/packages/router-plugin/tests/code-splitter/snapshots/retain-export-component.tsx b/packages/router-plugin/tests/code-splitter/snapshots/retain-export-component.tsx new file mode 100644 index 0000000000..886cad2399 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/retain-export-component.tsx @@ -0,0 +1,27 @@ +const $$splitLoaderImporter = () => import('tsr-split:retain-export-component.tsx?tsr-split'); +import { lazyFn } from '@tanstack/react-router'; +import { createFileRoute, Outlet } from '@tanstack/react-router'; +import { importedComponent as ImportedComponent } from '../shared/imported'; +export function Layout() { + return
+
+ +
+ + +
; +} +export const Route = createFileRoute('/_layout')({ + component: Layout, + loader: lazyFn($$splitLoaderImporter, 'loader') +}); +const HEADER_HEIGHT = '63px'; +export const SIDEBAR_WIDTH = '150px'; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/retain-export-component@split.tsx b/packages/router-plugin/tests/code-splitter/snapshots/retain-export-component@split.tsx new file mode 100644 index 0000000000..b53badb34f --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/retain-export-component@split.tsx @@ -0,0 +1,4 @@ +console.warn("These exports from \"retain-export-component.tsx\" are not being code-split and will increase your bundle size: \n- Layout\nThese should either have their export statements removed or be imported from another file that is not a route."); +import { importedLoader } from '../shared/imported'; +const loader = importedLoader; +export { loader }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-const.tsx b/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-const.tsx new file mode 100644 index 0000000000..69e27260d4 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-const.tsx @@ -0,0 +1,30 @@ +import { createFileRoute, Outlet } from '@tanstack/react-router'; +import { importedComponent as ImportedComponent, importedLoader } from '../shared/imported'; +export const loaderFn = () => { + return importedLoader(); +}; +const Layout = () => { + return
+
+ +
+ + +
; +}; +export const Route = createFileRoute('/_layout')({ + component: Layout, + loader: loaderFn +}); +const HEADER_HEIGHT = '63px'; +export const SIDEBAR_WIDTH = '150px'; +export const SIDEBAR_MINI_WIDTH = '80px'; +export default Layout; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-const@split.tsx b/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-const@split.tsx new file mode 100644 index 0000000000..7d4c85634d --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-const@split.tsx @@ -0,0 +1 @@ +console.warn("These exports from \"retain-exports-const.tsx\" are not being code-split and will increase your bundle size: \n- Layout\n- loaderFn\nThese should either have their export statements removed or be imported from another file that is not a route."); \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-function.tsx b/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-function.tsx new file mode 100644 index 0000000000..8162228c27 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-function.tsx @@ -0,0 +1,30 @@ +import { createFileRoute, Outlet } from '@tanstack/react-router'; +import { importedComponent as ImportedComponent, importedLoader } from '../shared/imported'; +export function loaderFn() { + return importedLoader(); +} +function Layout() { + return
+
+ +
+ + +
; +} +export const Route = createFileRoute('/_layout')({ + component: Layout, + loader: loaderFn +}); +const HEADER_HEIGHT = '63px'; +export const SIDEBAR_WIDTH = '150px'; +export const SIDEBAR_MINI_WIDTH = '80px'; +export default Layout; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-function@split.tsx b/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-function@split.tsx new file mode 100644 index 0000000000..f54a3bd29e --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-function@split.tsx @@ -0,0 +1 @@ +console.warn("These exports from \"retain-exports-function.tsx\" are not being code-split and will increase your bundle size: \n- Layout\n- loaderFn\nThese should either have their export statements removed or be imported from another file that is not a route."); \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-loader.tsx b/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-loader.tsx new file mode 100644 index 0000000000..d514b8fd86 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-loader.tsx @@ -0,0 +1,14 @@ +const $$splitComponentImporter = () => import('tsr-split:retain-exports-loader.tsx?tsr-split'); +import { lazyRouteComponent } from '@tanstack/react-router'; +import { createFileRoute } from '@tanstack/react-router'; +export function loaderFn() { + return { + foo: 'bar' + }; +} +export const Route = createFileRoute('/_layout')({ + component: lazyRouteComponent($$splitComponentImporter, 'component'), + loader: loaderFn +}); +export const SIDEBAR_WIDTH = '150px'; +export const SIDEBAR_MINI_WIDTH = '80px'; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-loader@split.tsx b/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-loader@split.tsx new file mode 100644 index 0000000000..f74980eee1 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/snapshots/retain-exports-loader@split.tsx @@ -0,0 +1,22 @@ +console.warn("These exports from \"retain-exports-loader.tsx\" are not being code-split and will increase your bundle size: \n- loaderFn\nThese should either have their export statements removed or be imported from another file that is not a route."); +import { Outlet } from '@tanstack/react-router'; +import { importedComponent as ImportedComponent } from '../shared/imported'; +const HEADER_HEIGHT = '63px'; +const component = function Layout() { + return
+
+ +
+ + +
; +}; +export { component }; \ No newline at end of file diff --git a/packages/router-plugin/tests/code-splitter/test-files/retain-export-component.tsx b/packages/router-plugin/tests/code-splitter/test-files/retain-export-component.tsx new file mode 100644 index 0000000000..4ad35a3f5d --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/test-files/retain-export-component.tsx @@ -0,0 +1,34 @@ +import * as React from 'react' +import { createFileRoute, Outlet } from '@tanstack/react-router' +import { + importedComponent as ImportedComponent, + importedLoader, +} from '../shared/imported' + +export function Layout() { + return ( +
+
+ +
+ + +
+ ) +} + +export const Route = createFileRoute('/_layout')({ + component: Layout, + loader: importedLoader, +}) + +const HEADER_HEIGHT = '63px' +export const SIDEBAR_WIDTH = '150px' +const SIDEBAR_MINI_WIDTH = '80px' +const ASIDE_WIDTH = '250px' diff --git a/packages/router-plugin/tests/code-splitter/test-files/retain-exports-const.tsx b/packages/router-plugin/tests/code-splitter/test-files/retain-exports-const.tsx new file mode 100644 index 0000000000..c055a3702f --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/test-files/retain-exports-const.tsx @@ -0,0 +1,40 @@ +import * as React from 'react' +import { createFileRoute, Outlet } from '@tanstack/react-router' +import { + importedComponent as ImportedComponent, + importedLoader, +} from '../shared/imported' + +export const loaderFn = () => { + return importedLoader() +} + +const Layout = () => { + return ( +
+
+ +
+ + +
+ ) +} + +export const Route = createFileRoute('/_layout')({ + component: Layout, + loader: loaderFn, +}) + +const HEADER_HEIGHT = '63px' +export const SIDEBAR_WIDTH = '150px' +export const SIDEBAR_MINI_WIDTH = '80px' +const ASIDE_WIDTH = '250px' + +export default Layout diff --git a/packages/router-plugin/tests/code-splitter/test-files/retain-exports-function.tsx b/packages/router-plugin/tests/code-splitter/test-files/retain-exports-function.tsx new file mode 100644 index 0000000000..f68a6cf422 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/test-files/retain-exports-function.tsx @@ -0,0 +1,40 @@ +import * as React from 'react' +import { createFileRoute, Outlet } from '@tanstack/react-router' +import { + importedComponent as ImportedComponent, + importedLoader, +} from '../shared/imported' + +export function loaderFn() { + return importedLoader() +} + +function Layout() { + return ( +
+
+ +
+ + +
+ ) +} + +export const Route = createFileRoute('/_layout')({ + component: Layout, + loader: loaderFn, +}) + +const HEADER_HEIGHT = '63px' +export const SIDEBAR_WIDTH = '150px' +export const SIDEBAR_MINI_WIDTH = '80px' +const ASIDE_WIDTH = '250px' + +export default Layout diff --git a/packages/router-plugin/tests/code-splitter/test-files/retain-exports-loader.tsx b/packages/router-plugin/tests/code-splitter/test-files/retain-exports-loader.tsx new file mode 100644 index 0000000000..d6c88f19f7 --- /dev/null +++ b/packages/router-plugin/tests/code-splitter/test-files/retain-exports-loader.tsx @@ -0,0 +1,35 @@ +import * as React from 'react' +import { createFileRoute, Outlet } from '@tanstack/react-router' +import { importedComponent as ImportedComponent } from '../shared/imported' + +export function loaderFn() { + return { foo: 'bar' } +} + +function Layout() { + return ( +
+
+ +
+ + +
+ ) +} + +export const Route = createFileRoute('/_layout')({ + component: Layout, + loader: loaderFn, +}) + +const HEADER_HEIGHT = '63px' +export const SIDEBAR_WIDTH = '150px' +export const SIDEBAR_MINI_WIDTH = '80px' +const ASIDE_WIDTH = '250px' diff --git a/packages/router-valibot-adapter/package.json b/packages/router-valibot-adapter/package.json index 8c1722bb70..f4a3e0dde9 100644 --- a/packages/router-valibot-adapter/package.json +++ b/packages/router-valibot-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/router-valibot-adapter", - "version": "1.51.2", + "version": "1.58.3", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -27,15 +27,15 @@ "clean": "rimraf ./dist && rimraf ./coverage", "test:eslint": "eslint ./src", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", - "test:types:ts55": "tsc", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "tsc", "test:unit": "vitest", "test:unit:dev": "pnpm run test:unit --watch --typecheck", - "test:build": "publint --strict", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", "build": "vite build" }, "type": "module", @@ -64,10 +64,10 @@ "node": ">=12" }, "devDependencies": { - "@testing-library/jest-dom": "^6.4.6", - "@testing-library/react": "^16.0.0", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", "@tanstack/react-router": "workspace:*", - "valibot": "^0.36.0" + "valibot": "^0.42.0" }, "peerDependencies": { "valibot": ">=0.36.0", diff --git a/packages/router-valibot-adapter/src/index.ts b/packages/router-valibot-adapter/src/index.ts index 6d904f8e72..ba9487d087 100644 --- a/packages/router-valibot-adapter/src/index.ts +++ b/packages/router-valibot-adapter/src/index.ts @@ -1,5 +1,6 @@ -import { type SearchValidatorAdapter } from '@tanstack/react-router' -import { type GenericSchema, parse } from 'valibot' +import { parse } from 'valibot' +import type { SearchValidatorAdapter } from '@tanstack/react-router' +import type { GenericSchema } from 'valibot' export type ValibotSearchValidatorAdapter = SearchValidatorAdapter< diff --git a/packages/router-vite-plugin/package.json b/packages/router-vite-plugin/package.json index 99807ee523..d892105a08 100644 --- a/packages/router-vite-plugin/package.json +++ b/packages/router-vite-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/router-vite-plugin", - "version": "1.51.0", + "version": "1.58.4", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -29,13 +29,13 @@ "test:unit": "echo 'No unit tests are needed here since we do them in @tanstack/router-plugin!'", "test:eslint": "eslint ./src", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", - "test:types:ts55": "tsc", - "test:build": "publint --strict", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "tsc", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", "build": "vite build" }, "type": "module", @@ -65,8 +65,5 @@ }, "dependencies": { "@tanstack/router-plugin": "workspace:^" - }, - "devDependencies": { - "vite": "^5.3.5" } } diff --git a/packages/router-zod-adapter/package.json b/packages/router-zod-adapter/package.json index 04951d99f9..9fd1519490 100644 --- a/packages/router-zod-adapter/package.json +++ b/packages/router-zod-adapter/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/router-zod-adapter", - "version": "1.51.2", + "version": "1.58.3", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -27,15 +27,15 @@ "clean": "rimraf ./dist && rimraf ./coverage", "test:eslint": "eslint ./src", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", - "test:types:ts55": "tsc", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "tsc", "test:unit": "vitest", "test:unit:dev": "pnpm run test:unit --watch --typecheck", - "test:build": "publint --strict", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", "build": "vite build" }, "type": "module", @@ -64,8 +64,8 @@ "node": ">=12" }, "devDependencies": { - "@testing-library/jest-dom": "^6.4.6", - "@testing-library/react": "^16.0.0", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", "@tanstack/react-router": "workspace:*", "zod": "^3.23.8" }, diff --git a/packages/router-zod-adapter/src/index.ts b/packages/router-zod-adapter/src/index.ts index 4151d0f2bc..b83e2bd932 100644 --- a/packages/router-zod-adapter/src/index.ts +++ b/packages/router-zod-adapter/src/index.ts @@ -1,5 +1,5 @@ -import { type SearchValidatorAdapter } from '@tanstack/react-router' import { z } from 'zod' +import type { SearchValidatorAdapter } from '@tanstack/react-router' export interface ZodTypeLike { _input: any diff --git a/packages/start-vite-plugin/package.json b/packages/start-vite-plugin/package.json index 8d4989cfad..5055a33e62 100644 --- a/packages/start-vite-plugin/package.json +++ b/packages/start-vite-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/start-vite-plugin", - "version": "1.46.6", + "version": "1.57.14", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -29,13 +29,13 @@ "test:unit": "vitest", "test:eslint": "eslint ./src", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", - "test:types:ts55": "tsc", - "test:build": "publint --strict", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "tsc", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", "build": "vite build" }, "type": "module", @@ -65,13 +65,13 @@ }, "dependencies": { "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/plugin-syntax-typescript": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.25.4", "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "@babel/types": "^7.25.2", + "@babel/traverse": "^7.25.6", + "@babel/types": "^7.25.6", "@types/babel__core": "^7.20.5", "@types/babel__generator": "^7.6.8", "@types/babel__template": "^7.4.4", diff --git a/packages/start/package.json b/packages/start/package.json index a37640f89a..647a37721e 100644 --- a/packages/start/package.json +++ b/packages/start/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/start", - "version": "1.51.2", + "version": "1.58.5", "description": "Modern and scalable routing for React applications", "author": "Tanner Linsley", "license": "MIT", @@ -27,19 +27,16 @@ "clean": "rimraf ./dist && rimraf ./coverage", "test:eslint": "eslint ./src", "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js", "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js", "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", - "test:types:ts55": "tsc", - "test:build": "publint --strict", - "build": "vite build && pnpm build:config && pnpm build:router-manifest && pnpm build:server-handler && pnpm build:server-runtime && pnpm build:react-server-runtime", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "tsc", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", + "build": "vite build && pnpm build:config && pnpm build:router-manifest", "build:config": "tsc --project tsconfigs/config.tsconfig.json", - "build:router-manifest": "tsc --project tsconfigs/router-manifest.tsconfig.json", - "build:server-handler": "tsc --project tsconfigs/server-handler.tsconfig.json", - "build:server-runtime": "tsc --project tsconfigs/server-runtime.tsconfig.json", - "build:react-server-runtime": "tsc --project tsconfigs/react-server-runtime.tsconfig.json" + "build:router-manifest": "tsc --project tsconfigs/router-manifest.tsconfig.json" }, "type": "module", "exports": { @@ -107,8 +104,8 @@ }, "./server-runtime": { "import": { - "types": "./dist/esm/server-runtime/server-runtime/index.d.ts", - "default": "./dist/esm/server-runtime/server-runtime/index.js" + "types": "./dist/esm/server-runtime/index.d.ts", + "default": "./dist/esm/server-runtime/index.js" } }, "./react-server-runtime": { @@ -119,8 +116,8 @@ }, "./server-handler": { "import": { - "types": "./dist/esm/server-handler/server-handler/index.d.ts", - "default": "./dist/esm/server-handler/server-handler/index.js" + "types": "./dist/esm/server-handler/index.d.ts", + "default": "./dist/esm/server-handler/index.js" } }, "./package.json": "./package.json" @@ -140,27 +137,24 @@ "@tanstack/router-plugin": "workspace:^", "@tanstack/start-vite-plugin": "workspace:^", "@types/jsesc": "^3.0.3", - "@vinxi/react": "0.2.3", + "@vinxi/react": "0.2.5", "@vinxi/react-server-dom": "^0.0.3", - "@vinxi/server-components": "^0.4.1", - "@vinxi/server-functions": "^0.4.1", + "@vinxi/server-components": "^0.4.3", + "@vinxi/server-functions": "^0.4.3", "import-meta-resolve": "^4.1.0", - "isbot": "^5.1.14", + "isbot": "^5.1.17", "jsesc": "^3.0.2", "tiny-invariant": "^1.3.3", - "vinxi": "0.4.1", - "vite-tsconfig-paths": "^4.3.2", + "vinxi": "0.4.3", + "vite-tsconfig-paths": "^5.0.1", "zod": "^3.23.8" }, "devDependencies": { - "@testing-library/react": "^16.0.0", + "@testing-library/react": "^16.0.1", "@vitejs/plugin-react": "^4.3.1", "react": "^18.2.0", "react-dom": "^18.2.0", - "rollup-plugin-preserve-directives": "^0.4.0", - "typescript": "^5.5.3", - "vite-plugin-dts": "^3.9.1", - "vite-plugin-externalize-deps": "^0.8.0" + "typescript": "^5.6.2" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", diff --git a/packages/start/src/client-runtime/fetcher.tsx b/packages/start/src/client-runtime/fetcher.tsx index 9b5fc36302..1e4ef342bf 100644 --- a/packages/start/src/client-runtime/fetcher.tsx +++ b/packages/start/src/client-runtime/fetcher.tsx @@ -123,20 +123,30 @@ export async function fetcher( async function handleResponseErrors(response: Response) { if (!response.ok) { + const contentType = response.headers.get('content-type') + const isJson = contentType && contentType.includes('application/json') + const body = await (async () => { - const contentType = response.headers.get('content-type') - if (contentType && contentType.includes('application/json')) { + if (isJson) { return await response.json() } return await response.text() })() - throw new Error( - [ - `Request failed with status ${response.status}`, - `${JSON.stringify(body, null, 2)}`, - ].join('\n\n'), - ) + const message = `Request failed with status ${response.status}` + + if (isJson) { + throw new Error( + JSON.stringify({ + message, + body, + }), + ) + } else { + throw new Error( + [message, `${JSON.stringify(body, null, 2)}`].join('\n\n'), + ) + } } return response diff --git a/packages/start/src/client-runtime/index.tsx b/packages/start/src/client-runtime/index.tsx index 1205974461..26a870d846 100644 --- a/packages/start/src/client-runtime/index.tsx +++ b/packages/start/src/client-runtime/index.tsx @@ -1,6 +1,6 @@ import { fetcher } from './fetcher' import { getBaseUrl } from './getBaseUrl' -import type { FetchFn } from '../client' +import type { FetchFn } from '../client/createServerFn' export function createServerReference( _fn: FetchFn, diff --git a/packages/start/src/config/index.ts b/packages/start/src/config/index.ts index 10efa04d2e..bae58dd30a 100644 --- a/packages/start/src/config/index.ts +++ b/packages/start/src/config/index.ts @@ -4,9 +4,10 @@ import { readFile } from 'node:fs/promises' import { fileURLToPath } from 'node:url' import reactRefresh from '@vitejs/plugin-react' import { resolve } from 'import-meta-resolve' -import { TanStackRouterVite, configSchema } from '@tanstack/router-plugin/vite' +import { TanStackRouterVite } from '@tanstack/router-plugin/vite' import { TanStackStartVite } from '@tanstack/start-vite-plugin' import { + configSchema, getConfig, startAPIRouteSegmentsFromTSRFilePath, } from '@tanstack/router-generator' @@ -93,13 +94,6 @@ const testedDeploymentPresets: Array = [ 'cloudflare-pages', 'node-server', ] -const staticDeploymentPresets: Array = [ - 'cloudflare-pages-static', - 'netlify-static', - 'static', - 'vercel-static', - 'zeabur-static', -] function checkDeploymentPresetInput(preset: string): DeploymentPreset { if (!vinxiDeploymentPresets.includes(preset as any)) { @@ -222,9 +216,6 @@ export function defineConfig( const deploymentPreset = checkDeploymentPresetInput( configDeploymentPreset || 'vercel', ) - const isStaticDeployment = - deploymentOptions.static ?? - staticDeploymentPresets.includes(deploymentPreset) const tsrConfig = getConfig(setTsrDefaults(opts.tsr)) @@ -241,7 +232,7 @@ export function defineConfig( return createApp({ server: { ...deploymentOptions, - static: isStaticDeployment, + static: deploymentOptions.static, preset: deploymentPreset, experimental: { asyncContext: true, @@ -490,10 +481,7 @@ function tsrRoutesManifest(opts: { } catch (err) { console.error(err) throw new Error( - `Could not find the production client vite manifest at '${path.resolve( - config.build.outDir, - '../client/_build/.vite/manifest.json', - )}'!`, + `Could not find the production client vite manifest at '${clientViteManifestPath}'!`, ) } @@ -504,9 +492,7 @@ function tsrRoutesManifest(opts: { routeTreeContent = readFileSync(routeTreePath, 'utf-8') } catch (err) { throw new Error( - `Could not find the generated route tree at '${path.resolve( - opts.tsrConfig.generatedRouteTree, - )}'!`, + `Could not find the generated route tree at '${routeTreePath}'!`, ) } @@ -626,7 +612,10 @@ function tsrFileRouter(opts: { toPath(src: string): string { const inputPath = vinxiFsRouterCleanPath(src, this.config) - const segments = startAPIRouteSegmentsFromTSRFilePath(inputPath) + const segments = startAPIRouteSegmentsFromTSRFilePath( + inputPath, + opts.tsrConfig, + ) const pathname = segments .map((part) => { diff --git a/packages/start/src/router-manifest/index.ts b/packages/start/src/router-manifest/index.ts index 8e37d2e8d1..7d5b4cfdc6 100644 --- a/packages/start/src/router-manifest/index.ts +++ b/packages/start/src/router-manifest/index.ts @@ -1,7 +1,6 @@ -import { getManifest } from 'vinxi/manifest' // @ts-expect-error -// eslint-disable-next-line import/no-unresolved import tsrGetManifest from 'tsr:routes-manifest' +import { getManifest } from 'vinxi/manifest' import type { Manifest } from '@tanstack/react-router' /** diff --git a/packages/start/src/server-runtime/index.tsx b/packages/start/src/server-runtime/index.tsx index 4b807d2775..909038a1eb 100644 --- a/packages/start/src/server-runtime/index.tsx +++ b/packages/start/src/server-runtime/index.tsx @@ -1,10 +1,10 @@ import { Readable, Writable } from 'node:stream' import { getEvent, getRequestHeaders } from 'vinxi/http' -import { fetcher } from '../client-runtime' +import { fetcher } from '../client-runtime/fetcher' import { getBaseUrl } from '../client-runtime/getBaseUrl' -import { handleServerRequest } from '../server-handler' +import { handleServerRequest } from '../server-handler/index' import type { WritableOptions } from 'node:stream' -import type { FetchFn } from '../client' +import type { FetchFn } from '../client/createServerFn' /** * * @returns {import('node:http').IncomingMessage} diff --git a/packages/start/src/server/createRequestHandler.ts b/packages/start/src/server/createRequestHandler.ts index 5357d6cbdd..b3b1c49344 100644 --- a/packages/start/src/server/createRequestHandler.ts +++ b/packages/start/src/server/createRequestHandler.ts @@ -1,14 +1,11 @@ -import { - type AnyRouter, - type Manifest, - createMemoryHistory, -} from '@tanstack/react-router' +import { createMemoryHistory } from '@tanstack/react-router' import { serializeLoaderData } from '../client/serialization' import { mergeHeaders, serverFnPayloadTypeHeader, serverFnReturnTypeHeader, } from '../client' +import type { AnyRouter, Manifest } from '@tanstack/react-router' import type { HandlerCallback } from './defaultStreamHandler' export type RequestHandler = ( diff --git a/packages/start/src/server/createStartHandler.ts b/packages/start/src/server/createStartHandler.ts index 26071c55ed..d53637300f 100644 --- a/packages/start/src/server/createStartHandler.ts +++ b/packages/start/src/server/createStartHandler.ts @@ -1,21 +1,13 @@ -import { eventHandler, toWebRequest } from 'vinxi/http' -import { - type AnyRouter, - type Manifest, - createMemoryHistory, -} from '@tanstack/react-router' -import { - type EventHandler, - type EventHandlerRequest, - type H3Event, - getResponseHeaders, -} from 'vinxi/http' +import { eventHandler, getResponseHeaders, toWebRequest } from 'vinxi/http' +import { createMemoryHistory } from '@tanstack/react-router' import { serializeLoaderData } from '../client/serialization' import { mergeHeaders } from '../client/headers' import { serverFnPayloadTypeHeader, serverFnReturnTypeHeader, } from '../constants' +import type { EventHandler, EventHandlerRequest, H3Event } from 'vinxi/http' +import type { AnyRouter, Manifest } from '@tanstack/react-router' import type { HandlerCallback } from './defaultStreamHandler' export type CustomizeStartHandler = ( diff --git a/packages/start/tsconfigs/react-server-runtime.tsconfig.json b/packages/start/tsconfigs/react-server-runtime.tsconfig.json deleted file mode 100644 index 9d94fb6491..0000000000 --- a/packages/start/tsconfigs/react-server-runtime.tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "include": ["../src/react-server-runtime/index.tsx"], - "compilerOptions": { - "outDir": "../dist/esm/react-server-runtime", - "target": "esnext", - "noEmit": false, - "jsx": "react-jsx" - } -} diff --git a/packages/start/tsconfigs/server-handler.tsconfig.json b/packages/start/tsconfigs/server-handler.tsconfig.json deleted file mode 100644 index 0fad93aad0..0000000000 --- a/packages/start/tsconfigs/server-handler.tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "include": ["../src/server-handler/index.tsx"], - "compilerOptions": { - "outDir": "../dist/esm/server-handler", - "target": "esnext", - "noEmit": false, - "jsx": "react-jsx" - } -} diff --git a/packages/start/tsconfigs/server-runtime.tsconfig.json b/packages/start/tsconfigs/server-runtime.tsconfig.json deleted file mode 100644 index 091334a19d..0000000000 --- a/packages/start/tsconfigs/server-runtime.tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "include": ["../src/server-runtime/index.tsx"], - "compilerOptions": { - "outDir": "../dist/esm/server-runtime", - "target": "esnext", - "noEmit": false, - "jsx": "react-jsx" - } -} diff --git a/packages/start/vite.config.ts b/packages/start/vite.config.ts index 409c2073b1..4422860a9d 100644 --- a/packages/start/vite.config.ts +++ b/packages/start/vite.config.ts @@ -1,9 +1,10 @@ import { defineConfig, mergeConfig } from 'vitest/config' import { tanstackViteConfig } from '@tanstack/config/vite' import react from '@vitejs/plugin-react' +import type { UserConfig } from 'vitest/config' const config = defineConfig({ - plugins: [react()], + plugins: [react()] as UserConfig['plugins'], }) export default mergeConfig( @@ -15,6 +16,9 @@ export default mergeConfig( './src/server/index.tsx', './src/client-runtime/index.tsx', './src/api/index.ts', + './src/server-runtime/index.tsx', + './src/react-server-runtime/index.tsx', + './src/server-handler/index.tsx', ], srcDir: './src', exclude: ['./src/config'], diff --git a/packages/virtual-file-routes/eslint.config.js b/packages/virtual-file-routes/eslint.config.js new file mode 100644 index 0000000000..8ce6ad05fc --- /dev/null +++ b/packages/virtual-file-routes/eslint.config.js @@ -0,0 +1,5 @@ +// @ts-check + +import rootConfig from '../../eslint.config.js' + +export default [...rootConfig] diff --git a/packages/virtual-file-routes/package.json b/packages/virtual-file-routes/package.json new file mode 100644 index 0000000000..ed77b28bb6 --- /dev/null +++ b/packages/virtual-file-routes/package.json @@ -0,0 +1,57 @@ +{ + "name": "@tanstack/virtual-file-routes", + "version": "1.56.0", + "description": "Modern and scalable routing for React applications", + "author": "Tanner Linsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/router.git", + "directory": "packages/virtual-file-routes" + }, + "homepage": "https://tanstack.com/router", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "keywords": [ + "react", + "location", + "router", + "routing", + "async", + "async router", + "typescript" + ], + "scripts": { + "clean": "rimraf ./dist && rimraf ./coverage", + "test:eslint": "eslint ./src", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", + "build": "vite build" + }, + "type": "module", + "types": "dist/esm/index.d.ts", + "main": "dist/cjs/index.cjs", + "module": "dist/esm/index.js", + "exports": { + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "files": [ + "dist", + "src" + ], + "engines": { + "node": ">=12" + } +} diff --git a/packages/virtual-file-routes/src/api.ts b/packages/virtual-file-routes/src/api.ts new file mode 100644 index 0000000000..d52f01c9ca --- /dev/null +++ b/packages/virtual-file-routes/src/api.ts @@ -0,0 +1,81 @@ +import type { + IndexRoute, + LayoutRoute, + PhysicalSubtree, + Route, + VirtualRootRoute, + VirtualRouteNode, +} from './types' + +export function rootRoute( + file: string, + children?: Array, +): VirtualRootRoute { + return { + type: 'root', + file, + children, + } +} + +export function index(file: string): IndexRoute { + return { + type: 'index', + file, + } +} + +export function layout( + file: string, + children: Array, +): LayoutRoute +export function layout( + id: string, + file: string, + children: Array, +): LayoutRoute + +export function layout( + idOrFile: string, + fileOrChildren: string | Array, + children?: Array, +): LayoutRoute { + if (Array.isArray(fileOrChildren)) { + return { + type: 'layout', + file: idOrFile, + children: fileOrChildren, + } + } else { + return { + type: 'layout', + id: idOrFile, + file: fileOrChildren, + children, + } + } +} + +export function route( + path: string, + file: string, + children?: Array, +): Route { + return { + type: 'route', + file, + path, + children, + } +} + +export function physical( + pathPrefix: string, + directory: string, +): PhysicalSubtree { + return { + type: 'physical', + directory, + pathPrefix, + } +} diff --git a/packages/virtual-file-routes/src/defineConfig.ts b/packages/virtual-file-routes/src/defineConfig.ts new file mode 100644 index 0000000000..726d068b80 --- /dev/null +++ b/packages/virtual-file-routes/src/defineConfig.ts @@ -0,0 +1,38 @@ +import type { VirtualRouteNode } from './types' + +// this is adapted from vite/src/node/config.ts + +export type ConfigFnObject = () => TConfig +export type ConfigFnPromise = () => Promise +export type ConfigFn = () => TConfig | Promise + +export type ConfigExport = + | TConfig + | Promise + | ConfigFnObject + | ConfigFnPromise + | ConfigFn + +export type VirtualRouteSubtreeConfig = Array + +/** + * Type helper to make it easier to use __virtual.ts + * accepts a direct {@link VirtualRouteSubtreeConfig} object, or a function that returns it. + */ +export function defineVirtualSubtreeConfig( + config: VirtualRouteSubtreeConfig, +): VirtualRouteSubtreeConfig +export function defineVirtualSubtreeConfig( + config: Promise, +): Promise +export function defineVirtualSubtreeConfig( + config: ConfigFnObject, +): ConfigFnObject +export function defineVirtualSubtreeConfig( + config: ConfigExport, +): ConfigExport +export function defineVirtualSubtreeConfig( + config: ConfigExport, +): ConfigExport { + return config +} diff --git a/packages/virtual-file-routes/src/index.ts b/packages/virtual-file-routes/src/index.ts new file mode 100644 index 0000000000..f52991a13c --- /dev/null +++ b/packages/virtual-file-routes/src/index.ts @@ -0,0 +1,18 @@ +export { rootRoute, index, route, layout, physical } from './api' +export type { + LayoutRoute, + Route, + IndexRoute, + PhysicalSubtree, + VirtualRootRoute, + VirtualRouteNode, +} from './types' + +export { defineVirtualSubtreeConfig } from './defineConfig' +export type { + ConfigExport, + ConfigFn, + ConfigFnObject, + ConfigFnPromise, + VirtualRouteSubtreeConfig, +} from './defineConfig' diff --git a/packages/virtual-file-routes/src/types.ts b/packages/virtual-file-routes/src/types.ts new file mode 100644 index 0000000000..7797e936e6 --- /dev/null +++ b/packages/virtual-file-routes/src/types.ts @@ -0,0 +1,35 @@ +export type IndexRoute = { + type: 'index' + file: string +} + +export type LayoutRoute = { + type: 'layout' + id?: string + file: string + children?: Array +} + +export type PhysicalSubtree = { + type: 'physical' + directory: string + pathPrefix: string +} + +export type Route = { + type: 'route' + file: string + path: string + children?: Array +} +export type VirtualRouteNode = + | IndexRoute + | LayoutRoute + | Route + | PhysicalSubtree + +export type VirtualRootRoute = { + type: 'root' + file: string + children?: Array +} diff --git a/packages/virtual-file-routes/tsconfig.json b/packages/virtual-file-routes/tsconfig.json new file mode 100644 index 0000000000..cdb76f0e64 --- /dev/null +++ b/packages/virtual-file-routes/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx" + }, + "target": "ESNext", + "moduleResolution": "Bundler", + "include": ["src", "tests", "vite.config.ts"] +} diff --git a/packages/virtual-file-routes/vite.config.ts b/packages/virtual-file-routes/vite.config.ts new file mode 100644 index 0000000000..5edc0264cb --- /dev/null +++ b/packages/virtual-file-routes/vite.config.ts @@ -0,0 +1,21 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import packageJson from './package.json' + +const config = defineConfig({ + test: { + name: packageJson.name, + dir: './tests', + watch: false, + environment: 'jsdom', + typecheck: { enabled: true }, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: './src/index.ts', + srcDir: './src', + }), +) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b48c488388..9a68d56fc1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,13 +6,14 @@ settings: overrides: use-sync-external-store: 1.2.2 - eslint: ^8.57.0 + eslint: ^9.10.0 '@tanstack/history': workspace:* '@tanstack/react-cross-context': workspace:* '@tanstack/react-router': workspace:* '@tanstack/router-cli': workspace:* '@tanstack/router-devtools': workspace:* '@tanstack/router-generator': workspace:* + '@tanstack/virtual-file-routes': workspace:* '@tanstack/router-plugin': workspace:* '@tanstack/router-vite-plugin': workspace:* '@tanstack/react-router-with-query': workspace:* @@ -21,6 +22,7 @@ overrides: '@tanstack/router-arktype-adapter': workspace:* '@tanstack/start': workspace:* '@tanstack/start-vite-plugin': workspace:* + '@tanstack/eslint-plugin-router': workspace:* temp-react: 0.0.0-experimental-035a41c4e-20230704 temp-react-dom: 0.0.0-experimental-035a41c4e-20230704 @@ -28,45 +30,48 @@ importers: .: devDependencies: + '@arethetypeswrong/cli': + specifier: ^0.16.2 + version: 0.16.2 '@eslint-react/eslint-plugin': - specifier: ^1.8.2 - version: 1.8.2(eslint@8.57.0)(typescript@5.5.3) + specifier: ^1.14.1 + version: 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) '@playwright/test': - specifier: ^1.45.3 - version: 1.45.3 - '@rollup/plugin-replace': - specifier: ^5.0.7 - version: 5.0.7(rollup@4.18.0) + specifier: ^1.47.1 + version: 1.47.1 '@tanstack/config': - specifier: ^0.11.3 - version: 0.11.3(@types/node@20.14.9)(esbuild@0.21.5)(eslint@8.57.0)(rollup@4.18.0)(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + specifier: ^0.13.1 + version: 0.13.1(@types/node@22.5.4)(esbuild@0.23.1)(eslint@9.10.0(jiti@1.21.6))(rollup@4.21.2)(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) '@types/node': - specifier: ^20.14.7 - version: 20.14.9 + specifier: ^22.5.4 + version: 22.5.4 '@types/react': specifier: ^18.3.3 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.3.0 version: 18.3.0 eslint: - specifier: ^8.57.0 - version: 8.57.0 + specifier: ^9.10.0 + version: 9.10.0(jiti@1.21.6) eslint-plugin-react-hooks: - specifier: ^4.6.2 - version: 4.6.2(eslint@8.57.0) + specifier: ^5.1.0-rc-5dcb0097-20240918 + version: 5.1.0-rc-fb9a90fa48-20240614(eslint@9.10.0(jiti@1.21.6)) glob: specifier: ^10.4.5 version: 10.4.5 + jsdom: + specifier: ^25.0.0 + version: 25.0.0 nx: - specifier: ^19.5.6 - version: 19.5.6(@swc/core@1.7.6(@swc/helpers@0.5.11)) + specifier: ^19.7.3 + version: 19.7.3(@swc/core@1.7.26) prettier: specifier: ^3.3.3 version: 3.3.3 publint: - specifier: ^0.2.9 - version: 0.2.9 + specifier: ^0.2.10 + version: 0.2.10 react: specifier: ^18.3.1 version: 18.3.1 @@ -80,11 +85,8 @@ importers: specifier: ^5.0.10 version: 5.0.10 typescript: - specifier: ^5.5.3 - version: 5.5.3 - typescript50: - specifier: npm:typescript@5.0 - version: typescript@5.0.4 + specifier: ^5.6.2 + version: 5.6.2 typescript51: specifier: npm:typescript@5.1 version: typescript@5.1.6 @@ -97,14 +99,17 @@ importers: typescript54: specifier: npm:typescript@5.4 version: typescript@5.4.5 + typescript55: + specifier: npm:typescript@5.5 + version: typescript@5.5.4 vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@20.14.9)(jsdom@24.1.1)(terser@5.31.1) + version: 1.6.0(@types/node@22.5.4)(jsdom@25.0.0)(terser@5.31.1) - examples/react/authenticated-routes: + e2e/react-router/basic: dependencies: '@tanstack/react-router': specifier: workspace:* @@ -112,12 +117,6 @@ importers: '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools - '@tanstack/router-plugin': - specifier: workspace:* - version: link:../../../packages/router-plugin - immer: - specifier: ^10.1.1 - version: 10.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -127,24 +126,24 @@ importers: redaxios: specifier: ^0.5.1 version: 0.5.1 - zod: - specifier: ^3.23.8 - version: 3.23.8 devDependencies: + '@playwright/test': + specifier: ^1.47.1 + version: 1.47.1 '@types/react': specifier: ^18.2.47 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/basic: + e2e/react-router/basic-file-based: dependencies: '@tanstack/react-router': specifier: workspace:* @@ -152,6 +151,9 @@ importers: '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin react: specifier: ^18.2.0 version: 18.3.1 @@ -161,74 +163,77 @@ importers: redaxios: specifier: ^0.5.1 version: 0.5.1 + zod: + specifier: ^3.23.8 + version: 3.23.8 devDependencies: '@playwright/test': - specifier: ^1.45.3 - version: 1.45.3 + specifier: ^1.47.1 + version: 1.47.1 '@types/react': specifier: ^18.2.47 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/basic-default-search-params: + e2e/react-router/basic-file-based-code-splitting: dependencies: - '@tanstack/react-query': - specifier: ^5.51.21 - version: 5.51.21(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin react: specifier: ^18.2.0 version: 18.3.1 react-dom: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) - redaxios: - specifier: ^0.5.1 - version: 0.5.1 zod: specifier: ^3.23.8 version: 3.23.8 devDependencies: + '@playwright/test': + specifier: ^1.47.1 + version: 1.47.1 '@types/react': specifier: ^18.2.47 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/basic-file-based: + e2e/react-router/basic-react-query: dependencies: + '@tanstack/react-query': + specifier: ^5.56.2 + version: 5.56.2(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.56.2 + version: 5.56.2(@tanstack/react-query@5.56.2(react@18.3.1))(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools - '@tanstack/router-plugin': - specifier: workspace:* - version: link:../../../packages/router-plugin - immer: - specifier: ^10.1.1 - version: 10.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -238,28 +243,31 @@ importers: redaxios: specifier: ^0.5.1 version: 0.5.1 - zod: - specifier: ^3.23.8 - version: 3.23.8 devDependencies: '@playwright/test': - specifier: ^1.45.3 - version: 1.45.3 + specifier: ^1.47.1 + version: 1.47.1 '@types/react': specifier: ^18.2.47 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/basic-file-based-codesplitting: + e2e/react-router/basic-react-query-file-based: dependencies: + '@tanstack/react-query': + specifier: ^5.56.2 + version: 5.56.2(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.56.2 + version: 5.56.2(@tanstack/react-query@5.56.2(react@18.3.1))(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -269,9 +277,6 @@ importers: '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin - immer: - specifier: ^10.1.1 - version: 10.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -285,33 +290,36 @@ importers: specifier: ^3.23.8 version: 3.23.8 devDependencies: + '@playwright/test': + specifier: ^1.47.1 + version: 1.47.1 '@types/react': specifier: ^18.2.47 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/basic-react-query: + e2e/react-router/basic-virtual-file-based: dependencies: - '@tanstack/react-query': - specifier: ^5.51.21 - version: 5.51.21(react@18.3.1) - '@tanstack/react-query-devtools': - specifier: ^5.51.21 - version: 5.51.21(@tanstack/react-query@5.51.21(react@18.3.1))(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@tanstack/virtual-file-routes': + specifier: workspace:* + version: link:../../../packages/virtual-file-routes react: specifier: ^18.2.0 version: 18.3.1 @@ -321,31 +329,28 @@ importers: redaxios: specifier: ^0.5.1 version: 0.5.1 + zod: + specifier: ^3.23.8 + version: 3.23.8 devDependencies: '@playwright/test': - specifier: ^1.45.3 - version: 1.45.3 + specifier: ^1.47.1 + version: 1.47.1 '@types/react': specifier: ^18.2.47 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/basic-react-query-file-based: + e2e/start/basic: dependencies: - '@tanstack/react-query': - specifier: ^5.51.21 - version: 5.51.21(react@18.3.1) - '@tanstack/react-query-devtools': - specifier: ^5.51.21 - version: 5.51.21(@tanstack/react-query@5.51.21(react@18.3.1))(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -355,40 +360,73 @@ importers: '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin - immer: - specifier: ^10.1.1 - version: 10.1.1 + '@tanstack/start': + specifier: workspace:* + version: link:../../../packages/start + isbot: + specifier: ^5.1.17 + version: 5.1.17 react: - specifier: ^18.2.0 + specifier: ^18.3.1 version: 18.3.1 react-dom: - specifier: ^18.2.0 + specifier: ^18.3.1 version: 18.3.1(react@18.3.1) redaxios: specifier: ^0.5.1 version: 0.5.1 + tailwind-merge: + specifier: ^2.5.2 + version: 2.5.2 + vinxi: + specifier: 0.4.3 + version: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) zod: specifier: ^3.23.8 version: 3.23.8 devDependencies: '@playwright/test': - specifier: ^1.45.3 - version: 1.45.3 + specifier: ^1.47.1 + version: 1.47.1 + '@types/node': + specifier: ^22.5.4 + version: 22.5.4 '@types/react': - specifier: ^18.2.47 - version: 18.3.3 + specifier: ^18.2.65 + version: 18.3.5 '@types/react-dom': - specifier: ^18.2.18 + specifier: ^18.2.21 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + postcss: + specifier: ^8.4.47 + version: 8.4.47 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + tailwindcss: + specifier: ^3.4.11 + version: 3.4.11 + typescript: + specifier: ^5.6.2 + version: 5.6.2 vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + vite-tsconfig-paths: + specifier: ^5.0.1 + version: 5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) - examples/react/basic-ssr-file-based: + e2e/start/basic-auth: dependencies: + '@prisma/client': + specifier: 5.19.1 + version: 5.19.1(prisma@5.19.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -401,61 +439,85 @@ importers: '@tanstack/start': specifier: workspace:* version: link:../../../packages/start - get-port: - specifier: ^7.1.0 - version: 7.1.0 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + isbot: + specifier: ^5.1.17 + version: 5.1.17 + prisma: + specifier: ^5.19.1 + version: 5.19.1 react: - specifier: ^18.2.0 + specifier: ^18.3.1 version: 18.3.1 react-dom: - specifier: ^18.2.0 + specifier: ^18.3.1 version: 18.3.1(react@18.3.1) redaxios: specifier: ^0.5.1 version: 0.5.1 + remix-auth-form: + specifier: ^1.5.0 + version: 1.5.0(@remix-run/server-runtime@2.11.2(typescript@5.6.2))(remix-auth@3.7.0(@remix-run/react@2.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@remix-run/server-runtime@2.11.2(typescript@5.6.2))) + tailwind-merge: + specifier: ^2.5.2 + version: 2.5.2 + vinxi: + specifier: 0.4.3 + version: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) devDependencies: - '@babel/core': - specifier: ^7.25.2 - version: 7.25.2 - '@babel/generator': - specifier: ^7.25.0 - version: 7.25.0 - '@rollup/plugin-babel': - specifier: ^6.0.4 - version: 6.0.4(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@4.18.0) - '@types/express': - specifier: ^4.17.21 - version: 4.17.21 + '@playwright/test': + specifier: ^1.47.1 + version: 1.47.1 + '@types/node': + specifier: ^22.5.4 + version: 22.5.4 + '@types/react': + specifier: ^18.2.65 + version: 18.3.5 + '@types/react-dom': + specifier: ^18.2.21 + version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - compression: - specifier: ^1.7.4 - version: 1.7.4 - express: - specifier: ^4.19.2 - version: 4.19.2 - isbot: - specifier: ^5.1.14 - version: 5.1.14 - node-fetch: - specifier: ^3.3.2 - version: 3.3.2 - serve-static: - specifier: ^1.15.0 - version: 1.15.0 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + postcss: + specifier: ^8.4.47 + version: 8.4.47 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + tailwindcss: + specifier: ^3.4.11 + version: 3.4.11 + typescript: + specifier: ^5.6.2 + version: 5.6.2 vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) - vite-plugin-babel: - specifier: ^1.2.0 - version: 1.2.0(@babel/core@7.25.2)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + vite-tsconfig-paths: + specifier: ^5.0.1 + version: 5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) - examples/react/basic-ssr-streaming-file-based: + e2e/start/basic-react-query: dependencies: + '@tanstack/react-query': + specifier: ^5.56.2 + version: 5.56.2(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.56.2 + version: 5.56.2(@tanstack/react-query@5.56.2(react@18.3.1))(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router + '@tanstack/react-router-with-query': + specifier: workspace:* + version: link:../../../packages/react-router-with-query '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools @@ -465,134 +527,200 @@ importers: '@tanstack/start': specifier: workspace:* version: link:../../../packages/start - get-port: - specifier: ^7.1.0 - version: 7.1.0 + isbot: + specifier: ^5.1.17 + version: 5.1.17 react: - specifier: ^18.2.0 + specifier: ^18.3.1 version: 18.3.1 react-dom: - specifier: ^18.2.0 + specifier: ^18.3.1 version: 18.3.1(react@18.3.1) redaxios: specifier: ^0.5.1 version: 0.5.1 - superjson: - specifier: ^2.2.1 - version: 2.2.1 + tailwind-merge: + specifier: ^2.5.2 + version: 2.5.2 + vinxi: + specifier: 0.4.3 + version: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) devDependencies: - '@babel/core': - specifier: ^7.25.2 - version: 7.25.2 - '@babel/generator': - specifier: ^7.25.0 - version: 7.25.0 - '@rollup/plugin-babel': - specifier: ^6.0.4 - version: 6.0.4(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@4.18.0) - '@types/express': - specifier: ^4.17.21 - version: 4.17.21 + '@playwright/test': + specifier: ^1.47.1 + version: 1.47.1 + '@types/node': + specifier: ^22.5.4 + version: 22.5.4 + '@types/react': + specifier: ^18.2.65 + version: 18.3.5 + '@types/react-dom': + specifier: ^18.2.21 + version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - compression: - specifier: ^1.7.4 - version: 1.7.4 - express: - specifier: ^4.19.2 - version: 4.19.2 - isbot: - specifier: ^5.1.14 - version: 5.1.14 - node-fetch: - specifier: ^3.3.2 - version: 3.3.2 - serve-static: - specifier: ^1.15.0 - version: 1.15.0 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + postcss: + specifier: ^8.4.47 + version: 8.4.47 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + tailwindcss: + specifier: ^3.4.11 + version: 3.4.11 + typescript: + specifier: ^5.6.2 + version: 5.6.2 vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) - vite-plugin-babel: - specifier: ^1.2.0 - version: 1.2.0(@babel/core@7.25.2)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + vite-tsconfig-paths: + specifier: ^5.0.1 + version: 5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) - examples/react/deferred-data: + e2e/start/basic-rsc: dependencies: + '@babel/plugin-syntax-typescript': + specifier: ^7.25.4 + version: 7.25.4(@babel/core@7.25.2) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools - immer: - specifier: ^10.1.1 - version: 10.1.1 - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@tanstack/start': + specifier: workspace:* + version: link:../../../packages/start redaxios: specifier: ^0.5.1 version: 0.5.1 - zod: - specifier: ^3.23.8 - version: 3.23.8 + tailwind-merge: + specifier: ^2.5.2 + version: 2.5.2 + vinxi: + specifier: 0.4.3 + version: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) devDependencies: '@types/react': - specifier: ^18.2.47 - version: 18.3.3 + specifier: ^18.2.65 + version: 18.3.5 '@types/react-dom': - specifier: ^18.2.18 + specifier: ^18.2.21 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + postcss: + specifier: ^8.4.47 + version: 8.4.47 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + tailwindcss: + specifier: ^3.4.11 + version: 3.4.11 + typescript: + specifier: ^5.6.2 + version: 5.6.2 vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + vite-tsconfig-paths: + specifier: ^5.0.1 + version: 5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) - examples/react/kitchen-sink: + e2e/start/clerk-basic: dependencies: + '@clerk/tanstack-start': + specifier: 0.4.1 + version: 0.4.1(@tanstack/react-router@packages+react-router)(@tanstack/start@packages+start)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools - immer: - specifier: ^10.1.1 - version: 10.1.1 + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@tanstack/start': + specifier: workspace:* + version: link:../../../packages/start + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + isbot: + specifier: ^5.1.17 + version: 5.1.17 react: - specifier: ^18.2.0 + specifier: ^18.3.1 version: 18.3.1 react-dom: - specifier: ^18.2.0 + specifier: ^18.3.1 version: 18.3.1(react@18.3.1) redaxios: specifier: ^0.5.1 version: 0.5.1 - zod: - specifier: ^3.23.8 - version: 3.23.8 + remix-auth-form: + specifier: ^1.5.0 + version: 1.5.0(@remix-run/server-runtime@2.11.2(typescript@5.6.2))(remix-auth@3.7.0(@remix-run/react@2.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@remix-run/server-runtime@2.11.2(typescript@5.6.2))) + tailwind-merge: + specifier: ^2.5.2 + version: 2.5.2 + vinxi: + specifier: 0.4.3 + version: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) devDependencies: + '@playwright/test': + specifier: ^1.47.1 + version: 1.47.1 + '@types/node': + specifier: ^22.5.4 + version: 22.5.4 '@types/react': - specifier: ^18.2.47 - version: 18.3.3 + specifier: ^18.2.65 + version: 18.3.5 '@types/react-dom': - specifier: ^18.2.18 + specifier: ^18.2.21 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + postcss: + specifier: ^8.4.47 + version: 8.4.47 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + tailwindcss: + specifier: ^3.4.11 + version: 3.4.11 + typescript: + specifier: ^5.6.2 + version: 5.6.2 vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + vite-tsconfig-paths: + specifier: ^5.0.1 + version: 5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) - examples/react/kitchen-sink-file-based: + examples/react/authenticated-routes: dependencies: '@tanstack/react-router': specifier: workspace:* @@ -603,9 +731,6 @@ importers: '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin - immer: - specifier: ^10.1.1 - version: 10.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -621,34 +746,25 @@ importers: devDependencies: '@types/react': specifier: ^18.2.47 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/kitchen-sink-react-query: + examples/react/basic: dependencies: - '@tanstack/react-query': - specifier: ^5.51.21 - version: 5.51.21(react@18.3.1) - '@tanstack/react-query-devtools': - specifier: ^5.51.21 - version: 5.51.21(@tanstack/react-query@5.51.21(react@18.3.1))(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools - immer: - specifier: ^10.1.1 - version: 10.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -658,43 +774,31 @@ importers: redaxios: specifier: ^0.5.1 version: 0.5.1 - zod: - specifier: ^3.23.8 - version: 3.23.8 devDependencies: '@types/react': specifier: ^18.2.47 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/kitchen-sink-react-query-file-based: + examples/react/basic-default-search-params: dependencies: '@tanstack/react-query': - specifier: ^5.51.21 - version: 5.51.21(react@18.3.1) - '@tanstack/react-query-devtools': - specifier: ^5.51.21 - version: 5.51.21(@tanstack/react-query@5.51.21(react@18.3.1))(react@18.3.1) + specifier: ^5.56.2 + version: 5.56.2(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools - '@tanstack/router-plugin': - specifier: workspace:* - version: link:../../../packages/router-plugin - immer: - specifier: ^10.1.1 - version: 10.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -710,22 +814,19 @@ importers: devDependencies: '@types/react': specifier: ^18.2.47 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/large-file-based: + examples/react/basic-file-based: dependencies: - '@tanstack/react-query': - specifier: ^5.51.21 - version: 5.51.21(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -735,9 +836,6 @@ importers: '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin - immer: - specifier: ^10.1.1 - version: 10.1.1 react: specifier: ^18.2.0 version: 18.3.1 @@ -753,31 +851,28 @@ importers: devDependencies: '@types/react': specifier: ^18.2.47 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/location-masking: + examples/react/basic-file-based-codesplitting: dependencies: - '@radix-ui/react-dialog': - specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/react-query': - specifier: ^5.51.21 - version: 5.51.21(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin react: specifier: ^18.2.0 version: 18.3.1 @@ -787,25 +882,31 @@ importers: redaxios: specifier: ^0.5.1 version: 0.5.1 + zod: + specifier: ^3.23.8 + version: 3.23.8 devDependencies: '@types/react': specifier: ^18.2.47 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/navigation-blocking: + examples/react/basic-react-query: dependencies: '@tanstack/react-query': - specifier: ^5.51.21 - version: 5.51.21(react@18.3.1) + specifier: ^5.56.2 + version: 5.56.2(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.56.2 + version: 5.56.2(@tanstack/react-query@5.56.2(react@18.3.1))(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -824,46 +925,64 @@ importers: devDependencies: '@types/react': specifier: ^18.2.47 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/quickstart: + examples/react/basic-react-query-file-based: dependencies: + '@tanstack/react-query': + specifier: ^5.56.2 + version: 5.56.2(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.56.2 + version: 5.56.2(@tanstack/react-query@5.56.2(react@18.3.1))(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + immer: + specifier: ^10.1.1 + version: 10.1.1 react: specifier: ^18.2.0 version: 18.3.1 react-dom: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + zod: + specifier: ^3.23.8 + version: 3.23.8 devDependencies: '@types/react': specifier: ^18.2.47 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/quickstart-file-based: + examples/react/basic-ssr-file-based: dependencies: '@tanstack/react-router': specifier: workspace:* @@ -874,9 +993,12 @@ importers: '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin - immer: - specifier: ^10.1.1 - version: 10.1.1 + '@tanstack/start': + specifier: workspace:* + version: link:../../../packages/start + get-port: + specifier: ^7.1.0 + version: 7.1.0 react: specifier: ^18.2.0 version: 18.3.1 @@ -886,24 +1008,45 @@ importers: redaxios: specifier: ^0.5.1 version: 0.5.1 - zod: - specifier: ^3.23.8 - version: 3.23.8 devDependencies: - '@types/react': - specifier: ^18.2.47 - version: 18.3.3 - '@types/react-dom': - specifier: ^18.2.18 - version: 18.3.0 + '@babel/core': + specifier: ^7.25.2 + version: 7.25.2 + '@babel/generator': + specifier: ^7.25.6 + version: 7.25.6 + '@rollup/plugin-babel': + specifier: ^6.0.4 + version: 6.0.4(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@4.21.2) + '@types/express': + specifier: ^4.17.21 + version: 4.17.21 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + compression: + specifier: ^1.7.4 + version: 1.7.4 + express: + specifier: ^4.21.0 + version: 4.21.0 + isbot: + specifier: ^5.1.17 + version: 5.1.17 + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 + serve-static: + specifier: ^1.16.2 + version: 1.16.2 vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + vite-plugin-babel: + specifier: ^1.2.0 + version: 1.2.0(@babel/core@7.25.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) - examples/react/quickstart-rspack-file-based: + examples/react/basic-ssr-streaming-file-based: dependencies: '@tanstack/react-router': specifier: workspace:* @@ -911,162 +1054,152 @@ importers: '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools - react: - specifier: ^18.3.1 - version: 18.3.1 - react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) - devDependencies: - '@rsbuild/core': - specifier: 1.0.1-beta.15 - version: 1.0.1-beta.15 - '@rsbuild/plugin-react': - specifier: 1.0.1-beta.15 - version: 1.0.1-beta.15(@rsbuild/core@1.0.1-beta.15) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin - '@types/react': - specifier: ^18.3.3 - version: 18.3.3 - '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.0 - typescript: - specifier: ^5.5.3 - version: 5.5.3 - - examples/react/quickstart-webpack-file-based: - dependencies: - '@tanstack/react-router': - specifier: workspace:* - version: link:../../../packages/react-router - '@tanstack/router-devtools': + '@tanstack/start': specifier: workspace:* - version: link:../../../packages/router-devtools + version: link:../../../packages/start + get-port: + specifier: ^7.1.0 + version: 7.1.0 react: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + superjson: + specifier: ^2.2.1 + version: 2.2.1 devDependencies: - '@swc/core': - specifier: ^1.7.6 - version: 1.7.6(@swc/helpers@0.5.11) - '@tanstack/router-plugin': - specifier: workspace:* - version: link:../../../packages/router-plugin - '@types/react': - specifier: ^18.3.3 - version: 18.3.3 - '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.0 - html-webpack-plugin: - specifier: ^5.6.0 - version: 5.6.0(@rspack/core@0.7.5(@swc/helpers@0.5.11))(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4)) - swc-loader: - specifier: ^0.2.6 - version: 0.2.6(@swc/core@1.7.6(@swc/helpers@0.5.11))(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4)) - typescript: - specifier: ^5.5.3 - version: 5.5.3 - webpack: - specifier: ^5.93.0 - version: 5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4) - webpack-cli: - specifier: ^5.1.4 - version: 5.1.4(webpack-dev-server@5.0.4)(webpack@5.93.0) - webpack-dev-server: - specifier: ^5.0.4 - version: 5.0.4(webpack-cli@5.1.4)(webpack@5.93.0) + '@babel/core': + specifier: ^7.25.2 + version: 7.25.2 + '@babel/generator': + specifier: ^7.25.6 + version: 7.25.6 + '@rollup/plugin-babel': + specifier: ^6.0.4 + version: 6.0.4(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@4.21.2) + '@types/express': + specifier: ^4.17.21 + version: 4.17.21 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + compression: + specifier: ^1.7.4 + version: 1.7.4 + express: + specifier: ^4.21.0 + version: 4.21.0 + isbot: + specifier: ^5.1.17 + version: 5.1.17 + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 + serve-static: + specifier: ^1.16.2 + version: 1.16.2 + vite: + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + vite-plugin-babel: + specifier: ^1.2.0 + version: 1.2.0(@babel/core@7.25.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) - examples/react/scroll-restoration: + examples/react/basic-virtual-file-based: dependencies: '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router - '@tanstack/react-virtual': - specifier: ^3.8.4 - version: 3.8.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@tanstack/virtual-file-routes': + specifier: workspace:* + version: link:../../../packages/virtual-file-routes + immer: + specifier: ^10.1.1 + version: 10.1.1 react: specifier: ^18.2.0 version: 18.3.1 react-dom: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + zod: + specifier: ^3.23.8 + version: 3.23.8 devDependencies: '@types/react': specifier: ^18.2.47 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/search-validator-adapters: + examples/react/basic-virtual-inside-file-based: dependencies: - '@tanstack/react-query': - specifier: ^5.51.21 - version: 5.51.21(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router - '@tanstack/router-arktype-adapter': - specifier: workspace:* - version: link:../../../packages/router-arktype-adapter '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin - '@tanstack/router-valibot-adapter': - specifier: workspace:* - version: link:../../../packages/router-valibot-adapter - '@tanstack/router-zod-adapter': + '@tanstack/virtual-file-routes': specifier: workspace:* - version: link:../../../packages/router-zod-adapter - arktype: - specifier: ^2.0.0-beta.5 - version: 2.0.0-beta.5 + version: link:../../../packages/virtual-file-routes + immer: + specifier: ^10.1.1 + version: 10.1.1 react: specifier: ^18.2.0 version: 18.3.1 react-dom: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) - valibot: - specifier: ^0.37.0 - version: 0.37.0(typescript@5.5.3) + redaxios: + specifier: ^0.5.1 + version: 0.5.1 zod: specifier: ^3.23.8 version: 3.23.8 devDependencies: '@types/react': specifier: ^18.2.47 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/start-basic: + examples/react/deferred-data: dependencies: '@tanstack/react-router': specifier: workspace:* @@ -1074,316 +1207,160 @@ importers: '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools - '@tanstack/router-plugin': - specifier: workspace:* - version: link:../../../packages/router-plugin - '@tanstack/start': - specifier: workspace:* - version: link:../../../packages/start - '@typescript-eslint/parser': - specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.0)(typescript@5.5.3) - '@vitejs/plugin-react': - specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - isbot: - specifier: ^5.1.14 - version: 5.1.14 react: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) redaxios: specifier: ^0.5.1 version: 0.5.1 - tailwind-merge: - specifier: ^2.4.0 - version: 2.4.0 - vinxi: - specifier: 0.4.1 - version: 0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1) + zod: + specifier: ^3.23.8 + version: 3.23.8 devDependencies: - '@playwright/test': - specifier: ^1.45.3 - version: 1.45.3 - '@types/node': - specifier: ^20.12.11 - version: 20.14.9 '@types/react': - specifier: ^18.2.65 - version: 18.3.3 + specifier: ^18.2.47 + version: 18.3.5 '@types/react-dom': - specifier: ^18.2.21 + specifier: ^18.2.18 version: 18.3.0 - autoprefixer: - specifier: ^10.4.20 - version: 10.4.20(postcss@8.4.40) - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-config-react-app: - specifier: ^7.0.1 - version: 7.0.1(@babel/plugin-syntax-flow@7.24.6(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.25.2))(eslint@8.57.0)(typescript@5.5.3) - postcss: - specifier: ^8.4.40 - version: 8.4.40 - prettier: - specifier: ^3.3.3 - version: 3.3.3 - tailwindcss: - specifier: ^3.4.7 - version: 3.4.7 - typescript: - specifier: ^5.5.3 - version: 5.5.3 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) - vite-tsconfig-paths: - specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/start-basic-auth: + examples/react/kitchen-sink: dependencies: - '@prisma/client': - specifier: 5.17.0 - version: 5.17.0(prisma@5.18.0) - '@remix-run/node': - specifier: ^2.10.3 - version: 2.11.1(typescript@5.5.3) - '@remix-run/server-runtime': - specifier: ^2.10.3 - version: 2.11.1(typescript@5.5.3) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools - '@tanstack/router-plugin': - specifier: workspace:* - version: link:../../../packages/router-plugin - '@tanstack/start': - specifier: workspace:* - version: link:../../../packages/start - '@typescript-eslint/parser': - specifier: ^7.16.0 - version: 7.18.0(eslint@8.57.0)(typescript@5.5.3) - '@vitejs/plugin-react': - specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - dotenv: - specifier: ^16.4.5 - version: 16.4.5 - isbot: - specifier: ^5.1.12 - version: 5.1.14 - prisma: - specifier: ^5.17.0 - version: 5.18.0 + immer: + specifier: ^10.1.1 + version: 10.1.1 react: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) redaxios: specifier: ^0.5.1 version: 0.5.1 - remix-auth-form: - specifier: ^1.5.0 - version: 1.5.0(@remix-run/server-runtime@2.11.1(typescript@5.5.3))(remix-auth@3.7.0(@remix-run/react@2.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(@remix-run/server-runtime@2.11.1(typescript@5.5.3))) - tailwind-merge: - specifier: ^2.4.0 - version: 2.4.0 - vinxi: - specifier: 0.3.12 - version: 0.3.12(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1) + zod: + specifier: ^3.23.8 + version: 3.23.8 devDependencies: - '@playwright/test': - specifier: ^1.45.1 - version: 1.45.3 - '@replayio/playwright': - specifier: ^3.1.8 - version: 3.1.8(@playwright/test@1.45.3) - '@types/node': - specifier: ^20.12.11 - version: 20.14.9 '@types/react': - specifier: ^18.2.65 - version: 18.3.3 + specifier: ^18.2.47 + version: 18.3.5 '@types/react-dom': - specifier: ^18.2.21 + specifier: ^18.2.18 version: 18.3.0 - autoprefixer: - specifier: ^10.4.19 - version: 10.4.20(postcss@8.4.40) - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-config-react-app: - specifier: ^7.0.1 - version: 7.0.1(@babel/plugin-syntax-flow@7.24.6(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.25.2))(eslint@8.57.0)(typescript@5.5.3) - postcss: - specifier: ^8.4.39 - version: 8.4.40 - prettier: - specifier: ^3.3.3 - version: 3.3.3 - tailwindcss: - specifier: ^3.4.4 - version: 3.4.7 - typescript: - specifier: ^5.5.3 - version: 5.5.3 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.3 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) - vite-tsconfig-paths: - specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/start-basic-counter: + examples/react/kitchen-sink-file-based: dependencies: '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router - '@tanstack/start': + '@tanstack/router-devtools': specifier: workspace:* - version: link:../../../packages/start - '@typescript-eslint/parser': - specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.0)(typescript@5.5.3) + version: link:../../../packages/router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + immer: + specifier: ^10.1.1 + version: 10.1.1 react: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) - vinxi: - specifier: 0.4.1 - version: 0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1) + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + zod: + specifier: ^3.23.8 + version: 3.23.8 devDependencies: - '@types/node': - specifier: ^20.12.11 - version: 20.14.9 '@types/react': - specifier: ^18.2.65 - version: 18.3.3 + specifier: ^18.2.47 + version: 18.3.5 '@types/react-dom': - specifier: ^18.2.21 + specifier: ^18.2.18 version: 18.3.0 - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-config-react-app: - specifier: ^7.0.1 - version: 7.0.1(@babel/plugin-syntax-flow@7.24.6(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.25.2))(eslint@8.57.0)(typescript@5.5.3) - prettier: - specifier: ^3.3.3 - version: 3.3.3 - typescript: - specifier: ^5.5.3 - version: 5.5.3 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/start-basic-react-query: + examples/react/kitchen-sink-react-query: dependencies: '@tanstack/react-query': - specifier: ^5.51.21 - version: 5.51.21(react@18.3.1) + specifier: ^5.56.2 + version: 5.56.2(react@18.3.1) '@tanstack/react-query-devtools': - specifier: ^5.51.21 - version: 5.51.21(@tanstack/react-query@5.51.21(react@18.3.1))(react@18.3.1) + specifier: ^5.56.2 + version: 5.56.2(@tanstack/react-query@5.56.2(react@18.3.1))(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router - '@tanstack/react-router-with-query': - specifier: workspace:* - version: link:../../../packages/react-router-with-query '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools - '@tanstack/router-plugin': - specifier: workspace:* - version: link:../../../packages/router-plugin - '@tanstack/start': - specifier: workspace:* - version: link:../../../packages/start - '@typescript-eslint/parser': - specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.0)(typescript@5.5.3) - '@vitejs/plugin-react': - specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - isbot: - specifier: ^5.1.14 - version: 5.1.14 + immer: + specifier: ^10.1.1 + version: 10.1.1 react: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) redaxios: specifier: ^0.5.1 version: 0.5.1 - tailwind-merge: - specifier: ^2.4.0 - version: 2.4.0 - vinxi: - specifier: 0.4.1 - version: 0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1) + zod: + specifier: ^3.23.8 + version: 3.23.8 devDependencies: - '@playwright/test': - specifier: ^1.45.3 - version: 1.45.3 - '@types/node': - specifier: ^20.12.11 - version: 20.14.9 '@types/react': - specifier: ^18.2.65 - version: 18.3.3 + specifier: ^18.2.47 + version: 18.3.5 '@types/react-dom': - specifier: ^18.2.21 + specifier: ^18.2.18 version: 18.3.0 - autoprefixer: - specifier: ^10.4.20 - version: 10.4.20(postcss@8.4.40) - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-config-react-app: - specifier: ^7.0.1 - version: 7.0.1(@babel/plugin-syntax-flow@7.24.6(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.25.2))(eslint@8.57.0)(typescript@5.5.3) - postcss: - specifier: ^8.4.40 - version: 8.4.40 - prettier: - specifier: ^3.3.3 - version: 3.3.3 - tailwindcss: - specifier: ^3.4.7 - version: 3.4.7 - typescript: - specifier: ^5.5.3 - version: 5.5.3 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) - vite-tsconfig-paths: - specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/start-basic-rsc: + examples/react/kitchen-sink-react-query-file-based: dependencies: - '@babel/plugin-syntax-typescript': - specifier: ^7.24.7 - version: 7.24.7(@babel/core@7.25.2) + '@tanstack/react-query': + specifier: ^5.56.2 + version: 5.56.2(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.56.2 + version: 5.56.2(@tanstack/react-query@5.56.2(react@18.3.1))(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -1393,67 +1370,40 @@ importers: '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin - '@tanstack/start': - specifier: workspace:* - version: link:../../../packages/start + immer: + specifier: ^10.1.1 + version: 10.1.1 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) redaxios: specifier: ^0.5.1 version: 0.5.1 - tailwind-merge: - specifier: ^2.4.0 - version: 2.4.0 - vinxi: - specifier: 0.4.1 - version: 0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1) + zod: + specifier: ^3.23.8 + version: 3.23.8 devDependencies: '@types/react': - specifier: ^18.2.65 - version: 18.3.3 + specifier: ^18.2.47 + version: 18.3.5 '@types/react-dom': - specifier: ^18.2.21 + specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - autoprefixer: - specifier: ^10.4.20 - version: 10.4.20(postcss@8.4.40) - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-config-react-app: - specifier: ^7.0.1 - version: 7.0.1(@babel/plugin-syntax-flow@7.24.6(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.25.2))(eslint@8.57.0)(typescript@5.5.3) - postcss: - specifier: ^8.4.40 - version: 8.4.40 - prettier: - specifier: ^3.3.3 - version: 3.3.3 - tailwindcss: - specifier: ^3.4.7 - version: 3.4.7 - typescript: - specifier: ^5.5.3 - version: 5.5.3 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) - vite-tsconfig-paths: - specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/start-clerk-basic: + examples/react/large-file-based: dependencies: - '@clerk/tanstack-start': - specifier: 0.3.0-snapshot.vdf04997 - version: 0.3.0-snapshot.vdf04997(@tanstack/react-router@packages+react-router)(@tanstack/start@packages+start)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@remix-run/node': - specifier: ^2.10.3 - version: 2.11.1(typescript@5.5.3) - '@remix-run/server-runtime': - specifier: ^2.10.3 - version: 2.11.1(typescript@5.5.3) + '@tanstack/react-query': + specifier: ^5.56.2 + version: 5.56.2(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -1463,287 +1413,104 @@ importers: '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin - '@tanstack/start': - specifier: workspace:* - version: link:../../../packages/start - '@typescript-eslint/parser': - specifier: ^7.16.0 - version: 7.18.0(eslint@8.57.0)(typescript@5.5.3) - '@vitejs/plugin-react': - specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - dotenv: - specifier: ^16.4.5 - version: 16.4.5 - isbot: - specifier: ^5.1.12 - version: 5.1.14 react: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) redaxios: specifier: ^0.5.1 version: 0.5.1 - remix-auth-form: - specifier: ^1.5.0 - version: 1.5.0(@remix-run/server-runtime@2.11.1(typescript@5.5.3))(remix-auth@3.7.0(@remix-run/react@2.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(@remix-run/server-runtime@2.11.1(typescript@5.5.3))) - tailwind-merge: - specifier: ^2.4.0 - version: 2.4.0 - vinxi: - specifier: 0.3.12 - version: 0.3.12(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1) + zod: + specifier: ^3.23.8 + version: 3.23.8 devDependencies: - '@playwright/test': - specifier: ^1.45.1 - version: 1.45.3 - '@replayio/playwright': - specifier: ^3.1.8 - version: 3.1.8(@playwright/test@1.45.3) - '@types/node': - specifier: ^20.12.11 - version: 20.14.9 '@types/react': - specifier: ^18.2.65 - version: 18.3.3 + specifier: ^18.2.47 + version: 18.3.5 '@types/react-dom': - specifier: ^18.2.21 + specifier: ^18.2.18 version: 18.3.0 - autoprefixer: - specifier: ^10.4.19 - version: 10.4.20(postcss@8.4.40) - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-config-react-app: - specifier: ^7.0.1 - version: 7.0.1(@babel/plugin-syntax-flow@7.24.6(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.25.2))(eslint@8.57.0)(typescript@5.5.3) - postcss: - specifier: ^8.4.39 - version: 8.4.40 - prettier: - specifier: ^3.3.3 - version: 3.3.3 - tailwindcss: - specifier: ^3.4.4 - version: 3.4.7 - typescript: - specifier: ^5.5.3 - version: 5.5.3 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.3 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) - vite-tsconfig-paths: - specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/start-convex-trellaux: + examples/react/location-masking: dependencies: - '@convex-dev/react-query': - specifier: 0.0.0-alpha.5 - version: 0.0.0-alpha.5(@tanstack/react-query@5.51.21(react@18.3.1))(convex@1.13.2(eslint@8.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@radix-ui/react-dialog': + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-query': - specifier: ^5.51.21 - version: 5.51.21(react@18.3.1) - '@tanstack/react-query-devtools': - specifier: ^5.51.21 - version: 5.51.21(@tanstack/react-query@5.51.21(react@18.3.1))(react@18.3.1) + specifier: ^5.56.2 + version: 5.56.2(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router - '@tanstack/react-router-with-query': - specifier: workspace:* - version: link:../../../packages/react-router-with-query '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools - '@tanstack/router-plugin': - specifier: workspace:* - version: link:../../../packages/router-plugin - '@tanstack/start': - specifier: workspace:* - version: link:../../../packages/start - '@typescript-eslint/parser': - specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.0)(typescript@5.5.3) - '@vitejs/plugin-react': - specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - concurrently: - specifier: ^8.2.2 - version: 8.2.2 - convex: - specifier: ^1.13.2 - version: 1.13.2(eslint@8.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - isbot: - specifier: ^5.1.14 - version: 5.1.14 - ky: - specifier: ^1.5.0 - version: 1.5.0 - msw: - specifier: ^2.3.5 - version: 2.3.5(typescript@5.5.3) react: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) - react-hot-toast: - specifier: ^2.4.1 - version: 2.4.1(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) redaxios: specifier: ^0.5.1 version: 0.5.1 - tailwind-merge: - specifier: ^2.4.0 - version: 2.4.0 - tiny-invariant: - specifier: ^1.3.3 - version: 1.3.3 - vinxi: - specifier: 0.4.1 - version: 0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1) - zod: - specifier: ^3.23.8 - version: 3.23.8 devDependencies: '@types/react': - specifier: ^18.2.65 - version: 18.3.3 + specifier: ^18.2.47 + version: 18.3.5 '@types/react-dom': - specifier: ^18.2.21 + specifier: ^18.2.18 version: 18.3.0 - autoprefixer: - specifier: ^10.4.20 - version: 10.4.20(postcss@8.4.40) - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-config-react-app: - specifier: ^7.0.1 - version: 7.0.1(@babel/plugin-syntax-flow@7.24.6(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.25.2))(eslint@8.57.0)(typescript@5.5.3) - postcss: - specifier: ^8.4.40 - version: 8.4.40 - prettier: - specifier: ^3.3.3 - version: 3.3.3 - tailwindcss: - specifier: ^3.4.7 - version: 3.4.7 - typescript: - specifier: ^5.5.3 - version: 5.5.3 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) - vite-tsconfig-paths: - specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/start-trellaux: + examples/react/navigation-blocking: dependencies: '@tanstack/react-query': - specifier: ^5.51.21 - version: 5.51.21(react@18.3.1) - '@tanstack/react-query-devtools': - specifier: ^5.51.21 - version: 5.51.21(@tanstack/react-query@5.51.21(react@18.3.1))(react@18.3.1) + specifier: ^5.56.2 + version: 5.56.2(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router - '@tanstack/react-router-with-query': - specifier: workspace:* - version: link:../../../packages/react-router-with-query '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools - '@tanstack/router-plugin': - specifier: workspace:* - version: link:../../../packages/router-plugin - '@tanstack/start': - specifier: workspace:* - version: link:../../../packages/start - '@typescript-eslint/parser': - specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.0)(typescript@5.5.3) - '@vitejs/plugin-react': - specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - isbot: - specifier: ^5.1.14 - version: 5.1.14 - ky: - specifier: ^1.5.0 - version: 1.5.0 - msw: - specifier: ^2.3.5 - version: 2.3.5(typescript@5.5.3) react: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1 react-dom: - specifier: ^18.3.1 + specifier: ^18.2.0 version: 18.3.1(react@18.3.1) - react-hot-toast: - specifier: ^2.4.1 - version: 2.4.1(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) redaxios: specifier: ^0.5.1 version: 0.5.1 - tailwind-merge: - specifier: ^2.4.0 - version: 2.4.0 - tiny-invariant: - specifier: ^1.3.3 - version: 1.3.3 - vinxi: - specifier: 0.4.1 - version: 0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1) - zod: - specifier: ^3.23.8 - version: 3.23.8 devDependencies: '@types/react': - specifier: ^18.2.65 - version: 18.3.3 + specifier: ^18.2.47 + version: 18.3.5 '@types/react-dom': - specifier: ^18.2.21 + specifier: ^18.2.18 version: 18.3.0 - autoprefixer: - specifier: ^10.4.20 - version: 10.4.20(postcss@8.4.40) - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-config-react-app: - specifier: ^7.0.1 - version: 7.0.1(@babel/plugin-syntax-flow@7.24.6(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.25.2))(eslint@8.57.0)(typescript@5.5.3) - postcss: - specifier: ^8.4.40 - version: 8.4.40 - prettier: - specifier: ^3.3.3 - version: 3.3.3 - tailwindcss: - specifier: ^3.4.7 - version: 3.4.7 - typescript: - specifier: ^5.5.3 - version: 5.5.3 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) - vite-tsconfig-paths: - specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/with-framer-motion: + examples/react/quickstart: dependencies: '@tanstack/react-router': specifier: workspace:* @@ -1751,39 +1518,27 @@ importers: '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools - framer-motion: - specifier: ^11.3.21 - version: 11.3.21(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - immer: - specifier: ^10.1.1 - version: 10.1.1 react: specifier: ^18.2.0 version: 18.3.1 react-dom: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) - redaxios: - specifier: ^0.5.1 - version: 0.5.1 - zod: - specifier: ^3.23.8 - version: 3.23.8 devDependencies: '@types/react': specifier: ^18.2.47 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/with-trpc: + examples/react/quickstart-file-based: dependencies: '@tanstack/react-router': specifier: workspace:* @@ -1794,12 +1549,6 @@ importers: '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin - '@trpc/client': - specifier: 11.0.0-rc.477 - version: 11.0.0-rc.477(@trpc/server@11.0.0-rc.477) - '@trpc/server': - specifier: 11.0.0-rc.477 - version: 11.0.0-rc.477 react: specifier: ^18.2.0 version: 18.3.1 @@ -1809,9450 +1558,8614 @@ importers: redaxios: specifier: ^0.5.1 version: 0.5.1 - vinxi: - specifier: 0.4.1 - version: 0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1) zod: specifier: ^3.23.8 version: 3.23.8 devDependencies: '@types/react': specifier: ^18.2.47 - version: 18.3.3 + version: 18.3.5 '@types/react-dom': specifier: ^18.2.18 version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + vite: + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - examples/react/with-trpc-react-query: + examples/react/quickstart-rspack-file-based: dependencies: - '@tanstack/react-query': - specifier: ^5.51.21 - version: 5.51.21(react@18.3.1) - '@tanstack/react-query-devtools': - specifier: ^5.51.21 - version: 5.51.21(@tanstack/react-query@5.51.21(react@18.3.1))(react@18.3.1) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router '@tanstack/router-devtools': specifier: workspace:* version: link:../../../packages/router-devtools + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + devDependencies: + '@rsbuild/core': + specifier: 1.0.4 + version: 1.0.4 + '@rsbuild/plugin-react': + specifier: 1.0.2 + version: 1.0.2(@rsbuild/core@1.0.4) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin - '@trpc/client': - specifier: 11.0.0-rc.477 - version: 11.0.0-rc.477(@trpc/server@11.0.0-rc.477) - '@trpc/react-query': - specifier: 11.0.0-rc.477 - version: 11.0.0-rc.477(@tanstack/react-query@5.51.21(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/server@11.0.0-rc.477)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@trpc/server': - specifier: 11.0.0-rc.477 - version: 11.0.0-rc.477 + '@types/react': + specifier: ^18.3.3 + version: 18.3.5 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + typescript: + specifier: ^5.6.2 + version: 5.6.2 + + examples/react/quickstart-webpack-file-based: + dependencies: + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/router-devtools': + specifier: workspace:* + version: link:../../../packages/router-devtools react: - specifier: ^18.2.0 + specifier: ^18.3.1 version: 18.3.1 react-dom: - specifier: ^18.2.0 + specifier: ^18.3.1 version: 18.3.1(react@18.3.1) - redaxios: - specifier: ^0.5.1 - version: 0.5.1 - vinxi: - specifier: 0.4.1 - version: 0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1) - zod: - specifier: ^3.23.8 - version: 3.23.8 devDependencies: + '@swc/core': + specifier: ^1.7.26 + version: 1.7.26(@swc/helpers@0.5.13) + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin '@types/react': - specifier: ^18.2.47 - version: 18.3.3 + specifier: ^18.3.3 + version: 18.3.5 '@types/react-dom': - specifier: ^18.2.18 + specifier: ^18.3.0 version: 18.3.0 - '@vitejs/plugin-react': - specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - - packages/history: {} + html-webpack-plugin: + specifier: ^5.6.0 + version: 5.6.0(@rspack/core@1.0.5(@swc/helpers@0.5.13))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4)) + swc-loader: + specifier: ^0.2.6 + version: 0.2.6(@swc/core@1.7.26(@swc/helpers@0.5.13))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4)) + typescript: + specifier: ^5.6.2 + version: 5.6.2 + webpack: + specifier: ^5.94.0 + version: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4) + webpack-cli: + specifier: ^5.1.4 + version: 5.1.4(webpack-dev-server@5.1.0)(webpack@5.94.0) + webpack-dev-server: + specifier: ^5.1.0 + version: 5.1.0(webpack-cli@5.1.4)(webpack@5.94.0) - packages/react-cross-context: - devDependencies: - '@vitejs/plugin-react': - specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + examples/react/scroll-restoration: + dependencies: + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/react-virtual': + specifier: ^3.10.7 + version: 3.10.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/router-devtools': + specifier: workspace:* + version: link:../../../packages/router-devtools react: specifier: ^18.2.0 version: 18.3.1 react-dom: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) - - packages/react-router: - dependencies: - '@tanstack/history': - specifier: workspace:* - version: link:../history - '@tanstack/react-store': - specifier: ^0.5.5 - version: 0.5.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - tiny-invariant: - specifier: ^1.3.3 - version: 1.3.3 - tiny-warning: - specifier: ^1.0.3 - version: 1.0.3 devDependencies: - '@testing-library/jest-dom': - specifier: ^6.4.8 - version: 6.4.8 - '@testing-library/react': - specifier: ^16.0.0 - version: 16.0.0(@testing-library/dom@10.0.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@types/react': + specifier: ^18.2.47 + version: 18.3.5 + '@types/react-dom': + specifier: ^18.2.18 + version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - combinate: - specifier: ^1.1.11 - version: 1.1.11 - jsdom: - specifier: ^24.1.1 - version: 24.1.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + vite: + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + + examples/react/search-validator-adapters: + dependencies: + '@tanstack/react-query': + specifier: ^5.56.2 + version: 5.56.2(react@18.3.1) + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/router-arktype-adapter': + specifier: workspace:* + version: link:../../../packages/router-arktype-adapter + '@tanstack/router-devtools': + specifier: workspace:* + version: link:../../../packages/router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@tanstack/router-valibot-adapter': + specifier: workspace:* + version: link:../../../packages/router-valibot-adapter + '@tanstack/router-zod-adapter': + specifier: workspace:* + version: link:../../../packages/router-zod-adapter + arktype: + specifier: ^2.0.0-rc.8 + version: 2.0.0-rc.8 react: specifier: ^18.2.0 version: 18.3.1 react-dom: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) + valibot: + specifier: ^0.42.0 + version: 0.42.0(typescript@5.6.2) zod: specifier: ^3.23.8 version: 3.23.8 - - packages/react-router-with-query: devDependencies: - '@tanstack/react-query': - specifier: '>=5.51.21' - version: 5.51.21(react@18.3.1) - '@tanstack/react-router': - specifier: workspace:* - version: link:../react-router + '@types/react': + specifier: ^18.2.47 + version: 18.3.5 + '@types/react-dom': + specifier: ^18.2.18 + version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - react: - specifier: '>=18' - version: 18.3.1 - react-dom: - specifier: '>=18' - version: 18.3.1(react@18.3.1) + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + vite: + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - packages/router-arktype-adapter: - devDependencies: + examples/react/start-basic: + dependencies: '@tanstack/react-router': specifier: workspace:* - version: link:../react-router - '@testing-library/jest-dom': - specifier: ^6.4.6 - version: 6.4.8 - '@testing-library/react': - specifier: ^16.0.0 - version: 16.0.0(@testing-library/dom@10.0.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - arktype: - specifier: ^2.0.0-beta.2 - version: 2.0.0-beta.5 - - packages/router-cli: - dependencies: - '@tanstack/router-generator': + version: link:../../../packages/react-router + '@tanstack/router-devtools': specifier: workspace:* - version: link:../router-generator - chokidar: - specifier: ^3.6.0 - version: 3.6.0 - yargs: - specifier: ^17.7.2 - version: 17.7.2 + version: link:../../../packages/router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@tanstack/start': + specifier: workspace:* + version: link:../../../packages/start + isbot: + specifier: ^5.1.17 + version: 5.1.17 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + tailwind-merge: + specifier: ^2.5.2 + version: 2.5.2 + vinxi: + specifier: 0.4.3 + version: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) devDependencies: - '@types/yargs': - specifier: ^17.0.32 - version: 17.0.32 + '@types/node': + specifier: ^22.5.4 + version: 22.5.4 + '@types/react': + specifier: ^18.2.65 + version: 18.3.5 + '@types/react-dom': + specifier: ^18.2.21 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + postcss: + specifier: ^8.4.47 + version: 8.4.47 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + tailwindcss: + specifier: ^3.4.11 + version: 3.4.11 + typescript: + specifier: ^5.6.2 + version: 5.6.2 vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + vite-tsconfig-paths: + specifier: ^5.0.1 + version: 5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) - packages/router-devtools: + examples/react/start-basic-auth: dependencies: + '@prisma/client': + specifier: 5.19.1 + version: 5.19.1(prisma@5.19.1) '@tanstack/react-router': specifier: workspace:* - version: link:../react-router - clsx: - specifier: ^2.1.1 - version: 2.1.1 - goober: - specifier: ^2.1.14 - version: 2.1.14(csstype@3.1.3) - devDependencies: - '@vitejs/plugin-react': - specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + version: link:../../../packages/react-router + '@tanstack/router-devtools': + specifier: workspace:* + version: link:../../../packages/router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@tanstack/start': + specifier: workspace:* + version: link:../../../packages/start + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + isbot: + specifier: ^5.1.17 + version: 5.1.17 + prisma: + specifier: ^5.19.1 + version: 5.19.1 react: - specifier: ^18.2.0 + specifier: ^18.3.1 version: 18.3.1 react-dom: - specifier: ^18.2.0 + specifier: ^18.3.1 version: 18.3.1(react@18.3.1) - - packages/router-generator: - dependencies: + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + remix-auth-form: + specifier: ^1.5.0 + version: 1.5.0(@remix-run/server-runtime@2.11.2(typescript@5.6.2))(remix-auth@3.7.0(@remix-run/react@2.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@remix-run/server-runtime@2.11.2(typescript@5.6.2))) + tailwind-merge: + specifier: ^2.5.2 + version: 2.5.2 + vinxi: + specifier: 0.4.3 + version: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) + devDependencies: + '@types/node': + specifier: ^22.5.4 + version: 22.5.4 + '@types/react': + specifier: ^18.2.65 + version: 18.3.5 + '@types/react-dom': + specifier: ^18.2.21 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + postcss: + specifier: ^8.4.47 + version: 8.4.47 prettier: specifier: ^3.3.3 version: 3.3.3 - zod: - specifier: ^3.23.8 - version: 3.23.8 - - packages/router-plugin: - dependencies: - '@babel/core': - specifier: ^7.25.2 - version: 7.25.2 - '@babel/generator': - specifier: ^7.25.0 - version: 7.25.0 - '@babel/parser': - specifier: ^7.25.3 - version: 7.25.3 - '@babel/plugin-syntax-jsx': - specifier: ^7.24.7 - version: 7.24.7(@babel/core@7.25.2) - '@babel/plugin-syntax-typescript': - specifier: ^7.24.7 - version: 7.24.7(@babel/core@7.25.2) - '@babel/template': - specifier: ^7.25.0 - version: 7.25.0 - '@babel/traverse': - specifier: ^7.25.3 - version: 7.25.3 - '@babel/types': - specifier: ^7.25.2 - version: 7.25.2 - '@rsbuild/core': - specifier: '>=1.0.0' - version: 1.0.0 - '@tanstack/router-generator': - specifier: workspace:* - version: link:../router-generator - '@types/babel__core': - specifier: ^7.20.5 - version: 7.20.5 - '@types/babel__generator': - specifier: ^7.6.8 - version: 7.6.8 - '@types/babel__template': - specifier: ^7.4.4 - version: 7.4.4 - '@types/babel__traverse': - specifier: ^7.20.6 - version: 7.20.6 - babel-dead-code-elimination: - specifier: ^1.0.6 - version: 1.0.6 - chokidar: - specifier: ^3.6.0 - version: 3.6.0 - unplugin: - specifier: ^1.12.2 - version: 1.12.2 + tailwindcss: + specifier: ^3.4.11 + version: 3.4.11 + typescript: + specifier: ^5.6.2 + version: 5.6.2 vite: - specifier: '>=5.0.0' - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) - webpack: - specifier: '>=5.92.0' - version: 5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5) - zod: - specifier: ^3.23.8 - version: 3.23.8 + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + vite-tsconfig-paths: + specifier: ^5.0.1 + version: 5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) - packages/router-valibot-adapter: - devDependencies: + examples/react/start-basic-counter: + dependencies: '@tanstack/react-router': specifier: workspace:* - version: link:../react-router - '@testing-library/jest-dom': - specifier: ^6.4.6 - version: 6.4.8 - '@testing-library/react': - specifier: ^16.0.0 - version: 16.0.0(@testing-library/dom@10.0.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - valibot: - specifier: ^0.36.0 - version: 0.36.0 - - packages/router-vite-plugin: - dependencies: - '@tanstack/router-plugin': + version: link:../../../packages/react-router + '@tanstack/start': specifier: workspace:* - version: link:../router-plugin + version: link:../../../packages/start + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + vinxi: + specifier: 0.4.3 + version: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) devDependencies: + '@types/node': + specifier: ^22.5.4 + version: 22.5.4 + '@types/react': + specifier: ^18.2.65 + version: 18.3.5 + '@types/react-dom': + specifier: ^18.2.21 + version: 18.3.0 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + typescript: + specifier: ^5.6.2 + version: 5.6.2 vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.9)(terser@5.31.1) - - packages/router-zod-adapter: - devDependencies: - '@tanstack/react-router': - specifier: workspace:* - version: link:../react-router - '@testing-library/jest-dom': - specifier: ^6.4.6 - version: 6.4.8 - '@testing-library/react': - specifier: ^16.0.0 - version: 16.0.0(@testing-library/dom@10.0.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - zod: - specifier: ^3.23.8 - version: 3.23.8 + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - packages/start: + examples/react/start-basic-react-query: dependencies: - '@tanstack/react-cross-context': - specifier: workspace:* - version: link:../react-cross-context + '@tanstack/react-query': + specifier: ^5.56.2 + version: 5.56.2(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.56.2 + version: 5.56.2(@tanstack/react-query@5.56.2(react@18.3.1))(react@18.3.1) '@tanstack/react-router': specifier: workspace:* - version: link:../react-router - '@tanstack/router-generator': + version: link:../../../packages/react-router + '@tanstack/react-router-with-query': specifier: workspace:* - version: link:../router-generator + version: link:../../../packages/react-router-with-query + '@tanstack/router-devtools': + specifier: workspace:* + version: link:../../../packages/router-devtools '@tanstack/router-plugin': specifier: workspace:* - version: link:../router-plugin - '@tanstack/start-vite-plugin': + version: link:../../../packages/router-plugin + '@tanstack/start': specifier: workspace:* - version: link:../start-vite-plugin - '@types/jsesc': - specifier: ^3.0.3 - version: 3.0.3 - '@vinxi/react': - specifier: 0.2.3 - version: 0.2.3 - '@vinxi/react-server-dom': - specifier: ^0.0.3 - version: 0.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - '@vinxi/server-components': - specifier: ^0.4.1 - version: 0.4.1(vinxi@0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1)) - '@vinxi/server-functions': - specifier: ^0.4.1 - version: 0.4.1(vinxi@0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1)) - import-meta-resolve: - specifier: ^4.1.0 - version: 4.1.0 + version: link:../../../packages/start isbot: - specifier: ^5.1.14 - version: 5.1.14 - jsesc: - specifier: ^3.0.2 - version: 3.0.2 - tiny-invariant: - specifier: ^1.3.3 - version: 1.3.3 - vinxi: - specifier: 0.4.1 - version: 0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1) - vite-tsconfig-paths: - specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - zod: - specifier: ^3.23.8 - version: 3.23.8 - devDependencies: - '@testing-library/react': - specifier: ^16.0.0 - version: 16.0.0(@testing-library/dom@10.0.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@vitejs/plugin-react': - specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + specifier: ^5.1.17 + version: 5.1.17 react: - specifier: ^18.2.0 + specifier: ^18.3.1 version: 18.3.1 react-dom: - specifier: ^18.2.0 + specifier: ^18.3.1 version: 18.3.1(react@18.3.1) - rollup-plugin-preserve-directives: - specifier: ^0.4.0 - version: 0.4.0(rollup@4.18.0) - typescript: - specifier: ^5.5.3 - version: 5.5.3 - vite-plugin-dts: - specifier: ^3.9.1 - version: 3.9.1(@types/node@20.14.9)(rollup@4.18.0)(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - vite-plugin-externalize-deps: - specifier: ^0.8.0 - version: 0.8.0(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - - packages/start-vite-plugin: - dependencies: - '@babel/core': - specifier: ^7.25.2 - version: 7.25.2 - '@babel/generator': - specifier: ^7.25.0 - version: 7.25.0 - '@babel/parser': - specifier: ^7.25.3 - version: 7.25.3 - '@babel/plugin-syntax-jsx': - specifier: ^7.24.7 - version: 7.24.7(@babel/core@7.25.2) - '@babel/plugin-syntax-typescript': - specifier: ^7.24.7 - version: 7.24.7(@babel/core@7.25.2) - '@babel/template': - specifier: ^7.25.0 - version: 7.25.0 - '@babel/traverse': - specifier: ^7.25.3 - version: 7.25.3 - '@babel/types': - specifier: ^7.25.2 - version: 7.25.2 - '@types/babel__core': - specifier: ^7.20.5 - version: 7.20.5 - '@types/babel__generator': - specifier: ^7.6.8 - version: 7.6.8 - '@types/babel__template': - specifier: ^7.4.4 - version: 7.4.4 - '@types/babel__traverse': - specifier: ^7.20.6 - version: 7.20.6 - -packages: - - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - '@adobe/css-tools@4.4.0': - resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} - - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@ark/schema@0.3.2': - resolution: {integrity: sha512-StWlBec++TxgDgpEUAkOxB7rqCZmOJr1dsW0P44vcgoitGtlQN13eCW1MlHlzScTUWA5iOtyHD+TsA0gKm4X0w==} - - '@ark/util@0.2.1': - resolution: {integrity: sha512-V+h43ZoXCT79K0OiwRE7oebcIeVHZ8YL/Xf0mCUCoIEuWnAJOS8zPwQzwGJGwys7MFHgn3YQYWL/nETuEvgcpQ==} - - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.25.2': - resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.25.2': - resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} - engines: {node: '>=6.9.0'} - - '@babel/eslint-parser@7.24.5': - resolution: {integrity: sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - eslint: ^8.57.0 - - '@babel/generator@7.25.0': - resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.24.7': - resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.25.2': - resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-create-class-features-plugin@7.24.7': - resolution: {integrity: sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-create-regexp-features-plugin@7.22.15': - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-define-polyfill-provider@0.6.2': - resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - '@babel/helper-environment-visitor@7.24.7': - resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-function-name@7.24.7': - resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-hoist-variables@7.24.7': - resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-member-expression-to-functions@7.24.7': - resolution: {integrity: sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.24.7': - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.25.2': - resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-optimise-call-expression@7.24.7': - resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.24.7': - resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-remap-async-to-generator@7.22.20': - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-replace-supers@7.24.7': - resolution: {integrity: sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-simple-access@7.24.7': - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-skip-transparent-expression-wrappers@7.24.7': - resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-split-export-declaration@7.24.7': - resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.24.8': - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} - engines: {node: '>=6.9.0'} - - '@babel/helper-wrap-function@7.24.5': - resolution: {integrity: sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.25.0': - resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.25.3': - resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5': - resolution: {integrity: sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1': - resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1': - resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1': - resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-proposal-class-properties@7.18.6': - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-decorators@7.24.1': - resolution: {integrity: sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6': - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-numeric-separator@7.18.6': - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-optional-chaining@7.21.0': - resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-private-methods@7.18.6': - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-private-property-in-object@7.21.11': - resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-decorators@7.24.1': - resolution: {integrity: sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-dynamic-import@7.8.3': - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-export-namespace-from@7.8.3': - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-flow@7.24.6': - resolution: {integrity: sha512-gNkksSdV8RbsCoHF9sjVYrHfYACMl/8U32UfUhJ9+84/ASXw8dlx+eHyyF0m6ncQJ9IBSxfuCkB36GJqYdXTOA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-assertions@7.24.1': - resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-attributes@7.24.1': - resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-jsx@7.24.7': - resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.24.7': - resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-arrow-functions@7.24.1': - resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-async-generator-functions@7.24.3': - resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-async-to-generator@7.24.1': - resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-block-scoped-functions@7.24.1': - resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-block-scoping@7.24.5': - resolution: {integrity: sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-class-properties@7.24.1': - resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-class-static-block@7.24.4': - resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - - '@babel/plugin-transform-classes@7.24.5': - resolution: {integrity: sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-computed-properties@7.24.1': - resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-destructuring@7.24.5': - resolution: {integrity: sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-dotall-regex@7.24.1': - resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-duplicate-keys@7.24.1': - resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-dynamic-import@7.24.1': - resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-exponentiation-operator@7.24.1': - resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-export-namespace-from@7.24.1': - resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-flow-strip-types@7.24.1': - resolution: {integrity: sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-for-of@7.24.1': - resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-function-name@7.24.1': - resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-json-strings@7.24.1': - resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-literals@7.24.1': - resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-logical-assignment-operators@7.24.1': - resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-member-expression-literals@7.24.1': - resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-amd@7.24.1': - resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-commonjs@7.24.1': - resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-systemjs@7.24.1': - resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-umd@7.24.1': - resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5': - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-new-target@7.24.1': - resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-nullish-coalescing-operator@7.24.1': - resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-numeric-separator@7.24.1': - resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-rest-spread@7.24.5': - resolution: {integrity: sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-super@7.24.1': - resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-catch-binding@7.24.1': - resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-chaining@7.24.5': - resolution: {integrity: sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-parameters@7.24.5': - resolution: {integrity: sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-methods@7.24.1': - resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-property-in-object@7.24.5': - resolution: {integrity: sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-property-literals@7.24.1': - resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-display-name@7.24.1': - resolution: {integrity: sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-development@7.22.5': - resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-self@7.24.7': - resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-source@7.24.7': - resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx@7.24.7': - resolution: {integrity: sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-pure-annotations@7.24.1': - resolution: {integrity: sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regenerator@7.24.1': - resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-reserved-words@7.24.1': - resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-runtime@7.24.3': - resolution: {integrity: sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-shorthand-properties@7.24.1': - resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-spread@7.24.1': - resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-sticky-regex@7.24.1': - resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-template-literals@7.24.1': - resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typeof-symbol@7.24.5': - resolution: {integrity: sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typescript@7.24.7': - resolution: {integrity: sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-escapes@7.24.1': - resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-property-regex@7.24.1': - resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-regex@7.24.1': - resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-sets-regex@7.24.1': - resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/preset-env@7.24.5': - resolution: {integrity: sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - - '@babel/preset-react@7.24.1': - resolution: {integrity: sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-typescript@7.24.1': - resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/regjsgen@0.8.0': - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - - '@babel/runtime@7.23.5': - resolution: {integrity: sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.25.0': - resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.25.3': - resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.25.2': - resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} - engines: {node: '>=6.9.0'} - - '@bundled-es-modules/cookie@2.0.0': - resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} - - '@bundled-es-modules/statuses@1.0.1': - resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} - - '@bundled-es-modules/tough-cookie@0.1.6': - resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} - - '@clerk/backend@1.7.0-snapshot.vdf04997': - resolution: {integrity: sha512-yVKKF4H4pPXlH4xGuWhqQl8L8UfACQRyi6Bo0/n4SPI8xhfAUbI+xXgl+0ewa76ExdmAYqOpQ8Nokwf0LnYoaw==} - engines: {node: '>=18.17.0'} - - '@clerk/clerk-react@5.4.2-snapshot.vdf04997': - resolution: {integrity: sha512-QiWbY5uvwI/90IdhKviotiPOSaezWSivoEotzh3gawlRtR+InLur1JTfRHqAonqq5WGejAet3R+3DKQrC0lw6Q==} - engines: {node: '>=18.17.0'} - peerDependencies: - react: '>=18 || >=19.0.0-beta' - react-dom: '>=18 || >=19.0.0-beta' - - '@clerk/shared@2.5.2-snapshot.vdf04997': - resolution: {integrity: sha512-JokAhs1CcZ4UDQwJJCoSWPSqy/gUV7N8aRrgp4XkUiAiF7jeUrxvD4C9FNXjAlfn01utjmk3HuCQ1FyRMaB9Rg==} - engines: {node: '>=18.17.0'} - peerDependencies: - react: '>=18 || >=19.0.0-beta' - react-dom: '>=18 || >=19.0.0-beta' - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@clerk/tanstack-start@0.3.0-snapshot.vdf04997': - resolution: {integrity: sha512-MR6uTPn2gUcQXd4iwVQnTz1C5IAPXbT96bRqjFyxqWWklmMCL55Z+AwqdkYWslRxrNjqWaS26VPZrZ3upOsMcg==} - engines: {node: '>=18.17.0'} - peerDependencies: - '@tanstack/react-router': workspace:* - '@tanstack/start': workspace:* - react: '>=18 || >=19.0.0-beta' - react-dom: '>=18 || >=19.0.0-beta' - - '@clerk/types@4.14.0-snapshot.vdf04997': - resolution: {integrity: sha512-X5OKm/AqWkdjPbTgP+0orYUB3Fa7Cky65LPhMN1Es5ATgQKxHgIfA5tetBdazqeK7kUL3eejSPQH/c03tksiaw==} - engines: {node: '>=18.17.0'} - - '@cloudflare/kv-asset-handler@0.3.2': - resolution: {integrity: sha512-EeEjMobfuJrwoctj7FA1y1KEbM0+Q1xSjobIEyie9k4haVEBB7vkDvsasw1pM3rO39mL2akxIAzLMUAtrMHZhA==} - engines: {node: '>=16.13'} - - '@colors/colors@1.6.0': - resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} - engines: {node: '>=0.1.90'} - - '@commitlint/parse@19.0.3': - resolution: {integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==} - engines: {node: '>=v18'} - - '@commitlint/types@19.0.3': - resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} - engines: {node: '>=v18'} - - '@convex-dev/react-query@0.0.0-alpha.5': - resolution: {integrity: sha512-/sd8fcEYit4UV5mM01j8ddeG9eBvlIxFkdRq2SR6l9XipIjgdhV+ybirHvr8iYZTdS4IejOk4t2iwzynOZSq8w==} - peerDependencies: - '@tanstack/react-query': ^5.0.0 - convex: ^1.13.0 - - '@dabh/diagnostics@2.0.3': - resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - - '@deno/shim-deno-test@0.5.0': - resolution: {integrity: sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w==} - - '@deno/shim-deno@0.19.1': - resolution: {integrity: sha512-8hYIpmDqpG76sn+UY1853RCi+CI7ZWz9tt37nfyDL8rwr6xbW0+GHUwCLcsGbh1uMIKURuJy6xtrIcnW+a0duA==} - - '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - - '@emnapi/core@1.2.0': - resolution: {integrity: sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==} - - '@emnapi/runtime@1.2.0': - resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} - - '@emnapi/wasi-threads@1.0.1': - resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} - - '@emotion/is-prop-valid@0.8.8': - resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} - - '@emotion/memoize@0.7.4': - resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - - '@esbuild/aix-ppc64@0.20.2': - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.17.19': - resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.20.2': - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.17.19': - resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.20.2': - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.17.19': - resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.20.2': - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.17.19': - resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.20.2': - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.17.19': - resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.20.2': - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.17.19': - resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.20.2': - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.17.19': - resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.20.2': - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.17.19': - resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.20.2': - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.17.19': - resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.20.2': - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.17.19': - resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.20.2': - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.17.19': - resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.20.2': - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.17.19': - resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.20.2': - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.17.19': - resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.20.2': - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.17.19': - resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.20.2': - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.17.19': - resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.20.2': - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.17.19': - resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.20.2': - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-x64@0.17.19': - resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.20.2': - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-x64@0.17.19': - resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.20.2': - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.17.19': - resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.20.2': - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.17.19': - resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.20.2': - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.17.19': - resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.20.2': - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.17.19': - resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.20.2': - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^8.57.0 - - '@eslint-community/regexpp@4.11.0': - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint-react/ast@1.8.2': - resolution: {integrity: sha512-JEGTvLgMhAqGirPve2x1xICHtf7vcJfUD/75QbNjl0qHsLDUfva1F99yv9k2kdGE4kESqKJHZehbzg8Xvn/sXg==} - - '@eslint-react/core@1.8.2': - resolution: {integrity: sha512-VYC3pGqxvEEYpWz2ZMq4ZGFOUKgPBo3kJSEYaX8BSeD8IBkqA0pOBh5c9/3ZUW9YYxpF9gFpZsGVS8h7NiWKOw==} - - '@eslint-react/eslint-plugin@1.8.2': - resolution: {integrity: sha512-fEVuqu7qz9g9XVKH/Pg2fLFzeyOjYbq3CjdAxo0H0VrbQPcRb3BNTuvsbURpbCb2agTrE2XlTxe24s/2ypjxPQ==} - engines: {bun: '>=1.0.15', node: '>=18.18.0'} - peerDependencies: - eslint: ^8.57.0 - typescript: ^4.9.5 || ^5.3.3 - peerDependenciesMeta: - typescript: - optional: true - - '@eslint-react/jsx@1.8.2': - resolution: {integrity: sha512-0w9ofkVw1HbMHvC0IauUcK17qAYAW+W0WYiu3LJm+BNOSYbeqW/eiSJWFjV11wYi0ZoHcuFZ6xbrJbndjc79Zg==} - - '@eslint-react/shared@1.8.2': - resolution: {integrity: sha512-CWYkJ0F4arYNqsqUs7n3TTdJKKt9gtwGEF7/i3prQLVZRNRaSriNE1EvUT7n181bwuT7HKYGQ3yGO/KXk1da1w==} - - '@eslint-react/tools@1.8.2': - resolution: {integrity: sha512-13jBjPoFZImEen+VubjUhfd5QXqaDdTvMxRQw49qWS7VRccVIdxS7Wwr9+ozQqEz1+Uu+yeRUJKr73zMknY1/g==} - - '@eslint-react/types@1.8.2': - resolution: {integrity: sha512-udWxV15Hw56Or+T4RDYv+XwYCVDWZ07TP7wvEgXvcN6uZfBQNlpakh8oyHsd1LvB5O3V0VGRYmKUNn2dz3/2PA==} - - '@eslint-react/var@1.8.2': - resolution: {integrity: sha512-NJeJ8wJWqTgIpPK2stgcKGr3PgF5qkcn0NyGcttak+YAioQYpoEb/yXcdB46oKjDnlV7a1JHNP5Txyx17LY5Gw==} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@fastify/busboy@2.1.0': - resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} - engines: {node: '>=14'} - - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.2': - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} - deprecated: Use @eslint/object-schema instead - - '@inquirer/confirm@3.1.10': - resolution: {integrity: sha512-/aAHu83Njy6yf44T+ZrRPUkMcUqprrOiIKsyMvf9jOV+vF5BNb2ja1aLP33MK36W8eaf91MTL/mU/e6METuENg==} - engines: {node: '>=18'} - - '@inquirer/core@8.2.3': - resolution: {integrity: sha512-WrpDVPAaxJQjHid3Ra4FhUO70YBzkHSYVyW5X48L5zHYdudoPISJqTRRWSeamHfaXda7PNNaC5Py5MEo7QwBNA==} - engines: {node: '>=18'} - - '@inquirer/figures@1.0.3': - resolution: {integrity: sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==} - engines: {node: '>=18'} - - '@inquirer/type@1.3.3': - resolution: {integrity: sha512-xTUt0NulylX27/zMx04ZYar/kr1raaiFTVvQ5feljQsiAgdm0WPj4S73/ye0fbslh+15QrIuDvfCXTek7pMY5A==} - engines: {node: '>=18'} - - '@ioredis/commands@1.2.0': - resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@jsonjoy.com/base64@1.1.2': - resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pack@1.0.4': - resolution: {integrity: sha512-aOcSN4MeAtFROysrbqG137b7gaDDSmVrl5mpo6sT/w+kcXpWnzhMjmY/Fh/sDx26NBxyIE7MB1seqLeCAzy9Sg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/util@1.2.0': - resolution: {integrity: sha512-4B8B+3vFsY4eo33DMKyJPlQ3sBMpPFUZK2dr3O3rXrOGKKbYG44J0XSFkDo1VOQiri5HFEhIeVvItjR2xcazmg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@kwsites/file-exists@1.1.1': - resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} - - '@kwsites/promise-deferred@1.1.1': - resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - - '@leichtgewicht/ip-codec@2.0.5': - resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - - '@mapbox/node-pre-gyp@1.0.11': - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true - - '@microsoft/api-extractor-model@7.28.13': - resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} - - '@microsoft/api-extractor-model@7.29.4': - resolution: {integrity: sha512-LHOMxmT8/tU1IiiiHOdHFF83Qsi+V8d0kLfscG4EvQE9cafiR8blOYr8SfkQKWB1wgEilQgXJX3MIA4vetDLZw==} - - '@microsoft/api-extractor@7.43.0': - resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} - hasBin: true - - '@microsoft/api-extractor@7.47.4': - resolution: {integrity: sha512-HKm+P4VNzWwvq1Ey+Jfhhj/3MjsD+ka2hbt8L5AcRM95lu1MFOYnz3XlU7Gr79Q/ZhOb7W/imAKeYrOI0bFydg==} - hasBin: true - - '@microsoft/tsdoc-config@0.16.2': - resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} - - '@microsoft/tsdoc-config@0.17.0': - resolution: {integrity: sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==} - - '@microsoft/tsdoc@0.14.2': - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - - '@microsoft/tsdoc@0.15.0': - resolution: {integrity: sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==} - - '@module-federation/runtime-tools@0.1.6': - resolution: {integrity: sha512-7ILVnzMIa0Dlc0Blck5tVZG1tnk1MmLnuZpLOMpbdW+zl+N6wdMjjHMjEZFCUAJh2E5XJ3BREwfX8Ets0nIkLg==} - - '@module-federation/runtime-tools@0.2.3': - resolution: {integrity: sha512-capN8CVTCEqNAjnl102girrkevczoQfnQYyiYC4WuyKsg7+LUqfirIe1Eiyv6VSE2UgvOTZDnqvervA6rBOlmg==} - - '@module-federation/runtime@0.1.6': - resolution: {integrity: sha512-nj6a+yJ+QxmcE89qmrTl4lphBIoAds0PFPVGnqLRWflwAP88jrCcrrTqRhARegkFDL+wE9AE04+h6jzlbIfMKg==} - - '@module-federation/runtime@0.2.3': - resolution: {integrity: sha512-N+ZxBUb1mkmfO9XT1BwgYQgShtUTlijHbukqQ4afFka5lRAT+ayC7RKfHJLz0HbuexKPCmPBDfdmCnErR5WyTQ==} - - '@module-federation/sdk@0.1.6': - resolution: {integrity: sha512-qifXpyYLM7abUeEOIfv0oTkguZgRZuwh89YOAYIZJlkP6QbRG7DJMQvtM8X2yHXm9PTk0IYNnOJH0vNQCo6auQ==} - - '@module-federation/sdk@0.2.3': - resolution: {integrity: sha512-W9zrPchLocyCBc/B8CW21akcfJXLl++9xBe1L1EtgxZGfj/xwHt0GcBWE/y+QGvYTL2a1iZjwscbftbUhxgxXg==} - - '@module-federation/webpack-bundler-runtime@0.1.6': - resolution: {integrity: sha512-K5WhKZ4RVNaMEtfHsd/9CNCgGKB0ipbm/tgweNNeC11mEuBTNxJ09Y630vg3WPkKv9vfMCuXg2p2Dk+Q/KWTSA==} - - '@module-federation/webpack-bundler-runtime@0.2.3': - resolution: {integrity: sha512-L/jt2uJ+8dwYiyn9GxryzDR6tr/Wk8rpgvelM2EBeLIhu7YxCHSmSjQYhw3BTux9zZIr47d1K9fGjBFsVRd/SQ==} - - '@mswjs/interceptors@0.27.2': - resolution: {integrity: sha512-mE6PhwcoW70EX8+h+Y/4dLfHk33GFt/y5PzDJz56ktMyaVGFXMJ5BYLbUjdmGEABfE0x5GgAGyKbrbkYww2s3A==} - engines: {node: '>=18'} - - '@mswjs/interceptors@0.29.1': - resolution: {integrity: sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==} - engines: {node: '>=18'} - - '@napi-rs/snappy-android-arm-eabi@7.2.2': - resolution: {integrity: sha512-H7DuVkPCK5BlAr1NfSU8bDEN7gYs+R78pSHhDng83QxRnCLmVIZk33ymmIwurmoA1HrdTxbkbuNl+lMvNqnytw==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - - '@napi-rs/snappy-android-arm64@7.2.2': - resolution: {integrity: sha512-2R/A3qok+nGtpVK8oUMcrIi5OMDckGYNoBLFyli3zp8w6IArPRfg1yOfVUcHvpUDTo9T7LOS1fXgMOoC796eQw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@napi-rs/snappy-darwin-arm64@7.2.2': - resolution: {integrity: sha512-USgArHbfrmdbuq33bD5ssbkPIoT7YCXCRLmZpDS6dMDrx+iM7eD2BecNbOOo7/v1eu6TRmQ0xOzeQ6I/9FIi5g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@napi-rs/snappy-darwin-x64@7.2.2': - resolution: {integrity: sha512-0APDu8iO5iT0IJKblk2lH0VpWSl9zOZndZKnBYIc+ei1npw2L5QvuErFOTeTdHBtzvUHASB+9bvgaWnQo4PvTQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@napi-rs/snappy-freebsd-x64@7.2.2': - resolution: {integrity: sha512-mRTCJsuzy0o/B0Hnp9CwNB5V6cOJ4wedDTWEthsdKHSsQlO7WU9W1yP7H3Qv3Ccp/ZfMyrmG98Ad7u7lG58WXA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@napi-rs/snappy-linux-arm-gnueabihf@7.2.2': - resolution: {integrity: sha512-v1uzm8+6uYjasBPcFkv90VLZ+WhLzr/tnfkZ/iD9mHYiULqkqpRuC8zvc3FZaJy5wLQE9zTDkTJN1IvUcZ+Vcg==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@napi-rs/snappy-linux-arm64-gnu@7.2.2': - resolution: {integrity: sha512-LrEMa5pBScs4GXWOn6ZYXfQ72IzoolZw5txqUHVGs8eK4g1HR9HTHhb2oY5ySNaKakG5sOgMsb1rwaEnjhChmQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/snappy-linux-arm64-musl@7.2.2': - resolution: {integrity: sha512-3orWZo9hUpGQcB+3aTLW7UFDqNCQfbr0+MvV67x8nMNYj5eAeUtMmUE/HxLznHO4eZ1qSqiTwLbVx05/Socdlw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@napi-rs/snappy-linux-x64-gnu@7.2.2': - resolution: {integrity: sha512-jZt8Jit/HHDcavt80zxEkDpH+R1Ic0ssiVCoueASzMXa7vwPJeF4ZxZyqUw4qeSy7n8UUExomu8G8ZbP6VKhgw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/snappy-linux-x64-musl@7.2.2': - resolution: {integrity: sha512-Dh96IXgcZrV39a+Tej/owcd9vr5ihiZ3KRix11rr1v0MWtVb61+H1GXXlz6+Zcx9y8jM1NmOuiIuJwkV4vZ4WA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@napi-rs/snappy-win32-arm64-msvc@7.2.2': - resolution: {integrity: sha512-9No0b3xGbHSWv2wtLEn3MO76Yopn1U2TdemZpCaEgOGccz1V+a/1d16Piz3ofSmnA13HGFz3h9NwZH9EOaIgYA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@napi-rs/snappy-win32-ia32-msvc@7.2.2': - resolution: {integrity: sha512-QiGe+0G86J74Qz1JcHtBwM3OYdTni1hX1PFyLRo3HhQUSpmi13Bzc1En7APn+6Pvo7gkrcy81dObGLDSxFAkQQ==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@napi-rs/snappy-win32-x64-msvc@7.2.2': - resolution: {integrity: sha512-a43cyx1nK0daw6BZxVcvDEXxKMFLSBSDTAhsFD0VqSKcC7MGUBMaqyoWUcMiI7LBSz4bxUmxDWKfCYzpEmeb3w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@napi-rs/wasm-runtime@0.2.4': - resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} - - '@netlify/functions@2.6.3': - resolution: {integrity: sha512-7Z9gWyAuPI2NnBOvpYPD66KIWOgNznLz9BkyZ0c7qeRE6p23UCMVZ2VsrJpjPDgoJtKplGSBzASl6fQD7iEeWw==} - engines: {node: '>=14.0.0'} - - '@netlify/node-cookies@0.1.0': - resolution: {integrity: sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==} - engines: {node: ^14.16.0 || >=16.0.0} - - '@netlify/serverless-functions-api@1.18.0': - resolution: {integrity: sha512-VCU5btoGZ8M6iI7HSwpfZXCpBLKWFmRtq5xYt0K7dY96BZWVBmaZY6Tn+w4L2DrGXwAsIeOFNp8CHjVXfuCAkg==} - engines: {node: '>=18.0.0'} - - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@nrwl/tao@19.5.6': - resolution: {integrity: sha512-p1bxEjW32bIHAiTp+PVdJpa2V9En2s9FigepHXyvmT2Aipisz96CKiDjexhPTjOZHUKtqA9FgmOIuVl3sBME3g==} - hasBin: true - - '@nx/nx-darwin-arm64@19.5.6': - resolution: {integrity: sha512-evEpUq571PQkhaLBR7ul5iqE2l97QS7Q37/rxoBuwJzyQ/QKHfNu5t032bR3KLyEOrv7golT10jMeoQlNeF7eQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@nx/nx-darwin-x64@19.5.6': - resolution: {integrity: sha512-o1tu0dOW7TZ80VN9N11FQL/3gHd1+t6NqtEmRClN0/sAh2MZyiBdbXv7UeN5HoKE7HAusiVFIxK3c1lxOvFtsQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@nx/nx-freebsd-x64@19.5.6': - resolution: {integrity: sha512-IUL0ROGpLUol9cuVJ7VeUvaB/ptxg7DOjMef1+LJeOgxl/SFNa0bj0kKpA/AQwujz6cLI7Ei7xLTVQOboNh1DA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@nx/nx-linux-arm-gnueabihf@19.5.6': - resolution: {integrity: sha512-TGf1+cpWg5QiPEGW5kgxa1fVNyASMuqu+LvQ9CKhNYNz5EPD15yr/k6C0tOjgSXro3wi8TikTeG0Ln2hpmn6pw==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@nx/nx-linux-arm64-gnu@19.5.6': - resolution: {integrity: sha512-4hZI5NmnBEAzr3NV/BtlPjbSVffLWGGCJ5tB/JB/NpW/vMtzOPCZ4RvsHuJMPprqHcXOdUnBgZFEcLbEMUXz0A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@nx/nx-linux-arm64-musl@19.5.6': - resolution: {integrity: sha512-n0oIBblMN+nlcBUbrFUkRSyzKZVR+G1lzdZ3PuHVwLC664hkbijEBAdF2E321yRfv5ohQVY0UIYDZVFN2XhFUg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@nx/nx-linux-x64-gnu@19.5.6': - resolution: {integrity: sha512-IuoNo1bDHyJEeHom/n2m4+AA+UQ+Rlryvt9+bTdADclSFjmBLYCgbJwQRy7q9+vQk2mpQm0pQJv4d3XKCpDH+g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@nx/nx-linux-x64-musl@19.5.6': - resolution: {integrity: sha512-FXtB8m/CSRkXLtDOAGfImO9OCUDIwYBssnvCVqX6PyPTBaVWo/GvX1O9WRbXSqSVIaJJTPn1aY/p6vptlGbDFw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@nx/nx-win32-arm64-msvc@19.5.6': - resolution: {integrity: sha512-aIDU84rjvxoqyUDIdN4VwS91Yec8bAtXOxjOFlF2acY2tXh0RjzmM+mkEP44nVAzFy0V1/cjzBKb6643FsEqdA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@nx/nx-win32-x64-msvc@19.5.6': - resolution: {integrity: sha512-zWB/2TjhNYKHbuPh++5hYitno3EpSFXrPND0I0VLec27WW7voRY9XQFFznA3omForU4FfmVhITcKCqzIb3EtpA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@open-draft/deferred-promise@2.2.0': - resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} - - '@open-draft/logger@0.3.0': - resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} - - '@open-draft/until@2.1.0': - resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - - '@opentelemetry/api-logs@0.50.0': - resolution: {integrity: sha512-JdZuKrhOYggqOpUljAq4WWNi5nB10PmgoF0y2CvedLGXd0kSawb/UBnWT8gg1ND3bHCNHStAIVT0ELlxJJRqrA==} - engines: {node: '>=14'} - - '@opentelemetry/api@1.8.0': - resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} - engines: {node: '>=8.0.0'} - - '@opentelemetry/core@1.23.0': - resolution: {integrity: sha512-hdQ/a9TMzMQF/BO8Cz1juA43/L5YGtCSiKoOHmrTEf7VMDAZgy8ucpWx3eQTnQ3gBloRcWtzvcrMZABC3PTSKQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' - - '@opentelemetry/core@1.24.1': - resolution: {integrity: sha512-wMSGfsdmibI88K9wB498zXY04yThPexo8jvwNNlm542HZB7XrrMRBbAyKJqG8qDRJwIBdBrPMi4V9ZPW/sqrcg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' - - '@opentelemetry/otlp-transformer@0.50.0': - resolution: {integrity: sha512-s0sl1Yfqd5q1Kjrf6DqXPWzErL+XHhrXOfejh4Vc/SMTNqC902xDsC8JQxbjuramWt/+hibfguIvi7Ns8VLolA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.9.0' - - '@opentelemetry/resources@1.23.0': - resolution: {integrity: sha512-iPRLfVfcEQynYGo7e4Di+ti+YQTAY0h5mQEUJcHlU9JOqpb4x965O6PZ+wMcwYVY63G96KtdS86YCM1BF1vQZg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' - - '@opentelemetry/resources@1.24.1': - resolution: {integrity: sha512-cyv0MwAaPF7O86x5hk3NNgenMObeejZFLJJDVuSeSMIsknlsj3oOZzRv3qSzlwYomXsICfBeFFlxwHQte5mGXQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' - - '@opentelemetry/sdk-logs@0.50.0': - resolution: {integrity: sha512-PeUEupBB29p9nlPNqXoa1PUWNLsZnxG0DCDj3sHqzae+8y76B/A5hvZjg03ulWdnvBLYpnJslqzylG9E0IL87g==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.4.0 <1.9.0' - '@opentelemetry/api-logs': '>=0.39.1' - - '@opentelemetry/sdk-metrics@1.23.0': - resolution: {integrity: sha512-4OkvW6+wST4h6LFG23rXSTf6nmTf201h9dzq7bE0z5R9ESEVLERZz6WXwE7PSgg1gdjlaznm1jLJf8GttypFDg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.9.0' - - '@opentelemetry/sdk-trace-base@1.23.0': - resolution: {integrity: sha512-PzBmZM8hBomUqvCddF/5Olyyviayka44O5nDWq673np3ctnvwMOvNrsUORZjKja1zJbwEuD9niAGbnVrz3jwRQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' - - '@opentelemetry/sdk-trace-base@1.24.1': - resolution: {integrity: sha512-zz+N423IcySgjihl2NfjBf0qw1RWe11XIAWVrTNOSSI6dtSPJiVom2zipFB2AEEtJWpv0Iz6DY6+TjnyTV5pWg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' - - '@opentelemetry/semantic-conventions@1.23.0': - resolution: {integrity: sha512-MiqFvfOzfR31t8cc74CTP1OZfz7MbqpAnLCra8NqQoaHJX6ncIRTdYOQYBDQ2uFISDq0WY8Y9dDTWvsgzzBYRg==} - engines: {node: '>=14'} - - '@opentelemetry/semantic-conventions@1.24.1': - resolution: {integrity: sha512-VkliWlS4/+GHLLW7J/rVBA00uXus1SWvwFvcUDxDwmFxYfg/2VI6ekwdXS28cjI8Qz2ky2BzG8OUHo+WeYIWqw==} - engines: {node: '>=14'} - - '@parcel/watcher-android-arm64@2.4.1': - resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [android] - - '@parcel/watcher-darwin-arm64@2.4.1': - resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [darwin] - - '@parcel/watcher-darwin-x64@2.4.1': - resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [darwin] - - '@parcel/watcher-freebsd-x64@2.4.1': - resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [freebsd] - - '@parcel/watcher-linux-arm-glibc@2.4.1': - resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - - '@parcel/watcher-linux-arm64-glibc@2.4.1': - resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - - '@parcel/watcher-linux-arm64-musl@2.4.1': - resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - - '@parcel/watcher-linux-x64-glibc@2.4.1': - resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - - '@parcel/watcher-linux-x64-musl@2.4.1': - resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - - '@parcel/watcher-wasm@2.3.0': - resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} - engines: {node: '>= 10.0.0'} - bundledDependencies: - - napi-wasm - - '@parcel/watcher-wasm@2.4.1': - resolution: {integrity: sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA==} - engines: {node: '>= 10.0.0'} - bundledDependencies: - - napi-wasm - - '@parcel/watcher-win32-arm64@2.4.1': - resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [win32] - - '@parcel/watcher-win32-ia32@2.4.1': - resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - - '@parcel/watcher-win32-x64@2.4.1': - resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [win32] - - '@parcel/watcher@2.4.1': - resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} - engines: {node: '>= 10.0.0'} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@playwright/test@1.45.3': - resolution: {integrity: sha512-UKF4XsBfy+u3MFWEH44hva1Q8Da28G6RFtR2+5saw+jgAFQV5yYnB1fu68Mz7fO+5GJF3wgwAIs0UelU8TxFrA==} - engines: {node: '>=18'} - hasBin: true - - '@prisma/client@5.17.0': - resolution: {integrity: sha512-N2tnyKayT0Zf7mHjwEyE8iG7FwTmXDHFZ1GnNhQp0pJUObsuel4ZZ1XwfuAYkq5mRIiC/Kot0kt0tGCfLJ70Jw==} - engines: {node: '>=16.13'} - peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true - - '@prisma/debug@5.18.0': - resolution: {integrity: sha512-f+ZvpTLidSo3LMJxQPVgAxdAjzv5OpzAo/eF8qZqbwvgi2F5cTOI9XCpdRzJYA0iGfajjwjOKKrVq64vkxEfUw==} - - '@prisma/engines-version@5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169': - resolution: {integrity: sha512-a/+LpJj8vYU3nmtkg+N3X51ddbt35yYrRe8wqHTJtYQt7l1f8kjIBcCs6sHJvodW/EK5XGvboOiwm47fmNrbgg==} - - '@prisma/engines@5.18.0': - resolution: {integrity: sha512-ofmpGLeJ2q2P0wa/XaEgTnX/IsLnvSp/gZts0zjgLNdBhfuj2lowOOPmDcfKljLQUXMvAek3lw5T01kHmCG8rg==} - - '@prisma/fetch-engine@5.18.0': - resolution: {integrity: sha512-I/3u0x2n31rGaAuBRx2YK4eB7R/1zCuayo2DGwSpGyrJWsZesrV7QVw7ND0/Suxeo/vLkJ5OwuBqHoCxvTHpOg==} - - '@prisma/get-platform@5.18.0': - resolution: {integrity: sha512-Tk+m7+uhqcKDgnMnFN0lRiH7Ewea0OEsZZs9pqXa7i3+7svS3FSCqDBCaM9x5fmhhkufiG0BtunJVDka+46DlA==} - - '@protobufjs/aspromise@1.1.2': - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - - '@protobufjs/base64@1.1.2': - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - - '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - - '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - - '@protobufjs/float@1.0.2': - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - - '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - - '@protobufjs/path@1.1.2': - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - - '@protobufjs/pool@1.1.0': - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - - '@radix-ui/primitive@1.1.0': - resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} - - '@radix-ui/react-compose-refs@1.1.0': - resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context@1.1.0': - resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dialog@1.1.1': - resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + tailwind-merge: + specifier: ^2.5.2 + version: 2.5.2 + vinxi: + specifier: 0.4.3 + version: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) + devDependencies: + '@types/node': + specifier: ^22.5.4 + version: 22.5.4 '@types/react': - optional: true + specifier: ^18.2.65 + version: 18.3.5 '@types/react-dom': - optional: true + specifier: ^18.2.21 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + postcss: + specifier: ^8.4.47 + version: 8.4.47 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + tailwindcss: + specifier: ^3.4.11 + version: 3.4.11 + typescript: + specifier: ^5.6.2 + version: 5.6.2 + vite: + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + vite-tsconfig-paths: + specifier: ^5.0.1 + version: 5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) - '@radix-ui/react-dismissable-layer@1.1.0': - resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: + examples/react/start-basic-rsc: + dependencies: + '@babel/plugin-syntax-typescript': + specifier: ^7.25.4 + version: 7.25.4(@babel/core@7.25.2) + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/router-devtools': + specifier: workspace:* + version: link:../../../packages/router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@tanstack/start': + specifier: workspace:* + version: link:../../../packages/start + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + tailwind-merge: + specifier: ^2.5.2 + version: 2.5.2 + vinxi: + specifier: 0.4.3 + version: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) + devDependencies: '@types/react': - optional: true + specifier: ^18.2.65 + version: 18.3.5 '@types/react-dom': - optional: true + specifier: ^18.2.21 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + postcss: + specifier: ^8.4.47 + version: 8.4.47 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + tailwindcss: + specifier: ^3.4.11 + version: 3.4.11 + typescript: + specifier: ^5.6.2 + version: 5.6.2 + vite: + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + vite-tsconfig-paths: + specifier: ^5.0.1 + version: 5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) - '@radix-ui/react-focus-guards@1.1.0': - resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: + examples/react/start-clerk-basic: + dependencies: + '@clerk/tanstack-start': + specifier: 0.4.1 + version: 0.4.1(@tanstack/react-router@packages+react-router)(@tanstack/start@packages+start)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/router-devtools': + specifier: workspace:* + version: link:../../../packages/router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@tanstack/start': + specifier: workspace:* + version: link:../../../packages/start + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + isbot: + specifier: ^5.1.17 + version: 5.1.17 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + remix-auth-form: + specifier: ^1.5.0 + version: 1.5.0(@remix-run/server-runtime@2.11.2(typescript@5.6.2))(remix-auth@3.7.0(@remix-run/react@2.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@remix-run/server-runtime@2.11.2(typescript@5.6.2))) + tailwind-merge: + specifier: ^2.5.2 + version: 2.5.2 + vinxi: + specifier: 0.4.3 + version: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) + devDependencies: + '@types/node': + specifier: ^22.5.4 + version: 22.5.4 '@types/react': - optional: true + specifier: ^18.2.65 + version: 18.3.5 + '@types/react-dom': + specifier: ^18.2.21 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + postcss: + specifier: ^8.4.47 + version: 8.4.47 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + tailwindcss: + specifier: ^3.4.11 + version: 3.4.11 + typescript: + specifier: ^5.6.2 + version: 5.6.2 + vite: + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + vite-tsconfig-paths: + specifier: ^5.0.1 + version: 5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) - '@radix-ui/react-focus-scope@1.1.0': - resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: + examples/react/start-convex-trellaux: + dependencies: + '@convex-dev/react-query': + specifier: 0.0.0-alpha.5 + version: 0.0.0-alpha.5(@tanstack/react-query@5.56.2(react@18.3.1))(convex@1.16.0(@clerk/clerk-react@5.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tanstack/react-query': + specifier: ^5.56.2 + version: 5.56.2(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.56.2 + version: 5.56.2(@tanstack/react-query@5.56.2(react@18.3.1))(react@18.3.1) + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/react-router-with-query': + specifier: workspace:* + version: link:../../../packages/react-router-with-query + '@tanstack/router-devtools': + specifier: workspace:* + version: link:../../../packages/router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@tanstack/start': + specifier: workspace:* + version: link:../../../packages/start + concurrently: + specifier: ^8.2.2 + version: 8.2.2 + convex: + specifier: ^1.16.0 + version: 1.16.0(@clerk/clerk-react@5.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + isbot: + specifier: ^5.1.17 + version: 5.1.17 + ky: + specifier: ^1.7.2 + version: 1.7.2 + msw: + specifier: ^2.4.7 + version: 2.4.7(typescript@5.6.2) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-hot-toast: + specifier: ^2.4.1 + version: 2.4.1(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + tailwind-merge: + specifier: ^2.5.2 + version: 2.5.2 + tiny-invariant: + specifier: ^1.3.3 + version: 1.3.3 + vinxi: + specifier: 0.4.3 + version: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) + zod: + specifier: ^3.23.8 + version: 3.23.8 + devDependencies: '@types/react': - optional: true + specifier: ^18.2.65 + version: 18.3.5 '@types/react-dom': - optional: true + specifier: ^18.2.21 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + postcss: + specifier: ^8.4.47 + version: 8.4.47 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + tailwindcss: + specifier: ^3.4.11 + version: 3.4.11 + typescript: + specifier: ^5.6.2 + version: 5.6.2 + vite: + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + vite-tsconfig-paths: + specifier: ^5.0.1 + version: 5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) - '@radix-ui/react-id@1.1.0': - resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: + examples/react/start-supabase-basic: + dependencies: + '@supabase/ssr': + specifier: ^0.5.1 + version: 0.5.1(@supabase/supabase-js@2.45.4) + '@supabase/supabase-js': + specifier: ^2.45.4 + version: 2.45.4 + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/router-devtools': + specifier: workspace:* + version: link:../../../packages/router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@tanstack/start': + specifier: workspace:* + version: link:../../../packages/start + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + vinxi: + specifier: 0.4.3 + version: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) + devDependencies: '@types/react': - optional: true + specifier: ^18.3.5 + version: 18.3.5 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + postcss: + specifier: ^8.4.47 + version: 8.4.47 + tailwindcss: + specifier: ^3.4.11 + version: 3.4.11 + typescript: + specifier: ^5.6.2 + version: 5.6.2 - '@radix-ui/react-portal@1.1.1': - resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: + examples/react/start-trellaux: + dependencies: + '@tanstack/react-query': + specifier: ^5.56.2 + version: 5.56.2(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.56.2 + version: 5.56.2(@tanstack/react-query@5.56.2(react@18.3.1))(react@18.3.1) + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/react-router-with-query': + specifier: workspace:* + version: link:../../../packages/react-router-with-query + '@tanstack/router-devtools': + specifier: workspace:* + version: link:../../../packages/router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@tanstack/start': + specifier: workspace:* + version: link:../../../packages/start + isbot: + specifier: ^5.1.17 + version: 5.1.17 + ky: + specifier: ^1.7.2 + version: 1.7.2 + msw: + specifier: ^2.4.7 + version: 2.4.7(typescript@5.6.2) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-hot-toast: + specifier: ^2.4.1 + version: 2.4.1(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + tailwind-merge: + specifier: ^2.5.2 + version: 2.5.2 + tiny-invariant: + specifier: ^1.3.3 + version: 1.3.3 + vinxi: + specifier: 0.4.3 + version: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) + zod: + specifier: ^3.23.8 + version: 3.23.8 + devDependencies: '@types/react': - optional: true + specifier: ^18.2.65 + version: 18.3.5 '@types/react-dom': - optional: true + specifier: ^18.2.21 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + postcss: + specifier: ^8.4.47 + version: 8.4.47 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + tailwindcss: + specifier: ^3.4.11 + version: 3.4.11 + typescript: + specifier: ^5.6.2 + version: 5.6.2 + vite: + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + vite-tsconfig-paths: + specifier: ^5.0.1 + version: 5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) - '@radix-ui/react-presence@1.1.0': - resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: + examples/react/with-framer-motion: + dependencies: + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/router-devtools': + specifier: workspace:* + version: link:../../../packages/router-devtools + framer-motion: + specifier: ^11.5.4 + version: 11.5.4(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + zod: + specifier: ^3.23.8 + version: 3.23.8 + devDependencies: '@types/react': - optional: true + specifier: ^18.2.47 + version: 18.3.5 '@types/react-dom': - optional: true + specifier: ^18.2.18 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + vite: + specifier: ^5.4.5 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - '@radix-ui/react-primitive@2.0.0': - resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: + examples/react/with-trpc: + dependencies: + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/router-devtools': + specifier: workspace:* + version: link:../../../packages/router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@trpc/client': + specifier: 11.0.0-rc.502 + version: 11.0.0-rc.502(@trpc/server@11.0.0-rc.502) + '@trpc/server': + specifier: 11.0.0-rc.502 + version: 11.0.0-rc.502 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + vinxi: + specifier: 0.4.3 + version: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) + zod: + specifier: ^3.23.8 + version: 3.23.8 + devDependencies: '@types/react': - optional: true + specifier: ^18.2.47 + version: 18.3.5 '@types/react-dom': - optional: true - - '@radix-ui/react-slot@1.1.0': - resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + specifier: ^18.2.18 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) - '@radix-ui/react-use-callback-ref@1.1.0': - resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: + examples/react/with-trpc-react-query: + dependencies: + '@tanstack/react-query': + specifier: ^5.56.2 + version: 5.56.2(react@18.3.1) + '@tanstack/react-query-devtools': + specifier: ^5.56.2 + version: 5.56.2(@tanstack/react-query@5.56.2(react@18.3.1))(react@18.3.1) + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/router-devtools': + specifier: workspace:* + version: link:../../../packages/router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@trpc/client': + specifier: 11.0.0-rc.502 + version: 11.0.0-rc.502(@trpc/server@11.0.0-rc.502) + '@trpc/react-query': + specifier: 11.0.0-rc.502 + version: 11.0.0-rc.502(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.502(@trpc/server@11.0.0-rc.502))(@trpc/server@11.0.0-rc.502)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@trpc/server': + specifier: 11.0.0-rc.502 + version: 11.0.0-rc.502 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + vinxi: + specifier: 0.4.3 + version: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) + zod: + specifier: ^3.23.8 + version: 3.23.8 + devDependencies: '@types/react': - optional: true + specifier: ^18.2.47 + version: 18.3.5 + '@types/react-dom': + specifier: ^18.2.18 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) - '@radix-ui/react-use-controllable-state@1.1.0': - resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: + packages/create-router: + dependencies: + '@rsbuild/core': + specifier: ^1.0.2 + version: 1.0.4 + '@rsbuild/plugin-react': + specifier: ^1.0.1 + version: 1.0.2(@rsbuild/core@1.0.4) + '@swc/core': + specifier: ^1.7.25 + version: 1.7.26(@swc/helpers@0.5.13) + '@tanstack/react-router': + specifier: workspace:* + version: link:../react-router + '@tanstack/router-devtools': + specifier: workspace:* + version: link:../router-devtools + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../router-plugin '@types/react': - optional: true + specifier: ^18.3.3 + version: 18.3.5 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + html-webpack-plugin: + specifier: ^5.6.0 + version: 5.6.0(@rspack/core@1.0.5(@swc/helpers@0.5.13))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4)) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + swc-loader: + specifier: ^0.2.6 + version: 0.2.6(@swc/core@1.7.26(@swc/helpers@0.5.13))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4)) + typescript: + specifier: ^5.6.2 + version: 5.6.2 + vite: + specifier: ^5.4.4 + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + webpack: + specifier: ^5.94.0 + version: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4) + webpack-cli: + specifier: ^5.1.4 + version: 5.1.4(webpack-dev-server@5.1.0)(webpack@5.94.0) + webpack-dev-server: + specifier: ^5.1.0 + version: 5.1.0(webpack-cli@5.1.4)(webpack@5.94.0) + devDependencies: + '@inquirer/prompts': + specifier: ^5.5.0 + version: 5.5.0 + '@types/cross-spawn': + specifier: ^6.0.6 + version: 6.0.6 + '@types/validate-npm-package-name': + specifier: ^4.0.2 + version: 4.0.2 + commander: + specifier: ^12.1.0 + version: 12.1.0 + cross-spawn: + specifier: ^7.0.3 + version: 7.0.3 + fast-glob: + specifier: ^3.3.2 + version: 3.3.2 + picocolors: + specifier: ^1.1.0 + version: 1.1.0 + unbuild: + specifier: ^2.0.0 + version: 2.0.0(typescript@5.6.2)(vue-tsc@2.0.29(typescript@5.6.2)) + validate-npm-package-name: + specifier: ^5.0.1 + version: 5.0.1 + yocto-spinner: + specifier: ^0.1.0 + version: 0.1.0 + + packages/eslint-plugin-router: + dependencies: + '@typescript-eslint/utils': + specifier: ^8.3.0 + version: 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + devDependencies: + '@typescript-eslint/rule-tester': + specifier: ^8.3.0 + version: 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + combinate: + specifier: ^1.1.11 + version: 1.1.11 + eslint: + specifier: ^9.10.0 + version: 9.10.0(jiti@1.21.6) - '@radix-ui/react-use-escape-keydown@1.1.0': - resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + packages/history: {} - '@radix-ui/react-use-layout-effect@1.1.0': - resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + packages/react-cross-context: + devDependencies: + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) - '@remix-run/node@2.11.1': - resolution: {integrity: sha512-KCQPLSd5Y3OLCoJUQxxTGswALL1gZ+OgL3bf2ap6kITIp1AUZz3T4jqCNVVyWllVAU9gpCtrONaI+SiWf+8b2w==} - engines: {node: '>=18.0.0'} - peerDependencies: - typescript: ^5.1.0 - peerDependenciesMeta: - typescript: - optional: true + packages/react-router: + dependencies: + '@tanstack/history': + specifier: workspace:* + version: link:../history + '@tanstack/react-store': + specifier: ^0.5.5 + version: 0.5.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/router-generator': + specifier: workspace:* + version: link:../router-generator + tiny-invariant: + specifier: ^1.3.3 + version: 1.3.3 + tiny-warning: + specifier: ^1.0.3 + version: 1.0.3 + devDependencies: + '@testing-library/jest-dom': + specifier: ^6.5.0 + version: 6.5.0 + '@testing-library/react': + specifier: ^16.0.1 + version: 16.0.1(@testing-library/dom@10.0.0)(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + combinate: + specifier: ^1.1.11 + version: 1.1.11 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + zod: + specifier: ^3.23.8 + version: 3.23.8 - '@remix-run/react@2.11.1': - resolution: {integrity: sha512-bXilQrHx5WVHsdA6UFkWxYVePZJ1kzwfa/KYMdbMZi6zsSlv2/N6ZbgNuoemt8oM8/YgCT6EOPITzCgz+zEMVw==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - typescript: ^5.1.0 - peerDependenciesMeta: - typescript: - optional: true + packages/react-router-with-query: + devDependencies: + '@tanstack/react-query': + specifier: '>=5.56.2' + version: 5.56.2(react@18.3.1) + '@tanstack/react-router': + specifier: workspace:* + version: link:../react-router + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + react: + specifier: '>=18' + version: 18.3.1 + react-dom: + specifier: '>=18' + version: 18.3.1(react@18.3.1) - '@remix-run/router@1.19.0': - resolution: {integrity: sha512-zDICCLKEwbVYTS6TjYaWtHXxkdoUvD/QXvyVZjGCsWz5vyH7aFeONlPffPdW+Y/t6KT0MgXb2Mfjun9YpWN1dA==} - engines: {node: '>=14.0.0'} + packages/router-arktype-adapter: + devDependencies: + '@tanstack/react-router': + specifier: workspace:* + version: link:../react-router + '@testing-library/jest-dom': + specifier: ^6.5.0 + version: 6.5.0 + '@testing-library/react': + specifier: ^16.0.1 + version: 16.0.1(@testing-library/dom@10.0.0)(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + arktype: + specifier: ^2.0.0-rc.8 + version: 2.0.0-rc.8 - '@remix-run/server-runtime@2.11.1': - resolution: {integrity: sha512-j3AlrZul0javvPR6ZWdN32/l12t1E90sLeZI/k+4HpT0ifjqJVg8uG6alRJ0LLN9ae5BERYEslUebUqdfejSkQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - typescript: ^5.1.0 - peerDependenciesMeta: - typescript: - optional: true + packages/router-cli: + dependencies: + '@tanstack/router-generator': + specifier: workspace:* + version: link:../router-generator + chokidar: + specifier: ^3.6.0 + version: 3.6.0 + yargs: + specifier: ^17.7.2 + version: 17.7.2 + devDependencies: + '@types/yargs': + specifier: ^17.0.33 + version: 17.0.33 - '@remix-run/web-blob@3.1.0': - resolution: {integrity: sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g==} + packages/router-devtools: + dependencies: + '@tanstack/react-router': + specifier: workspace:* + version: link:../react-router + clsx: + specifier: ^2.1.1 + version: 2.1.1 + goober: + specifier: ^2.1.14 + version: 2.1.14(csstype@3.1.3) + devDependencies: + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) - '@remix-run/web-fetch@4.4.2': - resolution: {integrity: sha512-jgKfzA713/4kAW/oZ4bC3MoLWyjModOVDjFPNseVqcJKSafgIscrYL9G50SurEYLswPuoU3HzSbO0jQCMYWHhA==} - engines: {node: ^10.17 || >=12.3} + packages/router-generator: + dependencies: + '@tanstack/virtual-file-routes': + specifier: workspace:* + version: link:../virtual-file-routes + prettier: + specifier: ^3.3.3 + version: 3.3.3 + tsx: + specifier: ^4.19.1 + version: 4.19.1 + zod: + specifier: ^3.23.8 + version: 3.23.8 - '@remix-run/web-file@3.1.0': - resolution: {integrity: sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ==} + packages/router-plugin: + dependencies: + '@babel/core': + specifier: ^7.25.2 + version: 7.25.2 + '@babel/generator': + specifier: ^7.25.6 + version: 7.25.6 + '@babel/parser': + specifier: ^7.25.6 + version: 7.25.6 + '@babel/plugin-syntax-jsx': + specifier: ^7.24.7 + version: 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-typescript': + specifier: ^7.25.4 + version: 7.25.4(@babel/core@7.25.2) + '@babel/template': + specifier: ^7.25.0 + version: 7.25.0 + '@babel/traverse': + specifier: ^7.25.6 + version: 7.25.6 + '@babel/types': + specifier: ^7.25.6 + version: 7.25.6 + '@rsbuild/core': + specifier: '>=1.0.2' + version: 1.0.4 + '@tanstack/router-generator': + specifier: workspace:* + version: link:../router-generator + '@tanstack/virtual-file-routes': + specifier: workspace:* + version: link:../virtual-file-routes + '@types/babel__core': + specifier: ^7.20.5 + version: 7.20.5 + '@types/babel__generator': + specifier: ^7.6.8 + version: 7.6.8 + '@types/babel__template': + specifier: ^7.4.4 + version: 7.4.4 + '@types/babel__traverse': + specifier: ^7.20.6 + version: 7.20.6 + babel-dead-code-elimination: + specifier: ^1.0.6 + version: 1.0.6 + chokidar: + specifier: ^3.6.0 + version: 3.6.0 + unplugin: + specifier: ^1.12.2 + version: 1.12.2 + vite: + specifier: '>=5.0.0' + version: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + webpack: + specifier: '>=5.92.0' + version: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.1) + zod: + specifier: ^3.23.8 + version: 3.23.8 - '@remix-run/web-form-data@3.1.0': - resolution: {integrity: sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A==} + packages/router-valibot-adapter: + devDependencies: + '@tanstack/react-router': + specifier: workspace:* + version: link:../react-router + '@testing-library/jest-dom': + specifier: ^6.5.0 + version: 6.5.0 + '@testing-library/react': + specifier: ^16.0.1 + version: 16.0.1(@testing-library/dom@10.0.0)(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + valibot: + specifier: ^0.42.0 + version: 0.42.0(typescript@5.6.2) - '@remix-run/web-stream@1.1.0': - resolution: {integrity: sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==} + packages/router-vite-plugin: + dependencies: + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../router-plugin - '@replayio/playwright@3.1.8': - resolution: {integrity: sha512-hRAjdPeC7kJYqus0za02nApfH3/f1yccXcf9qeqdlNPTVGeKTfFunTJCWVBxavwW6nEamKvsqzEoBHSk7+jwVg==} - peerDependencies: - '@playwright/test': ^1.34.0 + packages/router-zod-adapter: + devDependencies: + '@tanstack/react-router': + specifier: workspace:* + version: link:../react-router + '@testing-library/jest-dom': + specifier: ^6.5.0 + version: 6.5.0 + '@testing-library/react': + specifier: ^16.0.1 + version: 16.0.1(@testing-library/dom@10.0.0)(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + zod: + specifier: ^3.23.8 + version: 3.23.8 - '@rollup/plugin-alias@5.1.0': - resolution: {integrity: sha512-lpA3RZ9PdIG7qqhEfv79tBffNaoDuukFDrmhLqg9ifv99u/ehn+lOg30x2zmhf8AQqQUZaMk/B9fZraQ6/acDQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + packages/start: + dependencies: + '@tanstack/react-cross-context': + specifier: workspace:* + version: link:../react-cross-context + '@tanstack/react-router': + specifier: workspace:* + version: link:../react-router + '@tanstack/router-generator': + specifier: workspace:* + version: link:../router-generator + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../router-plugin + '@tanstack/start-vite-plugin': + specifier: workspace:* + version: link:../start-vite-plugin + '@types/jsesc': + specifier: ^3.0.3 + version: 3.0.3 + '@vinxi/react': + specifier: 0.2.5 + version: 0.2.5 + '@vinxi/react-server-dom': + specifier: ^0.0.3 + version: 0.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + '@vinxi/server-components': + specifier: ^0.4.3 + version: 0.4.3(vinxi@0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1)) + '@vinxi/server-functions': + specifier: ^0.4.3 + version: 0.4.3(vinxi@0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1)) + import-meta-resolve: + specifier: ^4.1.0 + version: 4.1.0 + isbot: + specifier: ^5.1.17 + version: 5.1.17 + jsesc: + specifier: ^3.0.2 + version: 3.0.2 + tiny-invariant: + specifier: ^1.3.3 + version: 1.3.3 + vinxi: + specifier: 0.4.3 + version: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) + vite-tsconfig-paths: + specifier: ^5.0.1 + version: 5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + zod: + specifier: ^3.23.8 + version: 3.23.8 + devDependencies: + '@testing-library/react': + specifier: ^16.0.1 + version: 16.0.1(@testing-library/dom@10.0.0)(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + typescript: + specifier: ^5.6.2 + version: 5.6.2 - '@rollup/plugin-babel@6.0.4': - resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@types/babel__core': ^7.1.9 - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: + packages/start-vite-plugin: + dependencies: + '@babel/core': + specifier: ^7.25.2 + version: 7.25.2 + '@babel/generator': + specifier: ^7.25.6 + version: 7.25.6 + '@babel/parser': + specifier: ^7.25.6 + version: 7.25.6 + '@babel/plugin-syntax-jsx': + specifier: ^7.24.7 + version: 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-typescript': + specifier: ^7.25.4 + version: 7.25.4(@babel/core@7.25.2) + '@babel/template': + specifier: ^7.25.0 + version: 7.25.0 + '@babel/traverse': + specifier: ^7.25.6 + version: 7.25.6 + '@babel/types': + specifier: ^7.25.6 + version: 7.25.6 '@types/babel__core': - optional: true - rollup: - optional: true + specifier: ^7.20.5 + version: 7.20.5 + '@types/babel__generator': + specifier: ^7.6.8 + version: 7.6.8 + '@types/babel__template': + specifier: ^7.4.4 + version: 7.4.4 + '@types/babel__traverse': + specifier: ^7.20.6 + version: 7.20.6 - '@rollup/plugin-commonjs@25.0.7': - resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.68.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + packages/virtual-file-routes: {} - '@rollup/plugin-inject@5.0.5': - resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true +packages: - '@rollup/plugin-json@6.1.0': - resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} - '@rollup/plugin-node-resolve@15.2.3': - resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@adobe/css-tools@4.4.0': + resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} - '@rollup/plugin-replace@5.0.7': - resolution: {integrity: sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} - '@rollup/plugin-terser@0.4.4': - resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} - '@rollup/pluginutils@4.2.1': - resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} - engines: {node: '>= 8.0.0'} + '@andrewbranch/untar.js@1.0.3': + resolution: {integrity: sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==} - '@rollup/pluginutils@5.1.0': - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + '@arethetypeswrong/cli@0.16.2': + resolution: {integrity: sha512-QW1jjQayokcn4KmKyuqvWJl+FyRMagX/D/kwNEddhUEbAhLCL6PXPduHLYxRtQSE+e8QllGS2qcGxqrLJeExAw==} + engines: {node: '>=18'} + hasBin: true - '@rollup/rollup-android-arm-eabi@4.18.0': - resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} - cpu: [arm] - os: [android] + '@arethetypeswrong/core@0.16.2': + resolution: {integrity: sha512-gAYzWaIbq8m9MuvxKmeDn24Or4mIWCSpRR0NNXAVoGUTPraB1SP3blPa5NycUPTnToKLA5DAwHLhwtWpslMbKQ==} + engines: {node: '>=18'} - '@rollup/rollup-android-arm64@4.18.0': - resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} - cpu: [arm64] - os: [android] + '@ark/schema@0.10.0': + resolution: {integrity: sha512-zpfXwWLOzj9aUK+dXQ6aleJAOgle4/WrHDop5CMX2M88dFQ85NdH8O0v0pvMAQnfFcaQAZ/nVDYLlBJsFc09XA==} - '@rollup/rollup-darwin-arm64@4.18.0': - resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} - cpu: [arm64] - os: [darwin] + '@ark/util@0.10.0': + resolution: {integrity: sha512-uK+9VU5doGMYOoOZVE+XaSs1vYACoaEJdrDkuBx26S4X7y3ChyKsPnIg/9pIw2vUySph1GkAXbvBnfVE2GmXgQ==} - '@rollup/rollup-darwin-x64@4.18.0': - resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} - cpu: [x64] - os: [darwin] + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': - resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} - cpu: [arm] - os: [linux] + '@babel/compat-data@7.25.2': + resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + engines: {node: '>=6.9.0'} - '@rollup/rollup-linux-arm-musleabihf@4.18.0': - resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} - cpu: [arm] - os: [linux] + '@babel/core@7.25.2': + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + engines: {node: '>=6.9.0'} - '@rollup/rollup-linux-arm64-gnu@4.18.0': - resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} - cpu: [arm64] - os: [linux] + '@babel/generator@7.25.6': + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} + engines: {node: '>=6.9.0'} - '@rollup/rollup-linux-arm64-musl@4.18.0': - resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} - cpu: [arm64] - os: [linux] + '@babel/helper-compilation-targets@7.25.2': + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + engines: {node: '>=6.9.0'} - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': - resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} - cpu: [ppc64] - os: [linux] + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} - '@rollup/rollup-linux-riscv64-gnu@4.18.0': - resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} - cpu: [riscv64] - os: [linux] + '@babel/helper-module-transforms@7.25.2': + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@rollup/rollup-linux-s390x-gnu@4.18.0': - resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} - cpu: [s390x] - os: [linux] + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + engines: {node: '>=6.9.0'} - '@rollup/rollup-linux-x64-gnu@4.18.0': - resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} - cpu: [x64] - os: [linux] + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} - '@rollup/rollup-linux-x64-musl@4.18.0': - resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} - cpu: [x64] - os: [linux] + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} - '@rollup/rollup-win32-arm64-msvc@4.18.0': - resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} - cpu: [arm64] - os: [win32] + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} - '@rollup/rollup-win32-ia32-msvc@4.18.0': - resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} - cpu: [ia32] - os: [win32] + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + engines: {node: '>=6.9.0'} - '@rollup/rollup-win32-x64-msvc@4.18.0': - resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} - cpu: [x64] - os: [win32] + '@babel/helpers@7.25.0': + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + engines: {node: '>=6.9.0'} - '@rsbuild/core@1.0.0': - resolution: {integrity: sha512-3CGB2vP5o5BEioHCkkdr2CA0RpMHYCwonWkaHkIsiTfCMKUaHLCkJzWJinGvg5muuHZA6YANI2YwF6wG8/cOAw==} - engines: {node: '>=14.0.0'} - deprecated: This is a mistakenly released version, please do not use it - hasBin: true + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} - '@rsbuild/core@1.0.1-beta.15': - resolution: {integrity: sha512-Y9N5GvGhorbP5RCOJDYZ+gUJGSBbDAUlntLeXFOF4bSQU7Pa+tzt/tuL44wxuPjjEMj87wQz4K6wYOUVov9gZw==} - engines: {node: '>=16.7.0'} + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + engines: {node: '>=6.0.0'} hasBin: true - '@rsbuild/plugin-react@1.0.1-beta.15': - resolution: {integrity: sha512-2HYxjWmIdRsBMugHtml9inPYrrbSUSaZc9oK8betBxJ1HiCCcUBi8jyZKMXogO8iQYkLA7ff6zDWmc2JoxyF0A==} + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + engines: {node: '>=6.9.0'} peerDependencies: - '@rsbuild/core': ^1.0.1-beta.15 - - '@rsbuild/shared@1.0.0': - resolution: {integrity: sha512-S8naGkaXAN+5vjk22Ghox07kGK/Weg5C1imc1ELB4J66m5PWaDSnlxiv8hdmruKelcNuWUaqmTJrqEpUkVSezw==} - deprecated: This is a mistakenly released version, please do not use it + '@babel/core': ^7.0.0-0 - '@rspack/binding-darwin-arm64@0.4.0': - resolution: {integrity: sha512-iQ6ERHXzY58zgHIZZAC7L7hrosO7BZXH3RpOTTibiZdTVex4Bq10CVmy6q6m88iQuqAQS2BHOXzAYLJtZlZRRw==} - cpu: [arm64] - os: [darwin] + '@babel/plugin-syntax-typescript@7.25.4': + resolution: {integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@rspack/binding-darwin-arm64@0.7.5': - resolution: {integrity: sha512-mNBIm36s1BA7v4SL/r4f3IXIsjyH5CZX4eXMRPE52lBc3ClVuUB7d/8zk8dkyjJCMAj8PsZSnAJ3cfXnn7TN4g==} - cpu: [arm64] - os: [darwin] + '@babel/plugin-transform-react-jsx-self@7.24.7': + resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@rspack/binding-darwin-arm64@1.0.0-beta.5': - resolution: {integrity: sha512-lHiQ5cZrBQEpoh7Cd0AY3ggzlfBy9HiK4T0x2VdtsT2ZMc81hPBJ23hB8WIA+CTfOwbeLUBi0Ypfo26jls+dBw==} - cpu: [arm64] - os: [darwin] + '@babel/plugin-transform-react-jsx-source@7.24.7': + resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@rspack/binding-darwin-x64@0.4.0': - resolution: {integrity: sha512-LRCiMPCbAIwwo0euqao7+8peUXj+qPDSi0nSK2y6wjaXfUVi8FwpWQ+O+B3RH3rpyFBU63IqatC8razalt8JgQ==} - cpu: [x64] - os: [darwin] + '@babel/runtime@7.23.5': + resolution: {integrity: sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==} + engines: {node: '>=6.9.0'} - '@rspack/binding-darwin-x64@0.7.5': - resolution: {integrity: sha512-teLK0TB1x0CsvaaiCopsFx4EvJe+/Hljwii6R7C9qOZs5zSOfbT/LQ202eA0sAGodCncARCGaXVrsekbrRYqeA==} - cpu: [x64] - os: [darwin] + '@babel/standalone@7.25.6': + resolution: {integrity: sha512-Kf2ZcZVqsKbtYhlA7sP0z5A3q5hmCVYMKMWRWNK/5OVwHIve3JY1djVRmIVAx8FMueLIfZGKQDIILK2w8zO4mg==} + engines: {node: '>=6.9.0'} - '@rspack/binding-darwin-x64@1.0.0-beta.5': - resolution: {integrity: sha512-uEWJe2Egs0LawG/8pnfHIyZeJWLMCZkQjZM1PY8iH7jVLXh1rELQJbGlMHNFbYvM4cU8Xfk9si2Vi4mPRepzlQ==} - cpu: [x64] - os: [darwin] + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + engines: {node: '>=6.9.0'} - '@rspack/binding-linux-arm64-gnu@0.4.0': - resolution: {integrity: sha512-trfEUQ7awu6dLWUlIXmSJmwW48lSxEl7kW4FUas/UMNH3/B/wim8TPx6ZuDrCzVhYk5HP7ccjbQg7mnbJ+E48w==} - cpu: [arm64] - os: [linux] + '@babel/traverse@7.25.6': + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} + engines: {node: '>=6.9.0'} - '@rspack/binding-linux-arm64-gnu@0.7.5': - resolution: {integrity: sha512-/24UytJXrK+7CsucDb30GCKYIJ8nG6ceqbJyOtsJv9zeArNLHkxrYGSyjHJIpQfwVN17BPP4RNOi+yIZ3ZgDyA==} - cpu: [arm64] - os: [linux] + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + engines: {node: '>=6.9.0'} - '@rspack/binding-linux-arm64-gnu@1.0.0-beta.5': - resolution: {integrity: sha512-DHyd2f+H5Y1F12fH5aN1Rx341E6cvH86pGnqcbdsVaOgM+8GM55LIr4p90XIdrjK2vH5PYROFM8g/d6CGzX3VQ==} - cpu: [arm64] - os: [linux] + '@bundled-es-modules/cookie@2.0.0': + resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} - '@rspack/binding-linux-arm64-musl@0.4.0': - resolution: {integrity: sha512-ubIcXmRopSJ6n+F/cRXDfGSgK847OX0CPeSSL4tiJ4dah5lz8iISZ9GLrNHJQ+SvphOH8F9lDpp8h2iwVt0Pbw==} - cpu: [arm64] - os: [linux] + '@bundled-es-modules/statuses@1.0.1': + resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} - '@rspack/binding-linux-arm64-musl@0.7.5': - resolution: {integrity: sha512-6RcxG42mLM01Pa6UYycACu/Nu9qusghAPUJumb8b8x5TRIDEtklYC5Ck6Rmagm+8E0ucMude2E/D4rMdIFcS3A==} - cpu: [arm64] - os: [linux] + '@bundled-es-modules/tough-cookie@0.1.6': + resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} - '@rspack/binding-linux-arm64-musl@1.0.0-beta.5': - resolution: {integrity: sha512-QG9NYVcwpaDqkUT1Ny1yr+RAgSmdN8AswqLkLbtD42Q/P+DKlvKUa48BxU7irQgYe21AKEg4E7EnLCXaeSwRFw==} - cpu: [arm64] - os: [linux] + '@clerk/backend@1.11.1': + resolution: {integrity: sha512-g+jk1wxS0j6s1or6e3rf8KK4bHaIxajCMHAASyhfl9a9OVBqtkeMgbQ3+LIFDRAOSQLxLKrIqJgPGPfOoHz17Q==} + engines: {node: '>=18.17.0'} - '@rspack/binding-linux-x64-gnu@0.4.0': - resolution: {integrity: sha512-Q3mqjgV2k68F8VuzZwaqhHggBhcSlD0N+vvtFP8BxXIX4Pdkmk2shwwVjniZmY+oKB16dbSmXxShdMlCE3CCng==} - cpu: [x64] - os: [linux] + '@clerk/clerk-react@5.8.2': + resolution: {integrity: sha512-5wXr02TmxlGBjBTrM5URCk01b0q/Po6xg3SPo/U8HgrQ8qnY82hbnLxZ1dUuqH3MIzUh2VAoISJzF4TEZYqJJA==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: '>=18 || >=19.0.0-beta' + react-dom: '>=18 || >=19.0.0-beta' - '@rspack/binding-linux-x64-gnu@0.7.5': - resolution: {integrity: sha512-R0Lu4CJN2nWMW7WzPBuCIju80cQPpcaqwKJDj/quwQySpJJZ6c5qGwB8mntqjxIzZDrNH6u0OkpiUTbvWZj8ww==} - cpu: [x64] - os: [linux] + '@clerk/shared@2.7.2': + resolution: {integrity: sha512-0SymNLqE5oMPf1XwtqNazNcpIoCKUv77f8rHpx4U8mg73uXYfuEQThNgCJyoM4/qxYLL3SBPKAlZl9MAHfSiyA==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: '>=18 || >=19.0.0-beta' + react-dom: '>=18 || >=19.0.0-beta' + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true - '@rspack/binding-linux-x64-gnu@1.0.0-beta.5': - resolution: {integrity: sha512-r3KB58qDZvTh9zoAdZG0F6soh9f7MtCbhZzhLAiFb8E5J+QBK3dN+hn6LLtap8istZaU0nq9UdYiKDPOthhPiQ==} - cpu: [x64] - os: [linux] + '@clerk/tanstack-start@0.4.1': + resolution: {integrity: sha512-EeX+9VlzYukxEwK/X3S4hWZLq6Z1fmiC3HepkyB3sT9FPYAA62eCL6TtzqSp+usVhdKuGUu22FZRb2keJmIiDA==} + engines: {node: '>=18.17.0'} + peerDependencies: + '@tanstack/react-router': workspace:* + '@tanstack/start': workspace:* + react: '>=18 || >=19.0.0-beta' + react-dom: '>=18 || >=19.0.0-beta' - '@rspack/binding-linux-x64-musl@0.4.0': - resolution: {integrity: sha512-5l6Q00yZDIeT8T1ruxEfF1Wj3m3SqnSHrPFiUqYydmgmNll1iCCRC2AmGVsmAACDQ7rg9z8BhhHtKukNBvmwTQ==} - cpu: [x64] - os: [linux] + '@clerk/types@4.20.1': + resolution: {integrity: sha512-s2v3wFgLsB+d0Ot5yN+5IjRNKWl63AAeEczTZDZYSWuNkGihvEXYjS2NtnYuhROBRgWEHEsm0JOp0rQkfTMkBw==} + engines: {node: '>=18.17.0'} - '@rspack/binding-linux-x64-musl@0.7.5': - resolution: {integrity: sha512-dDgi/ThikMy1m4llxPeEXDCA2I8F8ezFS/eCPLZGU2/J1b4ALwDjuRsMmo+VXSlFCKgIt98V6h1woeg7nu96yg==} - cpu: [x64] - os: [linux] + '@cloudflare/kv-asset-handler@0.3.2': + resolution: {integrity: sha512-EeEjMobfuJrwoctj7FA1y1KEbM0+Q1xSjobIEyie9k4haVEBB7vkDvsasw1pM3rO39mL2akxIAzLMUAtrMHZhA==} + engines: {node: '>=16.13'} - '@rspack/binding-linux-x64-musl@1.0.0-beta.5': - resolution: {integrity: sha512-/IDw2JI273wQXCoQQvnX2sthNglChMhQDig8XxFU3fLQmaPB8zxGFCxowstOQPjN/McSddHGdISGlv6RKh8rCQ==} - cpu: [x64] - os: [linux] + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} - '@rspack/binding-win32-arm64-msvc@0.4.0': - resolution: {integrity: sha512-k96/PSkVT/VEvqHygenzgr8Z7n4SuCSKONVFB5zazWDPaJwCqaqANQuvX0PbuazVy6PbiLE/YI0+4TDjL7dHCw==} - cpu: [arm64] - os: [win32] + '@commitlint/parse@19.0.3': + resolution: {integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==} + engines: {node: '>=v18'} - '@rspack/binding-win32-arm64-msvc@0.7.5': - resolution: {integrity: sha512-nEF4cUdLfgEK6FrgJSJhUlr2/7LY1tmqBNQCFsCjtDtUkQbJIEo1b8edT94G9tJcQoFE4cD+Re30yBYbQO2Thg==} - cpu: [arm64] - os: [win32] + '@commitlint/types@19.0.3': + resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} + engines: {node: '>=v18'} - '@rspack/binding-win32-arm64-msvc@1.0.0-beta.5': - resolution: {integrity: sha512-HhT79VMinXof1sI7SWBRNBamSUUcwgZwlfhcQlaRtm06YzmK0wieJAWi1Gunr6/tlDPa4UNM+y3le6K5kibwfQ==} - cpu: [arm64] - os: [win32] + '@convex-dev/react-query@0.0.0-alpha.5': + resolution: {integrity: sha512-/sd8fcEYit4UV5mM01j8ddeG9eBvlIxFkdRq2SR6l9XipIjgdhV+ybirHvr8iYZTdS4IejOk4t2iwzynOZSq8w==} + peerDependencies: + '@tanstack/react-query': ^5.0.0 + convex: ^1.13.0 - '@rspack/binding-win32-ia32-msvc@0.4.0': - resolution: {integrity: sha512-DmC7MumePZuss1AigT4FaIbFPZFtZXdcWBhD7dF88CvsvQRVtOcMujtByWkkNJ6ZDp+IUHyXOtPQWr1iRjDOCQ==} - cpu: [ia32] - os: [win32] + '@deno/shim-deno-test@0.5.0': + resolution: {integrity: sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w==} - '@rspack/binding-win32-ia32-msvc@0.7.5': - resolution: {integrity: sha512-hEcHRwJIzpZsePr+5x6V/7TGhrPXhSZYG4sIhsrem1za9W+qqCYYLZ7KzzbRODU07QaAH2RxjcA1bf8F2QDYAQ==} - cpu: [ia32] - os: [win32] + '@deno/shim-deno@0.19.1': + resolution: {integrity: sha512-8hYIpmDqpG76sn+UY1853RCi+CI7ZWz9tt37nfyDL8rwr6xbW0+GHUwCLcsGbh1uMIKURuJy6xtrIcnW+a0duA==} - '@rspack/binding-win32-ia32-msvc@1.0.0-beta.5': - resolution: {integrity: sha512-oYXpiXpoVBL7v3biBHeUlkrW0EVceG3PsBPcBg/AuVqbpogePu1xN6gRdaN9CYK/uRNcDyFC3QWDOq+Cn3KExg==} - cpu: [ia32] - os: [win32] + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} - '@rspack/binding-win32-x64-msvc@0.4.0': - resolution: {integrity: sha512-F3pAxz1GakFkyq8S+iPTqVkvIFnHG9te36wLW+tIzY4oC0vNPsEVunBp6NrYHzTaOf3aBZ+bvsLZyfvg+pKxqA==} - cpu: [x64] - os: [win32] + '@emnapi/core@1.2.0': + resolution: {integrity: sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==} - '@rspack/binding-win32-x64-msvc@0.7.5': - resolution: {integrity: sha512-PpVpP6J5/2b4T10hzSUwjLvmdpAOj3ozARl1Nrf/lsbYwhiXivoB8Gvoy/xe/Xpgr732Dk9VCeeW8rreWOOUVQ==} - cpu: [x64] - os: [win32] + '@emnapi/runtime@1.2.0': + resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} - '@rspack/binding-win32-x64-msvc@1.0.0-beta.5': - resolution: {integrity: sha512-tXYOIThPgiIvKKoV91GN/+P405DGFcuhdZZ+i0AhrRrtbK7mpkIRdde8aVMXNbTA6NnKAcOSAvJ2bVUVq3F2rQ==} - cpu: [x64] - os: [win32] + '@emnapi/wasi-threads@1.0.1': + resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} - '@rspack/binding@0.4.0': - resolution: {integrity: sha512-SpjaySPGmyRnRHrQItl9W9NGE2WoHsUPnererZaLK+pfVgO92q9uoEoKl3EBNNI9uttG132SCz4cx1zXwN394w==} + '@emotion/is-prop-valid@0.8.8': + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} - '@rspack/binding@0.7.5': - resolution: {integrity: sha512-XcdOvaCz1mWWwr5vmEY9zncdInrjINEh60EWkYdqtCA67v7X7rB1fe6n4BeAI1+YLS2Eacj+lytlr+n7I+DYVg==} + '@emotion/memoize@0.7.4': + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - '@rspack/binding@1.0.0-beta.5': - resolution: {integrity: sha512-GT0cxYzD4jrXaB4eaGu1N/l32InSWelDREvqg1MDjZAYZlYreN2yFiA8Ds5+RqPz53csup1WWHFMqYcNH9KipQ==} + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] - '@rspack/core@0.4.0': - resolution: {integrity: sha512-GY8lsCGRzj1mj5q1Ss5kjazpSisT/HJdXpIU730pG4Os6mE2sGYVUJ0ncYRv/DEBcL1c2dVr5vtMKTHlNYRlfg==} - engines: {node: '>=16.0.0'} + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] - '@rspack/core@0.7.5': - resolution: {integrity: sha512-zVTe4WCyc3qsLPattosiDYZFeOzaJ32/BYukPP2I1VJtCVFa+PxGVRPVZhSoN6fXw5oy48yHg9W9v1T8CaEFhw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@swc/helpers': '>=0.5.1' - peerDependenciesMeta: - '@swc/helpers': - optional: true + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] - '@rspack/core@1.0.0-beta.5': - resolution: {integrity: sha512-X8amU6N26FE4/3JPs+asTIeBZlESrfCC4jlfEOc6bsjLCiMK8NkF3r84xFG7qpGBe178c+yXwmBluyHUkMGHqg==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@swc/helpers': '>=0.5.1' - peerDependenciesMeta: - '@swc/helpers': - optional: true + '@esbuild/aix-ppc64@0.23.0': + resolution: {integrity: sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] - '@rspack/lite-tapable@1.0.0': - resolution: {integrity: sha512-7MZf4lburSUZoEenwazwUDKHhqyfnLCGnQ/tKcUtztfmVzfjZfRn/EaiT0AKkYGnL2U8AGsw89oUeVyvaOLVCw==} - engines: {node: '>=16.0.0'} + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] - '@rspack/plugin-react-refresh@1.0.0': - resolution: {integrity: sha512-WvXkLewW5G0Mlo5H1b251yDh5FFiH4NDAbYlFpvFjcuXX2AchZRf9zdw57BDE/ADyWsJgA8kixN/zZWBTN3iYA==} - peerDependencies: - react-refresh: '>=0.10.0 <1.0.0' - peerDependenciesMeta: - react-refresh: - optional: true + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] - '@rushstack/eslint-patch@1.10.3': - resolution: {integrity: sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==} + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] - '@rushstack/node-core-library@4.0.2': - resolution: {integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] - '@rushstack/node-core-library@5.5.1': - resolution: {integrity: sha512-ZutW56qIzH8xIOlfyaLQJFx+8IBqdbVCZdnj+XT1MorQ1JqqxHse8vbCpEM+2MjsrqcbxcgDIbfggB1ZSQ2A3g==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true + '@esbuild/android-arm64@0.23.0': + resolution: {integrity: sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] - '@rushstack/rig-package@0.5.2': - resolution: {integrity: sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA==} + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] - '@rushstack/rig-package@0.5.3': - resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] - '@rushstack/terminal@0.10.0': - resolution: {integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] - '@rushstack/terminal@0.13.3': - resolution: {integrity: sha512-fc3zjXOw8E0pXS5t9vTiIPx9gHA0fIdTXsu9mT4WbH+P3mYvnrX0iAQ5a6NvyK1+CqYWBTw/wVNx7SDJkI+WYQ==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true + '@esbuild/android-arm@0.23.0': + resolution: {integrity: sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] - '@rushstack/ts-command-line@4.19.1': - resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] - '@rushstack/ts-command-line@4.22.3': - resolution: {integrity: sha512-edMpWB3QhFFZ4KtSzS8WNjBgR4PXPPOVrOHMbb7kNpmQ1UFS9HdVtjCXg1H5fG+xYAbeE+TMPcVPUyX2p84STA==} + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] - '@shikijs/core@1.11.0': - resolution: {integrity: sha512-VbEhDAhT/2ozO0TPr5/ZQBO/NWLqtk4ZiBf6NplYpF38mKjNfMMied5fNEfIfYfN+cdKvhDB4VMcKvG/g9c3zg==} + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + '@esbuild/android-x64@0.23.0': + resolution: {integrity: sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==} engines: {node: '>=18'} + cpu: [x64] + os: [android] - '@stylistic/eslint-plugin-js@2.6.4': - resolution: {integrity: sha512-kx1hS3xTvzxZLdr/DCU/dLBE++vcP97sHeEFX2QXhk1Ipa4K1rzPOLw1HCbf4mU3s+7kHP5eYpDe+QteEOFLug==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] - '@swc/core-darwin-arm64@1.7.6': - resolution: {integrity: sha512-6lYHey84ZzsdtC7UuPheM4Rm0Inzxm6Sb8U6dmKc4eCx8JL0LfWG4LC5RsdsrTxnjTsbriWlnhZBffh8ijUHIQ==} - engines: {node: '>=10'} + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.7.6': - resolution: {integrity: sha512-Fyl+8aH9O5rpx4O7r2KnsPpoi32iWoKOYKiipeTbGjQ/E95tNPxbmsz4yqE8Ovldcga60IPJ5OKQA3HWRiuzdw==} - engines: {node: '>=10'} - cpu: [x64] + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.7.6': - resolution: {integrity: sha512-2WxYTqFaOx48GKC2cbO1/IntA+w+kfCFy436Ij7qRqqtV/WAvTM9TC1OmiFbqq436rSot52qYmX8fkwdB5UcLQ==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] - '@swc/core-linux-arm64-gnu@1.7.6': - resolution: {integrity: sha512-TBEGMSe0LhvPe4S7E68c7VzgT3OMu4VTmBLS7B2aHv4v8uZO92Khpp7L0WqgYU1y5eMjk+XLDLi4kokiNHv/Hg==} - engines: {node: '>=10'} + '@esbuild/darwin-arm64@0.23.0': + resolution: {integrity: sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==} + engines: {node: '>=18'} cpu: [arm64] - os: [linux] + os: [darwin] - '@swc/core-linux-arm64-musl@1.7.6': - resolution: {integrity: sha512-QI8QGL0HGT42tj7F1A+YAzhGkJjUcvvTfI1e2m704W0Enl2/UIK9v5D1zvQzYwusRyKuaQfbeBRYDh0NcLOGLg==} - engines: {node: '>=10'} + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} cpu: [arm64] - os: [linux] + os: [darwin] - '@swc/core-linux-x64-gnu@1.7.6': - resolution: {integrity: sha512-61AYVzhjuNQAVIKKWOJu3H0/pFD28RYJGxnGg3YMhvRLRyuWNyY5Nyyj2WkKcz/ON+g38Arlz00NT1LDIViRLg==} - engines: {node: '>=10'} + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} cpu: [x64] - os: [linux] + os: [darwin] - '@swc/core-linux-x64-musl@1.7.6': - resolution: {integrity: sha512-hQFznpfLK8XajfAAN9Cjs0w/aVmO7iu9VZvInyrTCRcPqxV5O+rvrhRxKvC1LRMZXr5M6JRSRtepp5w+TK4kAw==} - engines: {node: '>=10'} + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} cpu: [x64] - os: [linux] - - '@swc/core-win32-arm64-msvc@1.7.6': - resolution: {integrity: sha512-Aqsd9afykVMuekzjm4X4TDqwxmG4CrzoOSFe0hZrn9SMio72l5eAPnMtYoe5LsIqtjV8MNprLfXaNbjHjTegmA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] + os: [darwin] - '@swc/core-win32-ia32-msvc@1.7.6': - resolution: {integrity: sha512-9h0hYnOeRVNeQgHQTvD1Im67faNSSzBZ7Adtxyu9urNLfBTJilMllFd2QuGHlKW5+uaT6ZH7ZWDb+c/enx7Lcg==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] - '@swc/core-win32-x64-msvc@1.7.6': - resolution: {integrity: sha512-izeoB8glCSe6IIDQmrVm6bvR9muk9TeKgmtY7b6l1BwL4BFnTUk4dMmpbntT90bEVQn3JPCaPtUG4HfL8VuyuA==} - engines: {node: '>=10'} + '@esbuild/darwin-x64@0.23.0': + resolution: {integrity: sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==} + engines: {node: '>=18'} cpu: [x64] - os: [win32] + os: [darwin] - '@swc/core@1.7.6': - resolution: {integrity: sha512-FZxyao9eQks1MRmUshgsZTmlg/HB2oXK5fghkoWJm/1CU2q2kaJlVDll2as5j+rmWiwkp0Gidlq8wlXcEEAO+g==} - engines: {node: '>=10'} - peerDependencies: - '@swc/helpers': '*' - peerDependenciesMeta: - '@swc/helpers': - optional: true + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] - '@swc/helpers@0.5.1': - resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] - '@swc/helpers@0.5.11': - resolution: {integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==} + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] - '@swc/types@0.1.12': - resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==} + '@esbuild/freebsd-arm64@0.23.0': + resolution: {integrity: sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] - '@tanstack/config@0.11.3': - resolution: {integrity: sha512-jMhxnpsUoLNHAc1QZyN99p4Kxh46PmolvROUMr2oNNEn+8AtpL9b29HfWclm0ueP1csofdklZ9IUa0WXjiEUew==} + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} engines: {node: '>=18'} - hasBin: true + cpu: [arm64] + os: [freebsd] - '@tanstack/query-core@5.51.21': - resolution: {integrity: sha512-POQxm42IUp6n89kKWF4IZi18v3fxQWFRolvBA6phNVmA8psdfB1MvDnGacCJdS+EOX12w/CyHM62z//rHmYmvw==} + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] - '@tanstack/query-devtools@5.51.16': - resolution: {integrity: sha512-ajwuq4WnkNCMj/Hy3KR8d3RtZ6PSKc1dD2vs2T408MdjgKzQ3klVoL6zDgVO7X+5jlb5zfgcO3thh4ojPhfIaw==} + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] - '@tanstack/react-query-devtools@5.51.21': - resolution: {integrity: sha512-mi5ef8dvsS48GsG6/8M60O2EgrzPK1kNPngOcHBTlIUrB5dGkxP9fuHf05GQRxtSp5W5GlyeUpzOmtkKNpf9dQ==} - peerDependencies: - '@tanstack/react-query': ^5.51.21 - react: ^18 || ^19 + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] - '@tanstack/react-query@5.51.21': - resolution: {integrity: sha512-Q/V81x3sAYgCsxjwOkfLXfrmoG+FmDhLeHH5okC/Bp8Aaw2c33lbEo/mMcMnkxUPVtB2FLpzHT0tq3c+OlZEbw==} - peerDependencies: - react: ^18.0.0 + '@esbuild/freebsd-x64@0.23.0': + resolution: {integrity: sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] - '@tanstack/react-store@0.5.5': - resolution: {integrity: sha512-1orYXGatBqXCYKuroFwV8Ll/6aDa5E3pU6RR4h7RvRk7TmxF1+zLCsWALZaeijXkySNMGmvawSbUXRypivg2XA==} - peerDependencies: - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] - '@tanstack/react-virtual@3.8.4': - resolution: {integrity: sha512-Dq0VQr3QlTS2qL35g360QaJWBt7tCn/0xw4uZ0dHXPLO1Ak4Z4nVX4vuj1Npg1b/jqNMDToRtR5OIxM2NXRBWg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] - '@tanstack/store@0.5.5': - resolution: {integrity: sha512-EOSrgdDAJExbvRZEQ/Xhh9iZchXpMN+ga1Bnk8Nmygzs8TfiE6hbzThF+Pr2G19uHL6+DTDTHhJ8VQiOd7l4tA==} + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] - '@tanstack/virtual-core@3.8.4': - resolution: {integrity: sha512-iO5Ujgw3O1yIxWDe9FgUPNkGjyT657b1WNX52u+Wv1DyBFEpdCdGkuVaky0M3hHFqNWjAmHWTn4wgj9rTr7ZQg==} + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] - '@testing-library/dom@10.0.0': - resolution: {integrity: sha512-PmJPnogldqoVFf+EwbHvbBJ98MmqASV8kLrBYgsDNxQcFMeIS7JFL48sfyXvuMtgmWO/wMhh25odr+8VhDmn4g==} + '@esbuild/linux-arm64@0.23.0': + resolution: {integrity: sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==} engines: {node: '>=18'} + cpu: [arm64] + os: [linux] - '@testing-library/jest-dom@6.4.8': - resolution: {integrity: sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - - '@testing-library/react@16.0.0': - resolution: {integrity: sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==} + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} engines: {node: '>=18'} - peerDependencies: - '@testing-library/dom': ^10.0.0 - '@types/react': ^18.0.0 - '@types/react-dom': ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@trpc/client@11.0.0-rc.477': - resolution: {integrity: sha512-Ah/Er3vxTm2bIEUcIrike7Z/8Yc+DkFveU2ZHQQ0+zY7yxs931438+4OEJuY/Xl/0p5OTDeZTm6HBuZ1REFiyA==} - peerDependencies: - '@trpc/server': 11.0.0-rc.477+a467f8314 + cpu: [arm64] + os: [linux] - '@trpc/react-query@11.0.0-rc.477': - resolution: {integrity: sha512-1ZCAm0wv7yLmb3muq+5DTRxdKXzI1KjTrcM2+QRKCFu6EherGM8x6zGI36P9ZmC6o+SCoedzxqazDNe+kkqVqA==} - peerDependencies: - '@tanstack/react-query': ^5.49.2 - '@trpc/client': 11.0.0-rc.477+a467f8314 - '@trpc/server': 11.0.0-rc.477+a467f8314 - react: '>=18.2.0' - react-dom: '>=18.2.0' + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] - '@trpc/server@11.0.0-rc.477': - resolution: {integrity: sha512-K6zmjRv96fWilqm/ETehEK1DWsy5bSyrs2xbsNzCbjguMgamMhOClRHgYzJcwgLp2kasJ7QgD9YbahOhV1/u1w==} + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] - '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] - '@types/argparse@1.0.38': - resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + '@esbuild/linux-arm@0.23.0': + resolution: {integrity: sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] - '@types/babel__traverse@7.20.6': - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@esbuild/linux-ia32@0.23.0': + resolution: {integrity: sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] - '@types/body-parser@1.19.2': - resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] - '@types/bonjour@3.5.13': - resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] - '@types/braces@3.0.4': - resolution: {integrity: sha512-0WR3b8eaISjEW7RpZnclONaLFDf7buaowRHdqLp4vLj54AsSAYWfh3DRbfiYJY9XDxMgx1B4sE1Afw2PGpuHOA==} + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] - '@types/connect-history-api-fallback@1.5.4': - resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] - '@types/connect@3.4.35': - resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + '@esbuild/linux-loong64@0.23.0': + resolution: {integrity: sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] - '@types/conventional-commits-parser@5.0.0': - resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] - '@types/cookie@0.6.0': - resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] - '@types/eslint@9.6.0': - resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==} + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@esbuild/linux-mips64el@0.23.0': + resolution: {integrity: sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] - '@types/express-serve-static-core@4.17.36': - resolution: {integrity: sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==} + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] - '@types/html-minifier-terser@6.1.0': - resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@esbuild/linux-ppc64@0.23.0': + resolution: {integrity: sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] - '@types/http-proxy@1.17.14': - resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] - '@types/jsesc@3.0.3': - resolution: {integrity: sha512-YZZ9ZOAiiSVC6KApWd/fTCDTdTOOMiRU4Lq3/VSmXNPse8IvCVOn5kYRRLu900Ub1lTPurVZFI5unEqLDJR7wg==} + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] - '@types/micromatch@4.0.7': - resolution: {integrity: sha512-C/FMQ8HJAZhTsDpl4wDKZdMeeW5USjgzOczUwTGbRc1ZopPgOhIEnxY2ZgUrsuyy4DwK1JVOJZKFakv3TbCKiA==} + '@esbuild/linux-riscv64@0.23.0': + resolution: {integrity: sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] - '@types/mime@1.3.2': - resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] - '@types/mime@3.0.4': - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] - '@types/mute-stream@0.0.4': - resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] - '@types/node-forge@1.3.11': - resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] - '@types/node@20.14.9': - resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} + '@esbuild/linux-s390x@0.23.0': + resolution: {integrity: sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] - '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] - '@types/prop-types@15.7.12': - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] - '@types/qs@6.9.7': - resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] - '@types/range-parser@1.2.4': - resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] - '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + '@esbuild/linux-x64@0.23.0': + resolution: {integrity: sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] - '@types/react@18.3.3': - resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] - '@types/resolve@1.20.2': - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] - '@types/retry@0.12.2': - resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] - '@types/send@0.17.1': - resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} + '@esbuild/netbsd-x64@0.23.0': + resolution: {integrity: sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] - '@types/serve-index@1.9.4': - resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] - '@types/serve-static@1.15.5': - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + '@esbuild/openbsd-arm64@0.23.0': + resolution: {integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] - '@types/sockjs@0.3.36': - resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] - '@types/statuses@2.0.5': - resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] - '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] - '@types/triple-beam@1.3.5': - resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] - '@types/unist@3.0.2': - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@esbuild/openbsd-x64@0.23.0': + resolution: {integrity: sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] - '@types/wrap-ansi@3.0.0': - resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] - '@types/ws@8.5.10': - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] - '@types/yargs-parser@21.0.0': - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] - '@types/yargs@17.0.32': - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] - '@typescript-eslint/eslint-plugin@5.62.0': - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^8.57.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@esbuild/sunos-x64@0.23.0': + resolution: {integrity: sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] - '@typescript-eslint/eslint-plugin@7.18.0': - resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.57.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] - '@typescript-eslint/experimental-utils@5.62.0': - resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^8.57.0 + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] - '@typescript-eslint/parser@5.62.0': - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^8.57.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] - '@typescript-eslint/parser@7.18.0': - resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.57.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@esbuild/win32-arm64@0.23.0': + resolution: {integrity: sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] - '@typescript-eslint/scope-manager@7.17.0': - resolution: {integrity: sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] - '@typescript-eslint/scope-manager@7.18.0': - resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] - '@typescript-eslint/scope-manager@8.0.0': - resolution: {integrity: sha512-V0aa9Csx/ZWWv2IPgTfY7T4agYwJyILESu/PVqFtTFz9RIS823mAze+NbnBI8xiwdX3iqeQbcTYlvB04G9wyQw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] - '@typescript-eslint/type-utils@5.62.0': - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^8.57.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] - '@typescript-eslint/type-utils@7.17.0': - resolution: {integrity: sha512-XD3aaBt+orgkM/7Cei0XNEm1vwUxQ958AOLALzPlbPqb8C1G8PZK85tND7Jpe69Wualri81PLU+Zc48GVKIMMA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.57.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@esbuild/win32-ia32@0.23.0': + resolution: {integrity: sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] - '@typescript-eslint/type-utils@7.18.0': - resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.57.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] - '@typescript-eslint/type-utils@8.0.0': - resolution: {integrity: sha512-mJAFP2mZLTBwAn5WI4PMakpywfWFH5nQZezUQdSKV23Pqo6o9iShQg1hP2+0hJJXP2LnZkWPphdIq4juYYwCeg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] - '@typescript-eslint/types@7.17.0': - resolution: {integrity: sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==} - engines: {node: ^18.18.0 || >=20.0.0} + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] - '@typescript-eslint/types@7.18.0': - resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} - engines: {node: ^18.18.0 || >=20.0.0} + '@esbuild/win32-x64@0.23.0': + resolution: {integrity: sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] - '@typescript-eslint/types@8.0.0': - resolution: {integrity: sha512-wgdSGs9BTMWQ7ooeHtu5quddKKs5Z5dS+fHLbrQI+ID0XWJLODGMHRfhwImiHoeO2S5Wir2yXuadJN6/l4JRxw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^9.10.0 - '@typescript-eslint/typescript-estree@7.17.0': - resolution: {integrity: sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@typescript-eslint/typescript-estree@7.18.0': - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@eslint-react/ast@1.14.1': + resolution: {integrity: sha512-FzhWRl/kBF5cZky4G/I5kkRiwVUTjGNfP+fwwx94NImaH1CvnMk6ataBNNtvxXKrbWGpZSexT4vHjotfZTEXMA==} - '@typescript-eslint/typescript-estree@8.0.0': - resolution: {integrity: sha512-5b97WpKMX+Y43YKi4zVcCVLtK5F98dFls3Oxui8LbnmRsseKenbbDinmvxrWegKDMmlkIq/XHuyy0UGLtpCDKg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint-react/core@1.14.1': + resolution: {integrity: sha512-SK19+40fAYWtliPV9cRIZr0cnKIBkQJE8XWr0R2QobrWw2tkKKYqCLWwR0TpuxrjAd/JpG5TTcPHAgffCRtliw==} + + '@eslint-react/eslint-plugin@1.14.1': + resolution: {integrity: sha512-aMuUJrSbUCj/+S4McaMNuEg2R8JA8aZVLgdLf5bYuNi7YYpZ7kIMaKdlLW53UlaER9kRb8lrorFUL3cyg7Yc4w==} + engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: - typescript: '*' + eslint: ^9.10.0 + typescript: ^4.9.5 || ^5.3.3 peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/utils@5.62.0': - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^8.57.0 + '@eslint-react/jsx@1.14.1': + resolution: {integrity: sha512-NN8pIM3gZDk7Zusd2fFBaA78Zv98PxBDEBP/lxwSZNkuuUtgrHEBYWKRYs10hz1B6Vp1bvhIcnLO/BQThvJJog==} - '@typescript-eslint/utils@7.17.0': - resolution: {integrity: sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.57.0 + '@eslint-react/shared@1.14.1': + resolution: {integrity: sha512-gceHz2fZeJh+EwxQC+ozh+cFbnpDALnDxpamDFxZI1QRdy0wtrB0MjJFSSZ9F6WUITWxoic2T3071U9BCjI3/Q==} - '@typescript-eslint/utils@7.18.0': - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.57.0 + '@eslint-react/tools@1.14.1': + resolution: {integrity: sha512-4kutt+JCXuLatE6fBuNJ6IA2+ndgdymEvq/HQuhW2Xs6+pEqaxwrHT2GeaQbc5U8pfJCEWAYvYX1r0XF/v9gJQ==} + + '@eslint-react/types@1.14.1': + resolution: {integrity: sha512-WWw6e8/EHMIMOmN3SvvfiNyKJdQOrt1ugTAJIPHnNyKzOgCKhpN0xbtIQY3ghjhAm3GBO87aWB42q6a/YZd00w==} - '@typescript-eslint/utils@8.0.0': - resolution: {integrity: sha512-k/oS/A/3QeGLRvOWCg6/9rATJL5rec7/5s1YmdS0ZU6LHveJyGFwBvLhSRBv6i9xaj7etmosp+l+ViN1I9Aj/Q==} + '@eslint-react/var@1.14.1': + resolution: {integrity: sha512-dzjwC4XM5v3aT1pc+1JxV3aZne4eyjiu+/ajkpCgnDM7Cual63uaHNBTE4LBUQiA2/oYU4iHAa9EcEn31k3EhA==} + + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.1.0': + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@7.17.0': - resolution: {integrity: sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==} - engines: {node: ^18.18.0 || >=20.0.0} + '@eslint/js@9.10.0': + resolution: {integrity: sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@7.18.0': - resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.0.0': - resolution: {integrity: sha512-oN0K4nkHuOyF3PVMyETbpP5zp6wfyOvm7tWhTMfoqxSSsPmJIh6JNASuZDlODE8eE+0EB9uar+6+vxr9DBTYOA==} + '@eslint/plugin-kit@0.1.0': + resolution: {integrity: sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@fastify/busboy@2.1.0': + resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} + engines: {node: '>=14'} - '@vercel/nft@0.26.5': - resolution: {integrity: sha512-NHxohEqad6Ra/r4lGknO52uc/GrWILXAMs1BB4401GTqww0fw1bAqzpG1XHuDO+dprg4GvsD9ZLLSsdo78p9hQ==} - engines: {node: '>=16'} - hasBin: true + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} - '@vinxi/listhen@1.5.6': - resolution: {integrity: sha512-WSN1z931BtasZJlgPp704zJFnQFRg7yzSjkm3MzAWQYe4uXFXlFr1hc5Ac2zae5/HDOz5x1/zDM5Cb54vTCnWw==} - hasBin: true + '@humanwhocodes/retry@0.3.0': + resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + engines: {node: '>=18.18'} - '@vinxi/plugin-directives@0.4.1': - resolution: {integrity: sha512-NsHCDyqU00i4RKGBoNNcBuONEirg/XfGgPCLFK1CZw3AYBE19haFSgvuo21Bx+BFGcwdRU3BRtaBMvwjLrUCnw==} - peerDependencies: - vinxi: ^0.4.0 + '@inquirer/checkbox@2.5.0': + resolution: {integrity: sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==} + engines: {node: '>=18'} - '@vinxi/react-server-dom@0.0.3': - resolution: {integrity: sha512-ZJJZtuw1TbGFOBuDZBHmM3w40yzFpNFWoPCoC2QtZBkYEQXYF9sOHHxkjTfNvk4rSn/zaUAs6KNUbVRvebq/1Q==} - engines: {node: '>=0.10.0'} - peerDependencies: - react: 0.0.0-experimental-035a41c4e-20230704 - react-dom: 0.0.0-experimental-035a41c4e-20230704 - vite: ^4.3.9 + '@inquirer/confirm@3.2.0': + resolution: {integrity: sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==} + engines: {node: '>=18'} - '@vinxi/react@0.2.3': - resolution: {integrity: sha512-/JMHdzGzmoBTrXtW95E7DAvsF5bMrstz/2hphkL47Yb5iRaBNKs2Si4yTyHPmRHSh4teNRm/2YmvClRHtvQi4Q==} + '@inquirer/core@9.1.0': + resolution: {integrity: sha512-RZVfH//2ytTjmaBIzeKT1zefcQZzuruwkpTwwbe/i2jTl4o9M+iML5ChULzz6iw1Ok8iUBBsRCjY2IEbD8Ft4w==} + engines: {node: '>=18'} - '@vinxi/server-components@0.4.1': - resolution: {integrity: sha512-rMS+RCGr1tujO1xWgILMLpOWIyw2OwDO46EtkuhTfqaVgLLt/w7+hxzOnh4s3O9sXoKKuUswtj9/MpQQkFoMOQ==} - peerDependencies: - vinxi: ^0.4.0 + '@inquirer/editor@2.2.0': + resolution: {integrity: sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==} + engines: {node: '>=18'} - '@vinxi/server-functions@0.4.1': - resolution: {integrity: sha512-dj5v9V+DurXK8w/nBDgJof+UsK3bkcgk6K/xBUg+WVmn7sUrLTurDTGRkCaknC6tQCyadNzj4FWGGc+qlrWf9g==} - peerDependencies: - vinxi: ^0.4.0 + '@inquirer/expand@2.3.0': + resolution: {integrity: sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==} + engines: {node: '>=18'} - '@vitejs/plugin-react@4.3.1': - resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 + '@inquirer/figures@1.0.5': + resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==} + engines: {node: '>=18'} - '@vitest/expect@1.6.0': - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@inquirer/input@2.3.0': + resolution: {integrity: sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==} + engines: {node: '>=18'} - '@vitest/runner@1.6.0': - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@inquirer/number@1.1.0': + resolution: {integrity: sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==} + engines: {node: '>=18'} - '@vitest/snapshot@1.6.0': - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@inquirer/password@2.2.0': + resolution: {integrity: sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==} + engines: {node: '>=18'} - '@vitest/spy@1.6.0': - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@inquirer/prompts@5.5.0': + resolution: {integrity: sha512-BHDeL0catgHdcHbSFFUddNzvx/imzJMft+tWDPwTm3hfu8/tApk1HrooNngB2Mb4qY+KaRWF+iZqoVUPeslEog==} + engines: {node: '>=18'} - '@vitest/utils@1.6.0': - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@inquirer/rawlist@2.3.0': + resolution: {integrity: sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==} + engines: {node: '>=18'} - '@volar/language-core@1.11.1': - resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} + '@inquirer/search@1.1.0': + resolution: {integrity: sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ==} + engines: {node: '>=18'} - '@volar/language-core@2.4.0': - resolution: {integrity: sha512-FTla+khE+sYK0qJP+6hwPAAUwiNHVMph4RUXpxf/FIPKUP61NFrVZorml4mjFShnueR2y9/j8/vnh09YwVdH7A==} + '@inquirer/select@2.5.0': + resolution: {integrity: sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==} + engines: {node: '>=18'} - '@volar/source-map@1.11.1': - resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} + '@inquirer/type@1.5.3': + resolution: {integrity: sha512-xUQ14WQGR/HK5ei+2CvgcwoH9fQ4PgPGmVFSN0pc1+fVyDL3MREhyAY7nxEErSu6CkllBM3D7e3e+kOvtu+eIg==} + engines: {node: '>=18'} - '@volar/source-map@2.4.0': - resolution: {integrity: sha512-2ceY8/NEZvN6F44TXw2qRP6AQsvCYhV2bxaBPWxV9HqIfkbRydSksTFObCF1DBDNBfKiZTS8G/4vqV6cvjdOIQ==} + '@ioredis/commands@1.2.0': + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} - '@volar/typescript@1.11.1': - resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} - '@volar/typescript@2.4.0': - resolution: {integrity: sha512-9zx3lQWgHmVd+JRRAHUSRiEhe4TlzL7U7e6ulWXOxHH/WNYxzKwCvZD7WYWEZFdw4dHfTD9vUR0yPQO6GilCaQ==} + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@vue/compiler-core@3.4.27': - resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} - '@vue/compiler-dom@3.4.27': - resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==} + '@jridgewell/resolve-uri@3.1.1': + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} - '@vue/compiler-vue2@2.7.16': - resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@vue/language-core@1.8.27': - resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + tslib: '2' - '@vue/language-core@2.0.29': - resolution: {integrity: sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==} + '@jsonjoy.com/json-pack@1.0.4': + resolution: {integrity: sha512-aOcSN4MeAtFROysrbqG137b7gaDDSmVrl5mpo6sT/w+kcXpWnzhMjmY/Fh/sDx26NBxyIE7MB1seqLeCAzy9Sg==} + engines: {node: '>=10.0'} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + tslib: '2' - '@vue/shared@3.4.27': - resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} + '@jsonjoy.com/util@1.2.0': + resolution: {integrity: sha512-4B8B+3vFsY4eo33DMKyJPlQ3sBMpPFUZK2dr3O3rXrOGKKbYG44J0XSFkDo1VOQiri5HFEhIeVvItjR2xcazmg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' - '@web3-storage/multipart-parser@1.0.0': - resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} + '@kwsites/file-exists@1.1.1': + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} - '@webassemblyjs/ast@1.12.1': - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + '@kwsites/promise-deferred@1.1.1': + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - '@webassemblyjs/floating-point-hex-parser@1.11.6': - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - '@webassemblyjs/helper-api-error@1.11.6': - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + '@mapbox/node-pre-gyp@1.0.11': + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true - '@webassemblyjs/helper-buffer@1.12.1': - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + '@microsoft/api-extractor-model@7.29.4': + resolution: {integrity: sha512-LHOMxmT8/tU1IiiiHOdHFF83Qsi+V8d0kLfscG4EvQE9cafiR8blOYr8SfkQKWB1wgEilQgXJX3MIA4vetDLZw==} - '@webassemblyjs/helper-numbers@1.11.6': - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + '@microsoft/api-extractor@7.47.4': + resolution: {integrity: sha512-HKm+P4VNzWwvq1Ey+Jfhhj/3MjsD+ka2hbt8L5AcRM95lu1MFOYnz3XlU7Gr79Q/ZhOb7W/imAKeYrOI0bFydg==} + hasBin: true - '@webassemblyjs/helper-wasm-bytecode@1.11.6': - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + '@microsoft/tsdoc-config@0.17.0': + resolution: {integrity: sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==} - '@webassemblyjs/helper-wasm-section@1.12.1': - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + '@microsoft/tsdoc@0.15.0': + resolution: {integrity: sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==} - '@webassemblyjs/ieee754@1.11.6': - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + '@module-federation/runtime-tools@0.5.1': + resolution: {integrity: sha512-nfBedkoZ3/SWyO0hnmaxuz0R0iGPSikHZOAZ0N/dVSQaIzlffUo35B5nlC2wgWIc0JdMZfkwkjZRrnuuDIJbzg==} - '@webassemblyjs/leb128@1.11.6': - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + '@module-federation/runtime@0.5.1': + resolution: {integrity: sha512-xgiMUWwGLWDrvZc9JibuEbXIbhXg6z2oUkemogSvQ4LKvrl/n0kbqP1Blk669mXzyWbqtSp6PpvNdwaE1aN5xQ==} - '@webassemblyjs/utf8@1.11.6': - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + '@module-federation/sdk@0.5.1': + resolution: {integrity: sha512-exvchtjNURJJkpqjQ3/opdbfeT2wPKvrbnGnyRkrwW5o3FH1LaST1tkiNviT6OXTexGaVc2DahbdniQHVtQ7pA==} - '@webassemblyjs/wasm-edit@1.12.1': - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + '@module-federation/webpack-bundler-runtime@0.5.1': + resolution: {integrity: sha512-mMhRFH0k2VjwHt3Jol9JkUsmI/4XlrAoBG3E0o7HoyoPYv1UFOWyqAflfANcUPgbYpvqmyLzDcO+3IT36LXnrA==} - '@webassemblyjs/wasm-gen@1.12.1': - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + '@mswjs/interceptors@0.27.2': + resolution: {integrity: sha512-mE6PhwcoW70EX8+h+Y/4dLfHk33GFt/y5PzDJz56ktMyaVGFXMJ5BYLbUjdmGEABfE0x5GgAGyKbrbkYww2s3A==} + engines: {node: '>=18'} - '@webassemblyjs/wasm-opt@1.12.1': - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + '@mswjs/interceptors@0.35.6': + resolution: {integrity: sha512-PpD687w7qLxVMK176bpQjbzU9O0VC75QnBK5U1lKd29s4hIuxfTItUD6raNKyQ6BN8b64/8HE34RuYTkwH9uPQ==} + engines: {node: '>=18'} - '@webassemblyjs/wasm-parser@1.12.1': - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + '@napi-rs/wasm-runtime@0.2.4': + resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} - '@webassemblyjs/wast-printer@1.12.1': - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + '@netlify/functions@2.6.3': + resolution: {integrity: sha512-7Z9gWyAuPI2NnBOvpYPD66KIWOgNznLz9BkyZ0c7qeRE6p23UCMVZ2VsrJpjPDgoJtKplGSBzASl6fQD7iEeWw==} + engines: {node: '>=14.0.0'} - '@webpack-cli/configtest@2.1.1': - resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x + '@netlify/node-cookies@0.1.0': + resolution: {integrity: sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==} + engines: {node: ^14.16.0 || >=16.0.0} - '@webpack-cli/info@2.0.2': - resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x + '@netlify/serverless-functions-api@1.18.0': + resolution: {integrity: sha512-VCU5btoGZ8M6iI7HSwpfZXCpBLKWFmRtq5xYt0K7dY96BZWVBmaZY6Tn+w4L2DrGXwAsIeOFNp8CHjVXfuCAkg==} + engines: {node: '>=18.0.0'} - '@webpack-cli/serve@2.0.5': - resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - webpack-dev-server: '*' - peerDependenciesMeta: - webpack-dev-server: - optional: true + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nrwl/tao@19.7.3': + resolution: {integrity: sha512-cIGhnSFPZdVTp4bI0fqwFoE9i7ToPg5jXz+hNMl/MTwcOQfKQ1JJY/ZPLM3aBUPORFIZ/GECQEycUb6+xCB56g==} + hasBin: true + + '@nx/nx-darwin-arm64@19.7.3': + resolution: {integrity: sha512-0dDK0UkMR0vBv4AP/48Q9A+OC2dvpivdt8su/4W/CPADy69M9B5O3jPiK+jTRsLshQG/soC9JG0Rll1BNWymPg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@nx/nx-darwin-x64@19.7.3': + resolution: {integrity: sha512-hTdv5YY2GQTdT7GwVO7ST27ZzvCmAQvmkEapfnCdy74QsL4gapaXJFvtWLHVfG6qHNRHWXbpdegvR3VswRHZVQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@nx/nx-freebsd-x64@19.7.3': + resolution: {integrity: sha512-dwuB/3eoV2RbD0b0LHnagQOXa9PKAjLi7g5vNxzw6LuNT1tdaLaUZZGv2tfG0hHjsV0cOaAX41rEyOIwJyE7zg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@nx/nx-linux-arm-gnueabihf@19.7.3': + resolution: {integrity: sha512-X/eG3IqvIxlCfIOiCQKv7RKwra54I+SN9zj2TeSOtd/uK0paa3mYSlGUJqoP3wpzasW1+EPIGkTQqV283IA15w==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@nx/nx-linux-arm64-gnu@19.7.3': + resolution: {integrity: sha512-LNaX8DVcPlFVJhMf1AAAR6j1DZF9BlVhWlilRM44tIfnmvPfKIahKJIJbuikHE7q+lkvMrQUUDXKiQJlmm/qDw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + '@nx/nx-linux-arm64-musl@19.7.3': + resolution: {integrity: sha512-TJ9PqSebhrn8NfrW+wqMXB9N65U0L0Kjt8FfahWffNKtSAEUvhurbNhqna2Rt5WJe2qaVf6zN2pOHKhF/5pL0w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@nx/nx-linux-x64-gnu@19.7.3': + resolution: {integrity: sha512-YMb4WGGovwgxsP6VvAEnyWvLoUwsDrdE5CxFQ2yoThD2BixmSHUKLtx6dtPDHz25nOE3v1ZzM0xTwYXBhPaeRQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] - '@yarnpkg/lockfile@1.1.0': - resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + '@nx/nx-linux-x64-musl@19.7.3': + resolution: {integrity: sha512-zkjgDSvw2eDN+KuJBPPAPhU/lOdiMvJU0UMthJFw85dhQIYfAO8+UgiFg/qBsKo0kQ0MkhntnIPBPF8bH40qWg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] - '@yarnpkg/parsers@3.0.0-rc.46': - resolution: {integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==} - engines: {node: '>=14.15.0'} + '@nx/nx-win32-arm64-msvc@19.7.3': + resolution: {integrity: sha512-qCTFG6VxNvEe5JfoAELGZsjWDL4G+2NVSoSS3tByJYwVX256qgALcVoUHMjpxBn9FeOvUW9w5PL4Am4PKDdXLw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] - '@zkochan/js-yaml@0.0.7': - resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} - hasBin: true + '@nx/nx-win32-x64-msvc@19.7.3': + resolution: {integrity: sha512-ULNf73gLgB5cU/O4dlQe6tetbRIROTmaUNYTUUCCAC0BqVwZwPDxn4u9C5LgiErVyfPwwAhlserCGei5taLASQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] - '@zxing/text-encoding@0.9.0': - resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true + '@open-draft/logger@0.3.0': + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + '@open-draft/until@2.1.0': + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} + '@opentelemetry/api-logs@0.50.0': + resolution: {integrity: sha512-JdZuKrhOYggqOpUljAq4WWNi5nB10PmgoF0y2CvedLGXd0kSawb/UBnWT8gg1ND3bHCNHStAIVT0ELlxJJRqrA==} + engines: {node: '>=14'} - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + '@opentelemetry/api@1.8.0': + resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} + engines: {node: '>=8.0.0'} - acorn-import-attributes@1.9.5: - resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + '@opentelemetry/core@1.23.0': + resolution: {integrity: sha512-hdQ/a9TMzMQF/BO8Cz1juA43/L5YGtCSiKoOHmrTEf7VMDAZgy8ucpWx3eQTnQ3gBloRcWtzvcrMZABC3PTSKQ==} + engines: {node: '>=14'} peerDependencies: - acorn: ^8 + '@opentelemetry/api': '>=1.0.0 <1.9.0' - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + '@opentelemetry/core@1.24.1': + resolution: {integrity: sha512-wMSGfsdmibI88K9wB498zXY04yThPexo8jvwNNlm542HZB7XrrMRBbAyKJqG8qDRJwIBdBrPMi4V9ZPW/sqrcg==} + engines: {node: '>=14'} peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn-loose@8.3.0: - resolution: {integrity: sha512-75lAs9H19ldmW+fAbyqHdjgdCrz0pWGXKmnqFoh8PyVd1L2RIb4RzYrSjmopeqv3E1G3/Pimu6GgLlrGbrkF7w==} - engines: {node: '>=0.4.0'} + '@opentelemetry/api': '>=1.0.0 <1.9.0' - acorn-typescript@1.4.13: - resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==} + '@opentelemetry/otlp-transformer@0.50.0': + resolution: {integrity: sha512-s0sl1Yfqd5q1Kjrf6DqXPWzErL+XHhrXOfejh4Vc/SMTNqC902xDsC8JQxbjuramWt/+hibfguIvi7Ns8VLolA==} + engines: {node: '>=14'} peerDependencies: - acorn: '>=8.9.0' - - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} - hasBin: true - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} + '@opentelemetry/api': '>=1.3.0 <1.9.0' - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + '@opentelemetry/resources@1.23.0': + resolution: {integrity: sha512-iPRLfVfcEQynYGo7e4Di+ti+YQTAY0h5mQEUJcHlU9JOqpb4x965O6PZ+wMcwYVY63G96KtdS86YCM1BF1vQZg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' - ajv-draft-04@1.0.0: - resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + '@opentelemetry/resources@1.24.1': + resolution: {integrity: sha512-cyv0MwAaPF7O86x5hk3NNgenMObeejZFLJJDVuSeSMIsknlsj3oOZzRv3qSzlwYomXsICfBeFFlxwHQte5mGXQ==} + engines: {node: '>=14'} peerDependencies: - ajv: ^8.5.0 - peerDependenciesMeta: - ajv: - optional: true + '@opentelemetry/api': '>=1.0.0 <1.9.0' - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + '@opentelemetry/sdk-logs@0.50.0': + resolution: {integrity: sha512-PeUEupBB29p9nlPNqXoa1PUWNLsZnxG0DCDj3sHqzae+8y76B/A5hvZjg03ulWdnvBLYpnJslqzylG9E0IL87g==} + engines: {node: '>=14'} peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true + '@opentelemetry/api': '>=1.4.0 <1.9.0' + '@opentelemetry/api-logs': '>=0.39.1' - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + '@opentelemetry/sdk-metrics@1.23.0': + resolution: {integrity: sha512-4OkvW6+wST4h6LFG23rXSTf6nmTf201h9dzq7bE0z5R9ESEVLERZz6WXwE7PSgg1gdjlaznm1jLJf8GttypFDg==} + engines: {node: '>=14'} peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true + '@opentelemetry/api': '>=1.3.0 <1.9.0' - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + '@opentelemetry/sdk-trace-base@1.23.0': + resolution: {integrity: sha512-PzBmZM8hBomUqvCddF/5Olyyviayka44O5nDWq673np3ctnvwMOvNrsUORZjKja1zJbwEuD9niAGbnVrz3jwRQ==} + engines: {node: '>=14'} peerDependencies: - ajv: ^6.9.1 + '@opentelemetry/api': '>=1.0.0 <1.9.0' - ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + '@opentelemetry/sdk-trace-base@1.24.1': + resolution: {integrity: sha512-zz+N423IcySgjihl2NfjBf0qw1RWe11XIAWVrTNOSSI6dtSPJiVom2zipFB2AEEtJWpv0Iz6DY6+TjnyTV5pWg==} + engines: {node: '>=14'} peerDependencies: - ajv: ^8.8.2 + '@opentelemetry/api': '>=1.0.0 <1.9.0' - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + '@opentelemetry/semantic-conventions@1.23.0': + resolution: {integrity: sha512-MiqFvfOzfR31t8cc74CTP1OZfz7MbqpAnLCra8NqQoaHJX6ncIRTdYOQYBDQ2uFISDq0WY8Y9dDTWvsgzzBYRg==} + engines: {node: '>=14'} - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + '@opentelemetry/semantic-conventions@1.24.1': + resolution: {integrity: sha512-VkliWlS4/+GHLLW7J/rVBA00uXus1SWvwFvcUDxDwmFxYfg/2VI6ekwdXS28cjI8Qz2ky2BzG8OUHo+WeYIWqw==} + engines: {node: '>=14'} - ajv@8.13.0: - resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + '@parcel/watcher-android-arm64@2.4.1': + resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] - ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + '@parcel/watcher-darwin-arm64@2.4.1': + resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + '@parcel/watcher-darwin-x64@2.4.1': + resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + '@parcel/watcher-freebsd-x64@2.4.1': + resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] - ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} - hasBin: true + '@parcel/watcher-linux-arm-glibc@2.4.1': + resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + '@parcel/watcher-linux-arm64-glibc@2.4.1': + resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} + '@parcel/watcher-linux-arm64-musl@2.4.1': + resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + '@parcel/watcher-linux-x64-glibc@2.4.1': + resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + '@parcel/watcher-linux-x64-musl@2.4.1': + resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-wasm@2.3.0': + resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} + engines: {node: '>= 10.0.0'} + bundledDependencies: + - napi-wasm + + '@parcel/watcher-wasm@2.4.1': + resolution: {integrity: sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA==} + engines: {node: '>= 10.0.0'} + bundledDependencies: + - napi-wasm + + '@parcel/watcher-win32-arm64@2.4.1': + resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.4.1': + resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.4.1': + resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.4.1': + resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} + engines: {node: '>= 10.0.0'} - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + '@playwright/test@1.47.1': + resolution: {integrity: sha512-dbWpcNQZ5nj16m+A5UNScYx7HX5trIy7g4phrcitn+Nk83S32EBX/CLU4hiF4RGKX/yRc93AAqtfaXB7JWBd4Q==} + engines: {node: '>=18'} + hasBin: true - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + '@prisma/client@5.19.1': + resolution: {integrity: sha512-x30GFguInsgt+4z5I4WbkZP2CGpotJMUXy+Gl/aaUjHn2o1DnLYNTA+q9XdYmAQZM8fIIkvUiA2NpgosM3fneg==} + engines: {node: '>=16.13'} + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + '@prisma/debug@5.19.1': + resolution: {integrity: sha512-lAG6A6QnG2AskAukIEucYJZxxcSqKsMK74ZFVfCTOM/7UiyJQi48v6TQ47d6qKG3LbMslqOvnTX25dj/qvclGg==} - aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + '@prisma/engines-version@5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3': + resolution: {integrity: sha512-xR6rt+z5LnNqTP5BBc+8+ySgf4WNMimOKXRn6xfNRDSpHvbOEmd7+qAOmzCrddEc4Cp8nFC0txU14dstjH7FXA==} - archiver-utils@5.0.2: - resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} - engines: {node: '>= 14'} + '@prisma/engines@5.19.1': + resolution: {integrity: sha512-kR/PoxZDrfUmbbXqqb8SlBBgCjvGaJYMCOe189PEYzq9rKqitQ2fvT/VJ8PDSe8tTNxhc2KzsCfCAL+Iwm/7Cg==} - archiver@7.0.1: - resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} - engines: {node: '>= 14'} + '@prisma/fetch-engine@5.19.1': + resolution: {integrity: sha512-pCq74rtlOVJfn4pLmdJj+eI4P7w2dugOnnTXpRilP/6n5b2aZiA4ulJlE0ddCbTPkfHmOL9BfaRgA8o+1rfdHw==} - are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. + '@prisma/get-platform@5.19.1': + resolution: {integrity: sha512-sCeoJ+7yt0UjnR+AXZL7vXlg5eNxaFOwC23h0KvW1YIXUoa7+W2ZcAUhoEQBmJTW4GrFqCuZ8YSP0mkDa4k3Zg==} - arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + '@radix-ui/primitive@1.1.0': + resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + '@radix-ui/react-compose-refs@1.1.0': + resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + '@radix-ui/react-context@1.1.0': + resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - aria-hidden@1.2.3: - resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} - engines: {node: '>=10'} + '@radix-ui/react-dialog@1.1.1': + resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + '@radix-ui/react-dismissable-layer@1.1.0': + resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - arktype@2.0.0-beta.5: - resolution: {integrity: sha512-3bNUyiA2iuvyV/rfiErLli9HrrvC6W4XT8Ja6SAEihljM60PRQhYJEr5jM4MGGtj1k/oFxgOkHd++VjQrm6SoA==} + '@radix-ui/react-focus-guards@1.1.0': + resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + '@radix-ui/react-focus-scope@1.1.0': + resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - array-each@1.0.1: - resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} - engines: {node: '>=0.10.0'} + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + '@radix-ui/react-portal@1.1.1': + resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + '@radix-ui/react-presence@1.1.0': + resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} + '@radix-ui/react-primitive@2.0.0': + resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - array-slice@1.1.0: - resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} - engines: {node: '>=0.10.0'} + '@radix-ui/react-slot@1.1.0': + resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} + '@remix-run/react@2.11.1': + resolution: {integrity: sha512-bXilQrHx5WVHsdA6UFkWxYVePZJ1kzwfa/KYMdbMZi6zsSlv2/N6ZbgNuoemt8oM8/YgCT6EOPITzCgz+zEMVw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + typescript: ^5.1.0 + peerDependenciesMeta: + typescript: + optional: true - array.prototype.toreversed@1.1.2: - resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + '@remix-run/router@1.19.0': + resolution: {integrity: sha512-zDICCLKEwbVYTS6TjYaWtHXxkdoUvD/QXvyVZjGCsWz5vyH7aFeONlPffPdW+Y/t6KT0MgXb2Mfjun9YpWN1dA==} + engines: {node: '>=14.0.0'} - array.prototype.tosorted@1.1.3: - resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + '@remix-run/router@1.19.1': + resolution: {integrity: sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==} + engines: {node: '>=14.0.0'} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + '@remix-run/server-runtime@2.11.1': + resolution: {integrity: sha512-j3AlrZul0javvPR6ZWdN32/l12t1E90sLeZI/k+4HpT0ifjqJVg8uG6alRJ0LLN9ae5BERYEslUebUqdfejSkQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + typescript: ^5.1.0 + peerDependenciesMeta: + typescript: + optional: true - assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + '@remix-run/server-runtime@2.11.2': + resolution: {integrity: sha512-abG6ENj0X3eHqDxqO2thWM2NSEiPnqyt58z1BbiQCv+t8g0Zuqd5QHbB4wzdNvfS0vKhg+jJiigcJneAc4sZzw==} + engines: {node: '>=18.0.0'} + peerDependencies: + typescript: ^5.1.0 + peerDependenciesMeta: + typescript: + optional: true - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + '@rollup/plugin-alias@5.1.0': + resolution: {integrity: sha512-lpA3RZ9PdIG7qqhEfv79tBffNaoDuukFDrmhLqg9ifv99u/ehn+lOg30x2zmhf8AQqQUZaMk/B9fZraQ6/acDQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-babel@6.0.4': + resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + rollup: + optional: true - ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + '@rollup/plugin-commonjs@25.0.7': + resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true - ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} + '@rollup/plugin-inject@5.0.5': + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true - astring@1.8.6: - resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} - hasBin: true + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true - async-exit-hook@2.0.1: - resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} - engines: {node: '>=0.12.0'} + '@rollup/plugin-node-resolve@15.2.3': + resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true - async-sema@3.1.1: - resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + '@rollup/plugin-replace@5.0.7': + resolution: {integrity: sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true - async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + '@rollup/plugin-terser@0.4.4': + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} - autoprefixer@10.4.20: - resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} peerDependencies: - postcss: ^8.1.0 - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true - axe-core@4.7.0: - resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} - engines: {node: '>=4'} + '@rollup/rollup-android-arm-eabi@4.21.2': + resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} + cpu: [arm] + os: [android] - axios@1.7.2: - resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + '@rollup/rollup-android-arm64@4.21.2': + resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==} + cpu: [arm64] + os: [android] - axobject-query@3.2.1: - resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + '@rollup/rollup-darwin-arm64@4.21.2': + resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==} + cpu: [arm64] + os: [darwin] - b4a@1.6.6: - resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + '@rollup/rollup-darwin-x64@4.21.2': + resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==} + cpu: [x64] + os: [darwin] - babel-dead-code-elimination@1.0.6: - resolution: {integrity: sha512-JxFi9qyRJpN0LjEbbjbN8g0ux71Qppn9R8Qe3k6QzHg2CaKsbUQtbn307LQGiDLGjV6JCtEFqfxzVig9MyDCHQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': + resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==} + cpu: [arm] + os: [linux] - babel-plugin-add-module-exports@0.2.1: - resolution: {integrity: sha512-3AN/9V/rKuv90NG65m4tTHsI04XrCKsWbztIcW7a8H5iIN7WlvWucRtVV0V/rT4QvtA11n5Vmp20fLwfMWqp6g==} + '@rollup/rollup-linux-arm-musleabihf@4.21.2': + resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==} + cpu: [arm] + os: [linux] - babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} + '@rollup/rollup-linux-arm64-gnu@4.21.2': + resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==} + cpu: [arm64] + os: [linux] - babel-plugin-polyfill-corejs2@0.4.11: - resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@rollup/rollup-linux-arm64-musl@4.21.2': + resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==} + cpu: [arm64] + os: [linux] - babel-plugin-polyfill-corejs3@0.10.4: - resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': + resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==} + cpu: [ppc64] + os: [linux] - babel-plugin-polyfill-regenerator@0.6.2: - resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@rollup/rollup-linux-riscv64-gnu@4.21.2': + resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==} + cpu: [riscv64] + os: [linux] - babel-plugin-transform-react-remove-prop-types@0.4.24: - resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} + '@rollup/rollup-linux-s390x-gnu@4.21.2': + resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==} + cpu: [s390x] + os: [linux] - babel-preset-react-app@10.0.1: - resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} + '@rollup/rollup-linux-x64-gnu@4.21.2': + resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==} + cpu: [x64] + os: [linux] - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + '@rollup/rollup-linux-x64-musl@4.21.2': + resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==} + cpu: [x64] + os: [linux] - bare-events@2.2.2: - resolution: {integrity: sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==} + '@rollup/rollup-win32-arm64-msvc@4.21.2': + resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==} + cpu: [arm64] + os: [win32] - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + '@rollup/rollup-win32-ia32-msvc@4.21.2': + resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==} + cpu: [ia32] + os: [win32] - batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + '@rollup/rollup-win32-x64-msvc@4.21.2': + resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==} + cpu: [x64] + os: [win32] - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} + '@rsbuild/core@1.0.4': + resolution: {integrity: sha512-ACvCzeyW5gW5olGBzK5Tnc5RfUOQ+BPnMB7Y0Iycz0pRYAghKQcYkpPZlEpdsKQDNeBUKk9loOy+Z7Rca4Ouzw==} + engines: {node: '>=16.7.0'} + hasBin: true - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + '@rsbuild/plugin-react@1.0.2': + resolution: {integrity: sha512-8Sa4AJ43/ift7ZW1iNMA38ZIEDXNINPa8rGI38u7b42yBgMUWBan8yDjFYAC0Gkg3lh8vCWYVQYZp0RyIS7lqA==} + peerDependencies: + '@rsbuild/core': 1.x || ^1.0.1-rc.0 - birecord@0.1.1: - resolution: {integrity: sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==} + '@rspack/binding-darwin-arm64@1.0.5': + resolution: {integrity: sha512-pEHj4AOluOa7FaR1DMACPUUZKO3qZI4/66xaTqk0BbclvMT7eheQAWtkmjdE9WJgeZ389TrwZeaMzzPdHhK/6Q==} + cpu: [arm64] + os: [darwin] - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + '@rspack/binding-darwin-x64@1.0.5': + resolution: {integrity: sha512-xS5EDD9l3MHL54bnmxsndm61P9l3l7ZNuLSuPl2MbYJzDqPdnXhTdkIjdcDOLH2daFm8gfB634wa5knZhPGLOw==} + cpu: [x64] + os: [darwin] - body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + '@rspack/binding-linux-arm64-gnu@1.0.5': + resolution: {integrity: sha512-svPOFlem7s6T33tX8a28uD5Ngc7bdML96ioiH7Fhi0J/at+WAthor4GeUNwkwuzBQI/Nc9XCgiYPcE0pzP7c6w==} + cpu: [arm64] + os: [linux] - bonjour-service@1.2.1: - resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==} + '@rspack/binding-linux-arm64-musl@1.0.5': + resolution: {integrity: sha512-cysqogEUNc0TgzzXcK9bkv12eoCjqhLzOvGXQU1zSEU9Hov7tuzMDl3Z6R3A7NgOCmWu84/wOnTrkSOI28caew==} + cpu: [arm64] + os: [linux] - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + '@rspack/binding-linux-x64-gnu@1.0.5': + resolution: {integrity: sha512-qIEMsWOzTKpVm0Sg553gKkua49Kd/sElLD1rZcXjjxjAsD97uq8AiNncArMfYdDKgkKbtwtW/Fb3uVuafTLnZg==} + cpu: [x64] + os: [linux] - boxen@7.1.1: - resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} - engines: {node: '>=14.16'} + '@rspack/binding-linux-x64-musl@1.0.5': + resolution: {integrity: sha512-yulltMSQN3aBt3NMURYTmJcpAJBi4eEJ4i9qF0INE8f0885sJpI0j35/31POkCghG1ZOSZkYALFrheKKP9e8pg==} + cpu: [x64] + os: [linux] - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + '@rspack/binding-win32-arm64-msvc@1.0.5': + resolution: {integrity: sha512-5oF/qN6TnUj28UAdaOgSIWKq7HG5QgI4p37zvQBBTXZHhrwN2kE6H+TaofWnSqWJynwmGIxJIx8bGo3lDfFbfA==} + cpu: [arm64] + os: [win32] - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + '@rspack/binding-win32-ia32-msvc@1.0.5': + resolution: {integrity: sha512-y16IPjd/z6L7+r6RXLu7J/jlZDUenSnJDqo10HnnxtLjOJ+vna+pljI8sHcwu1ao0c3J3uMvbkF34dTiev7Opg==} + cpu: [ia32] + os: [win32] - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + '@rspack/binding-win32-x64-msvc@1.0.5': + resolution: {integrity: sha512-PSBTbDSgT+ClYvyQTDtWBi/bxXW/xJmVjg9NOWe8KAEl5WNU+pToiCBLLPCGDSa+K7/zr2TDb6QakG/qYItPZw==} + cpu: [x64] + os: [win32] - browserslist@4.23.3: - resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + '@rspack/binding@1.0.5': + resolution: {integrity: sha512-SnVrzRWeKSosJ0/1e5taAeqJ1ISst6NAE1N8YK4ZdUEVWmE26tC2V/yTvZHSsqatc/0Cf+A18IZJx0q6H/DlRw==} - btoa@1.2.1: - resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==} - engines: {node: '>= 0.4.0'} - hasBin: true + '@rspack/core@1.0.5': + resolution: {integrity: sha512-UlydS2VupZ6yBx3jCqCHpeEUQNWCrBkTQhPIezK0eCAk13i745byjqXX4tcfN6jR5Kjh/1CIb8r07k9DgGON1w==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true - buffer-crc32@1.0.0: - resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} - engines: {node: '>=8.0.0'} + '@rspack/lite-tapable@1.0.0': + resolution: {integrity: sha512-7MZf4lburSUZoEenwazwUDKHhqyfnLCGnQ/tKcUtztfmVzfjZfRn/EaiT0AKkYGnL2U8AGsw89oUeVyvaOLVCw==} + engines: {node: '>=16.0.0'} - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + '@rspack/plugin-react-refresh@1.0.0': + resolution: {integrity: sha512-WvXkLewW5G0Mlo5H1b251yDh5FFiH4NDAbYlFpvFjcuXX2AchZRf9zdw57BDE/ADyWsJgA8kixN/zZWBTN3iYA==} + peerDependencies: + react-refresh: '>=0.10.0 <1.0.0' + peerDependenciesMeta: + react-refresh: + optional: true - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + '@rushstack/node-core-library@5.5.1': + resolution: {integrity: sha512-ZutW56qIzH8xIOlfyaLQJFx+8IBqdbVCZdnj+XT1MorQ1JqqxHse8vbCpEM+2MjsrqcbxcgDIbfggB1ZSQ2A3g==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + '@rushstack/rig-package@0.5.3': + resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} + '@rushstack/terminal@0.13.3': + resolution: {integrity: sha512-fc3zjXOw8E0pXS5t9vTiIPx9gHA0fIdTXsu9mT4WbH+P3mYvnrX0iAQ5a6NvyK1+CqYWBTw/wVNx7SDJkI+WYQ==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true - bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} - engines: {node: '>=18'} + '@rushstack/ts-command-line@4.22.3': + resolution: {integrity: sha512-edMpWB3QhFFZ4KtSzS8WNjBgR4PXPPOVrOHMbb7kNpmQ1UFS9HdVtjCXg1H5fG+xYAbeE+TMPcVPUyX2p84STA==} - bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} + '@shikijs/core@1.11.0': + resolution: {integrity: sha512-VbEhDAhT/2ozO0TPr5/ZQBO/NWLqtk4ZiBf6NplYpF38mKjNfMMied5fNEfIfYfN+cdKvhDB4VMcKvG/g9c3zg==} - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - c12@1.10.0: - resolution: {integrity: sha512-0SsG7UDhoRWcuSvKWHaXmu5uNjDCDN3nkQLRL4Q42IlFy+ze58FcCoI3uPwINXinkz7ZinbhEgyzYFw9u9ZV8g==} + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + '@stylistic/eslint-plugin-js@2.7.1': + resolution: {integrity: sha512-4YgqaPhPV8nMAMWnRz+RB7S/CQh/ximISMj2QJ8HPveUzCqUBkeNV7iB4cggr4pkalcDCsIu0y4LhmrlS1yAgA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + '@supabase/auth-js@2.65.0': + resolution: {integrity: sha512-+wboHfZufAE2Y612OsKeVP4rVOeGZzzMLD/Ac3HrTQkkY4qXNjI6Af9gtmxwccE5nFvTiF114FEbIQ1hRq5uUw==} - camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + '@supabase/functions-js@2.4.1': + resolution: {integrity: sha512-8sZ2ibwHlf+WkHDUZJUXqqmPvWQ3UHN0W30behOJngVh/qHHekhJLCFbh0AjkE9/FqqXtf9eoVvmYgfCLk5tNA==} - camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} + '@supabase/node-fetch@2.6.15': + resolution: {integrity: sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==} + engines: {node: 4.x || >=6.0.0} - camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} + '@supabase/postgrest-js@1.16.1': + resolution: {integrity: sha512-EOSEZFm5pPuCPGCmLF1VOCS78DfkSz600PBuvBND/IZmMciJ1pmsS3ss6TkB6UkuvTybYiBh7gKOYyxoEO3USA==} - caniuse-lite@1.0.30001647: - resolution: {integrity: sha512-n83xdNiyeNcHpzWY+1aFbqCK7LuLfBricc4+alSQL2Xb6OR3XpnQAmlDG+pQcdTfiHRuLcQ96VOfrPSGiNJYSg==} + '@supabase/realtime-js@2.10.2': + resolution: {integrity: sha512-qyCQaNg90HmJstsvr2aJNxK2zgoKh9ZZA8oqb7UT2LCh3mj9zpa3Iwu167AuyNxsxrUE8eEJ2yH6wLCij4EApA==} - caniuse-lite@1.0.30001651: - resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + '@supabase/ssr@0.5.1': + resolution: {integrity: sha512-+G94H/GZG0nErZ3FQV9yJmsC5Rj7dmcfCAwOt37hxeR1La+QTl8cE9whzYwPUrTJjMLGNXoO+1BMvVxwBAbz4g==} + peerDependencies: + '@supabase/supabase-js': ^2.43.4 - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + '@supabase/storage-js@2.7.0': + resolution: {integrity: sha512-iZenEdO6Mx9iTR6T7wC7sk6KKsoDPLq8rdu5VRy7+JiT1i8fnqfcOr6mfF2Eaqky9VQzhP8zZKQYjzozB65Rig==} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + '@supabase/supabase-js@2.45.4': + resolution: {integrity: sha512-E5p8/zOLaQ3a462MZnmnz03CrduA5ySH9hZyL03Y+QZLIOO4/Gs8Rdy4ZCKDHsN7x0xdanVEWWFN3pJFQr9/hg==} - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} + '@swc/core-darwin-arm64@1.7.26': + resolution: {integrity: sha512-FF3CRYTg6a7ZVW4yT9mesxoVVZTrcSWtmZhxKCYJX9brH4CS/7PRPjAKNk6kzWgWuRoglP7hkjQcd6EpMcZEAw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + '@swc/core-darwin-x64@1.7.26': + resolution: {integrity: sha512-az3cibZdsay2HNKmc4bjf62QVukuiMRh5sfM5kHR/JMTrLyS6vSw7Ihs3UTkZjUxkLTT8ro54LI6sV6sUQUbLQ==} engines: {node: '>=10'} + cpu: [x64] + os: [darwin] - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + '@swc/core-linux-arm-gnueabihf@1.7.26': + resolution: {integrity: sha512-VYPFVJDO5zT5U3RpCdHE5v1gz4mmR8BfHecUZTmD2v1JeFY6fv9KArJUpjrHEEsjK/ucXkQFmJ0jaiWXmpOV9Q==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + '@swc/core-linux-arm64-gnu@1.7.26': + resolution: {integrity: sha512-YKevOV7abpjcAzXrhsl+W48Z9mZvgoVs2eP5nY+uoMAdP2b3GxC0Df1Co0I90o2lkzO4jYBpTMcZlmUXLdXn+Q==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + '@swc/core-linux-arm64-musl@1.7.26': + resolution: {integrity: sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + '@swc/core-linux-x64-gnu@1.7.26': + resolution: {integrity: sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w==} engines: {node: '>=10'} + cpu: [x64] + os: [linux] - chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} + '@swc/core-linux-x64-musl@1.7.26': + resolution: {integrity: sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] - citty@0.1.6: - resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + '@swc/core-win32-arm64-msvc@1.7.26': + resolution: {integrity: sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] - clean-css@5.3.3: - resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} - engines: {node: '>= 10.0'} + '@swc/core-win32-ia32-msvc@1.7.26': + resolution: {integrity: sha512-9YngxNcG3177GYdsTum4V98Re+TlCeJEP4kEwEg9EagT5s3YejYdKwVAkAsJszzkXuyRDdnHUpYbTrPG6FiXrQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} + '@swc/core-win32-x64-msvc@1.7.26': + resolution: {integrity: sha512-VR+hzg9XqucgLjXxA13MtV5O3C0bK0ywtLIBw/+a+O+Oc6mxFWHtdUeXDbIi5AiPbn0fjgVJMqYnyjGyyX8u0w==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] - cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + '@swc/core@1.7.26': + resolution: {integrity: sha512-f5uYFf+TmMQyYIoxkn/evWhNGuUzC730dFwAKGwBVHHVoPyak1/GvJUm6i1SKl+2Hrj9oN0i3WSoWWZ4pgI8lw==} engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '*' + peerDependenciesMeta: + '@swc/helpers': + optional: true - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - cli-spinners@2.6.1: - resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} - engines: {node: '>=6'} + '@swc/helpers@0.5.13': + resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} + '@swc/types@0.1.12': + resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==} - cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} + '@tanstack/config@0.13.1': + resolution: {integrity: sha512-p8K5lrwZPGjvfPuvP1UxHyucDmdADrHOqzpO/zRAhjqV6uBZBatZ2CTKR8Zlvekmb2bdXKjqBGoiyIuLiT0xTA==} + engines: {node: '>=18'} + hasBin: true - client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + '@tanstack/query-core@5.56.2': + resolution: {integrity: sha512-gor0RI3/R5rVV3gXfddh1MM+hgl0Z4G7tj6Xxpq6p2I03NGPaJ8dITY9Gz05zYYb/EJq9vPas/T4wn9EaDPd4Q==} - clipboardy@4.0.0: - resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} - engines: {node: '>=18'} + '@tanstack/query-devtools@5.56.1': + resolution: {integrity: sha512-xnp9jq/9dHfSCDmmf+A5DjbIjYqbnnUL2ToqlaaviUQGRTapXQ8J+GxusYUu1IG0vZMaWdiVUA4HRGGZYAUU+A==} - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + '@tanstack/react-query-devtools@5.56.2': + resolution: {integrity: sha512-7nINJtRZZVwhTTyDdMIcSaXo+EHMLYJu1S2e6FskvvD5prx87LlAXXWZDfU24Qm4HjshEtM5lS3HIOszNGblcw==} + peerDependencies: + '@tanstack/react-query': ^5.56.2 + react: ^18 || ^19 - clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} + '@tanstack/react-query@5.56.2': + resolution: {integrity: sha512-SR0GzHVo6yzhN72pnRhkEFRAHMsUo5ZPzAxfTMvUxFIDVS6W9LYUp6nXW3fcHVdg0ZJl8opSH85jqahvm6DSVg==} + peerDependencies: + react: ^18 || ^19 - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} + '@tanstack/react-store@0.5.5': + resolution: {integrity: sha512-1orYXGatBqXCYKuroFwV8Ll/6aDa5E3pU6RR4h7RvRk7TmxF1+zLCsWALZaeijXkySNMGmvawSbUXRypivg2XA==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} + '@tanstack/react-virtual@3.10.7': + resolution: {integrity: sha512-yeP+M0G8D+15ZFPivpuQ5hoM4Fa/PzERBx8P8EGcfEsXX3JOb9G9UUrqc47ZXAxvK+YqzM9T5qlJUYUFOwCZJw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} - engines: {node: '>=0.10.0'} + '@tanstack/store@0.5.5': + resolution: {integrity: sha512-EOSrgdDAJExbvRZEQ/Xhh9iZchXpMN+ga1Bnk8Nmygzs8TfiE6hbzThF+Pr2G19uHL6+DTDTHhJ8VQiOd7l4tA==} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + '@tanstack/virtual-core@3.10.7': + resolution: {integrity: sha512-ND5dfsU0n9F4gROzwNNDJmg6y8n9pI8YWxtgbfJ5UcNn7Hx+MxEXtXcQ189tS7sh8pmCObgz2qSiyRKTZxT4dg==} - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + '@testing-library/dom@10.0.0': + resolution: {integrity: sha512-PmJPnogldqoVFf+EwbHvbBJ98MmqASV8kLrBYgsDNxQcFMeIS7JFL48sfyXvuMtgmWO/wMhh25odr+8VhDmn4g==} + engines: {node: '>=18'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + '@testing-library/jest-dom@6.5.0': + resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + '@testing-library/react@16.0.1': + resolution: {integrity: sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 + '@types/react-dom': ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + '@trpc/client@11.0.0-rc.502': + resolution: {integrity: sha512-ysFQ3wHnjzLcAqeuwx9/B/YV+2XN/kmfAdTUG+O/SUAdP2wAwo6XbhOxlHw0HWS5pDCsTfJkxDr1nMVkuFM07Q==} + peerDependencies: + '@trpc/server': 11.0.0-rc.502+2a8c56027 - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true + '@trpc/react-query@11.0.0-rc.502': + resolution: {integrity: sha512-aWZZGFTxERXOzI0cb2zYoJQyLrnfJz7sqJVTR4/5UJQ1eCRdu7mFnni6rAlcAHI4r2iA+2xtBQ74JPlaVp5krg==} + peerDependencies: + '@tanstack/react-query': ^5.49.2 + '@trpc/client': 11.0.0-rc.502+2a8c56027 + '@trpc/server': 11.0.0-rc.502+2a8c56027 + react: '>=18.2.0' + react-dom: '>=18.2.0' - color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + '@trpc/server@11.0.0-rc.502': + resolution: {integrity: sha512-n6B8Q/UqF+hFXyCTXq9AWSn6EkXBbVo/Bs7/QzZxe5KD5CdnBomC7A1y6Qr+i0eiOWwTHJZQ0az+gJetb2fdxw==} - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} - colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} - combinate@1.1.11: - resolution: {integrity: sha512-+2MNAQ29HtNejOxkgaTQPC2Bm+pQvFuqf7o18uObl/Bx3daX06kjLUNY/qa9f+YSqzqm/ic3SdrlfN0fvTlw2g==} + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} + '@types/body-parser@1.19.2': + resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} + '@types/bonjour@3.5.13': + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} - commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + '@types/braces@3.0.4': + resolution: {integrity: sha512-0WR3b8eaISjEW7RpZnclONaLFDf7buaowRHdqLp4vLj54AsSAYWfh3DRbfiYJY9XDxMgx1B4sE1Afw2PGpuHOA==} - compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + '@types/connect-history-api-fallback@1.5.4': + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} - compare-versions@6.0.0-rc.1: - resolution: {integrity: sha512-cFhkjbGY1jLFWIV7KegECbfuyYPxSGvgGkdkfM+ibboQDoPwg2FRHm5BSNTOApiauRBzJIQH7qvOJs2sW5ueKQ==} + '@types/connect@3.4.35': + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} - compare-versions@6.1.1: - resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + '@types/conventional-commits-parser@5.0.0': + resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} - compress-commons@6.0.2: - resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} - engines: {node: '>= 14'} + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} + '@types/cross-spawn@6.0.6': + resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} - compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - computeds@0.0.1: - resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + '@types/express-serve-static-core@4.17.36': + resolution: {integrity: sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==} - concurrently@8.2.2: - resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} - engines: {node: ^14.13.0 || >=16.0.0} - hasBin: true + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/html-minifier-terser@6.1.0': + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/http-proxy@1.17.14': + resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} - confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + '@types/jsesc@3.0.3': + resolution: {integrity: sha512-YZZ9ZOAiiSVC6KApWd/fTCDTdTOOMiRU4Lq3/VSmXNPse8IvCVOn5kYRRLu900Ub1lTPurVZFI5unEqLDJR7wg==} - confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - connect-history-api-fallback@2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} + '@types/micromatch@4.0.7': + resolution: {integrity: sha512-C/FMQ8HJAZhTsDpl4wDKZdMeeW5USjgzOczUwTGbRc1ZopPgOhIEnxY2ZgUrsuyy4DwK1JVOJZKFakv3TbCKiA==} - consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} - engines: {node: ^14.18.0 || >=16.10.0} + '@types/mime@1.3.2': + resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + '@types/mime@3.0.4': + resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + '@types/mute-stream@0.0.4': + resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + '@types/node-forge@1.3.11': + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} - conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} + '@types/node@22.5.4': + resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} - conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} - engines: {node: '>=16'} - hasBin: true + '@types/phoenix@1.6.5': + resolution: {integrity: sha512-xegpDuR+z0UqG9fwHqNoy3rI7JDlvaPh2TY47Fl80oq6g+hXT+c/LEuE43X48clZ6lOfANl5WrPur9fYO1RJ/w==} - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - convex@1.13.2: - resolution: {integrity: sha512-XtXv5f5QXQgpcd+zcgecfIdUn1JmusGuHlP0c6XKxLEdA6v9dXI43/s5CgB3ioX1vwVTHpJBp0bqtpe37XXbuA==} - engines: {node: '>=16.15.1', npm: '>=7.0.0'} - hasBin: true - peerDependencies: - '@auth0/auth0-react': ^2.0.1 - '@clerk/clerk-react': ^4.12.8 || ^5.0.0 - react: ^17.0.2 || ^18.0.0 - react-dom: ^17.0.2 || ^18.0.0 - peerDependenciesMeta: - '@auth0/auth0-react': - optional: true - '@clerk/clerk-react': - optional: true - react: - optional: true - react-dom: - optional: true + '@types/qs@6.9.7': + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} - cookie-es@1.1.0: - resolution: {integrity: sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw==} + '@types/range-parser@1.2.4': + resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} - cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - cookie-signature@1.2.1: - resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} - engines: {node: '>=6.6.0'} + '@types/react@18.3.5': + resolution: {integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==} - cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} - copy-anything@3.0.2: - resolution: {integrity: sha512-CzATjGXzUQ0EvuvgOCI6A4BGOo2bcVx8B+eC2nF862iv9fopnPQwlrbACakNCHRIJbCSBj+J/9JeDf60k64MkA==} - engines: {node: '>=12.13'} + '@types/send@0.17.1': + resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} - core-js-compat@3.37.1: - resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} + '@types/serve-index@1.9.4': + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} - core-js@3.32.2: - resolution: {integrity: sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ==} + '@types/serve-static@1.15.5': + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} - core-js@3.38.1: - resolution: {integrity: sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==} + '@types/sockjs@0.3.36': + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + '@types/statuses@2.0.5': + resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} - cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true + '@types/unist@3.0.2': + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} - crc32-stream@6.0.0: - resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} - engines: {node: '>= 14'} + '@types/validate-npm-package-name@4.0.2': + resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} - croner@8.0.2: - resolution: {integrity: sha512-HgSdlSUX8mIgDTTiQpWUP4qY4IFRMsduPCYdca34Pelt8MVdxdaDOzreFtCscA6R+cRZd7UbD1CD3uyx6J3X1A==} - engines: {node: '>=18.0'} + '@types/wrap-ansi@3.0.0': + resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + '@types/ws@8.5.10': + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + '@types/yargs-parser@21.0.0': + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - crossws@0.2.4: - resolution: {integrity: sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==} + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + '@typescript-eslint/eslint-plugin@8.3.0': + resolution: {integrity: sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - uWebSockets.js: '*' + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^9.10.0 + typescript: '*' peerDependenciesMeta: - uWebSockets.js: + typescript: optional: true - css-select@4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + '@typescript-eslint/parser@8.3.0': + resolution: {integrity: sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} + '@typescript-eslint/rule-tester@8.5.0': + resolution: {integrity: sha512-ySLDyc7rktaTLcAICIKf5MG6tjc20g9e6oud4oG1OlsBLZlV9Yl4iuCnmBILojjST8/iYs5o1qebYhF1r97EfA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 - css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + '@typescript-eslint/scope-manager@8.3.0': + resolution: {integrity: sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true + '@typescript-eslint/scope-manager@8.5.0': + resolution: {integrity: sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - cssstyle@4.0.1: - resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} - engines: {node: '>=18'} + '@typescript-eslint/type-utils@8.3.0': + resolution: {integrity: sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - csstype@3.1.1: - resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} + '@typescript-eslint/type-utils@8.5.0': + resolution: {integrity: sha512-N1K8Ix+lUM+cIDhL2uekVn/ZD7TZW+9/rwz8DclQpcQ9rk4sIL5CAlBC0CugWKREmDjBzI/kQqU4wkg46jWLYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + '@typescript-eslint/types@8.3.0': + resolution: {integrity: sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - current-git-branch@1.1.0: - resolution: {integrity: sha512-n5mwGZllLsFzxDPtTmadqGe4IIBPfqPbiIRX4xgFR9VK/Bx47U+94KiVkxSKAKN6/s43TlkztS2GZpgMKzwQ8A==} + '@typescript-eslint/types@8.5.0': + resolution: {integrity: sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + '@typescript-eslint/typescript-estree@8.3.0': + resolution: {integrity: sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - data-uri-to-buffer@3.0.1: - resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} - engines: {node: '>= 6'} + '@typescript-eslint/typescript-estree@8.5.0': + resolution: {integrity: sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} + '@typescript-eslint/utils@8.3.0': + resolution: {integrity: sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 - data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} + '@typescript-eslint/utils@8.5.0': + resolution: {integrity: sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + '@typescript-eslint/visitor-keys@8.3.0': + resolution: {integrity: sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + '@typescript-eslint/visitor-keys@8.5.0': + resolution: {integrity: sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + '@vercel/nft@0.26.5': + resolution: {integrity: sha512-NHxohEqad6Ra/r4lGknO52uc/GrWILXAMs1BB4401GTqww0fw1bAqzpG1XHuDO+dprg4GvsD9ZLLSsdo78p9hQ==} + engines: {node: '>=16'} + hasBin: true - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} + '@vinxi/listhen@1.5.6': + resolution: {integrity: sha512-WSN1z931BtasZJlgPp704zJFnQFRg7yzSjkm3MzAWQYe4uXFXlFr1hc5Ac2zae5/HDOz5x1/zDM5Cb54vTCnWw==} + hasBin: true - dax-sh@0.39.2: - resolution: {integrity: sha512-gpuGEkBQM+5y6p4cWaw9+ePy5TNon+fdwFVtTI8leU3UhwhsBfPewRxMXGuQNC+M2b/MDGMlfgpqynkcd0C3FQ==} + '@vinxi/plugin-directives@0.4.3': + resolution: {integrity: sha512-Ey+TRIwyk8871PKhQel8NyZ9B6N0Tvhjo1QIttTyrV0d7BfUpri5GyGygmBY7fHClSE/vqaNCCZIKpTL3NJAEg==} + peerDependencies: + vinxi: ^0.4.3 - db0@0.1.4: - resolution: {integrity: sha512-Ft6eCwONYxlwLjBXSJxw0t0RYtA5gW9mq8JfBXn9TtC0nDPlqePAhpv9v4g9aONBi6JI1OXHTKKkUYGd+BOrCA==} + '@vinxi/react-server-dom@0.0.3': + resolution: {integrity: sha512-ZJJZtuw1TbGFOBuDZBHmM3w40yzFpNFWoPCoC2QtZBkYEQXYF9sOHHxkjTfNvk4rSn/zaUAs6KNUbVRvebq/1Q==} + engines: {node: '>=0.10.0'} peerDependencies: - '@libsql/client': ^0.5.2 - better-sqlite3: ^9.4.3 - drizzle-orm: ^0.29.4 - peerDependenciesMeta: - '@libsql/client': - optional: true - better-sqlite3: - optional: true - drizzle-orm: - optional: true + react: 0.0.0-experimental-035a41c4e-20230704 + react-dom: 0.0.0-experimental-035a41c4e-20230704 + vite: ^4.3.9 - de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + '@vinxi/react@0.2.5': + resolution: {integrity: sha512-Ubjv/JfYWTxFbuaHxKOeq6hQMuSuIH6eZXRf27wb82YWM82z3VY1nwZzTHgyveHg/EPSOK0p8LUmbw9758xTlw==} - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + '@vinxi/server-components@0.4.3': + resolution: {integrity: sha512-KVEnQtb+ZlXIEKaUw4r4WZl/rqFeZqSyIRklY1wFiPw7GCJUxbXzISpsJ+HwDhYi9k4n8uZJyQyLHGkoiEiolg==} peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + vinxi: ^0.4.3 - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + '@vinxi/server-functions@0.4.3': + resolution: {integrity: sha512-kVYrOrCMHwGvHRwpaeW2/PE7URcGtz4Rk/hIHa2xjt5PGopzzB/Y5GC8YgZjtqSRqo0ElAKsEik7UE6CXH3HXA==} peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + vinxi: ^0.4.3 + + '@vitejs/plugin-react@4.3.1': + resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + + '@vitest/expect@1.6.0': + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + + '@vitest/runner@1.6.0': + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + '@vitest/snapshot@1.6.0': + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} - debug@4.3.6: - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + '@vitest/spy@1.6.0': + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + '@vitest/utils@1.6.0': + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} + '@volar/language-core@2.4.0': + resolution: {integrity: sha512-FTla+khE+sYK0qJP+6hwPAAUwiNHVMph4RUXpxf/FIPKUP61NFrVZorml4mjFShnueR2y9/j8/vnh09YwVdH7A==} - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + '@volar/source-map@2.4.0': + resolution: {integrity: sha512-2ceY8/NEZvN6F44TXw2qRP6AQsvCYhV2bxaBPWxV9HqIfkbRydSksTFObCF1DBDNBfKiZTS8G/4vqV6cvjdOIQ==} - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + '@volar/typescript@2.4.0': + resolution: {integrity: sha512-9zx3lQWgHmVd+JRRAHUSRiEhe4TlzL7U7e6ulWXOxHH/WNYxzKwCvZD7WYWEZFdw4dHfTD9vUR0yPQO6GilCaQ==} - default-browser-id@5.0.0: - resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} - engines: {node: '>=18'} + '@vue/compiler-core@3.4.27': + resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} - default-browser@5.2.1: - resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} - engines: {node: '>=18'} + '@vue/compiler-dom@3.4.27': + resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==} - default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + '@vue/language-core@2.0.29': + resolution: {integrity: sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + '@vue/shared@3.4.27': + resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} + '@web3-storage/multipart-parser@1.0.0': + resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} - denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} - destr@2.0.3: - resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} - detect-file@1.0.0: - resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} - engines: {node: '>=0.10.0'} + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} - detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} - detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} - detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} - detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + '@webpack-cli/configtest@2.1.1': + resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x - didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + '@webpack-cli/info@2.0.2': + resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@webpack-cli/serve@2.0.5': + resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} - engines: {node: '>=6'} + '@yarnpkg/lockfile@1.1.0': + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + '@yarnpkg/parsers@3.0.0-rc.46': + resolution: {integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==} + engines: {node: '>=14.15.0'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + '@zkochan/js-yaml@0.0.7': + resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} + hasBin: true - dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true - dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dom-converter@0.2.0: - resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} - dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 - domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + acorn-loose@8.3.0: + resolution: {integrity: sha512-75lAs9H19ldmW+fAbyqHdjgdCrz0pWGXKmnqFoh8PyVd1L2RIb4RzYrSjmopeqv3E1G3/Pimu6GgLlrGbrkF7w==} + engines: {node: '>=0.4.0'} - dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + acorn-typescript@1.4.13: + resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==} + peerDependencies: + acorn: '>=8.9.0' - dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} - dot-prop@8.0.2: - resolution: {integrity: sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ==} - engines: {node: '>=16'} + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true - dotenv-expand@11.0.6: - resolution: {integrity: sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==} - engines: {node: '>=12'} + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} - dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 - electron-to-chromium@1.5.4: - resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - enabled@2.0.0: - resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} - enhanced-resolve@5.12.0: - resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} - engines: {node: '>=10.13.0'} + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} - enhanced-resolve@5.17.0: - resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} - engines: {node: '>=10.13.0'} + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} - enquirer@2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} + ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true - entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} - envinfo@7.13.0: - resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} - hasBin: true - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} - error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} - es-iterator-helpers@1.0.18: - resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} - engines: {node: '>= 0.4'} + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - esbuild-register@3.6.0: - resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} - peerDependencies: - esbuild: '>=0.12 <1' + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - esbuild@0.17.19: - resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} - engines: {node: '>=12'} - hasBin: true + aria-hidden@1.2.3: + resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} + engines: {node: '>=10'} - esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} - hasBin: true + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true + arktype@2.0.0-rc.8: + resolution: {integrity: sha512-ByrqjptsavUCUL9ptts6BUL2LCNkVZyniOdaBw76dlBQ6gYIhYSeycuuj4gRFwcAafszOnAPD2fAqHK7bbo/Zw==} - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + array-each@1.0.1: + resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} + engines: {node: '>=0.10.0'} - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} + array-slice@1.1.0: + resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} + engines: {node: '>=0.10.0'} - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - eslint-compat-utils@0.5.1: - resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} - engines: {node: '>=12'} - peerDependencies: - eslint: ^8.57.0 + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} - eslint-config-react-app@7.0.1: - resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} - engines: {node: '>=14.0.0'} - peerDependencies: - eslint: ^8.57.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true + async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - eslint-plugin-es-x@7.8.0: - resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: ^8.57.0 + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - eslint-plugin-flowtype@8.0.3: - resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} - engines: {node: '>=12.0.0'} + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true peerDependencies: - '@babel/plugin-syntax-flow': ^7.14.5 - '@babel/plugin-transform-react-jsx': ^7.14.9 - eslint: ^8.57.0 + postcss: ^8.1.0 - eslint-plugin-import-x@3.1.0: - resolution: {integrity: sha512-/UbPA+bYY7nIxcjL3kpcDY3UNdoLHFhyBFzHox2M0ypcUoueTn6woZUUmzzi5et/dXChksasYYFeKE2wshOrhg==} - engines: {node: '>=16'} - peerDependencies: - eslint: ^8.57.0 + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^8.57.0 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + axios@1.7.7: + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} - eslint-plugin-jest@25.7.0: - resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^4.0.0 || ^5.0.0 - eslint: ^8.57.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true + b4a@1.6.6: + resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} - eslint-plugin-jsx-a11y@6.8.0: - resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^8.57.0 + babel-dead-code-elimination@1.0.6: + resolution: {integrity: sha512-JxFi9qyRJpN0LjEbbjbN8g0ux71Qppn9R8Qe3k6QzHg2CaKsbUQtbn307LQGiDLGjV6JCtEFqfxzVig9MyDCHQ==} - eslint-plugin-n@17.10.2: - resolution: {integrity: sha512-e+s4eAf5NtJaxPhTNu3qMO0Iz40WANS93w9LQgYcvuljgvDmWi/a3rh+OrNyMHeng6aOWGJO0rCg5lH4zi8yTw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 + babel-plugin-add-module-exports@0.2.1: + resolution: {integrity: sha512-3AN/9V/rKuv90NG65m4tTHsI04XrCKsWbztIcW7a8H5iIN7WlvWucRtVV0V/rT4QvtA11n5Vmp20fLwfMWqp6g==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - eslint-plugin-react-debug@1.8.2: - resolution: {integrity: sha512-+DUv5IKQGoNH40wIDRpIL0O6seQeN08aM5DATQp3142/ZAIZsPycD4GZBF9U11hwvmBnBg0xHX11Gmt7YGIkJA==} - engines: {bun: '>=1.0.15', node: '>=18.18.0'} - peerDependencies: - eslint: ^8.57.0 - typescript: ^4.9.5 || ^5.3.3 - peerDependenciesMeta: - typescript: - optional: true + bare-events@2.2.2: + resolution: {integrity: sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==} - eslint-plugin-react-dom@1.8.2: - resolution: {integrity: sha512-Jbe+qxwM8MoPWEks0HEEq92TVlgUK98aaWJp4hH8m85YY3nKSOIkt8EE/OvwiqTdv8e3Z19Qkth1ahCDc+gvlA==} - engines: {bun: '>=1.0.15', node: '>=18.18.0'} - peerDependencies: - eslint: ^8.57.0 - typescript: ^4.9.5 || ^5.3.3 - peerDependenciesMeta: - typescript: - optional: true + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - eslint-plugin-react-hooks-extra@1.8.2: - resolution: {integrity: sha512-nxeuBb6yth+NFRVRsqjivEA0cGPQXUK+GrnSiuFp4kAJ+PgIupE3GKvy8ucwPTpmacsL8edjjZnx+BxdRBJwPQ==} - engines: {bun: '>=1.0.15', node: '>=18.18.0'} - peerDependencies: - eslint: ^8.57.0 - typescript: ^4.9.5 || ^5.3.3 - peerDependenciesMeta: - typescript: - optional: true + batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^8.57.0 + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} - eslint-plugin-react-naming-convention@1.8.2: - resolution: {integrity: sha512-SvYH1ZsqvZT0FwVYxqDErPWxS9QQ9XAfcOwWmYRH4XkI1xAVwgdqb86Vn2tBQKplnLQhR9CVYlbxm/l2VZoD+g==} - engines: {bun: '>=1.0.15', node: '>=18.18.0'} - peerDependencies: - eslint: ^8.57.0 - typescript: ^4.9.5 || ^5.3.3 - peerDependenciesMeta: - typescript: - optional: true + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - eslint-plugin-react-x@1.8.2: - resolution: {integrity: sha512-UbdjagNnMvvTAR10cJXQr/c04Vfr729zPQ7rqJhTG8iL5f/nLVcsTxtx2S+HBrada3ZAo1Ai3xBDQ2CsLtTDjA==} - engines: {bun: '>=1.0.15', node: '>=18.18.0'} - peerDependencies: - eslint: ^8.57.0 - typescript: ^4.9.5 || ^5.3.3 - peerDependenciesMeta: - typescript: - optional: true + birecord@0.1.1: + resolution: {integrity: sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==} - eslint-plugin-react@7.34.1: - resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^8.57.0 + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - eslint-plugin-require-extensions@0.1.3: - resolution: {integrity: sha512-T3c1PZ9PIdI3hjV8LdunfYI8gj017UQjzAnCrxuo3wAjneDbTPHdE3oNWInOjMA+z/aBkUtlW5vC0YepYMZIug==} - engines: {node: '>=16'} - peerDependencies: - eslint: ^8.57.0 + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - eslint-plugin-testing-library@5.11.1: - resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} - peerDependencies: - eslint: ^8.57.0 + bonjour-service@1.2.1: + resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==} - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} - eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - eslint-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - espree@10.1.0: - resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + c12@1.10.0: + resolution: {integrity: sha512-0SsG7UDhoRWcuSvKWHaXmu5uNjDCDN3nkQLRL4Q42IlFy+ze58FcCoI3uPwINXinkz7ZinbhEgyzYFw9u9ZV8g==} - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} - execa@0.6.3: - resolution: {integrity: sha512-/teX3MDLFBdYUhRk8WCBYboIMUmqeizu0m9Z3YF3JWrbEh/SlZg00vLJSaAGWw3wrZ9tE0buNw79eaAPYhUuvg==} + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + + caniuse-lite@1.0.30001659: + resolution: {integrity: sha512-Qxxyfv3RdHAfJcXelgf0hU4DFUVXBGTjqrBUZLUh8AtlGnsDo+CnncYtTd95+ZKfnANUOzxyIQCuU/UeBZBYoA==} + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} - express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} - engines: {node: '>= 0.10.0'} + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - fast-decode-uri-component@1.0.1: - resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} - fast-deep-equal@2.0.1: - resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} - fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + cjs-module-lexer@1.4.1: + resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} - fast-querystring@1.1.2: - resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} - fastest-levenshtein@1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} + cli-highlight@2.1.11: + resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + cli-spinners@2.6.1: + resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} + engines: {node: '>=6'} - faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} - fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + clipboardy@4.0.0: + resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} + engines: {node: '>=18'} - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} - finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} - findup-sync@5.0.0: - resolution: {integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==} - engines: {node: '>= 10.13.0'} + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} - fined@2.0.0: - resolution: {integrity: sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==} - engines: {node: '>= 10.13.0'} + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - flagged-respawn@2.0.0: - resolution: {integrity: sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==} - engines: {node: '>= 10.13.0'} + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} - fn.name@1.1.0: - resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true + combinate@1.1.11: + resolution: {integrity: sha512-+2MNAQ29HtNejOxkgaTQPC2Bm+pQvFuqf7o18uObl/Bx3daX06kjLUNY/qa9f+YSqzqm/ic3SdrlfN0fvTlw2g==} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} - for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} - for-own@1.0.0: - resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} - engines: {node: '>=0.10.0'} + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} - fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - framer-motion@11.3.21: - resolution: {integrity: sha512-D+hfIsvzV8eL/iycld4K+tKlg2Q2LdwnrcBEohtGw3cG1AIuNYATbT5RUqIM1ndsAk+EfGhoSGf0UaiFodc5Tw==} - peerDependencies: - '@emotion/is-prop-valid': '*' - react: ^18.0.0 - react-dom: ^18.0.0 - peerDependenciesMeta: - '@emotion/is-prop-valid': - optional: true - react: - optional: true - react-dom: - optional: true + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} - front-matter@4.0.2: - resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} + compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + concurrently@8.2.2: + resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} + confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} - gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. + conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + convex@1.16.0: + resolution: {integrity: sha512-duu6ged8mL2WgN9Jxm/XykbRe8MW+Wotkj57KTX44l7TUlnwvNCKB3mmlAVCxbsd4epyU05TkQz8WGwb/4SssQ==} + engines: {node: '>=18.0.0', npm: '>=7.0.0'} + hasBin: true + peerDependencies: + '@auth0/auth0-react': ^2.0.1 + '@clerk/clerk-react': ^4.12.8 || ^5.0.0 + react: ^17.0.2 || ^18.0.0 + react-dom: ^17.0.2 || ^18.0.0 + peerDependenciesMeta: + '@auth0/auth0-react': + optional: true + '@clerk/clerk-react': + optional: true + react: + optional: true + react-dom: + optional: true - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + cookie-es@1.1.0: + resolution: {integrity: sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw==} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} - get-port-please@3.1.2: - resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} - get-port@7.1.0: - resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} - engines: {node: '>=16'} + copy-anything@3.0.2: + resolution: {integrity: sha512-CzATjGXzUQ0EvuvgOCI6A4BGOo2bcVx8B+eC2nF862iv9fopnPQwlrbACakNCHRIJbCSBj+J/9JeDf60k64MkA==} + engines: {node: '>=12.13'} - get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} + core-js@3.38.1: + resolution: {integrity: sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==} - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + + croner@8.0.2: + resolution: {integrity: sha512-HgSdlSUX8mIgDTTiQpWUP4qY4IFRMsduPCYdca34Pelt8MVdxdaDOzreFtCscA6R+cRZd7UbD1CD3uyx6J3X1A==} + engines: {node: '>=18.0'} - get-tsconfig@4.7.5: - resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - giget@1.2.1: - resolution: {integrity: sha512-4VG22mopWtIeHwogGSy1FViXVo0YT+m6BrqZfz0JJFwbSsePsCdOzdLIIli5BtMp7Xe8f/o2OmBpQX2NBOC24g==} - hasBin: true + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + crossws@0.2.4: + resolution: {integrity: sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==} + peerDependencies: + uWebSockets.js: '*' + peerDependenciesMeta: + uWebSockets.js: + optional: true - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + css-declaration-sorter@7.2.0: + resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.0.9 - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - global-modules@1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} - global-prefix@1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} + hasBin: true - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + cssnano-preset-default@7.0.6: + resolution: {integrity: sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - globals@15.9.0: - resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} - engines: {node: '>=18'} + cssnano-utils@5.0.0: + resolution: {integrity: sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + cssnano@7.0.6: + resolution: {integrity: sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - globby@14.0.1: - resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==} + cssstyle@4.0.1: + resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} engines: {node: '>=18'} - globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + csstype@3.1.1: + resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} - goober@2.1.14: - resolution: {integrity: sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==} - peerDependencies: - csstype: ^3.0.10 + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + current-git-branch@1.1.0: + resolution: {integrity: sha512-n5mwGZllLsFzxDPtTmadqGe4IIBPfqPbiIRX4xgFR9VK/Bx47U+94KiVkxSKAKN6/s43TlkztS2GZpgMKzwQ8A==} - graceful-fs@4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} - graphql@16.9.0: - resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + dax-sh@0.39.2: + resolution: {integrity: sha512-gpuGEkBQM+5y6p4cWaw9+ePy5TNon+fdwFVtTI8leU3UhwhsBfPewRxMXGuQNC+M2b/MDGMlfgpqynkcd0C3FQ==} - gzip-size@7.0.0: - resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + db0@0.1.4: + resolution: {integrity: sha512-Ft6eCwONYxlwLjBXSJxw0t0RYtA5gW9mq8JfBXn9TtC0nDPlqePAhpv9v4g9aONBi6JI1OXHTKKkUYGd+BOrCA==} + peerDependencies: + '@libsql/client': ^0.5.2 + better-sqlite3: ^9.4.3 + drizzle-orm: ^0.29.4 + peerDependenciesMeta: + '@libsql/client': + optional: true + better-sqlite3: + optional: true + drizzle-orm: + optional: true - h3@1.11.1: - resolution: {integrity: sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A==} + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - handle-thing@2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} - headers-polyfill@4.0.3: - resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} - homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} - hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} - hpack.js@2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} - html-entities@2.5.2: - resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - html-minifier-terser@6.1.0: - resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} - engines: {node: '>=12'} - hasBin: true + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} - html-rspack-plugin@5.5.7: - resolution: {integrity: sha512-7dNAURj9XBHWoYg59F8VU6hT7J7w+od4Lr5hc/rrgN6sy6QfqVpoPqW9Qw4IGFOgit8Pul7iQp1yysBSIhOlsg==} - engines: {node: '>=10.13.0'} + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} - html-webpack-plugin@5.6.0: - resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==} - engines: {node: '>=10.13.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.20.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} - htmlparser2@6.1.0: - resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} - http-deceiver@1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} - http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} - http-parser-js@0.5.8: - resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} + detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} - http-proxy-middleware@2.0.6: - resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/express': ^4.17.13 - peerDependenciesMeta: - '@types/express': - optional: true + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - http-shutdown@1.2.2: - resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - https-proxy-agent@5.0.0: - resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} - engines: {node: '>= 6'} + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} - https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} - engines: {node: '>= 14'} + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - httpxy@0.1.5: - resolution: {integrity: sha512-hqLDO+rfststuyEUTWObQK6zHEEmZ/kaIP2/zclGGZn6X8h/ESTWg+WKecQ/e5k4nPswjzZD+q2VqZIbr15CoQ==} + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - hyperdyperid@1.2.0: - resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} - engines: {node: '>=10.18'} + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - ignore-walk@5.0.1: - resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} - immer@10.1.1: - resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + dot-prop@8.0.2: + resolution: {integrity: sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ==} + engines: {node: '>=16'} - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + dotenv-expand@11.0.6: + resolution: {integrity: sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==} + engines: {node: '>=12'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} - inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + electron-to-chromium@1.5.4: + resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} - interpret@3.1.1: - resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} - engines: {node: '>=10.13.0'} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - ioredis@5.4.1: - resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} - engines: {node: '>=12.22.0'} + emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} - ipaddr.js@2.2.0: - resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} - engines: {node: '>= 10'} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} - iron-webcrypto@1.2.1: - resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - is-absolute@1.0.0: - resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} - engines: {node: '>=0.10.0'} + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + envinfo@7.13.0: + resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} + engines: {node: '>=4'} + hasBin: true - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} + esbuild@0.23.0: + resolution: {integrity: sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==} + engines: {node: '>=18'} hasBin: true - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} hasBin: true - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} - is-git-repository@1.1.1: - resolution: {integrity: sha512-hxLpJytJnIZ5Og5QsxSkzmb8Qx8rGau9bio1JN/QtXcGEFuSsQYau0IiqlsCwftsfVYjF1mOq6uLdmwNSspgpA==} + eslint-compat-utils@0.5.1: + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} + peerDependencies: + eslint: ^9.10.0 - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - is-immutable-type@4.0.0: - resolution: {integrity: sha512-gyFBCXv+NikTs8/PGZhgjbMmFZQ5jvHGZIsVu6+/9Bk4K7imlWBIDN7hTr9fNioGzFg71I4YM3z8f0aKXarTAw==} + eslint-plugin-es-x@7.8.0: + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint: ^8.57.0 - typescript: '>=4.7.4' + eslint: ^9.10.0 - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true + eslint-plugin-import-x@4.1.1: + resolution: {integrity: sha512-dBEM8fACIFNt4H7GoOaRmnH6evJW6JSTJTYYgmRd3vI4geBTjgDM/JyUDKUwIw0HDSyI+u7Vs3vFRXUo/BOAtA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} + eslint-plugin-n@17.10.2: + resolution: {integrity: sha512-e+s4eAf5NtJaxPhTNu3qMO0Iz40WANS93w9LQgYcvuljgvDmWi/a3rh+OrNyMHeng6aOWGJO0rCg5lH4zi8yTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} + eslint-plugin-react-debug@1.14.1: + resolution: {integrity: sha512-VFkRmXGCgmCCgUsdBpmARYhFvKbK7XgF41hgQrEhJAfYA0lXE2Urb+VkVpk57xUk+ZxMQy3sy6A1P4tQ+83hrQ==} + engines: {bun: '>=1.0.15', node: '>=18.18.0'} + peerDependencies: + eslint: ^9.10.0 + typescript: ^4.9.5 || ^5.3.3 + peerDependenciesMeta: + typescript: + optional: true - is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + eslint-plugin-react-dom@1.14.1: + resolution: {integrity: sha512-hVcublIn4aAvudpl39I0l/1ldJJvn5rINHc71m+balFeKt5Qk0nPTUdPRCWRyp4ExD/mEbWAcEIP/pS0b5B/Vg==} + engines: {bun: '>=1.0.15', node: '>=18.18.0'} + peerDependencies: + eslint: ^9.10.0 + typescript: ^4.9.5 || ^5.3.3 + peerDependenciesMeta: + typescript: + optional: true - is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} + eslint-plugin-react-hooks-extra@1.14.1: + resolution: {integrity: sha512-R5BOTZYY9fm7qTPN1hRZxk9mj8JwvnpXbxhEZwphM3Sn2legwXVHdXXkuUqaDR6AWw+z3wfLkb8xhVBu+uY1Hg==} + engines: {bun: '>=1.0.15', node: '>=18.18.0'} + peerDependencies: + eslint: ^9.10.0 + typescript: ^4.9.5 || ^5.3.3 + peerDependenciesMeta: + typescript: + optional: true - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} + eslint-plugin-react-hooks@5.1.0-rc-fb9a90fa48-20240614: + resolution: {integrity: sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^9.10.0 - is-network-error@1.1.0: - resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} - engines: {node: '>=16'} + eslint-plugin-react-naming-convention@1.14.1: + resolution: {integrity: sha512-F3HCtRXwtT66/KNBuhSPxk63z/1iIxV3LUrwKAPVomTpGEIGrF/vzvNjJK0eaxf2Ae7h+SGMrDvJcRaYtRpRvQ==} + engines: {bun: '>=1.0.15', node: '>=18.18.0'} + peerDependencies: + eslint: ^9.10.0 + typescript: ^4.9.5 || ^5.3.3 + peerDependenciesMeta: + typescript: + optional: true - is-node-process@1.2.0: - resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + eslint-plugin-react-web-api@1.14.1: + resolution: {integrity: sha512-1qS15Wfh+++1UHtGRf6palH2nfDVlKSNMaUjaANnUss04PW0PXeNF540cTuWwMPHyh8xIxcEgDzqx+8MokCtCw==} + engines: {bun: '>=1.0.15', node: '>=18.18.0'} + peerDependencies: + eslint: ^9.10.0 + typescript: ^4.9.5 || ^5.3.3 + peerDependenciesMeta: + typescript: + optional: true - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + eslint-plugin-react-x@1.14.1: + resolution: {integrity: sha512-69KBSAX9X+1Az/wfWjvztPJyaZq2PSurlYYju0bH+iWon7pBV7zSqWiGhkizLpa2bSKFhAGzbMhSuaEqPiZQkA==} + engines: {bun: '>=1.0.15', node: '>=18.18.0'} + peerDependencies: + eslint: ^9.10.0 + typescript: ^4.9.5 || ^5.3.3 + peerDependenciesMeta: + typescript: + optional: true - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} - is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} + eslint-scope@8.0.2: + resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} + eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + eslint@9.10.0: + resolution: {integrity: sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} + espree@10.1.0: + resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true - is-primitive@3.0.1: - resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==} - engines: {node: '>=0.10.0'} + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} - is-reference@1.2.1: - resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} - is-relative@1.0.0: - resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} - engines: {node: '>=0.10.0'} + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} - is-text-path@2.0.0: - resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} - engines: {node: '>=8'} + execa@0.6.3: + resolution: {integrity: sha512-/teX3MDLFBdYUhRk8WCBYboIMUmqeizu0m9Z3YF3JWrbEh/SlZg00vLJSaAGWw3wrZ9tE0buNw79eaAPYhUuvg==} + engines: {node: '>=4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} - is-unc-path@1.0.0: - resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - is-uuid@1.0.2: - resolution: {integrity: sha512-tCByphFcJgf2qmiMo5hMCgNAquNSagOetVetDvBXswGkNfoyEMvGH1yDlF8cbZbKnbVBr4Y5/rlpMz9umxyBkQ==} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} + express@4.21.0: + resolution: {integrity: sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==} + engines: {node: '>= 0.10.0'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} - is-what@4.1.8: - resolution: {integrity: sha512-yq8gMao5upkPoGEU9LsB2P+K3Kt8Q3fQFCGyNCWOAnJAMzEXVV9drYb0TXr42TTliLLhKIBvulgAXgtLLnwzGA==} - engines: {node: '>=12.13'} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - is64bit@2.0.0: - resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} - engines: {node: '>=18'} + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - isbot@5.1.14: - resolution: {integrity: sha512-4X8KZHyaIqXOqEv1qfZOqshMX3r7Q/VtMEMzuGPZljDMEIGpX7bcGODR9gZztXdcPBEJpNioQXXBJun+xi2G5g==} - engines: {node: '>=18'} + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} - isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} - iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} - jackspeak@3.4.0: - resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} - engines: {node: '>=14'} + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} - jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} - jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} - jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + findup-sync@5.0.0: + resolution: {integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==} + engines: {node: '>= 10.13.0'} - js-cookie@3.0.5: - resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} - engines: {node: '>=14'} + fined@2.0.0: + resolution: {integrity: sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==} + engines: {node: '>= 10.13.0'} - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + flagged-respawn@2.0.0: + resolution: {integrity: sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==} + engines: {node: '>= 10.13.0'} - js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - jsdom@24.1.1: - resolution: {integrity: sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==} - engines: {node: '>=18'} + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} peerDependencies: - canvas: ^2.11.2 + debug: '*' peerDependenciesMeta: - canvas: + debug: optional: true - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + for-own@1.0.0: + resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} + engines: {node: '>=0.10.0'} - json-parse-even-better-errors@3.0.2: - resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true + framer-motion@11.5.4: + resolution: {integrity: sha512-E+tb3/G6SO69POkdJT+3EpdMuhmtCh9EWuK4I1DnIC23L7tFPrl8vxP+LSovwaw6uUr73rUbpb4FgK011wbRJQ==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true - jsonata@1.8.7: - resolution: {integrity: sha512-tOW2/hZ+nR2bcQZs+0T62LVe5CHaNa3laFFWb/262r39utN6whJGBF7IR2Wq1QXrDbhftolk5gggW8uUJYlBTQ==} - engines: {node: '>= 8'} + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} - jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + front-matter@4.0.2: + resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} - jwt-decode@3.1.2: - resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] - klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - knitwork@1.1.0: - resolution: {integrity: sha512-oHnmiBUVHz1V+URE77PNot2lv3QiYU2zQf1JjOVkMt3YDKGbu8NAFr+c4mcNOhdsGrB/VpVbRwPwhiXrPhxQbw==} + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. - kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} - kuler@2.0.0: - resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} - ky@1.5.0: - resolution: {integrity: sha512-bkQo+UqryW6Zmo/DsixYZE4Z9t2mzvNMhceyIhuMuInb3knm5Q+GNGMKveydJAj+Z6piN1SwI6eR/V0G+Z0BtA==} - engines: {node: '>=18'} + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} - language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} - launch-editor@2.8.0: - resolution: {integrity: sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==} + get-port-please@3.1.2: + resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} - launchdarkly-eventsource@2.0.3: - resolution: {integrity: sha512-VhFjppK7jXlcEKaS7bxdoibB5j01NKyeDR7a8XfssdDGNWCTsbF0/5IExSmPi44eDncPhkoPNxlSZhEZvrbD5w==} - engines: {node: '>=0.12.0'} + get-port@7.1.0: + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} + engines: {node: '>=16'} - launchdarkly-js-sdk-common@5.2.0: - resolution: {integrity: sha512-aLv2ZrUv229RIwLtFhdILu2aJS/fqGSJzTk4L/bCDZA8RuIh7PutI3ui/AJeNnzPzjKzdEQZw6wVhkVc84baog==} + get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} - launchdarkly-node-client-sdk@3.2.1: - resolution: {integrity: sha512-vIn1kFCWSX83M2hHIQEw+TyEZFqcXn4DTKja2Vdt9NFgs0I2BA70ENA+zgz8OSt+VqvTciZV0l5X90Uyv+3vsQ==} - engines: {node: '>= 12.0.0'} + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} - lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} + get-tsconfig@4.7.5: + resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} - levdist@1.0.0: - resolution: {integrity: sha512-YguwC2spb0pqpJM3a5OsBhih/GG2ZHoaSHnmBqhEI7997a36buhqcRTegEjozHxyxByIwLpZHZTVYMThq+Zd3g==} + giget@1.2.1: + resolution: {integrity: sha512-4VG22mopWtIeHwogGSy1FViXVo0YT+m6BrqZfz0JJFwbSsePsCdOzdLIIli5BtMp7Xe8f/o2OmBpQX2NBOC24g==} + hasBin: true - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} - liftoff@5.0.0: - resolution: {integrity: sha512-a5BQjbCHnB+cy+gsro8lXJ4kZluzOijzJ1UVVfyJYZC+IP2pLv1h4+aysQeKuTmyO8NAqfyQAk4HWaP/HjcKTg==} + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - - lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} - engines: {node: '>=14'} - - line-diff@2.1.1: - resolution: {integrity: sha512-vswdynAI5AMPJacOo2o+JJ4caDJbnY2NEqms4MhMW0NJbjh3skP/brpVTAgBxrg55NRZ2Vtw88ef18hnagIpYQ==} + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true - lines-and-columns@2.0.4: - resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported - linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported - listhen@1.7.2: - resolution: {integrity: sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g==} - hasBin: true + global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} + global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + globals@15.9.0: + resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} + engines: {node: '>=18'} - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + globby@14.0.1: + resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==} + engines: {node: '>=18'} - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - lodash.isarguments@3.1.0: - resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + goober@2.1.14: + resolution: {integrity: sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==} + peerDependencies: + csstype: ^3.0.10 - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + graphql@16.9.0: + resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - logform@2.6.1: - resolution: {integrity: sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA==} - engines: {node: '>= 12.0.0'} + gzip-size@7.0.0: + resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + h3@1.11.1: + resolution: {integrity: sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A==} - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} - lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} - lunr@2.3.9: - resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + headers-polyfill@4.0.3: + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} - magic-string@0.30.11: - resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - magicast@0.2.11: - resolution: {integrity: sha512-6saXbRDA1HMkqbsvHOU6HBjCVgZT460qheRkLhJQHWAbhXoWESI3Kn/dGGXyKs15FFKR85jsUqFx2sMK0wy/5g==} + homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - map-cache@0.2.2: - resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} - engines: {node: '>=0.10.0'} + hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} - markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} - hasBin: true + html-entities@2.5.2: + resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} - mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + html-webpack-plugin@5.6.0: + resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==} + engines: {node: '>=10.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true - memfs@4.9.3: - resolution: {integrity: sha512-bsYSSnirtYTWi1+OPMFb0M048evMKyUYe0EbtuGQgq6BVQM1g1W8/KIUJCCvjgI/El0j6Q4WsmMiBwLUBSw8LA==} - engines: {node: '>= 4.0.0'} + htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} - meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} + http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} - engines: {node: '>=8.6'} + http-proxy-middleware@2.0.6: + resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + http-shutdown@1.2.2: + resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} - mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} - mime@4.0.3: - resolution: {integrity: sha512-KgUb15Oorc0NEKPbvfa0wRU+PItIEZmiv+pyAO2i0oTIVTJhlzMclU7w4RXWQrSOVH5ax/p/CkIO7KI4OyFJTQ==} - engines: {node: '>=16'} - hasBin: true + httpxy@0.1.5: + resolution: {integrity: sha512-hqLDO+rfststuyEUTWObQK6zHEEmZ/kaIP2/zclGGZn6X8h/ESTWg+WKecQ/e5k4nPswjzZD+q2VqZIbr15CoQ==} - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} - minimatch@3.0.8: - resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + ignore-walk@5.0.1: + resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + immer@10.1.1: + resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} + hasBin: true - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - mixpanel@0.18.0: - resolution: {integrity: sha512-VyUoiLB/S/7abYYHGD5x0LijeuJCUabG8Hb+FvYU3Y99xHf1Qh+s4/pH9lt50fRitAHncWbU1FE01EknUfVVjQ==} - engines: {node: '>=10.0'} + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - mlly@1.7.0: - resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - mrmime@1.0.1: - resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} - engines: {node: '>=10'} + ioredis@5.4.1: + resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} + engines: {node: '>=12.22.0'} - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} - msw@2.3.5: - resolution: {integrity: sha512-+GUI4gX5YC5Bv33epBrD+BGdmDvBg2XGruiWnI3GbIbRmMMBeZ5gs3mJ51OWSGHgJKztZ8AtZeYMMNMVrje2/Q==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - typescript: '>= 4.7.x' - peerDependenciesMeta: - typescript: - optional: true + is-absolute@1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} - muggle-string@0.3.1: - resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} - muggle-string@0.4.1: - resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} - multicast-dns@7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} - hasBin: true + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} - mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} hasBin: true - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} - nitropack@2.9.6: - resolution: {integrity: sha512-HP2PE0dREcDIBVkL8Zm6eVyrDd10/GI9hTL00PHvjUM8I9Y/2cv73wRDmxNyInfrx/CJKHATb2U/pQrqpzJyXA==} - engines: {node: ^16.11.0 || >=17.0.0} - hasBin: true - peerDependencies: - xml2js: ^0.6.2 - peerDependenciesMeta: - xml2js: - optional: true + is-git-repository@1.1.1: + resolution: {integrity: sha512-hxLpJytJnIZ5Og5QsxSkzmb8Qx8rGau9bio1JN/QtXcGEFuSsQYau0IiqlsCwftsfVYjF1mOq6uLdmwNSspgpA==} - no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} - node-addon-api@7.1.0: - resolution: {integrity: sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==} - engines: {node: ^16 || ^18 || >= 20} + is-immutable-type@5.0.0: + resolution: {integrity: sha512-mcvHasqbRBWJznuPqqHRKiJgYAz60sZ0mvO3bN70JbkuK7ksfmgc489aKZYxMEjIbRvyOseaTjaRZLRF/xFeRA==} + peerDependencies: + eslint: ^9.10.0 + typescript: '>=4.7.4' - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true - node-fetch-native@1.6.4: - resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} - node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} + is-network-error@1.1.0: + resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} + engines: {node: '>=16'} - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - node-localstorage@1.3.1: - resolution: {integrity: sha512-NMWCSWWc6JbHT5PyWlNT2i8r7PgGYXVntmKawY83k/M0UJScZ5jirb61TLnqKwd815DfBQu+lR3sRw08SPzIaQ==} - engines: {node: '>=0.12'} + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - node-machine-id@1.1.12: - resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} - node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} - nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} - npm-bundled@2.0.1: - resolution: {integrity: sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - npm-normalize-package-bin@2.0.0: - resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + is-primitive@3.0.1: + resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==} + engines: {node: '>=0.10.0'} - npm-packlist@5.1.3: - resolution: {integrity: sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} + is-relative@1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. + is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} - nwsapi@2.2.12: - resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} + is-unc-path@1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} - nx@19.5.6: - resolution: {integrity: sha512-qjP17aa5ViXSpo0bDgJ7O3b8EY/0+PbX7ZIKvG1g6qasohtfM1y4Sx2bbSow0zCKU0+r1LnR53Q0lyX4OOgtUg==} - hasBin: true - peerDependencies: - '@swc-node/register': ^1.8.0 - '@swc/core': ^1.3.85 - peerDependenciesMeta: - '@swc-node/register': - optional: true - '@swc/core': - optional: true + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} - nypm@0.3.4: - resolution: {integrity: sha512-1JLkp/zHBrkS3pZ692IqOaIKSYHmQXgqfELk6YTOfVBnwealAmPA1q2kKK7PHJAHSMBozerThEFZXP3G6o7Ukg==} - engines: {node: ^14.16.0 || >=16.10.0} - hasBin: true + is-what@4.1.8: + resolution: {integrity: sha512-yq8gMao5upkPoGEU9LsB2P+K3Kt8Q3fQFCGyNCWOAnJAMzEXVV9drYb0TXr42TTliLLhKIBvulgAXgtLLnwzGA==} + engines: {node: '>=12.13'} - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} - object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} + is64bit@2.0.0: + resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} + engines: {node: '>=18'} - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + isbot@5.1.17: + resolution: {integrity: sha512-/wch8pRKZE+aoVhRX/hYPY1C7dMCeeMyhkQLNLNlYAbGQn9bkvMB8fOUXNnk5I0m4vDYbBJ9ciVtkr9zfBJ7qA==} + engines: {node: '>=18'} - object.defaults@1.1.0: - resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} - object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} + jackspeak@3.4.0: + resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} + engines: {node: '>=14'} - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - object.hasown@1.1.4: - resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} - engines: {node: '>= 0.4'} + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} - object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} - ofetch@1.3.4: - resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - ohash@1.1.3: - resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} + js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true - on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + jsdom@25.0.0: + resolution: {integrity: sha512-OhoFVT59T7aEq75TVw9xxEfkXgacpqAhQaYgP9y/fDqWQCMB/b1H66RfmPm/MaeaAIU9nDwMOVTlPN51+ao6CQ==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true - one-time@1.0.0: - resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} + hasBin: true - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - open@10.1.0: - resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} - engines: {node: '>=18'} + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - openapi-typescript@6.7.5: - resolution: {integrity: sha512-ZD6dgSZi0u1QCP55g8/2yS5hNJfIpgqsSGHLxxdOjvY7eIrXzj271FJEQw33VwsZ6RCtO/NOuhxa7GBWmEudyA==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} hasBin: true - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - ora@5.3.0: - resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} - engines: {node: '>=10'} + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - outvariant@1.4.2: - resolution: {integrity: sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ==} + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + jwt-decode@3.1.2: + resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + knitwork@1.1.0: + resolution: {integrity: sha512-oHnmiBUVHz1V+URE77PNot2lv3QiYU2zQf1JjOVkMt3YDKGbu8NAFr+c4mcNOhdsGrB/VpVbRwPwhiXrPhxQbw==} - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - p-retry@6.2.0: - resolution: {integrity: sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==} - engines: {node: '>=16.17'} + ky@1.7.2: + resolution: {integrity: sha512-OzIvbHKKDpi60TnF9t7UUVAF1B4mcqc02z5PIvrm08Wyb+yOcz63GRvEuVxNT18a9E1SrNouhB4W2NNLeD7Ykg==} + engines: {node: '>=18'} - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + launch-editor@2.8.0: + resolution: {integrity: sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==} - package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} - param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + liftoff@5.0.0: + resolution: {integrity: sha512-a5BQjbCHnB+cy+gsro8lXJ4kZluzOijzJ1UVVfyJYZC+IP2pLv1h4+aysQeKuTmyO8NAqfyQAk4HWaP/HjcKTg==} + engines: {node: '>=10.13.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} - parse-filepath@1.0.2: - resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} - engines: {node: '>=0.8'} + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} + lines-and-columns@2.0.3: + resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + listhen@1.7.2: + resolution: {integrity: sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g==} + hasBin: true - pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - path-root-regex@0.1.2: - resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} - engines: {node: '>=0.10.0'} + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - path-root@0.1.1: - resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} - engines: {node: '>=0.10.0'} + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} - path-to-regexp@6.2.2: - resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - path-type@5.0.0: - resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} - engines: {node: '>=12'} + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} + magicast@0.2.11: + resolution: {integrity: sha512-6saXbRDA1HMkqbsvHOU6HBjCVgZT460qheRkLhJQHWAbhXoWESI3Kn/dGGXyKs15FFKR85jsUqFx2sMK0wy/5g==} - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} - pkg-types@1.1.1: - resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} + map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} - playwright-core@1.45.3: - resolution: {integrity: sha512-+ym0jNbcjikaOwwSZycFbwkWgfruWvYlJfThKYAlImbxUgdWFO2oW70ojPm4OpE4t6TAo2FY/smM+hpVTtkhDA==} - engines: {node: '>=18'} - hasBin: true + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} - playwright@1.45.3: - resolution: {integrity: sha512-QhVaS+lpluxCaioejDZ95l4Y4jSFCsBvl2UZkpeXlzxmqS+aABr5c82YmfMHrL6x27nvrvykJAFpkzT2eWdJww==} - engines: {node: '>=18'} + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - postcss-import@15.1.0: - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} + marked-terminal@7.1.0: + resolution: {integrity: sha512-+pvwa14KZL74MVXjYdPR3nSInhGhNvPce/3mqLVZT2oUvt654sL1XImFuLZ1pkA866IYZ3ikDTOFUIC7XzpZZg==} + engines: {node: '>=16.0.0'} peerDependencies: - postcss: ^8.0.0 + marked: '>=1 <14' - postcss-js@4.0.1: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 + marked@9.1.6: + resolution: {integrity: sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==} + engines: {node: '>= 16'} + hasBin: true - postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} - postcss-nested@6.0.1: - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} - postcss-selector-parser@6.0.16: - resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} - engines: {node: '>=4'} + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} - postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} + memfs@4.9.3: + resolution: {integrity: sha512-bsYSSnirtYTWi1+OPMFb0M048evMKyUYe0EbtuGQgq6BVQM1g1W8/KIUJCCvjgI/El0j6Q4WsmMiBwLUBSw8LA==} + engines: {node: '>= 4.0.0'} - postcss@8.4.40: - resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} - engines: {node: ^10 || ^12 || >=14} + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - engines: {node: '>=14'} - hasBin: true + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} - engines: {node: '>=14'} - hasBin: true + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} - pretty-bytes@6.1.1: - resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} - engines: {node: ^14.13.1 || >=16.0.0} + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} - pretty-error@4.0.0: - resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} - pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} - prisma@5.18.0: - resolution: {integrity: sha512-+TrSIxZsh64OPOmaSgVPH7ALL9dfU0jceYaMJXsNrTkFHO7/3RANi5K2ZiPB1De9+KDxCWn7jvRq8y8pvk+o9g==} - engines: {node: '>=16.13'} + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} hasBin: true - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - - protobufjs@7.3.2: - resolution: {integrity: sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==} - engines: {node: '>=12.0.0'} - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + mime@4.0.3: + resolution: {integrity: sha512-KgUb15Oorc0NEKPbvfa0wRU+PItIEZmiv+pyAO2i0oTIVTJhlzMclU7w4RXWQrSOVH5ax/p/CkIO7KI4OyFJTQ==} + engines: {node: '>=16'} + hasBin: true - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} - publint@0.2.9: - resolution: {integrity: sha512-nITKS1NSwD68PQlts0ntryhxrWObep6P0CCycwi1lgXI+K7uKyacMYRRCQi7hTae8imkI3FCi0FlgnwLxjM8yA==} - engines: {node: '>=16'} - hasBin: true + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} - punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} + minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} - queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} - radix3@1.1.2: - resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} - rc9@2.1.1: - resolution: {integrity: sha512-lNeOl38Ws0eNxpO3+wD1I9rkHGQyj1NU1jlzv4go2CtEnEQEUfqnIvZG7W+bC/aXdJ27n5x/yUjb6RoT9tko+Q==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} - react-hot-toast@2.4.1: - resolution: {integrity: sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==} + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} + hasBin: true + + mkdist@1.5.7: + resolution: {integrity: sha512-xdBMl7hxGctAmAg4BLT3HqgpwP2QIRU4jm9aqTwu0911onX0C11+HFOvsK+VuFCpaMfIZJ5MrLfTXE+Hn/6Q2g==} + hasBin: true peerDependencies: - react: '>=16' - react-dom: '>=16' + sass: ^1.78.0 + typescript: '>=5.5.4' + vue-tsc: ^1.8.27 || ^2.0.21 + peerDependenciesMeta: + sass: + optional: true + typescript: + optional: true + vue-tsc: + optional: true - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + mlly@1.7.1: + resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} - react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} - react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - react-refresh@0.14.0: - resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} - engines: {node: '>=0.10.0'} + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} - engines: {node: '>=0.10.0'} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - react-remove-scroll-bar@2.3.4: - resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} - engines: {node: '>=10'} + msw@2.4.7: + resolution: {integrity: sha512-lLfwzRjTQhaYaoJq600wCFAmjLQnI7JI2VnUDmqj6icZbxgClwJqaJW2/++kkeQvKKoI8rG8NRFMutoG8+LT7w==} + engines: {node: '>=18'} + hasBin: true peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + typescript: '>= 4.8.x' peerDependenciesMeta: - '@types/react': + typescript: optional: true - react-remove-scroll@2.5.7: - resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - react-router-dom@6.26.0: - resolution: {integrity: sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true - react-router@6.26.0: - resolution: {integrity: sha512-wVQq0/iFYd3iZ9H2l3N3k4PL8EEHcb0XlU2Na8nEwmiXgIUElEH6gaJDtUQxJ+JFzmIXaQjfdpcGWaM6IoQGxg==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - react-style-singleton@2.2.1: - resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} - engines: {node: '>=10'} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + nitropack@2.9.6: + resolution: {integrity: sha512-HP2PE0dREcDIBVkL8Zm6eVyrDd10/GI9hTL00PHvjUM8I9Y/2cv73wRDmxNyInfrx/CJKHATb2U/pQrqpzJyXA==} + engines: {node: ^16.11.0 || >=17.0.0} + hasBin: true peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + xml2js: ^0.6.2 peerDependenciesMeta: - '@types/react': + xml2js: optional: true - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + node-addon-api@7.1.0: + resolution: {integrity: sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==} + engines: {node: ^16 || ^18 || >= 20} - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + node-emoji@2.1.3: + resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} + engines: {node: '>=18'} - readable-stream@4.5.2: - resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} - readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - recast@0.23.4: - resolution: {integrity: sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==} - engines: {node: '>= 4'} + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} - rechoir@0.8.0: - resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} - engines: {node: '>= 10.13.0'} + node-gyp-build@4.8.1: + resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} + hasBin: true - redaxios@0.5.1: - resolution: {integrity: sha512-FSD2AmfdbkYwl7KDExYQlVvIrFz6Yd83pGfaGjBzM9F6rpq8g652Q4Yq5QD4c+nf4g2AgeElv1y+8ajUPiOYMg==} + node-machine-id@1.1.12: + resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} - redis-errors@1.2.0: - resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} - engines: {node: '>=4'} + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true - redis-parser@3.0.0: - resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} - engines: {node: '>=4'} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} - reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-bundled@2.0.1: + resolution: {integrity: sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + npm-normalize-package-bin@2.0.0: + resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + npm-packlist@5.1.3: + resolution: {integrity: sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true - regenerate-unicode-properties@10.1.1: - resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} - regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} - regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + deprecated: This package is no longer supported. - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} + nwsapi@2.2.12: + resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} - regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + nx@19.7.3: + resolution: {integrity: sha512-8F4CzKavSuOFv+uKVwXHc00Px0q40CWAYCW6NC5IgU3AMaJVumyHzgB8Sn+yfkaVgfVnZVqznOsyrbZUWuj/VA==} hasBin: true + peerDependencies: + '@swc-node/register': ^1.8.0 + '@swc/core': ^1.3.85 + peerDependenciesMeta: + '@swc-node/register': + optional: true + '@swc/core': + optional: true - relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} - - remeda@2.7.0: - resolution: {integrity: sha512-7q7Xthw/C6uZBk8W5BfXpp/8IjaP51IPUrBVRfSZ3GB9dZMZJEAwYmVxA+TptDmhwlGRw8jUqoo4hL5zU0aV5Q==} + nypm@0.3.4: + resolution: {integrity: sha512-1JLkp/zHBrkS3pZ692IqOaIKSYHmQXgqfELk6YTOfVBnwealAmPA1q2kKK7PHJAHSMBozerThEFZXP3G6o7Ukg==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true - remix-auth-form@1.5.0: - resolution: {integrity: sha512-xWM7T41vi4ZsIxL3f8gz/D6g2mxrnYF7LnG+rG3VqwHh6l13xCoKLraxzWRdbKMVKKQCMISKZRXAeJh9/PQwBA==} - peerDependencies: - '@remix-run/server-runtime': ^1.0.0 || ^2.0.0 - remix-auth: ^3.6.0 + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} - remix-auth@3.7.0: - resolution: {integrity: sha512-2QVjp2nJVaYxuFBecMQwzixCO7CLSssttLBU5eVlNcNlVeNMmY1g7OkmZ1Ogw9sBcoMXZ18J7xXSK0AISVFcfQ==} - peerDependencies: - '@remix-run/react': ^1.0.0 || ^2.0.0 - '@remix-run/server-runtime': ^1.0.0 || ^2.0.0 + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} - renderkid@3.0.0: - resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} - resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} + object.defaults@1.1.0: + resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} + engines: {node: '>=0.10.0'} - resolve-dir@1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} engines: {node: '>=0.10.0'} - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + ofetch@1.3.4: + resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + ohash@1.1.3: + resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} - resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} - retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} - rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + openapi-typescript@6.7.5: + resolution: {integrity: sha512-ZD6dgSZi0u1QCP55g8/2yS5hNJfIpgqsSGHLxxdOjvY7eIrXzj271FJEQw33VwsZ6RCtO/NOuhxa7GBWmEudyA==} hasBin: true - rollup-plugin-preserve-directives@0.4.0: - resolution: {integrity: sha512-gx4nBxYm5BysmEQS+e2tAMrtFxrGvk+Pe5ppafRibQi0zlW7VYAbEGk6IKDw9sJGPdFWgVTE0o4BU4cdG0Fylg==} - peerDependencies: - rollup: 2.x || 3.x || 4.x + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} - rollup-plugin-visualizer@5.12.0: - resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} - engines: {node: '>=14'} - hasBin: true - peerDependencies: - rollup: 2.x || 3.x || 4.x - peerDependenciesMeta: - rollup: - optional: true + ora@5.3.0: + resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} + engines: {node: '>=10'} - rollup@4.18.0: - resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} - rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + outvariant@1.4.3: + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} - rrweb-cssom@0.7.1: - resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} - run-applescript@7.0.0: - resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} engines: {node: '>=18'} - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} - rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} - sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + p-retry@6.2.0: + resolution: {integrity: sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==} + engines: {node: '>=16.17'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + parse-filepath@1.0.2: + resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} + engines: {node: '>=0.8'} - safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} + parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + parse5-htmlparser2-tree-adapter@6.0.1: + resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} + parse5@5.1.1: + resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - schema-utils@4.2.0: - resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} - engines: {node: '>= 12.13.0'} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} - scule@1.3.0: - resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - select-hose@2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} - semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - serve-index@1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} - engines: {node: '>= 0.8.0'} + path-root-regex@0.1.2: + resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} + engines: {node: '>=0.10.0'} - serve-placeholder@2.0.1: - resolution: {integrity: sha512-rUzLlXk4uPFnbEaIz3SW8VISTxMuONas88nYWjAWaM2W9VDbt9tyFOr3lq8RhVOFrT3XISoBw8vni5una8qMnQ==} + path-root@0.1.1: + resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} + engines: {node: '>=0.10.0'} - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + path-to-regexp@0.1.10: + resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} - set-cookie-parser@2.7.0: - resolution: {integrity: sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==} + path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} - setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - sha-1@1.0.0: - resolution: {integrity: sha512-qjFA/+LdT0Gvu/JcmYTGZMvVy6WXJOWv1KQuY7HvSr2oBrMxA8PnZu2mc1/ZS2EvLMokj7lIeQsNPjkRzXrImw==} + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + pkg-types@1.2.0: + resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} - shiki@1.11.0: - resolution: {integrity: sha512-NqH/O1zRHvnuk/WfSL6b7+DtI7/kkMMSQGlZhm9DyzSU+SoIHhaw/fBZMr+zp9R8KjdIzkk3JKSC6hORuGDyng==} + playwright-core@1.47.1: + resolution: {integrity: sha512-i1iyJdLftqtt51mEk6AhYFaAJCDx0xQ/O5NU8EKaWFgMjItPVma542Nh/Aq8aLCjIJSzjaiEQGW/nyqLkGF1OQ==} + engines: {node: '>=18'} + hasBin: true - short-unique-id@5.2.0: - resolution: {integrity: sha512-cMGfwNyfDZ/nzJ2k2M+ClthBIh//GlZl1JEf47Uoa9XR11bz8Pa2T2wQO4bVrRdH48LrIDWJahQziKo3MjhsWg==} + playwright@1.47.1: + resolution: {integrity: sha512-SUEKi6947IqYbKxRiqnbUobVZY4bF1uu+ZnZNJX9DfU1tlf2UhWfvVjLf01pQx9URsOr18bFVUKXmanYWhbfkw==} + engines: {node: '>=18'} hasBin: true - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + postcss-calc@10.0.2: + resolution: {integrity: sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==} + engines: {node: ^18.12 || ^20.9 || >=22.0} + peerDependencies: + postcss: ^8.4.38 - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + postcss-colormin@7.0.2: + resolution: {integrity: sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - simple-git@3.25.0: - resolution: {integrity: sha512-KIY5sBnzc4yEcJXW7Tdv4viEz8KyG+nU0hay+DWZasvdFOYKeUZ6Xc25LUHHjw0tinPT7O1eY6pzX7pRT1K8rw==} + postcss-convert-values@7.0.4: + resolution: {integrity: sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + postcss-discard-comments@7.0.3: + resolution: {integrity: sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + postcss-discard-duplicates@7.0.1: + resolution: {integrity: sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} + postcss-discard-empty@7.0.0: + resolution: {integrity: sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} + postcss-discard-overridden@7.0.0: + resolution: {integrity: sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - slide@1.1.6: - resolution: {integrity: sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==} + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 - smob@1.4.1: - resolution: {integrity: sha512-9LK+E7Hv5R9u4g4C3p+jjLstaLe11MDsL21UpYaCNmapvMkYhqCV4A/f/3gyH8QjMyh6l68q9xC85vihY9ahMQ==} + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 - snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true - snakecase-keys@5.4.4: - resolution: {integrity: sha512-YTywJG93yxwHLgrYLZjlC75moVEX04LZM4FHfihjHe1FCXm+QaLOFfSf535aXOAd0ArVQMWUAe8ZPm4VtWyXaA==} - engines: {node: '>=12'} + postcss-merge-longhand@7.0.4: + resolution: {integrity: sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - snappy@7.2.2: - resolution: {integrity: sha512-iADMq1kY0v3vJmGTuKcFWSXt15qYUz7wFkArOrsSg0IFfI3nJqIJvK2/ZbEIndg7erIJLtAVX2nSOqPz7DcwbA==} - engines: {node: '>= 10'} + postcss-merge-rules@7.0.4: + resolution: {integrity: sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - sockjs@0.3.24: - resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + postcss-minify-font-values@7.0.0: + resolution: {integrity: sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} + postcss-minify-gradients@7.0.0: + resolution: {integrity: sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + postcss-minify-params@7.0.2: + resolution: {integrity: sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + postcss-minify-selectors@7.0.4: + resolution: {integrity: sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 - spawn-command@0.0.2: - resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + postcss-normalize-charset@7.0.0: + resolution: {integrity: sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - spdy-transport@3.0.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + postcss-normalize-display-values@7.0.0: + resolution: {integrity: sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - spdy@4.0.2: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} + postcss-normalize-positions@7.0.0: + resolution: {integrity: sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} + postcss-normalize-repeat-style@7.0.0: + resolution: {integrity: sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + postcss-normalize-string@7.0.0: + resolution: {integrity: sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - stable-hash@0.0.4: - resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + postcss-normalize-timing-functions@7.0.0: + resolution: {integrity: sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + postcss-normalize-unicode@7.0.2: + resolution: {integrity: sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} + postcss-normalize-url@7.0.0: + resolution: {integrity: sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + postcss-normalize-whitespace@7.0.0: + resolution: {integrity: sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + postcss-ordered-values@7.0.1: + resolution: {integrity: sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - standard-as-callback@2.1.0: - resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + postcss-reduce-initial@7.0.2: + resolution: {integrity: sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} + postcss-reduce-transforms@7.0.0: + resolution: {integrity: sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} - std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + postcss-svgo@7.0.1: + resolution: {integrity: sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==} + engines: {node: ^18.12.0 || ^20.9.0 || >= 18} + peerDependencies: + postcss: ^8.4.31 - stream-slice@0.1.2: - resolution: {integrity: sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA==} + postcss-unique-selectors@7.0.3: + resolution: {integrity: sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 - streamx@2.16.1: - resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - strict-event-emitter@0.5.1: - resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + engines: {node: ^10 || ^12 || >=14} - string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} - string-natural-compare@3.0.1: - resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} + prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true - string-ts@2.2.0: - resolution: {integrity: sha512-VTP0LLZo4Jp9Gz5IiDVMS9WyLx/3IeYh0PXUn0NdPqusUFNgkHPWiEdbB9TU2Iv3myUskraD5WtYEdHUrQEIlQ==} + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + pretty-error@4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} - string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} - engines: {node: '>= 0.4'} + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + prisma@5.19.1: + resolution: {integrity: sha512-c5K9MiDaa+VAAyh1OiYk76PXOme9s3E992D7kvvIOhCrNsBQfy2mP2QAQtX0WNj140IgG++12kwZpYB9iIydNQ==} + engines: {node: '>=16.13'} + hasBin: true - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} + publint@0.2.10: + resolution: {integrity: sha512-5TzYaAFiGpgkYX/k6VaItRMT2uHI4zO5OWJ2k7Er0Ot3jutBCNTJB1qRHuy1lYq07JhRczzFs6HFPB4D+A47xA==} + engines: {node: '>=16'} + hasBin: true - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - strip-literal@1.3.0: - resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - strong-log-transformer@2.1.0: - resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} - engines: {node: '>=4'} - hasBin: true + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - superjson@2.2.1: - resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} - engines: {node: '>=16'} + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} - superstruct@1.0.4: - resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} - engines: {node: '>=14.0.0'} + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + rc9@2.1.1: + resolution: {integrity: sha512-lNeOl38Ws0eNxpO3+wD1I9rkHGQyj1NU1jlzv4go2CtEnEQEUfqnIvZG7W+bC/aXdJ27n5x/yUjb6RoT9tko+Q==} - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + react-hot-toast@2.4.1: + resolution: {integrity: sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==} engines: {node: '>=10'} + peerDependencies: + react: '>=16' + react-dom: '>=16' - supports-color@9.4.0: - resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} - engines: {node: '>=12'} + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} - swc-loader@0.2.6: - resolution: {integrity: sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==} + react-remove-scroll-bar@2.3.4: + resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + engines: {node: '>=10'} peerDependencies: - '@swc/core': ^1.2.147 - webpack: '>=2' + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true - swr@2.2.5: - resolution: {integrity: sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==} + react-remove-scroll@2.5.7: + resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + engines: {node: '>=10'} peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + react-router-dom@6.26.0: + resolution: {integrity: sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' - system-architecture@0.1.0: - resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} - engines: {node: '>=18'} + react-router@6.26.0: + resolution: {integrity: sha512-wVQq0/iFYd3iZ9H2l3N3k4PL8EEHcb0XlU2Na8nEwmiXgIUElEH6gaJDtUQxJ+JFzmIXaQjfdpcGWaM6IoQGxg==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' - tailwind-merge@2.4.0: - resolution: {integrity: sha512-49AwoOQNKdqKPd9CViyH5wJoSKsCDjUlzL8DxuGp3P1FsGY36NJDAa18jLZcaHAUUuTj+JB8IAo8zWgBNvBF7A==} + react-style-singleton@2.2.1: + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true - tailwindcss@3.4.7: - resolution: {integrity: sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==} - engines: {node: '>=14.0.0'} - hasBin: true + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} - tar@6.2.0: - resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} - engines: {node: '>=10'} + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - terminal-link@2.1.1: - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} - engines: {node: '>=8'} + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} - terser-webpack-plugin@5.3.10: - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + recast@0.23.4: + resolution: {integrity: sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==} + engines: {node: '>= 4'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - terser@5.31.1: - resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==} - engines: {node: '>=10'} - hasBin: true + redaxios@0.5.1: + resolution: {integrity: sha512-FSD2AmfdbkYwl7KDExYQlVvIrFz6Yd83pGfaGjBzM9F6rpq8g652Q4Yq5QD4c+nf4g2AgeElv1y+8ajUPiOYMg==} - text-extensions@2.4.0: - resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} - text-hex@1.0.0: - resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - thingies@1.21.0: - resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} - engines: {node: '>=10.18'} - peerDependencies: - tslib: ^2 + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + remix-auth-form@1.5.0: + resolution: {integrity: sha512-xWM7T41vi4ZsIxL3f8gz/D6g2mxrnYF7LnG+rG3VqwHh6l13xCoKLraxzWRdbKMVKKQCMISKZRXAeJh9/PQwBA==} + peerDependencies: + '@remix-run/server-runtime': ^1.0.0 || ^2.0.0 + remix-auth: ^3.6.0 - thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + remix-auth@3.7.0: + resolution: {integrity: sha512-2QVjp2nJVaYxuFBecMQwzixCO7CLSssttLBU5eVlNcNlVeNMmY1g7OkmZ1Ogw9sBcoMXZ18J7xXSK0AISVFcfQ==} + peerDependencies: + '@remix-run/react': ^1.0.0 || ^2.0.0 + '@remix-run/server-runtime': ^1.0.0 || ^2.0.0 - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + renderkid@3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} - tiny-warning@1.0.3: - resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} - tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} - tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} - engines: {node: '>=14.14'} + resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} - tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} - tree-dump@1.0.2: - resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - triple-beam@1.4.1: - resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} - engines: {node: '>= 14.0.0'} + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + rollup-plugin-dts@6.1.1: + resolution: {integrity: sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==} engines: {node: '>=16'} peerDependencies: - typescript: '>=4.2.0' + rollup: ^3.29.4 || ^4 + typescript: ^4.5 || ^5.0 - ts-declaration-location@1.0.2: - resolution: {integrity: sha512-F7+4QiD/WguzLqviTNu+4tgR5SJtW4orC9RDCYzkwbeyHNq7hfGpq4Y8odaf0w9Z6orH+y98jgUdVaUFOPNRhg==} + rollup-plugin-preserve-directives@0.4.0: + resolution: {integrity: sha512-gx4nBxYm5BysmEQS+e2tAMrtFxrGvk+Pe5ppafRibQi0zlW7VYAbEGk6IKDw9sJGPdFWgVTE0o4BU4cdG0Fylg==} peerDependencies: - typescript: '>=4.0.0' - - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - - ts-pattern@5.2.0: - resolution: {integrity: sha512-aGaSpOlDcns7ZoeG/OMftWyQG1KqPVhgplhJxNCvyIXqWrumM5uIoOSarw/hmmi/T1PnuQ/uD8NaFHvLpHicDg==} + rollup: 2.x || 3.x || 4.x - tsconfck@3.0.3: - resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==} - engines: {node: ^18 || >=20} + rollup-plugin-visualizer@5.12.0: + resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} + engines: {node: '>=14'} hasBin: true peerDependencies: - typescript: ^5.0.0 + rollup: 2.x || 3.x || 4.x peerDependenciesMeta: - typescript: + rollup: optional: true - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true - tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + rollup@4.21.2: + resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rrweb-cssom@0.6.0: + resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - tslib@2.4.1: - resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} - turbo-stream@2.2.0: - resolution: {integrity: sha512-FKFg7A0To1VU4CH9YmSMON5QphK0BXjSoiC7D9yMh+mEEbXLUP9qJ4hEt1qcjKtzncs1OpcnjZO8NgrlVbZH+g==} + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} - type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true - type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true - type-fest@4.23.0: - resolution: {integrity: sha512-ZiBujro2ohr5+Z/hZWHESLz3g08BBdrdLMieYFULJO+tWc437sn8kQsWLJoZErY8alNhxre9K4p3GURAG11n+w==} - engines: {node: '>=16'} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + serve-placeholder@2.0.1: + resolution: {integrity: sha512-rUzLlXk4uPFnbEaIz3SW8VISTxMuONas88nYWjAWaM2W9VDbt9tyFOr3lq8RhVOFrT3XISoBw8vni5una8qMnQ==} - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} - typedoc-plugin-frontmatter@1.0.0: - resolution: {integrity: sha512-Mqn96+RjUjPUz/42H8MOp/8eOKjE5MVIgZRFDGmSI2YuggnMZSfh5MMpvd6ykjNTpq7gV5D2iwjqLt8nYRg9rg==} - peerDependencies: - typedoc-plugin-markdown: '>=4.0.0' + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - typedoc-plugin-markdown@4.2.6: - resolution: {integrity: sha512-k33o2lZSGpL3GjH28eW+RsujzCYFP0L5GNqpK+wa4CBcMOxpj8WV7SydNRLS6eSa2UvaPvNVJTaAZ6Tm+8GXoA==} - engines: {node: '>= 18'} - peerDependencies: - typedoc: 0.26.x + set-cookie-parser@2.7.0: + resolution: {integrity: sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==} - typedoc@0.26.6: - resolution: {integrity: sha512-SfEU3SH3wHNaxhFPjaZE2kNl/NFtLNW5c1oHsg7mti7GjmUj1Roq6osBQeMd+F4kL0BoRBBr8gQAuqBlfFu8LA==} - engines: {node: '>= 18'} - hasBin: true - peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} - typescript-eslint@7.18.0: - resolution: {integrity: sha512-PonBkP603E3tt05lDkbOMyaxJjvKqQrXsnow72sVeOFINDE/qNmnnd+f9b4N+U7W6MXnnYyrhtmF2t08QWwUbA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.57.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} - hasBin: true + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} - engines: {node: '>=14.17'} - hasBin: true + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} - typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} - engines: {node: '>=14.17'} - hasBin: true + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} - typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} - typescript@5.4.2: - resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} - engines: {node: '>=14.17'} - hasBin: true + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true + shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - typescript@5.5.3: - resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} - engines: {node: '>=14.17'} - hasBin: true + shiki@1.11.0: + resolution: {integrity: sha512-NqH/O1zRHvnuk/WfSL6b7+DtI7/kkMMSQGlZhm9DyzSU+SoIHhaw/fBZMr+zp9R8KjdIzkk3JKSC6hORuGDyng==} - uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + short-unique-id@5.2.0: + resolution: {integrity: sha512-cMGfwNyfDZ/nzJ2k2M+ClthBIh//GlZl1JEf47Uoa9XR11bz8Pa2T2wQO4bVrRdH48LrIDWJahQziKo3MjhsWg==} + hasBin: true - ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - unc-path-regex@0.1.2: - resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} - engines: {node: '>=0.10.0'} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - uncrypto@0.1.3: - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} - unctx@2.3.1: - resolution: {integrity: sha512-PhKke8ZYauiqh3FEMVNm7ljvzQiph0Mt3GBRve03IJm7ukfaON2OBK795tLwhbyfzknuRRkW0+Ze+CQUmzOZ+A==} + simple-git@3.25.0: + resolution: {integrity: sha512-KIY5sBnzc4yEcJXW7Tdv4viEz8KyG+nU0hay+DWZasvdFOYKeUZ6Xc25LUHHjw0tinPT7O1eY6pzX7pRT1K8rw==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} - undici-types@5.28.4: - resolution: {integrity: sha512-3OeMF5Lyowe8VW0skf5qaIE7Or3yS9LS7fvMUI0gg4YxpIBVg0L8BxCmROw2CcYhSkpR68Epz7CGc8MPj94Uww==} + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} - undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} - engines: {node: '>=14.0'} + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} - undici@6.19.7: - resolution: {integrity: sha512-HR3W/bMGPSr90i8AAp2C4DM3wChFdJPLrWYpIS++LxS8K+W535qftjt+4MyjNYHeWabMj1nvtmLIi7l++iq91A==} - engines: {node: '>=18.17'} + smob@1.4.1: + resolution: {integrity: sha512-9LK+E7Hv5R9u4g4C3p+jjLstaLe11MDsL21UpYaCNmapvMkYhqCV4A/f/3gyH8QjMyh6l68q9xC85vihY9ahMQ==} - unenv@1.9.0: - resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==} + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} + snakecase-keys@5.4.4: + resolution: {integrity: sha512-YTywJG93yxwHLgrYLZjlC75moVEX04LZM4FHfihjHe1FCXm+QaLOFfSf535aXOAd0ArVQMWUAe8ZPm4VtWyXaA==} + engines: {node: '>=12'} - unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} + sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} - unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} - unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} - unimport@3.7.1: - resolution: {integrity: sha512-V9HpXYfsZye5bPPYUgs0Otn3ODS1mDUciaBlXljI4C2fTwfFpvFZRywmlOu943puN9sncxROMZhsZCjNXEpzEQ==} + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} + spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} + spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} + spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} - unplugin@1.12.2: - resolution: {integrity: sha512-bEqQxeC7rxtxPZ3M5V4Djcc4lQqKPgGe3mAWZvxcSmX5jhGxll19NliaRzQSQPrk4xJZSGniK3puLWpRuZN7VQ==} - engines: {node: '>=14.0.0'} + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - unstorage@1.10.2: - resolution: {integrity: sha512-cULBcwDqrS8UhlIysUJs2Dk0Mmt8h7B0E6mtR+relW9nZvsf/u4SkAYyNliPiPW7XtFNb5u3IUMkxGxFTTRTgQ==} - peerDependencies: - '@azure/app-configuration': ^1.5.0 - '@azure/cosmos': ^4.0.0 - '@azure/data-tables': ^13.2.2 - '@azure/identity': ^4.0.1 - '@azure/keyvault-secrets': ^4.8.0 - '@azure/storage-blob': ^12.17.0 - '@capacitor/preferences': ^5.0.7 - '@netlify/blobs': ^6.5.0 || ^7.0.0 - '@planetscale/database': ^1.16.0 - '@upstash/redis': ^1.28.4 - '@vercel/kv': ^1.0.1 - idb-keyval: ^6.2.1 - ioredis: ^5.3.2 - peerDependenciesMeta: - '@azure/app-configuration': - optional: true - '@azure/cosmos': - optional: true - '@azure/data-tables': - optional: true - '@azure/identity': - optional: true - '@azure/keyvault-secrets': - optional: true - '@azure/storage-blob': - optional: true - '@capacitor/preferences': - optional: true - '@netlify/blobs': - optional: true - '@planetscale/database': - optional: true - '@upstash/redis': - optional: true - '@vercel/kv': - optional: true - idb-keyval: - optional: true - ioredis: - optional: true + stable-hash@0.0.4: + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} - untun@0.1.3: - resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} - hasBin: true + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - unwasm@0.3.9: - resolution: {integrity: sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==} + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - update-browserslist-db@1.1.0: - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - uqr@0.1.2: - resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - url-polyfill@1.1.12: - resolution: {integrity: sha512-mYFmBHCapZjtcNHW0MDq9967t+z4Dmg5CJ0KqysK3+ZbyoNOWQHksGCTWwDhxGXllkWlOc10Xfko6v4a3ucM6A==} + streamx@2.16.1: + resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} - urlpattern-polyfill@8.0.2: - resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} + strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} - use-callback-ref@1.3.0: - resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} - use-sidecar@1.1.2: - resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + string-ts@2.2.0: + resolution: {integrity: sha512-VTP0LLZo4Jp9Gz5IiDVMS9WyLx/3IeYh0PXUn0NdPqusUFNgkHPWiEdbB9TU2Iv3myUskraD5WtYEdHUrQEIlQ==} - use-sync-external-store@1.2.2: - resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - utila@0.4.0: - resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} - v8flags@4.0.1: - resolution: {integrity: sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==} - engines: {node: '>= 10.13.0'} + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} - valibot@0.36.0: - resolution: {integrity: sha512-CjF1XN4sUce8sBK9TixrDqFM7RwNkuXdJu174/AwmQUB62QbCQADg5lLe8ldBalFgtj1uKj+pKwDJiNo4Mn+eQ==} + strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} - valibot@0.37.0: - resolution: {integrity: sha512-FQz52I8RXgFgOHym3XHYSREbNtkgSjF9prvMFH1nBsRyfL6SfCzoT1GuSDTlbsuPubM7/6Kbw0ZMQb8A+V+VsQ==} - peerDependencies: - typescript: '>=5' - peerDependenciesMeta: - typescript: - optional: true + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} - validator@13.12.0: - resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} - engines: {node: '>= 0.10'} + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} - vinxi@0.3.12: - resolution: {integrity: sha512-YU/Scild/Rdy6qwgdILYRlO99Wp8ti2CmlMlYioEg7lRtxAST5iCFjviDya+BYQDgc3Pugh4KzOypVwjZknF2A==} - hasBin: true + strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} - vinxi@0.4.1: - resolution: {integrity: sha512-WGEYqIuJ2/P3sBoSVKsGvp/UKpW4wVSaAFdA18gthyMCEExN6nVteoA+Rv1wQFLKXTVL9JRpeGJjcLzcRRgGCA==} - hasBin: true + strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} - vite-node@1.6.0: - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} - engines: {node: ^18.0.0 || >=20.0.0} + strong-log-transformer@2.1.0: + resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} + engines: {node: '>=4'} hasBin: true - vite-plugin-babel@1.2.0: - resolution: {integrity: sha512-ltAnq535Ubf9sDbVCkztAdkwx5aQbNrwPFs+iZTJ5FaAhTdxjqmLGpxsAaRfJWEKBJ/kFf9KwMoTdArm0IRUUw==} - peerDependencies: - '@babel/core': ^7.0.0 - vite: ^2.7.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - - vite-plugin-dts@3.9.1: - resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} - engines: {node: ^14.18.0 || >=16.0.0} + stylehacks@7.0.4: + resolution: {integrity: sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - typescript: '*' - vite: '*' - peerDependenciesMeta: - vite: - optional: true + postcss: ^8.4.31 - vite-plugin-dts@4.0.3: - resolution: {integrity: sha512-+xnTsaONwU2kV6zhRjtbRJSGN41uFR/whqmcb4k4fftLFDJElxthp0PP5Fq8gMeM9ytWMt1yk5gGgekLREWYQQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - typescript: '*' - vite: '*' - peerDependenciesMeta: - vite: - optional: true + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true - vite-plugin-externalize-deps@0.8.0: - resolution: {integrity: sha512-MdC8kRNQ1ZjhUicU2HcqGVhL0UUFqv83Zp1JZdHjE82PoPR8wsSWZ3axpot7B6img3sW6g8shYJikE0CKA0chA==} - peerDependencies: - vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + superjson@2.2.1: + resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + engines: {node: '>=16'} - vite-tsconfig-paths@4.3.2: - resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} - peerDependencies: - vite: '*' - peerDependenciesMeta: - vite: - optional: true + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} - vite-tsconfig-paths@5.0.1: - resolution: {integrity: sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==} - peerDependencies: - vite: '*' - peerDependenciesMeta: - vite: - optional: true + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} - vite@5.3.5: - resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} - vitest@1.6.0: - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true + supports-color@9.4.0: + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} - vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + supports-hyperlinks@3.1.0: + resolution: {integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==} + engines: {node: '>=14.18'} - vue-template-compiler@2.7.16: - resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} - vue-tsc@1.8.27: - resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} + svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + engines: {node: '>=14.0.0'} hasBin: true + + swc-loader@0.2.6: + resolution: {integrity: sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==} peerDependencies: - typescript: '*' + '@swc/core': ^1.2.147 + webpack: '>=2' - vue-tsc@2.0.29: - resolution: {integrity: sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==} - hasBin: true + swr@2.2.5: + resolution: {integrity: sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==} peerDependencies: - typescript: '>=5.0.0' + react: ^16.11.0 || ^17.0.0 || ^18.0.0 - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} - engines: {node: '>=10.13.0'} + system-architecture@0.1.0: + resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} + engines: {node: '>=18'} - wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + tailwind-merge@2.5.2: + resolution: {integrity: sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==} - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + tailwindcss@3.4.11: + resolution: {integrity: sha512-qhEuBcLemjSJk5ajccN9xJFtM/h0AVCPaA6C92jNP+M2J8kX+eMJHI7R2HFKUvvAsMpcfLILMCFYSeDwpMmlUg==} + engines: {node: '>=14.0.0'} + hasBin: true - web-encoding@1.1.5: - resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} - web-streams-polyfill@3.2.1: - resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} - engines: {node: '>= 8'} + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} + tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} - webpack-cli@5.1.4: - resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} - engines: {node: '>=14.15.0'} - hasBin: true + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} peerDependencies: - '@webpack-cli/generators': '*' - webpack: 5.x.x - webpack-bundle-analyzer: '*' - webpack-dev-server: '*' + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 peerDependenciesMeta: - '@webpack-cli/generators': - optional: true - webpack-bundle-analyzer: + '@swc/core': optional: true - webpack-dev-server: + esbuild: optional: true - - webpack-dev-middleware@7.2.1: - resolution: {integrity: sha512-hRLz+jPQXo999Nx9fXVdKlg/aehsw1ajA9skAneGmT03xwmyuhvF93p6HUKKbWhXdcERtGTzUCtIQr+2IQegrA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - webpack: ^5.0.0 - peerDependenciesMeta: - webpack: + uglify-js: optional: true - webpack-dev-server@5.0.4: - resolution: {integrity: sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==} - engines: {node: '>= 18.12.0'} + terser@5.31.1: + resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==} + engines: {node: '>=10'} hasBin: true + + text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + thingies@1.21.0: + resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + engines: {node: '>=10.18'} peerDependencies: - webpack: ^5.0.0 - webpack-cli: '*' - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true + tslib: ^2 - webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} - engines: {node: '>=10.0.0'} + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} + thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - webpack-virtual-modules@0.6.2: - resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - webpack@5.93.0: - resolution: {integrity: sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} + tinybench@2.8.0: + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} - websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} - whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} - whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} + tmp@0.2.3: + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} - which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + tree-dump@1.0.2: + resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' - which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + ts-declaration-location@1.0.4: + resolution: {integrity: sha512-r4JoxYhKULbZuH81Pjrp9OEG5St7XWk7zXwGkLKhmVcjiBVHTJXV5wK6dEa9JKW5QGSTW6b1lOjxAKp8R1SQhg==} + peerDependencies: + typescript: '>=4.0.0' - widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + ts-pattern@5.3.1: + resolution: {integrity: sha512-1RUMKa8jYQdNfmnK4jyzBK3/PS/tnjcZ1CW0v1vWDeYe5RBklc/nquw03MEoB66hVBm4BnlCfmOqDVxHyT1DpA==} - winston-loki@6.1.2: - resolution: {integrity: sha512-l1iqDDaEUt63Q8arDsiVCXIrK3jLjPOEc5UTs+WMVnWf8D+A8ZRErAAXKDOduT240aNGzpTbCwe5zfdqqLlzMg==} + tsconfck@3.0.3: + resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - winston-transport@4.7.1: - resolution: {integrity: sha512-wQCXXVgfv/wUPOfb2x0ruxzwkcZfxcktz6JIMUaPLmcNhO4bZTwA/WtDWK74xV3F2dKu8YadrFv0qhwYjVEwhA==} - engines: {node: '>= 12.0.0'} + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} - winston@3.14.2: - resolution: {integrity: sha512-CO8cdpBB2yqzEf8v895L+GNKYJiEq8eKlHU38af3snQBQ+sdAIUepjMSguOIJC7ICbzm0ZI+Af2If4vIJrtmOg==} - engines: {node: '>= 12.0.0'} + tslib@2.4.1: + resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + tsx@4.19.1: + resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} + engines: {node: '>=18.0.0'} + hasBin: true - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + turbo-stream@2.2.0: + resolution: {integrity: sha512-FKFg7A0To1VU4CH9YmSMON5QphK0BXjSoiC7D9yMh+mEEbXLUP9qJ4hEt1qcjKtzncs1OpcnjZO8NgrlVbZH+g==} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + turbo-stream@2.3.0: + resolution: {integrity: sha512-PhEr9mdexoVv+rJkQ3c8TjrN3DUghX37GNJkSMksoPR4KrXIPnM2MnqRt07sViIqX9IdlhrgtTSyjoVOASq6cg==} - write-file-atomic@1.3.4: - resolution: {integrity: sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==} + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + type-fest@4.23.0: + resolution: {integrity: sha512-ZiBujro2ohr5+Z/hZWHESLz3g08BBdrdLMieYFULJO+tWc437sn8kQsWLJoZErY8alNhxre9K4p3GURAG11n+w==} + engines: {node: '>=16'} - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + typedoc-plugin-frontmatter@1.0.0: + resolution: {integrity: sha512-Mqn96+RjUjPUz/42H8MOp/8eOKjE5MVIgZRFDGmSI2YuggnMZSfh5MMpvd6ykjNTpq7gV5D2iwjqLt8nYRg9rg==} + peerDependencies: + typedoc-plugin-markdown: '>=4.0.0' - yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} + typedoc-plugin-markdown@4.2.6: + resolution: {integrity: sha512-k33o2lZSGpL3GjH28eW+RsujzCYFP0L5GNqpK+wa4CBcMOxpj8WV7SydNRLS6eSa2UvaPvNVJTaAZ6Tm+8GXoA==} + engines: {node: '>= 18'} + peerDependencies: + typedoc: 0.26.x - yaml@2.4.5: - resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} - engines: {node: '>= 14'} + typedoc@0.26.6: + resolution: {integrity: sha512-SfEU3SH3wHNaxhFPjaZE2kNl/NFtLNW5c1oHsg7mti7GjmUj1Roq6osBQeMd+F4kL0BoRBBr8gQAuqBlfFu8LA==} + engines: {node: '>= 18'} hasBin: true + peerDependencies: + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + typescript-eslint@8.3.0: + resolution: {integrity: sha512-EvWjwWLwwKDIJuBjk2I6UkV8KEQcwZ0VM10nR1rIunRDIP67QJTZAHBXTX0HW/oI1H10YESF8yWie8fRQxjvFA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} + typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true - z-schema@5.0.5: - resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} - engines: {node: '>=8.0.0'} + typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + engines: {node: '>=14.17'} hasBin: true - zip-stream@6.0.1: - resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} - engines: {node: '>= 14'} + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true - zod-validation-error@1.2.0: - resolution: {integrity: sha512-laJkD/ugwEh8CpuH+xXv5L9Z+RLz3lH8alNxolfaHZJck611OJj97R4Rb+ZqA7WNly2kNtTo4QwjdjXw9scpiw==} - engines: {node: ^14.17 || >=16.0.0} - peerDependencies: - zod: ^3.18.0 + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + typescript@5.6.1-rc: + resolution: {integrity: sha512-E3b2+1zEFu84jB0YQi9BORDjz9+jGbwwy1Zi3G0LUNw7a7cePUrHMRNy8aPh53nXpkFGVHSxIZo5vKTfYaFiBQ==} + engines: {node: '>=14.17'} + hasBin: true -snapshots: + typescript@5.6.2: + resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} + engines: {node: '>=14.17'} + hasBin: true - '@aashutoshrathi/word-wrap@1.2.6': {} + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + + unbuild@2.0.0: + resolution: {integrity: sha512-JWCUYx3Oxdzvw2J9kTAp+DKE8df/BnH/JTSj6JyA4SH40ECdFu7FoJJcrm8G92B7TjofQ6GZGjJs50TRxoH6Wg==} + hasBin: true + peerDependencies: + typescript: ^5.1.6 + peerDependenciesMeta: + typescript: + optional: true - '@adobe/css-tools@4.4.0': {} + unc-path-regex@0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} + engines: {node: '>=0.10.0'} - '@alloc/quick-lru@5.2.0': {} + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + unctx@2.3.1: + resolution: {integrity: sha512-PhKke8ZYauiqh3FEMVNm7ljvzQiph0Mt3GBRve03IJm7ukfaON2OBK795tLwhbyfzknuRRkW0+Ze+CQUmzOZ+A==} - '@ark/schema@0.3.2': - dependencies: - '@ark/util': 0.2.1 + undici-types@5.28.4: + resolution: {integrity: sha512-3OeMF5Lyowe8VW0skf5qaIE7Or3yS9LS7fvMUI0gg4YxpIBVg0L8BxCmROw2CcYhSkpR68Epz7CGc8MPj94Uww==} - '@ark/util@0.2.1': {} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - '@babel/code-frame@7.24.7': - dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.0.1 + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} - '@babel/compat-data@7.25.2': {} + unenv@1.9.0: + resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==} - '@babel/core@7.25.2': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helpers': 7.25.0 - '@babel/parser': 7.25.3 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 - convert-source-map: 2.0.0 - debug: 4.3.5 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} - '@babel/eslint-parser@7.24.5(@babel/core@7.25.2)(eslint@8.57.0)': - dependencies: - '@babel/core': 7.25.2 - '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.57.0 - eslint-visitor-keys: 2.1.0 - semver: 6.3.1 + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} - '@babel/generator@7.25.0': - dependencies: - '@babel/types': 7.25.2 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 + unimport@3.7.1: + resolution: {integrity: sha512-V9HpXYfsZye5bPPYUgs0Otn3ODS1mDUciaBlXljI4C2fTwfFpvFZRywmlOu943puN9sncxROMZhsZCjNXEpzEQ==} - '@babel/helper-annotate-as-pure@7.24.7': - dependencies: - '@babel/types': 7.25.2 + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': - dependencies: - '@babel/types': 7.25.2 + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} - '@babel/helper-compilation-targets@7.25.2': - dependencies: - '@babel/compat-data': 7.25.2 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.23.3 - lru-cache: 5.1.1 - semver: 6.3.1 + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} - '@babel/helper-create-class-features-plugin@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-function-name': 7.24.7 - '@babel/helper-member-expression-to-functions': 7.24.7 - '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/helper-replace-supers': 7.24.7(@babel/core@7.25.2) - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} - '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - regexpu-core: 5.3.2 - semver: 6.3.1 + unplugin@1.12.2: + resolution: {integrity: sha512-bEqQxeC7rxtxPZ3M5V4Djcc4lQqKPgGe3mAWZvxcSmX5jhGxll19NliaRzQSQPrk4xJZSGniK3puLWpRuZN7VQ==} + engines: {node: '>=14.0.0'} - '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - debug: 4.3.5 - lodash.debounce: 4.0.8 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color + unstorage@1.10.2: + resolution: {integrity: sha512-cULBcwDqrS8UhlIysUJs2Dk0Mmt8h7B0E6mtR+relW9nZvsf/u4SkAYyNliPiPW7XtFNb5u3IUMkxGxFTTRTgQ==} + peerDependencies: + '@azure/app-configuration': ^1.5.0 + '@azure/cosmos': ^4.0.0 + '@azure/data-tables': ^13.2.2 + '@azure/identity': ^4.0.1 + '@azure/keyvault-secrets': ^4.8.0 + '@azure/storage-blob': ^12.17.0 + '@capacitor/preferences': ^5.0.7 + '@netlify/blobs': ^6.5.0 || ^7.0.0 + '@planetscale/database': ^1.16.0 + '@upstash/redis': ^1.28.4 + '@vercel/kv': ^1.0.1 + idb-keyval: ^6.2.1 + ioredis: ^5.3.2 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/kv': + optional: true + idb-keyval: + optional: true + ioredis: + optional: true - '@babel/helper-environment-visitor@7.24.7': - dependencies: - '@babel/types': 7.25.2 + untun@0.1.3: + resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} + hasBin: true - '@babel/helper-function-name@7.24.7': - dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + untyped@1.4.2: + resolution: {integrity: sha512-nC5q0DnPEPVURPhfPQLahhSTnemVtPzdx7ofiRxXpOB2SYnb3MfdU3DVGyJdS8Lx+tBWeAePO8BfU/3EgksM7Q==} + hasBin: true - '@babel/helper-hoist-variables@7.24.7': - dependencies: - '@babel/types': 7.25.2 + unwasm@0.3.9: + resolution: {integrity: sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==} - '@babel/helper-member-expression-to-functions@7.24.7': - dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 - transitivePeerDependencies: - - supports-color + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' - '@babel/helper-module-imports@7.24.7': - dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 - transitivePeerDependencies: - - supports-color + uqr@0.1.2: + resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} - '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.3 - transitivePeerDependencies: - - supports-color + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - '@babel/helper-optimise-call-expression@7.24.7': - dependencies: - '@babel/types': 7.25.2 + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - '@babel/helper-plugin-utils@7.24.7': {} + urlpattern-polyfill@8.0.2: + resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} - '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-wrap-function': 7.24.5 + use-callback-ref@1.3.0: + resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true - '@babel/helper-replace-supers@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-member-expression-to-functions': 7.24.7 - '@babel/helper-optimise-call-expression': 7.24.7 - transitivePeerDependencies: - - supports-color + use-sidecar@1.1.2: + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true - '@babel/helper-simple-access@7.24.7': - dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 - transitivePeerDependencies: - - supports-color + use-sync-external-store@1.2.2: + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.24.7': - dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 - transitivePeerDependencies: - - supports-color + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - '@babel/helper-split-export-declaration@7.24.7': - dependencies: - '@babel/types': 7.25.2 + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - '@babel/helper-string-parser@7.24.8': {} + utila@0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} - '@babel/helper-validator-identifier@7.24.7': {} + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} - '@babel/helper-validator-option@7.24.8': {} + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true - '@babel/helper-wrap-function@7.24.5': - dependencies: - '@babel/helper-function-name': 7.24.7 - '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + v8flags@4.0.1: + resolution: {integrity: sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==} + engines: {node: '>= 10.13.0'} - '@babel/helpers@7.25.0': - dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + valibot@0.42.0: + resolution: {integrity: sha512-igMdmHXxDiQY714ssh9bGisMqJ2yg7sko1KOmv/omnrIacGtP6mGrbvVT1IuV1bDrHyG9ybgpHwG1UElDiDCLg==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true - '@babel/highlight@7.24.7': - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - '@babel/parser@7.25.3': - dependencies: - '@babel/types': 7.25.2 + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + vinxi@0.4.3: + resolution: {integrity: sha512-RgJz7RWftML5h/qfPsp3QKVc2FSlvV4+HevpE0yEY2j+PS/I2ULjoSsZDXaR8Ks2WYuFFDzQr8yrox7v8aqkng==} + hasBin: true - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + vite-node@1.6.0: + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.25.2) - transitivePeerDependencies: - - supports-color + vite-plugin-babel@1.2.0: + resolution: {integrity: sha512-ltAnq535Ubf9sDbVCkztAdkwx5aQbNrwPFs+iZTJ5FaAhTdxjqmLGpxsAaRfJWEKBJ/kFf9KwMoTdArm0IRUUw==} + peerDependencies: + '@babel/core': ^7.0.0 + vite: ^2.7.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + vite-plugin-dts@4.0.3: + resolution: {integrity: sha512-+xnTsaONwU2kV6zhRjtbRJSGN41uFR/whqmcb4k4fftLFDJElxthp0PP5Fq8gMeM9ytWMt1yk5gGgekLREWYQQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true - '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 - transitivePeerDependencies: - - supports-color + vite-plugin-externalize-deps@0.8.0: + resolution: {integrity: sha512-MdC8kRNQ1ZjhUicU2HcqGVhL0UUFqv83Zp1JZdHjE82PoPR8wsSWZ3axpot7B6img3sW6g8shYJikE0CKA0chA==} + peerDependencies: + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - '@babel/plugin-proposal-decorators@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-decorators': 7.24.1(@babel/core@7.25.2) - transitivePeerDependencies: - - supports-color + vite-tsconfig-paths@5.0.1: + resolution: {integrity: sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true - '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + vite@5.4.5: + resolution: {integrity: sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true - '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + vitest@1.6.0: + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true - '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) - transitivePeerDependencies: - - supports-color + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 - transitivePeerDependencies: - - supports-color + vue-tsc@2.0.29: + resolution: {integrity: sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} - '@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) - transitivePeerDependencies: - - supports-color + watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + web-streams-polyfill@3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: '>= 8'} - '@babel/plugin-syntax-decorators@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} - '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + webpack-cli@5.1.4: + resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} + engines: {node: '>=14.15.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + webpack: 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true - '@babel/plugin-syntax-flow@7.24.6(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + webpack-dev-middleware@7.4.2: + resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true - '@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + webpack-dev-server@5.1.0: + resolution: {integrity: sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==} + engines: {node: '>= 18.12.0'} + hasBin: true + peerDependencies: + webpack: ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true - '@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + webpack@5.94.0: + resolution: {integrity: sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + whatwg-url@14.0.0: + resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + engines: {node: '>=18'} - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true - '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true - '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true - '@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.25.2) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - '@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.25.2) - transitivePeerDependencies: - - supports-color + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} - '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} - '@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} - '@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 - transitivePeerDependencies: - - supports-color + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} - '@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) - transitivePeerDependencies: - - supports-color + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} - '@babel/plugin-transform-classes@7.24.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-function-name': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-replace-supers': 7.24.7(@babel/core@7.25.2) - '@babel/helper-split-export-declaration': 7.24.7 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/template': 7.25.0 + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true - '@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} - '@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - '@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} - '@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - '@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.24.7 + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - '@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - '@babel/plugin-transform-flow-strip-types@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-flow': 7.24.6(@babel/core@7.25.2) + yaml@2.4.5: + resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} + engines: {node: '>= 14'} + hasBin: true - '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - transitivePeerDependencies: - - supports-color + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} - '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-function-name': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} - '@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} - '@babel/plugin-transform-literals@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} - '@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} - '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} - '@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 - transitivePeerDependencies: - - supports-color + yocto-spinner@0.1.0: + resolution: {integrity: sha512-sBra0N4uhNn5UibnOz/HJxB1a0tzZ5zXbqnDe+tfRR3BGy+BmOrzrnQCZRJI7C++JiSZaPygPeNon4QCUmMQ4g==} + engines: {node: '>=18.19'} - '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - transitivePeerDependencies: - - supports-color + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} - '@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-hoist-variables': 7.24.7 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - transitivePeerDependencies: - - supports-color + yoctocolors@2.1.1: + resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + engines: {node: '>=18'} - '@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 - transitivePeerDependencies: - - supports-color + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - '@babel/plugin-transform-new-target@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 +snapshots: - '@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@aashutoshrathi/word-wrap@1.2.6': {} - '@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@adobe/css-tools@4.4.0': {} - '@babel/plugin-transform-object-rest-spread@7.24.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.25.2) + '@alloc/quick-lru@5.2.0': {} - '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.25.2)': + '@ampproject/remapping@2.3.0': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-replace-supers': 7.24.7(@babel/core@7.25.2) - transitivePeerDependencies: - - supports-color + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 - '@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@andrewbranch/untar.js@1.0.3': {} - '@babel/plugin-transform-optional-chaining@7.24.5(@babel/core@7.25.2)': + '@arethetypeswrong/cli@0.16.2': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) - transitivePeerDependencies: - - supports-color + '@arethetypeswrong/core': 0.16.2 + chalk: 4.1.2 + cli-table3: 0.6.5 + commander: 10.0.1 + marked: 9.1.6 + marked-terminal: 7.1.0(marked@9.1.6) + semver: 7.6.3 - '@babel/plugin-transform-parameters@7.24.5(@babel/core@7.25.2)': + '@arethetypeswrong/core@0.16.2': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + '@andrewbranch/untar.js': 1.0.3 + cjs-module-lexer: 1.4.1 + fflate: 0.8.2 + lru-cache: 10.4.3 + semver: 7.6.3 + typescript: 5.6.1-rc + validate-npm-package-name: 5.0.1 - '@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.25.2)': + '@ark/schema@0.10.0': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 - transitivePeerDependencies: - - supports-color + '@ark/util': 0.10.0 - '@babel/plugin-transform-private-property-in-object@7.24.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) - transitivePeerDependencies: - - supports-color + '@ark/util@0.10.0': {} - '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.25.2)': + '@babel/code-frame@7.24.7': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/highlight': 7.24.7 + picocolors: 1.1.0 - '@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/compat-data@7.25.2': {} - '@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.25.2)': + '@babel/core@7.25.2': dependencies: - '@babel/core': 7.25.2 - '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.25.2) + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.0 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + convert-source-map: 2.0.0 + debug: 4.3.6 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2)': + '@babel/generator@7.25.6': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/types': 7.25.6 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 - '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2)': + '@babel/helper-compilation-targets@7.25.2': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/compat-data': 7.25.2 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 + lru-cache: 5.1.1 + semver: 6.3.1 - '@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.25.2)': + '@babel/helper-module-imports@7.24.7': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - - '@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - regenerator-transform: 0.15.2 - - '@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - - '@babel/plugin-transform-runtime@7.24.3(@babel/core@7.25.2)': + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.25.2) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) - semver: 6.3.1 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-plugin-utils@7.24.8': {} - '@babel/plugin-transform-spread@7.24.1(@babel/core@7.25.2)': + '@babel/helper-simple-access@7.24.7': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - - '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - - '@babel/plugin-transform-typeof-symbol@7.24.5(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - - '@babel/plugin-transform-typescript@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) - transitivePeerDependencies: - - supports-color + '@babel/helper-string-parser@7.24.8': {} - '@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-validator-identifier@7.24.7': {} - '@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.25.2)': + '@babel/helper-validator-option@7.24.8': {} + + '@babel/helpers@7.25.0': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 - '@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.25.2)': + '@babel/highlight@7.24.7': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.0 - '@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.25.2)': + '@babel/parser@7.25.6': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.7 + '@babel/types': 7.25.6 - '@babel/preset-env@7.24.5(@babel/core@7.25.2)': + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': dependencies: - '@babel/compat-data': 7.25.2 '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.5(@babel/core@7.25.2) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.2) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.25.2) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.25.2) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.25.2) - '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.25.2) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.25.2) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.25.2) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-object-rest-spread': 7.24.5(@babel/core@7.25.2) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.25.2) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.25.2) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-private-property-in-object': 7.24.5(@babel/core@7.25.2) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-typeof-symbol': 7.24.5(@babel/core@7.25.2) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.25.2) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.2) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.25.2) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) - core-js-compat: 3.37.1 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + '@babel/helper-plugin-utils': 7.24.8 - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2)': + '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/types': 7.25.2 - esutils: 2.0.3 + '@babel/helper-plugin-utils': 7.24.8 - '@babel/preset-react@7.24.1(@babel/core@7.25.2)': + '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.25.2) - '@babel/plugin-transform-react-pure-annotations': 7.24.1(@babel/core@7.25.2) - transitivePeerDependencies: - - supports-color + '@babel/helper-plugin-utils': 7.24.8 - '@babel/preset-typescript@7.24.1(@babel/core@7.25.2)': + '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.7 - '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-typescript': 7.24.7(@babel/core@7.25.2) - transitivePeerDependencies: - - supports-color - - '@babel/regjsgen@0.8.0': {} + '@babel/helper-plugin-utils': 7.24.8 '@babel/runtime@7.23.5': dependencies: regenerator-runtime: 0.14.0 + '@babel/standalone@7.25.6': {} + '@babel/template@7.25.0': dependencies: '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 - '@babel/traverse@7.25.3': + '@babel/traverse@7.25.6': dependencies: '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/parser': 7.25.3 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 '@babel/template': 7.25.0 - '@babel/types': 7.25.2 - debug: 4.3.5 + '@babel/types': 7.25.6 + debug: 4.3.6 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.25.2': + '@babel/types@7.25.6': dependencies: '@babel/helper-string-parser': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 @@ -11271,10 +10184,10 @@ snapshots: '@types/tough-cookie': 4.0.5 tough-cookie: 4.1.4 - '@clerk/backend@1.7.0-snapshot.vdf04997(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@clerk/backend@1.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@clerk/shared': 2.5.2-snapshot.vdf04997(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@clerk/types': 4.14.0-snapshot.vdf04997 + '@clerk/shared': 2.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@clerk/types': 4.20.1 cookie: 0.5.0 snakecase-keys: 5.4.4 tslib: 2.4.1 @@ -11282,17 +10195,17 @@ snapshots: - react - react-dom - '@clerk/clerk-react@5.4.2-snapshot.vdf04997(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@clerk/clerk-react@5.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@clerk/shared': 2.5.2-snapshot.vdf04997(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@clerk/types': 4.14.0-snapshot.vdf04997 + '@clerk/shared': 2.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@clerk/types': 4.20.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.4.1 - '@clerk/shared@2.5.2-snapshot.vdf04997(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@clerk/shared@2.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@clerk/types': 4.14.0-snapshot.vdf04997 + '@clerk/types': 4.20.1 glob-to-regexp: 0.4.1 js-cookie: 3.0.5 std-env: 3.7.0 @@ -11301,19 +10214,19 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@clerk/tanstack-start@0.3.0-snapshot.vdf04997(@tanstack/react-router@packages+react-router)(@tanstack/start@packages+start)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@clerk/tanstack-start@0.4.1(@tanstack/react-router@packages+react-router)(@tanstack/start@packages+start)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@clerk/backend': 1.7.0-snapshot.vdf04997(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@clerk/clerk-react': 5.4.2-snapshot.vdf04997(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@clerk/shared': 2.5.2-snapshot.vdf04997(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@clerk/types': 4.14.0-snapshot.vdf04997 + '@clerk/backend': 1.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@clerk/clerk-react': 5.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@clerk/shared': 2.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@clerk/types': 4.20.1 '@tanstack/react-router': link:packages/react-router '@tanstack/start': link:packages/start react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.4.1 - '@clerk/types@4.14.0-snapshot.vdf04997': + '@clerk/types@4.20.1': dependencies: csstype: 3.1.1 @@ -11321,7 +10234,8 @@ snapshots: dependencies: mime: 3.0.0 - '@colors/colors@1.6.0': {} + '@colors/colors@1.5.0': + optional: true '@commitlint/parse@19.0.3': dependencies: @@ -11334,16 +10248,10 @@ snapshots: '@types/conventional-commits-parser': 5.0.0 chalk: 5.3.0 - '@convex-dev/react-query@0.0.0-alpha.5(@tanstack/react-query@5.51.21(react@18.3.1))(convex@1.13.2(eslint@8.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@convex-dev/react-query@0.0.0-alpha.5(@tanstack/react-query@5.56.2(react@18.3.1))(convex@1.16.0(@clerk/clerk-react@5.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: - '@tanstack/react-query': 5.51.21(react@18.3.1) - convex: 1.13.2(eslint@8.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - - '@dabh/diagnostics@2.0.3': - dependencies: - colorspace: 1.1.4 - enabled: 2.0.0 - kuler: 2.0.0 + '@tanstack/react-query': 5.56.2(react@18.3.1) + convex: 1.16.0(@clerk/clerk-react@5.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@deno/shim-deno-test@0.5.0': {} @@ -11357,15 +10265,15 @@ snapshots: '@emnapi/core@1.2.0': dependencies: '@emnapi/wasi-threads': 1.0.1 - tslib: 2.6.2 + tslib: 2.7.0 '@emnapi/runtime@1.2.0': dependencies: - tslib: 2.6.2 + tslib: 2.7.0 '@emnapi/wasi-threads@1.0.1': dependencies: - tslib: 2.6.2 + tslib: 2.7.0 '@emotion/is-prop-valid@0.8.8': dependencies: @@ -11375,13 +10283,22 @@ snapshots: '@emotion/memoize@0.7.4': optional: true + '@esbuild/aix-ppc64@0.19.12': + optional: true + '@esbuild/aix-ppc64@0.20.2': optional: true '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/android-arm64@0.17.19': + '@esbuild/aix-ppc64@0.23.0': + optional: true + + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.19.12': optional: true '@esbuild/android-arm64@0.20.2': @@ -11390,7 +10307,13 @@ snapshots: '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm@0.17.19': + '@esbuild/android-arm64@0.23.0': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm@0.19.12': optional: true '@esbuild/android-arm@0.20.2': @@ -11399,7 +10322,13 @@ snapshots: '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-x64@0.17.19': + '@esbuild/android-arm@0.23.0': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-x64@0.19.12': optional: true '@esbuild/android-x64@0.20.2': @@ -11408,7 +10337,13 @@ snapshots: '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.17.19': + '@esbuild/android-x64@0.23.0': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.19.12': optional: true '@esbuild/darwin-arm64@0.20.2': @@ -11417,7 +10352,13 @@ snapshots: '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-x64@0.17.19': + '@esbuild/darwin-arm64@0.23.0': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.19.12': optional: true '@esbuild/darwin-x64@0.20.2': @@ -11426,7 +10367,13 @@ snapshots: '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.17.19': + '@esbuild/darwin-x64@0.23.0': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': optional: true '@esbuild/freebsd-arm64@0.20.2': @@ -11435,7 +10382,13 @@ snapshots: '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.17.19': + '@esbuild/freebsd-arm64@0.23.0': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.19.12': optional: true '@esbuild/freebsd-x64@0.20.2': @@ -11444,7 +10397,13 @@ snapshots: '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/linux-arm64@0.17.19': + '@esbuild/freebsd-x64@0.23.0': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.19.12': optional: true '@esbuild/linux-arm64@0.20.2': @@ -11453,7 +10412,13 @@ snapshots: '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm@0.17.19': + '@esbuild/linux-arm64@0.23.0': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm@0.19.12': optional: true '@esbuild/linux-arm@0.20.2': @@ -11462,7 +10427,13 @@ snapshots: '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-ia32@0.17.19': + '@esbuild/linux-arm@0.23.0': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.19.12': optional: true '@esbuild/linux-ia32@0.20.2': @@ -11471,7 +10442,13 @@ snapshots: '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-loong64@0.17.19': + '@esbuild/linux-ia32@0.23.0': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.19.12': optional: true '@esbuild/linux-loong64@0.20.2': @@ -11480,7 +10457,13 @@ snapshots: '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-mips64el@0.17.19': + '@esbuild/linux-loong64@0.23.0': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.19.12': optional: true '@esbuild/linux-mips64el@0.20.2': @@ -11489,7 +10472,13 @@ snapshots: '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-ppc64@0.17.19': + '@esbuild/linux-mips64el@0.23.0': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.19.12': optional: true '@esbuild/linux-ppc64@0.20.2': @@ -11498,7 +10487,13 @@ snapshots: '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.17.19': + '@esbuild/linux-ppc64@0.23.0': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.19.12': optional: true '@esbuild/linux-riscv64@0.20.2': @@ -11507,7 +10502,13 @@ snapshots: '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-s390x@0.17.19': + '@esbuild/linux-riscv64@0.23.0': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.19.12': optional: true '@esbuild/linux-s390x@0.20.2': @@ -11516,7 +10517,13 @@ snapshots: '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-x64@0.17.19': + '@esbuild/linux-s390x@0.23.0': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-x64@0.19.12': optional: true '@esbuild/linux-x64@0.20.2': @@ -11525,7 +10532,13 @@ snapshots: '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.17.19': + '@esbuild/linux-x64@0.23.0': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.19.12': optional: true '@esbuild/netbsd-x64@0.20.2': @@ -11534,7 +10547,19 @@ snapshots: '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.17.19': + '@esbuild/netbsd-x64@0.23.0': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.0': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.19.12': optional: true '@esbuild/openbsd-x64@0.20.2': @@ -11543,7 +10568,13 @@ snapshots: '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.17.19': + '@esbuild/openbsd-x64@0.23.0': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.19.12': optional: true '@esbuild/sunos-x64@0.20.2': @@ -11552,7 +10583,13 @@ snapshots: '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/win32-arm64@0.17.19': + '@esbuild/sunos-x64@0.23.0': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.19.12': optional: true '@esbuild/win32-arm64@0.20.2': @@ -11561,7 +10598,13 @@ snapshots: '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-ia32@0.17.19': + '@esbuild/win32-arm64@0.23.0': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.19.12': optional: true '@esbuild/win32-ia32@0.20.2': @@ -11570,7 +10613,13 @@ snapshots: '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-x64@0.17.19': + '@esbuild/win32-ia32@0.23.0': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-x64@0.19.12': optional: true '@esbuild/win32-x64@0.20.2': @@ -11579,128 +10628,140 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + '@esbuild/win32-x64@0.23.0': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@9.10.0(jiti@1.21.6))': dependencies: - eslint: 8.57.0 + eslint: 9.10.0(jiti@1.21.6) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.11.0': {} - '@eslint-react/ast@1.8.2(eslint@8.57.0)(typescript@5.5.3)': + '@eslint-react/ast@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@eslint-react/tools': 1.8.2 - '@eslint-react/types': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) + '@eslint-react/tools': 1.14.1 + '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.6.2) + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) birecord: 0.1.1 - remeda: 2.7.0 string-ts: 2.2.0 - ts-pattern: 5.2.0 + ts-pattern: 5.3.1 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/core@1.8.2(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@eslint-react/ast': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/jsx': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/shared': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/tools': 1.8.2 - '@eslint-react/types': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/var': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/type-utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) - remeda: 2.7.0 + '@eslint-react/core@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + dependencies: + '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/shared': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/tools': 1.14.1 + '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/var': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.5.0 + '@typescript-eslint/type-utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + birecord: 0.1.1 short-unique-id: 5.2.0 - ts-pattern: 5.2.0 + ts-pattern: 5.3.1 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/eslint-plugin@1.8.2(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@eslint-react/shared': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/tools': 1.8.2 - '@eslint-react/types': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/type-utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) - eslint: 8.57.0 - eslint-plugin-react-debug: 1.8.2(eslint@8.57.0)(typescript@5.5.3) - eslint-plugin-react-dom: 1.8.2(eslint@8.57.0)(typescript@5.5.3) - eslint-plugin-react-hooks-extra: 1.8.2(eslint@8.57.0)(typescript@5.5.3) - eslint-plugin-react-naming-convention: 1.8.2(eslint@8.57.0)(typescript@5.5.3) - eslint-plugin-react-x: 1.8.2(eslint@8.57.0)(typescript@5.5.3) - remeda: 2.7.0 + '@eslint-react/eslint-plugin@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + dependencies: + '@eslint-react/shared': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/tools': 1.14.1 + '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.5.0 + '@typescript-eslint/type-utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + eslint: 9.10.0(jiti@1.21.6) + eslint-plugin-react-debug: 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + eslint-plugin-react-dom: 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + eslint-plugin-react-hooks-extra: 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + eslint-plugin-react-naming-convention: 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + eslint-plugin-react-web-api: 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + eslint-plugin-react-x: 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@eslint-react/jsx@1.8.2(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@eslint-react/ast': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/tools': 1.8.2 - '@eslint-react/types': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/var': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) - remeda: 2.7.0 - ts-pattern: 5.2.0 + '@eslint-react/jsx@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': + dependencies: + '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/tools': 1.14.1 + '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/var': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.5.0 + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + ts-pattern: 5.3.1 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/shared@1.8.2(eslint@8.57.0)(typescript@5.5.3)': + '@eslint-react/shared@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) + '@eslint-react/tools': 1.14.1 + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) picomatch: 4.0.2 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/tools@1.8.2': {} + '@eslint-react/tools@1.14.1': {} - '@eslint-react/types@1.8.2(eslint@8.57.0)(typescript@5.5.3)': + '@eslint-react/types@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@eslint-react/tools': 1.8.2 - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) - remeda: 2.7.0 + '@eslint-react/tools': 1.14.1 + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/var@1.8.2(eslint@8.57.0)(typescript@5.5.3)': + '@eslint-react/var@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@eslint-react/ast': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/tools': 1.8.2 - '@eslint-react/types': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) - remeda: 2.7.0 + '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/tools': 1.14.1 + '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.5.0 + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + ts-pattern: 5.3.1 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint/eslintrc@2.1.4': + '@eslint/config-array@0.18.0': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.6 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.5 - espree: 9.6.1 - globals: 13.24.0 + debug: 4.3.6 + espree: 10.1.0 + globals: 14.0.0 ignore: 5.3.1 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -11709,46 +10770,116 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.0': {} + '@eslint/js@9.10.0': {} - '@fastify/busboy@2.1.0': {} + '@eslint/object-schema@2.1.4': {} - '@humanwhocodes/config-array@0.11.14': + '@eslint/plugin-kit@0.1.0': dependencies: - '@humanwhocodes/object-schema': 2.0.2 - debug: 4.3.5 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + levn: 0.4.1 + + '@fastify/busboy@2.1.0': {} '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.2': {} + '@humanwhocodes/retry@0.3.0': {} + + '@inquirer/checkbox@2.5.0': + dependencies: + '@inquirer/core': 9.1.0 + '@inquirer/figures': 1.0.5 + '@inquirer/type': 1.5.3 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 - '@inquirer/confirm@3.1.10': + '@inquirer/confirm@3.2.0': dependencies: - '@inquirer/core': 8.2.3 - '@inquirer/type': 1.3.3 + '@inquirer/core': 9.1.0 + '@inquirer/type': 1.5.3 - '@inquirer/core@8.2.3': + '@inquirer/core@9.1.0': dependencies: - '@inquirer/figures': 1.0.3 - '@inquirer/type': 1.3.3 + '@inquirer/figures': 1.0.5 + '@inquirer/type': 1.5.3 '@types/mute-stream': 0.0.4 - '@types/node': 20.14.9 + '@types/node': 22.5.4 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 - chalk: 4.1.2 cli-spinners: 2.9.2 cli-width: 4.1.0 mute-stream: 1.0.0 signal-exit: 4.1.0 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + + '@inquirer/editor@2.2.0': + dependencies: + '@inquirer/core': 9.1.0 + '@inquirer/type': 1.5.3 + external-editor: 3.1.0 + + '@inquirer/expand@2.3.0': + dependencies: + '@inquirer/core': 9.1.0 + '@inquirer/type': 1.5.3 + yoctocolors-cjs: 2.1.2 + + '@inquirer/figures@1.0.5': {} + + '@inquirer/input@2.3.0': + dependencies: + '@inquirer/core': 9.1.0 + '@inquirer/type': 1.5.3 + + '@inquirer/number@1.1.0': + dependencies: + '@inquirer/core': 9.1.0 + '@inquirer/type': 1.5.3 + + '@inquirer/password@2.2.0': + dependencies: + '@inquirer/core': 9.1.0 + '@inquirer/type': 1.5.3 + ansi-escapes: 4.3.2 + + '@inquirer/prompts@5.5.0': + dependencies: + '@inquirer/checkbox': 2.5.0 + '@inquirer/confirm': 3.2.0 + '@inquirer/editor': 2.2.0 + '@inquirer/expand': 2.3.0 + '@inquirer/input': 2.3.0 + '@inquirer/number': 1.1.0 + '@inquirer/password': 2.2.0 + '@inquirer/rawlist': 2.3.0 + '@inquirer/search': 1.1.0 + '@inquirer/select': 2.5.0 + + '@inquirer/rawlist@2.3.0': + dependencies: + '@inquirer/core': 9.1.0 + '@inquirer/type': 1.5.3 + yoctocolors-cjs: 2.1.2 + + '@inquirer/search@1.1.0': + dependencies: + '@inquirer/core': 9.1.0 + '@inquirer/figures': 1.0.5 + '@inquirer/type': 1.5.3 + yoctocolors-cjs: 2.1.2 - '@inquirer/figures@1.0.3': {} + '@inquirer/select@2.5.0': + dependencies: + '@inquirer/core': 9.1.0 + '@inquirer/figures': 1.0.5 + '@inquirer/type': 1.5.3 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 - '@inquirer/type@1.3.3': {} + '@inquirer/type@1.5.3': + dependencies: + mute-stream: 1.0.0 '@ioredis/commands@1.2.0': {} @@ -11768,7 +10899,7 @@ snapshots: '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.1': {} @@ -11780,34 +10911,32 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/sourcemap-codec@1.4.15': {} - '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 - '@jsonjoy.com/base64@1.1.2(tslib@2.6.2)': + '@jsonjoy.com/base64@1.1.2(tslib@2.7.0)': dependencies: - tslib: 2.6.2 + tslib: 2.7.0 - '@jsonjoy.com/json-pack@1.0.4(tslib@2.6.2)': + '@jsonjoy.com/json-pack@1.0.4(tslib@2.7.0)': dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.6.2) - '@jsonjoy.com/util': 1.2.0(tslib@2.6.2) + '@jsonjoy.com/base64': 1.1.2(tslib@2.7.0) + '@jsonjoy.com/util': 1.2.0(tslib@2.7.0) hyperdyperid: 1.2.0 - thingies: 1.21.0(tslib@2.6.2) - tslib: 2.6.2 + thingies: 1.21.0(tslib@2.7.0) + tslib: 2.7.0 - '@jsonjoy.com/util@1.2.0(tslib@2.6.2)': + '@jsonjoy.com/util@1.2.0(tslib@2.7.0)': dependencies: - tslib: 2.6.2 + tslib: 2.7.0 '@kwsites/file-exists@1.1.1': dependencies: - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color @@ -11830,49 +10959,23 @@ snapshots: - encoding - supports-color - '@microsoft/api-extractor-model@7.28.13(@types/node@20.14.9)': - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@20.14.9) - transitivePeerDependencies: - - '@types/node' - - '@microsoft/api-extractor-model@7.29.4(@types/node@20.14.9)': + '@microsoft/api-extractor-model@7.29.4(@types/node@22.5.4)': dependencies: '@microsoft/tsdoc': 0.15.0 '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.5.1(@types/node@20.14.9) - transitivePeerDependencies: - - '@types/node' - - '@microsoft/api-extractor@7.43.0(@types/node@20.14.9)': - dependencies: - '@microsoft/api-extractor-model': 7.28.13(@types/node@20.14.9) - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@20.14.9) - '@rushstack/rig-package': 0.5.2 - '@rushstack/terminal': 0.10.0(@types/node@20.14.9) - '@rushstack/ts-command-line': 4.19.1(@types/node@20.14.9) - lodash: 4.17.21 - minimatch: 3.0.8 - resolve: 1.22.8 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.4.2 + '@rushstack/node-core-library': 5.5.1(@types/node@22.5.4) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.47.4(@types/node@20.14.9)': + '@microsoft/api-extractor@7.47.4(@types/node@22.5.4)': dependencies: - '@microsoft/api-extractor-model': 7.29.4(@types/node@20.14.9) + '@microsoft/api-extractor-model': 7.29.4(@types/node@22.5.4) '@microsoft/tsdoc': 0.15.0 '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.5.1(@types/node@20.14.9) + '@rushstack/node-core-library': 5.5.1(@types/node@22.5.4) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.13.3(@types/node@20.14.9) - '@rushstack/ts-command-line': 4.22.3(@types/node@20.14.9) + '@rushstack/terminal': 0.13.3(@types/node@22.5.4) + '@rushstack/ts-command-line': 4.22.3(@types/node@22.5.4) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.8 @@ -11882,13 +10985,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/tsdoc-config@0.16.2': - dependencies: - '@microsoft/tsdoc': 0.14.2 - ajv: 6.12.6 - jju: 1.4.0 - resolve: 1.19.0 - '@microsoft/tsdoc-config@0.17.0': dependencies: '@microsoft/tsdoc': 0.15.0 @@ -11896,45 +10992,23 @@ snapshots: jju: 1.4.0 resolve: 1.22.8 - '@microsoft/tsdoc@0.14.2': {} - '@microsoft/tsdoc@0.15.0': {} - '@module-federation/runtime-tools@0.1.6': - dependencies: - '@module-federation/runtime': 0.1.6 - '@module-federation/webpack-bundler-runtime': 0.1.6 - optional: true - - '@module-federation/runtime-tools@0.2.3': - dependencies: - '@module-federation/runtime': 0.2.3 - '@module-federation/webpack-bundler-runtime': 0.2.3 - - '@module-federation/runtime@0.1.6': + '@module-federation/runtime-tools@0.5.1': dependencies: - '@module-federation/sdk': 0.1.6 - optional: true + '@module-federation/runtime': 0.5.1 + '@module-federation/webpack-bundler-runtime': 0.5.1 - '@module-federation/runtime@0.2.3': + '@module-federation/runtime@0.5.1': dependencies: - '@module-federation/sdk': 0.2.3 + '@module-federation/sdk': 0.5.1 - '@module-federation/sdk@0.1.6': - optional: true - - '@module-federation/sdk@0.2.3': {} - - '@module-federation/webpack-bundler-runtime@0.1.6': - dependencies: - '@module-federation/runtime': 0.1.6 - '@module-federation/sdk': 0.1.6 - optional: true + '@module-federation/sdk@0.5.1': {} - '@module-federation/webpack-bundler-runtime@0.2.3': + '@module-federation/webpack-bundler-runtime@0.5.1': dependencies: - '@module-federation/runtime': 0.2.3 - '@module-federation/sdk': 0.2.3 + '@module-federation/runtime': 0.5.1 + '@module-federation/sdk': 0.5.1 '@mswjs/interceptors@0.27.2': dependencies: @@ -11942,57 +11016,18 @@ snapshots: '@open-draft/logger': 0.3.0 '@open-draft/until': 2.1.0 is-node-process: 1.2.0 - outvariant: 1.4.2 + outvariant: 1.4.3 strict-event-emitter: 0.5.1 - '@mswjs/interceptors@0.29.1': + '@mswjs/interceptors@0.35.6': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 '@open-draft/until': 2.1.0 is-node-process: 1.2.0 - outvariant: 1.4.2 + outvariant: 1.4.3 strict-event-emitter: 0.5.1 - '@napi-rs/snappy-android-arm-eabi@7.2.2': - optional: true - - '@napi-rs/snappy-android-arm64@7.2.2': - optional: true - - '@napi-rs/snappy-darwin-arm64@7.2.2': - optional: true - - '@napi-rs/snappy-darwin-x64@7.2.2': - optional: true - - '@napi-rs/snappy-freebsd-x64@7.2.2': - optional: true - - '@napi-rs/snappy-linux-arm-gnueabihf@7.2.2': - optional: true - - '@napi-rs/snappy-linux-arm64-gnu@7.2.2': - optional: true - - '@napi-rs/snappy-linux-arm64-musl@7.2.2': - optional: true - - '@napi-rs/snappy-linux-x64-gnu@7.2.2': - optional: true - - '@napi-rs/snappy-linux-x64-musl@7.2.2': - optional: true - - '@napi-rs/snappy-win32-arm64-msvc@7.2.2': - optional: true - - '@napi-rs/snappy-win32-ia32-msvc@7.2.2': - optional: true - - '@napi-rs/snappy-win32-x64-msvc@7.2.2': - optional: true - '@napi-rs/wasm-runtime@0.2.4': dependencies: '@emnapi/core': 1.2.0 @@ -12020,10 +11055,6 @@ snapshots: transitivePeerDependencies: - '@opentelemetry/api' - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - dependencies: - eslint-scope: 5.1.1 - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -12036,43 +11067,43 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@nrwl/tao@19.5.6(@swc/core@1.7.6(@swc/helpers@0.5.11))': + '@nrwl/tao@19.7.3(@swc/core@1.7.26)': dependencies: - nx: 19.5.6(@swc/core@1.7.6(@swc/helpers@0.5.11)) - tslib: 2.6.2 + nx: 19.7.3(@swc/core@1.7.26) + tslib: 2.7.0 transitivePeerDependencies: - '@swc-node/register' - '@swc/core' - debug - '@nx/nx-darwin-arm64@19.5.6': + '@nx/nx-darwin-arm64@19.7.3': optional: true - '@nx/nx-darwin-x64@19.5.6': + '@nx/nx-darwin-x64@19.7.3': optional: true - '@nx/nx-freebsd-x64@19.5.6': + '@nx/nx-freebsd-x64@19.7.3': optional: true - '@nx/nx-linux-arm-gnueabihf@19.5.6': + '@nx/nx-linux-arm-gnueabihf@19.7.3': optional: true - '@nx/nx-linux-arm64-gnu@19.5.6': + '@nx/nx-linux-arm64-gnu@19.7.3': optional: true - '@nx/nx-linux-arm64-musl@19.5.6': + '@nx/nx-linux-arm64-musl@19.7.3': optional: true - '@nx/nx-linux-x64-gnu@19.5.6': + '@nx/nx-linux-x64-gnu@19.7.3': optional: true - '@nx/nx-linux-x64-musl@19.5.6': + '@nx/nx-linux-x64-musl@19.7.3': optional: true - '@nx/nx-win32-arm64-msvc@19.5.6': + '@nx/nx-win32-arm64-msvc@19.7.3': optional: true - '@nx/nx-win32-x64-msvc@19.5.6': + '@nx/nx-win32-x64-msvc@19.7.3': optional: true '@open-draft/deferred-promise@2.2.0': {} @@ -12080,7 +11111,7 @@ snapshots: '@open-draft/logger@0.3.0': dependencies: is-node-process: 1.2.0 - outvariant: 1.4.2 + outvariant: 1.4.3 '@open-draft/until@2.1.0': {} @@ -12223,220 +11254,187 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.45.3': + '@playwright/test@1.47.1': dependencies: - playwright: 1.45.3 + playwright: 1.47.1 - '@prisma/client@5.17.0(prisma@5.18.0)': + '@prisma/client@5.19.1(prisma@5.19.1)': optionalDependencies: - prisma: 5.18.0 - - '@prisma/debug@5.18.0': {} - - '@prisma/engines-version@5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169': {} - - '@prisma/engines@5.18.0': - dependencies: - '@prisma/debug': 5.18.0 - '@prisma/engines-version': 5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169 - '@prisma/fetch-engine': 5.18.0 - '@prisma/get-platform': 5.18.0 - - '@prisma/fetch-engine@5.18.0': - dependencies: - '@prisma/debug': 5.18.0 - '@prisma/engines-version': 5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169 - '@prisma/get-platform': 5.18.0 - - '@prisma/get-platform@5.18.0': - dependencies: - '@prisma/debug': 5.18.0 - - '@protobufjs/aspromise@1.1.2': {} - - '@protobufjs/base64@1.1.2': {} - - '@protobufjs/codegen@2.0.4': {} - - '@protobufjs/eventemitter@1.1.0': {} - - '@protobufjs/fetch@1.1.0': - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 + prisma: 5.19.1 - '@protobufjs/float@1.0.2': {} + '@prisma/debug@5.19.1': {} - '@protobufjs/inquire@1.1.0': {} + '@prisma/engines-version@5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3': {} - '@protobufjs/path@1.1.2': {} + '@prisma/engines@5.19.1': + dependencies: + '@prisma/debug': 5.19.1 + '@prisma/engines-version': 5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3 + '@prisma/fetch-engine': 5.19.1 + '@prisma/get-platform': 5.19.1 - '@protobufjs/pool@1.1.0': {} + '@prisma/fetch-engine@5.19.1': + dependencies: + '@prisma/debug': 5.19.1 + '@prisma/engines-version': 5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3 + '@prisma/get-platform': 5.19.1 - '@protobufjs/utf8@1.1.0': {} + '@prisma/get-platform@5.19.1': + dependencies: + '@prisma/debug': 5.19.1 '@radix-ui/primitive@1.1.0': {} - '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.3)(react@18.3.1)': + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 - '@radix-ui/react-context@1.1.0(@types/react@18.3.3)(react@18.3.1)': + '@radix-ui/react-context@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 - '@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) aria-hidden: 1.2.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.7(@types/react@18.3.3)(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.5)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.3)(react@18.3.1)': + '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 - '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-id@1.1.0(@types/react@18.3.3)(react@18.3.1)': + '@radix-ui/react-id@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 - '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@radix-ui/react-slot@1.1.0(@types/react@18.3.3)(react@18.3.1)': + '@radix-ui/react-slot@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.3)(react@18.3.1)': + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.3)(react@18.3.1)': + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.3)(react@18.3.1)': + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.3)(react@18.3.1)': + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.3 - - '@remix-run/node@2.11.1(typescript@5.5.3)': - dependencies: - '@remix-run/server-runtime': 2.11.1(typescript@5.5.3) - '@remix-run/web-fetch': 4.4.2 - '@web3-storage/multipart-parser': 1.0.0 - cookie-signature: 1.2.1 - source-map-support: 0.5.21 - stream-slice: 0.1.2 - undici: 6.19.7 - optionalDependencies: - typescript: 5.5.3 + '@types/react': 18.3.5 - '@remix-run/react@2.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)': + '@remix-run/react@2.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)': dependencies: '@remix-run/router': 1.19.0 - '@remix-run/server-runtime': 2.11.1(typescript@5.5.3) + '@remix-run/server-runtime': 2.11.1(typescript@5.6.2) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-router: 6.26.0(react@18.3.1) react-router-dom: 6.26.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) turbo-stream: 2.2.0 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 '@remix-run/router@1.19.0': {} - '@remix-run/server-runtime@2.11.1(typescript@5.5.3)': + '@remix-run/router@1.19.1': {} + + '@remix-run/server-runtime@2.11.1(typescript@5.6.2)': dependencies: '@remix-run/router': 1.19.0 '@types/cookie': 0.6.0 @@ -12446,384 +11444,261 @@ snapshots: source-map: 0.7.4 turbo-stream: 2.2.0 optionalDependencies: - typescript: 5.5.3 - - '@remix-run/web-blob@3.1.0': - dependencies: - '@remix-run/web-stream': 1.1.0 - web-encoding: 1.1.5 + typescript: 5.6.2 - '@remix-run/web-fetch@4.4.2': + '@remix-run/server-runtime@2.11.2(typescript@5.6.2)': dependencies: - '@remix-run/web-blob': 3.1.0 - '@remix-run/web-file': 3.1.0 - '@remix-run/web-form-data': 3.1.0 - '@remix-run/web-stream': 1.1.0 + '@remix-run/router': 1.19.1 + '@types/cookie': 0.6.0 '@web3-storage/multipart-parser': 1.0.0 - abort-controller: 3.0.0 - data-uri-to-buffer: 3.0.1 - mrmime: 1.0.1 - - '@remix-run/web-file@3.1.0': - dependencies: - '@remix-run/web-blob': 3.1.0 - - '@remix-run/web-form-data@3.1.0': - dependencies: - web-encoding: 1.1.5 - - '@remix-run/web-stream@1.1.0': - dependencies: - web-streams-polyfill: 3.2.1 + cookie: 0.6.0 + set-cookie-parser: 2.7.0 + source-map: 0.7.4 + turbo-stream: 2.3.0 + optionalDependencies: + typescript: 5.6.2 - '@replayio/playwright@3.1.8(@playwright/test@1.45.3)': + '@rollup/plugin-alias@5.1.0(rollup@3.29.4)': dependencies: - '@playwright/test': 1.45.3 - chalk: 4.1.2 - debug: 4.3.5 - fs-extra: 11.2.0 - is-uuid: 1.0.2 - jsonata: 1.8.7 - launchdarkly-node-client-sdk: 3.2.1 - mixpanel: 0.18.0 - node-fetch: 2.7.0 - p-map: 4.0.0 - sha-1: 1.0.0 - stack-utils: 2.0.6 - superstruct: 1.0.4 - undici: 5.28.4 - uuid: 8.3.2 - winston: 3.14.2 - winston-loki: 6.1.2 - ws: 8.18.0 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate + slash: 4.0.0 + optionalDependencies: + rollup: 3.29.4 - '@rollup/plugin-alias@5.1.0(rollup@4.18.0)': + '@rollup/plugin-alias@5.1.0(rollup@4.21.2)': dependencies: slash: 4.0.0 optionalDependencies: - rollup: 4.18.0 + rollup: 4.21.2 - '@rollup/plugin-babel@6.0.4(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@4.18.0)': + '@rollup/plugin-babel@6.0.4(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@4.21.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) optionalDependencies: '@types/babel__core': 7.20.5 - rollup: 4.18.0 + rollup: 4.21.2 transitivePeerDependencies: - supports-color - '@rollup/plugin-commonjs@25.0.7(rollup@4.18.0)': + '@rollup/plugin-commonjs@25.0.7(rollup@3.29.4)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 8.1.0 + is-reference: 1.2.1 + magic-string: 0.30.11 + optionalDependencies: + rollup: 3.29.4 + + '@rollup/plugin-commonjs@25.0.7(rollup@4.21.2)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 - magic-string: 0.30.10 + magic-string: 0.30.11 optionalDependencies: - rollup: 4.18.0 + rollup: 4.21.2 - '@rollup/plugin-inject@5.0.5(rollup@4.18.0)': + '@rollup/plugin-inject@5.0.5(rollup@4.21.2)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) estree-walker: 2.0.2 - magic-string: 0.30.10 + magic-string: 0.30.11 + optionalDependencies: + rollup: 4.21.2 + + '@rollup/plugin-json@6.1.0(rollup@3.29.4)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + optionalDependencies: + rollup: 3.29.4 + + '@rollup/plugin-json@6.1.0(rollup@4.21.2)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) optionalDependencies: - rollup: 4.18.0 + rollup: 4.21.2 - '@rollup/plugin-json@6.1.0(rollup@4.18.0)': + '@rollup/plugin-node-resolve@15.2.3(rollup@3.29.4)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.8 optionalDependencies: - rollup: 4.18.0 + rollup: 3.29.4 - '@rollup/plugin-node-resolve@15.2.3(rollup@4.18.0)': + '@rollup/plugin-node-resolve@15.2.3(rollup@4.21.2)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.8 optionalDependencies: - rollup: 4.18.0 + rollup: 4.21.2 + + '@rollup/plugin-replace@5.0.7(rollup@3.29.4)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + magic-string: 0.30.11 + optionalDependencies: + rollup: 3.29.4 - '@rollup/plugin-replace@5.0.7(rollup@4.18.0)': + '@rollup/plugin-replace@5.0.7(rollup@4.21.2)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - magic-string: 0.30.10 + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) + magic-string: 0.30.11 optionalDependencies: - rollup: 4.18.0 + rollup: 4.21.2 - '@rollup/plugin-terser@0.4.4(rollup@4.18.0)': + '@rollup/plugin-terser@0.4.4(rollup@4.21.2)': dependencies: serialize-javascript: 6.0.2 smob: 1.4.1 terser: 5.31.1 optionalDependencies: - rollup: 4.18.0 + rollup: 4.21.2 '@rollup/pluginutils@4.2.1': dependencies: estree-walker: 2.0.2 picomatch: 2.3.1 - '@rollup/pluginutils@5.1.0(rollup@4.18.0)': + '@rollup/pluginutils@5.1.0(rollup@3.29.4)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.18.0 + rollup: 3.29.4 - '@rollup/rollup-android-arm-eabi@4.18.0': - optional: true + '@rollup/pluginutils@5.1.0(rollup@4.21.2)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.21.2 - '@rollup/rollup-android-arm64@4.18.0': + '@rollup/rollup-android-arm-eabi@4.21.2': optional: true - '@rollup/rollup-darwin-arm64@4.18.0': + '@rollup/rollup-android-arm64@4.21.2': optional: true - '@rollup/rollup-darwin-x64@4.18.0': + '@rollup/rollup-darwin-arm64@4.21.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + '@rollup/rollup-darwin-x64@4.21.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.18.0': + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.18.0': + '@rollup/rollup-linux-arm-musleabihf@4.21.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.18.0': + '@rollup/rollup-linux-arm64-gnu@4.21.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + '@rollup/rollup-linux-arm64-musl@4.21.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.18.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.18.0': + '@rollup/rollup-linux-riscv64-gnu@4.21.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.18.0': + '@rollup/rollup-linux-s390x-gnu@4.21.2': optional: true - '@rollup/rollup-linux-x64-musl@4.18.0': + '@rollup/rollup-linux-x64-gnu@4.21.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.18.0': + '@rollup/rollup-linux-x64-musl@4.21.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.18.0': + '@rollup/rollup-win32-arm64-msvc@4.21.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.18.0': + '@rollup/rollup-win32-ia32-msvc@4.21.2': optional: true - '@rsbuild/core@1.0.0': - dependencies: - '@rsbuild/shared': 1.0.0 - '@rspack/core': 0.4.0 - core-js: 3.32.2 - html-webpack-plugin: html-rspack-plugin@5.5.7 - postcss: 8.4.31 - semver: 7.6.3 - ws: 8.18.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate + '@rollup/rollup-win32-x64-msvc@4.21.2': + optional: true - '@rsbuild/core@1.0.1-beta.15': + '@rsbuild/core@1.0.4': dependencies: - '@rspack/core': 1.0.0-beta.5(@swc/helpers@0.5.11) + '@rspack/core': 1.0.5(@swc/helpers@0.5.13) '@rspack/lite-tapable': 1.0.0 - '@swc/helpers': 0.5.11 - caniuse-lite: 1.0.30001651 + '@swc/helpers': 0.5.13 + caniuse-lite: 1.0.30001659 core-js: 3.38.1 optionalDependencies: fsevents: 2.3.3 - '@rsbuild/plugin-react@1.0.1-beta.15(@rsbuild/core@1.0.1-beta.15)': + '@rsbuild/plugin-react@1.0.2(@rsbuild/core@1.0.4)': dependencies: - '@rsbuild/core': 1.0.1-beta.15 + '@rsbuild/core': 1.0.4 '@rspack/plugin-react-refresh': 1.0.0(react-refresh@0.14.2) react-refresh: 0.14.2 - '@rsbuild/shared@1.0.0': - dependencies: - '@rspack/core': 0.4.0 - caniuse-lite: 1.0.30001647 - line-diff: 2.1.1 - lodash: 4.17.21 - postcss: 8.4.31 - - '@rspack/binding-darwin-arm64@0.4.0': - optional: true - - '@rspack/binding-darwin-arm64@0.7.5': - optional: true - - '@rspack/binding-darwin-arm64@1.0.0-beta.5': - optional: true - - '@rspack/binding-darwin-x64@0.4.0': - optional: true - - '@rspack/binding-darwin-x64@0.7.5': - optional: true - - '@rspack/binding-darwin-x64@1.0.0-beta.5': - optional: true - - '@rspack/binding-linux-arm64-gnu@0.4.0': - optional: true - - '@rspack/binding-linux-arm64-gnu@0.7.5': - optional: true - - '@rspack/binding-linux-arm64-gnu@1.0.0-beta.5': - optional: true - - '@rspack/binding-linux-arm64-musl@0.4.0': - optional: true - - '@rspack/binding-linux-arm64-musl@0.7.5': - optional: true - - '@rspack/binding-linux-arm64-musl@1.0.0-beta.5': - optional: true - - '@rspack/binding-linux-x64-gnu@0.4.0': - optional: true - - '@rspack/binding-linux-x64-gnu@0.7.5': - optional: true - - '@rspack/binding-linux-x64-gnu@1.0.0-beta.5': - optional: true - - '@rspack/binding-linux-x64-musl@0.4.0': - optional: true - - '@rspack/binding-linux-x64-musl@0.7.5': - optional: true - - '@rspack/binding-linux-x64-musl@1.0.0-beta.5': - optional: true - - '@rspack/binding-win32-arm64-msvc@0.4.0': - optional: true - - '@rspack/binding-win32-arm64-msvc@0.7.5': + '@rspack/binding-darwin-arm64@1.0.5': optional: true - '@rspack/binding-win32-arm64-msvc@1.0.0-beta.5': + '@rspack/binding-darwin-x64@1.0.5': optional: true - '@rspack/binding-win32-ia32-msvc@0.4.0': + '@rspack/binding-linux-arm64-gnu@1.0.5': optional: true - '@rspack/binding-win32-ia32-msvc@0.7.5': + '@rspack/binding-linux-arm64-musl@1.0.5': optional: true - '@rspack/binding-win32-ia32-msvc@1.0.0-beta.5': + '@rspack/binding-linux-x64-gnu@1.0.5': optional: true - '@rspack/binding-win32-x64-msvc@0.4.0': + '@rspack/binding-linux-x64-musl@1.0.5': optional: true - '@rspack/binding-win32-x64-msvc@0.7.5': + '@rspack/binding-win32-arm64-msvc@1.0.5': optional: true - '@rspack/binding-win32-x64-msvc@1.0.0-beta.5': + '@rspack/binding-win32-ia32-msvc@1.0.5': optional: true - '@rspack/binding@0.4.0': - optionalDependencies: - '@rspack/binding-darwin-arm64': 0.4.0 - '@rspack/binding-darwin-x64': 0.4.0 - '@rspack/binding-linux-arm64-gnu': 0.4.0 - '@rspack/binding-linux-arm64-musl': 0.4.0 - '@rspack/binding-linux-x64-gnu': 0.4.0 - '@rspack/binding-linux-x64-musl': 0.4.0 - '@rspack/binding-win32-arm64-msvc': 0.4.0 - '@rspack/binding-win32-ia32-msvc': 0.4.0 - '@rspack/binding-win32-x64-msvc': 0.4.0 - - '@rspack/binding@0.7.5': - optionalDependencies: - '@rspack/binding-darwin-arm64': 0.7.5 - '@rspack/binding-darwin-x64': 0.7.5 - '@rspack/binding-linux-arm64-gnu': 0.7.5 - '@rspack/binding-linux-arm64-musl': 0.7.5 - '@rspack/binding-linux-x64-gnu': 0.7.5 - '@rspack/binding-linux-x64-musl': 0.7.5 - '@rspack/binding-win32-arm64-msvc': 0.7.5 - '@rspack/binding-win32-ia32-msvc': 0.7.5 - '@rspack/binding-win32-x64-msvc': 0.7.5 + '@rspack/binding-win32-x64-msvc@1.0.5': optional: true - '@rspack/binding@1.0.0-beta.5': - optionalDependencies: - '@rspack/binding-darwin-arm64': 1.0.0-beta.5 - '@rspack/binding-darwin-x64': 1.0.0-beta.5 - '@rspack/binding-linux-arm64-gnu': 1.0.0-beta.5 - '@rspack/binding-linux-arm64-musl': 1.0.0-beta.5 - '@rspack/binding-linux-x64-gnu': 1.0.0-beta.5 - '@rspack/binding-linux-x64-musl': 1.0.0-beta.5 - '@rspack/binding-win32-arm64-msvc': 1.0.0-beta.5 - '@rspack/binding-win32-ia32-msvc': 1.0.0-beta.5 - '@rspack/binding-win32-x64-msvc': 1.0.0-beta.5 - - '@rspack/core@0.4.0': - dependencies: - '@rspack/binding': 0.4.0 - '@swc/helpers': 0.5.1 - browserslist: 4.23.3 - compare-versions: 6.0.0-rc.1 - enhanced-resolve: 5.12.0 - fast-querystring: 1.1.2 - graceful-fs: 4.2.10 - json-parse-even-better-errors: 3.0.2 - neo-async: 2.6.2 - react-refresh: 0.14.0 - tapable: 2.2.1 - terminal-link: 2.1.1 - watchpack: 2.4.1 - webpack-sources: 3.2.3 - zod: 3.23.8 - zod-validation-error: 1.2.0(zod@3.23.8) - - '@rspack/core@0.7.5(@swc/helpers@0.5.11)': - dependencies: - '@module-federation/runtime-tools': 0.1.6 - '@rspack/binding': 0.7.5 - caniuse-lite: 1.0.30001651 - tapable: 2.2.1 - webpack-sources: 3.2.3 + '@rspack/binding@1.0.5': optionalDependencies: - '@swc/helpers': 0.5.11 - optional: true - - '@rspack/core@1.0.0-beta.5(@swc/helpers@0.5.11)': - dependencies: - '@module-federation/runtime-tools': 0.2.3 - '@rspack/binding': 1.0.0-beta.5 + '@rspack/binding-darwin-arm64': 1.0.5 + '@rspack/binding-darwin-x64': 1.0.5 + '@rspack/binding-linux-arm64-gnu': 1.0.5 + '@rspack/binding-linux-arm64-musl': 1.0.5 + '@rspack/binding-linux-x64-gnu': 1.0.5 + '@rspack/binding-linux-x64-musl': 1.0.5 + '@rspack/binding-win32-arm64-msvc': 1.0.5 + '@rspack/binding-win32-ia32-msvc': 1.0.5 + '@rspack/binding-win32-x64-msvc': 1.0.5 + + '@rspack/core@1.0.5(@swc/helpers@0.5.13)': + dependencies: + '@module-federation/runtime-tools': 0.5.1 + '@rspack/binding': 1.0.5 '@rspack/lite-tapable': 1.0.0 - caniuse-lite: 1.0.30001651 + caniuse-lite: 1.0.30001659 optionalDependencies: - '@swc/helpers': 0.5.11 + '@swc/helpers': 0.5.13 '@rspack/lite-tapable@1.0.0': {} @@ -12834,20 +11709,7 @@ snapshots: optionalDependencies: react-refresh: 0.14.2 - '@rushstack/eslint-patch@1.10.3': {} - - '@rushstack/node-core-library@4.0.2(@types/node@20.14.9)': - dependencies: - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.8 - semver: 7.5.4 - z-schema: 5.0.5 - optionalDependencies: - '@types/node': 20.14.9 - - '@rushstack/node-core-library@5.5.1(@types/node@20.14.9)': + '@rushstack/node-core-library@5.5.1(@types/node@22.5.4)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -12858,44 +11720,23 @@ snapshots: resolve: 1.22.8 semver: 7.5.4 optionalDependencies: - '@types/node': 20.14.9 - - '@rushstack/rig-package@0.5.2': - dependencies: - resolve: 1.22.8 - strip-json-comments: 3.1.1 + '@types/node': 22.5.4 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.8 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.10.0(@types/node@20.14.9)': - dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@20.14.9) - supports-color: 8.1.1 - optionalDependencies: - '@types/node': 20.14.9 - - '@rushstack/terminal@0.13.3(@types/node@20.14.9)': + '@rushstack/terminal@0.13.3(@types/node@22.5.4)': dependencies: - '@rushstack/node-core-library': 5.5.1(@types/node@20.14.9) + '@rushstack/node-core-library': 5.5.1(@types/node@22.5.4) supports-color: 8.1.1 optionalDependencies: - '@types/node': 20.14.9 - - '@rushstack/ts-command-line@4.19.1(@types/node@20.14.9)': - dependencies: - '@rushstack/terminal': 0.10.0(@types/node@20.14.9) - '@types/argparse': 1.0.38 - argparse: 1.0.10 - string-argv: 0.3.2 - transitivePeerDependencies: - - '@types/node' + '@types/node': 22.5.4 - '@rushstack/ts-command-line@4.22.3(@types/node@20.14.9)': + '@rushstack/ts-command-line@4.22.3(@types/node@22.5.4)': dependencies: - '@rushstack/terminal': 0.13.3(@types/node@20.14.9) + '@rushstack/terminal': 0.13.3(@types/node@22.5.4) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -12908,103 +11749,147 @@ snapshots: '@sinclair/typebox@0.27.8': {} + '@sindresorhus/is@4.6.0': {} + '@sindresorhus/merge-streams@2.3.0': {} - '@stylistic/eslint-plugin-js@2.6.4(eslint@8.57.0)': + '@stylistic/eslint-plugin-js@2.7.1(eslint@9.10.0(jiti@1.21.6))': dependencies: - '@types/eslint': 9.6.0 - acorn: 8.12.1 - eslint: 8.57.0 + '@types/eslint': 9.6.1 + eslint: 9.10.0(jiti@1.21.6) eslint-visitor-keys: 4.0.0 espree: 10.1.0 - '@swc/core-darwin-arm64@1.7.6': + '@supabase/auth-js@2.65.0': + dependencies: + '@supabase/node-fetch': 2.6.15 + + '@supabase/functions-js@2.4.1': + dependencies: + '@supabase/node-fetch': 2.6.15 + + '@supabase/node-fetch@2.6.15': + dependencies: + whatwg-url: 5.0.0 + + '@supabase/postgrest-js@1.16.1': + dependencies: + '@supabase/node-fetch': 2.6.15 + + '@supabase/realtime-js@2.10.2': + dependencies: + '@supabase/node-fetch': 2.6.15 + '@types/phoenix': 1.6.5 + '@types/ws': 8.5.10 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@supabase/ssr@0.5.1(@supabase/supabase-js@2.45.4)': + dependencies: + '@supabase/supabase-js': 2.45.4 + cookie: 0.6.0 + + '@supabase/storage-js@2.7.0': + dependencies: + '@supabase/node-fetch': 2.6.15 + + '@supabase/supabase-js@2.45.4': + dependencies: + '@supabase/auth-js': 2.65.0 + '@supabase/functions-js': 2.4.1 + '@supabase/node-fetch': 2.6.15 + '@supabase/postgrest-js': 1.16.1 + '@supabase/realtime-js': 2.10.2 + '@supabase/storage-js': 2.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@swc/core-darwin-arm64@1.7.26': optional: true - '@swc/core-darwin-x64@1.7.6': + '@swc/core-darwin-x64@1.7.26': optional: true - '@swc/core-linux-arm-gnueabihf@1.7.6': + '@swc/core-linux-arm-gnueabihf@1.7.26': optional: true - '@swc/core-linux-arm64-gnu@1.7.6': + '@swc/core-linux-arm64-gnu@1.7.26': optional: true - '@swc/core-linux-arm64-musl@1.7.6': + '@swc/core-linux-arm64-musl@1.7.26': optional: true - '@swc/core-linux-x64-gnu@1.7.6': + '@swc/core-linux-x64-gnu@1.7.26': optional: true - '@swc/core-linux-x64-musl@1.7.6': + '@swc/core-linux-x64-musl@1.7.26': optional: true - '@swc/core-win32-arm64-msvc@1.7.6': + '@swc/core-win32-arm64-msvc@1.7.26': optional: true - '@swc/core-win32-ia32-msvc@1.7.6': + '@swc/core-win32-ia32-msvc@1.7.26': optional: true - '@swc/core-win32-x64-msvc@1.7.6': + '@swc/core-win32-x64-msvc@1.7.26': optional: true - '@swc/core@1.7.6(@swc/helpers@0.5.11)': + '@swc/core@1.7.26(@swc/helpers@0.5.13)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.12 optionalDependencies: - '@swc/core-darwin-arm64': 1.7.6 - '@swc/core-darwin-x64': 1.7.6 - '@swc/core-linux-arm-gnueabihf': 1.7.6 - '@swc/core-linux-arm64-gnu': 1.7.6 - '@swc/core-linux-arm64-musl': 1.7.6 - '@swc/core-linux-x64-gnu': 1.7.6 - '@swc/core-linux-x64-musl': 1.7.6 - '@swc/core-win32-arm64-msvc': 1.7.6 - '@swc/core-win32-ia32-msvc': 1.7.6 - '@swc/core-win32-x64-msvc': 1.7.6 - '@swc/helpers': 0.5.11 + '@swc/core-darwin-arm64': 1.7.26 + '@swc/core-darwin-x64': 1.7.26 + '@swc/core-linux-arm-gnueabihf': 1.7.26 + '@swc/core-linux-arm64-gnu': 1.7.26 + '@swc/core-linux-arm64-musl': 1.7.26 + '@swc/core-linux-x64-gnu': 1.7.26 + '@swc/core-linux-x64-musl': 1.7.26 + '@swc/core-win32-arm64-msvc': 1.7.26 + '@swc/core-win32-ia32-msvc': 1.7.26 + '@swc/core-win32-x64-msvc': 1.7.26 + '@swc/helpers': 0.5.13 '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.1': - dependencies: - tslib: 2.6.2 - - '@swc/helpers@0.5.11': + '@swc/helpers@0.5.13': dependencies: - tslib: 2.6.2 + tslib: 2.7.0 '@swc/types@0.1.12': dependencies: '@swc/counter': 0.1.3 - '@tanstack/config@0.11.3(@types/node@20.14.9)(esbuild@0.21.5)(eslint@8.57.0)(rollup@4.18.0)(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1))': + '@tanstack/config@0.13.1(@types/node@22.5.4)(esbuild@0.23.1)(eslint@9.10.0(jiti@1.21.6))(rollup@4.21.2)(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1))': dependencies: '@commitlint/parse': 19.0.3 - '@eslint/js': 8.57.0 - '@stylistic/eslint-plugin-js': 2.6.4(eslint@8.57.0) + '@eslint/js': 9.10.0 + '@stylistic/eslint-plugin-js': 2.7.1(eslint@9.10.0(jiti@1.21.6)) commander: 12.1.0 current-git-branch: 1.1.0 - esbuild-register: 3.6.0(esbuild@0.21.5) - eslint-plugin-import-x: 3.1.0(eslint@8.57.0)(typescript@5.5.3) - eslint-plugin-n: 17.10.2(eslint@8.57.0) + esbuild-register: 3.6.0(esbuild@0.23.1) + eslint-plugin-import-x: 4.1.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + eslint-plugin-n: 17.10.2(eslint@9.10.0(jiti@1.21.6)) globals: 15.9.0 interpret: 3.1.1 jsonfile: 6.1.0 liftoff: 5.0.0 minimist: 1.2.8 - rollup-plugin-preserve-directives: 0.4.0(rollup@4.18.0) + rollup-plugin-preserve-directives: 0.4.0(rollup@4.21.2) semver: 7.6.3 simple-git: 3.25.0 - typedoc: 0.26.6(typescript@5.5.3) - typedoc-plugin-frontmatter: 1.0.0(typedoc-plugin-markdown@4.2.6(typedoc@0.26.6(typescript@5.5.3))) - typedoc-plugin-markdown: 4.2.6(typedoc@0.26.6(typescript@5.5.3)) - typescript-eslint: 7.18.0(eslint@8.57.0)(typescript@5.5.3) + typedoc: 0.26.6(typescript@5.6.2) + typedoc-plugin-frontmatter: 1.0.0(typedoc-plugin-markdown@4.2.6(typedoc@0.26.6(typescript@5.6.2))) + typedoc-plugin-markdown: 4.2.6(typedoc@0.26.6(typescript@5.6.2)) + typescript-eslint: 8.3.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) v8flags: 4.0.1 - vite-plugin-dts: 4.0.3(@types/node@20.14.9)(rollup@4.18.0)(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - vite-plugin-externalize-deps: 0.8.0(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) - vite-tsconfig-paths: 5.0.1(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)) + vite-plugin-dts: 4.0.3(@types/node@22.5.4)(rollup@4.21.2)(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + vite-plugin-externalize-deps: 0.8.0(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) + vite-tsconfig-paths: 5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)) transitivePeerDependencies: - '@types/node' - esbuild @@ -13014,19 +11899,19 @@ snapshots: - typescript - vite - '@tanstack/query-core@5.51.21': {} + '@tanstack/query-core@5.56.2': {} - '@tanstack/query-devtools@5.51.16': {} + '@tanstack/query-devtools@5.56.1': {} - '@tanstack/react-query-devtools@5.51.21(@tanstack/react-query@5.51.21(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query-devtools@5.56.2(@tanstack/react-query@5.56.2(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/query-devtools': 5.51.16 - '@tanstack/react-query': 5.51.21(react@18.3.1) + '@tanstack/query-devtools': 5.56.1 + '@tanstack/react-query': 5.56.2(react@18.3.1) react: 18.3.1 - '@tanstack/react-query@5.51.21(react@18.3.1)': + '@tanstack/react-query@5.56.2(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.51.21 + '@tanstack/query-core': 5.56.2 react: 18.3.1 '@tanstack/react-store@0.5.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -13036,15 +11921,15 @@ snapshots: react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.2.2(react@18.3.1) - '@tanstack/react-virtual@3.8.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-virtual@3.10.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/virtual-core': 3.8.4 + '@tanstack/virtual-core': 3.10.7 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) '@tanstack/store@0.5.5': {} - '@tanstack/virtual-core@3.8.4': {} + '@tanstack/virtual-core@3.10.7': {} '@testing-library/dom@10.0.0': dependencies: @@ -13057,10 +11942,9 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.8': + '@testing-library/jest-dom@6.5.0': dependencies: '@adobe/css-tools': 4.4.0 - '@babel/runtime': 7.23.5 aria-query: 5.3.0 chalk: 3.0.0 css.escape: 1.5.1 @@ -13068,33 +11952,35 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@16.0.0(@testing-library/dom@10.0.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@16.0.1(@testing-library/dom@10.0.0)(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.23.5 '@testing-library/dom': 10.0.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 '@types/react-dom': 18.3.0 - '@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477)': + '@trpc/client@11.0.0-rc.502(@trpc/server@11.0.0-rc.502)': dependencies: - '@trpc/server': 11.0.0-rc.477 + '@trpc/server': 11.0.0-rc.502 - '@trpc/react-query@11.0.0-rc.477(@tanstack/react-query@5.51.21(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/server@11.0.0-rc.477)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@trpc/react-query@11.0.0-rc.502(@tanstack/react-query@5.56.2(react@18.3.1))(@trpc/client@11.0.0-rc.502(@trpc/server@11.0.0-rc.502))(@trpc/server@11.0.0-rc.502)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-query': 5.51.21(react@18.3.1) - '@trpc/client': 11.0.0-rc.477(@trpc/server@11.0.0-rc.477) - '@trpc/server': 11.0.0-rc.477 + '@tanstack/react-query': 5.56.2(react@18.3.1) + '@trpc/client': 11.0.0-rc.502(@trpc/server@11.0.0-rc.502) + '@trpc/server': 11.0.0-rc.502 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@trpc/server@11.0.0-rc.477': {} + '@trpc/server@11.0.0-rc.502': {} + + '@trysound/sax@0.2.0': {} '@tybys/wasm-util@0.9.0': dependencies: - tslib: 2.6.2 + tslib: 2.7.0 '@types/argparse@1.0.38': {} @@ -13102,57 +11988,56 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 '@types/body-parser@1.19.2': dependencies: '@types/connect': 3.4.35 - '@types/node': 20.14.9 + '@types/node': 22.5.4 '@types/bonjour@3.5.13': dependencies: - '@types/node': 20.14.9 + '@types/node': 22.5.4 '@types/braces@3.0.4': {} '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.17.36 - '@types/node': 20.14.9 + '@types/node': 22.5.4 '@types/connect@3.4.35': dependencies: - '@types/node': 20.14.9 + '@types/node': 22.5.4 '@types/conventional-commits-parser@5.0.0': dependencies: - '@types/node': 20.14.9 + '@types/node': 22.5.4 '@types/cookie@0.6.0': {} - '@types/eslint-scope@3.7.7': + '@types/cross-spawn@6.0.6': dependencies: - '@types/eslint': 9.6.0 - '@types/estree': 1.0.5 + '@types/node': 22.5.4 - '@types/eslint@9.6.0': + '@types/eslint@9.6.1': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 @@ -13161,7 +12046,7 @@ snapshots: '@types/express-serve-static-core@4.17.36': dependencies: - '@types/node': 20.14.9 + '@types/node': 22.5.4 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -13183,14 +12068,12 @@ snapshots: '@types/http-proxy@1.17.14': dependencies: - '@types/node': 20.14.9 + '@types/node': 22.5.4 '@types/jsesc@3.0.3': {} '@types/json-schema@7.0.15': {} - '@types/json5@0.0.29': {} - '@types/micromatch@4.0.7': dependencies: '@types/braces': 3.0.4 @@ -13201,17 +12084,17 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 20.14.9 + '@types/node': 22.5.4 '@types/node-forge@1.3.11': dependencies: - '@types/node': 20.14.9 + '@types/node': 22.5.4 - '@types/node@20.14.9': + '@types/node@22.5.4': dependencies: - undici-types: 5.26.5 + undici-types: 6.19.8 - '@types/parse-json@4.0.2': {} + '@types/phoenix@1.6.5': {} '@types/prop-types@15.7.12': {} @@ -13221,9 +12104,9 @@ snapshots: '@types/react-dom@18.3.0': dependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 - '@types/react@18.3.3': + '@types/react@18.3.5': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 @@ -13232,322 +12115,189 @@ snapshots: '@types/retry@0.12.2': {} - '@types/semver@7.5.8': {} - '@types/send@0.17.1': - dependencies: - '@types/mime': 1.3.2 - '@types/node': 20.14.9 - - '@types/serve-index@1.9.4': - dependencies: - '@types/express': 4.17.21 - - '@types/serve-static@1.15.5': - dependencies: - '@types/http-errors': 2.0.4 - '@types/mime': 3.0.4 - '@types/node': 20.14.9 - - '@types/sockjs@0.3.36': - dependencies: - '@types/node': 20.14.9 - - '@types/statuses@2.0.5': {} - - '@types/tough-cookie@4.0.5': {} - - '@types/triple-beam@1.3.5': {} - - '@types/unist@3.0.2': {} - - '@types/wrap-ansi@3.0.0': {} - - '@types/ws@8.5.10': - dependencies: - '@types/node': 20.14.9 - - '@types/yargs-parser@21.0.0': {} - - '@types/yargs@17.0.32': - dependencies: - '@types/yargs-parser': 21.0.0 - - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.3) - debug: 4.3.5 - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare-lite: 1.4.0 - semver: 7.6.3 - tsutils: 3.21.0(typescript@5.5.3) - optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.3) - optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.3) - eslint: 8.57.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.3) - debug: 4.3.5 - eslint: 8.57.0 - optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.5 - eslint: 8.57.0 - optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color + dependencies: + '@types/mime': 1.3.2 + '@types/node': 22.5.4 - '@typescript-eslint/scope-manager@5.62.0': + '@types/serve-index@1.9.4': dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 + '@types/express': 4.17.21 - '@typescript-eslint/scope-manager@7.17.0': + '@types/serve-static@1.15.5': dependencies: - '@typescript-eslint/types': 7.17.0 - '@typescript-eslint/visitor-keys': 7.17.0 + '@types/http-errors': 2.0.4 + '@types/mime': 3.0.4 + '@types/node': 22.5.4 - '@typescript-eslint/scope-manager@7.18.0': + '@types/sockjs@0.3.36': dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 + '@types/node': 22.5.4 + + '@types/statuses@2.0.5': {} + + '@types/tough-cookie@4.0.5': {} + + '@types/unist@3.0.2': {} + + '@types/validate-npm-package-name@4.0.2': {} + + '@types/wrap-ansi@3.0.0': {} - '@typescript-eslint/scope-manager@8.0.0': + '@types/ws@8.5.10': dependencies: - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/visitor-keys': 8.0.0 + '@types/node': 22.5.4 + + '@types/yargs-parser@21.0.0': {} - '@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.5.3)': + '@types/yargs@17.0.33': dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.3) - debug: 4.3.5 - eslint: 8.57.0 - tsutils: 3.21.0(typescript@5.5.3) - optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color + '@types/yargs-parser': 21.0.0 - '@typescript-eslint/type-utils@7.17.0(eslint@8.57.0)(typescript@5.5.3)': + '@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.3) - '@typescript-eslint/utils': 7.17.0(eslint@8.57.0)(typescript@5.5.3) - debug: 4.3.5 - eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.5.3) + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 8.3.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/type-utils': 8.3.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/utils': 8.3.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.3.0 + eslint: 9.10.0(jiti@1.21.6) + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.5.3)': + '@typescript-eslint/parser@8.3.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.3) - debug: 4.3.5 - eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.5.3) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.3.0 + debug: 4.3.6 + eslint: 9.10.0(jiti@1.21.6) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.0.0(eslint@8.57.0)(typescript@5.5.3)': + '@typescript-eslint/rule-tester@8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.0.0(typescript@5.5.3) - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) - debug: 4.3.5 - ts-api-utils: 1.3.0(typescript@5.5.3) - optionalDependencies: - typescript: 5.5.3 + '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.6.2) + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + ajv: 6.12.6 + eslint: 9.10.0(jiti@1.21.6) + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + semver: 7.6.3 transitivePeerDependencies: - - eslint - supports-color + - typescript - '@typescript-eslint/types@5.62.0': {} - - '@typescript-eslint/types@7.17.0': {} - - '@typescript-eslint/types@7.18.0': {} + '@typescript-eslint/scope-manager@8.3.0': + dependencies: + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/visitor-keys': 8.3.0 - '@typescript-eslint/types@8.0.0': {} + '@typescript-eslint/scope-manager@8.5.0': + dependencies: + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/visitor-keys': 8.5.0 - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.3)': + '@typescript-eslint/type-utils@8.3.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.5 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.3 - tsutils: 3.21.0(typescript@5.5.3) + '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.2) + '@typescript-eslint/utils': 8.3.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + debug: 4.3.6 + ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: + - eslint - supports-color - '@typescript-eslint/typescript-estree@7.17.0(typescript@5.5.3)': + '@typescript-eslint/type-utils@8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@typescript-eslint/types': 7.17.0 - '@typescript-eslint/visitor-keys': 7.17.0 - debug: 4.3.5 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.3) + '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.6.2) + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + debug: 4.3.6 + ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: + - eslint - supports-color - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.3)': + '@typescript-eslint/types@8.3.0': {} + + '@typescript-eslint/types@8.5.0': {} + + '@typescript-eslint/typescript-estree@8.3.0(typescript@5.6.2)': dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.5 - globby: 11.1.0 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/visitor-keys': 8.3.0 + debug: 4.3.6 + fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.3) + ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.0.0(typescript@5.5.3)': + '@typescript-eslint/typescript-estree@8.5.0(typescript@5.6.2)': dependencies: - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/visitor-keys': 8.0.0 - debug: 4.3.5 - globby: 11.1.0 + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/visitor-keys': 8.5.0 + debug: 4.3.6 + fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.3) + ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.3) - eslint: 8.57.0 - eslint-scope: 5.1.1 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@7.17.0(eslint@8.57.0)(typescript@5.5.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.17.0 - '@typescript-eslint/types': 7.17.0 - '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.3) - eslint: 8.57.0 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - - typescript - '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.5.3)': + '@typescript-eslint/utils@8.3.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.3) - eslint: 8.57.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6)) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.2) + eslint: 9.10.0(jiti@1.21.6) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@8.0.0(eslint@8.57.0)(typescript@5.5.3)': + '@typescript-eslint/utils@8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/typescript-estree': 8.0.0(typescript@5.5.3) - eslint: 8.57.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6)) + '@typescript-eslint/scope-manager': 8.5.0 + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.6.2) + eslint: 9.10.0(jiti@1.21.6) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - - '@typescript-eslint/visitor-keys@7.17.0': - dependencies: - '@typescript-eslint/types': 7.17.0 - eslint-visitor-keys: 3.4.3 - - '@typescript-eslint/visitor-keys@7.18.0': + '@typescript-eslint/visitor-keys@8.3.0': dependencies: - '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/types': 8.3.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.0.0': + '@typescript-eslint/visitor-keys@8.5.0': dependencies: - '@typescript-eslint/types': 8.0.0 + '@typescript-eslint/types': 8.5.0 eslint-visitor-keys: 3.4.3 - '@ungap/structured-clone@1.2.0': {} - '@vercel/nft@0.26.5': dependencies: '@mapbox/node-pre-gyp': 1.0.11 @@ -13577,8 +12327,8 @@ snapshots: get-port-please: 3.1.2 h3: 1.11.1 http-shutdown: 1.2.2 - jiti: 1.21.0 - mlly: 1.7.0 + jiti: 1.21.6 + mlly: 1.7.1 node-forge: 1.3.1 pathe: 1.1.2 std-env: 3.7.0 @@ -13588,9 +12338,9 @@ snapshots: transitivePeerDependencies: - uWebSockets.js - '@vinxi/plugin-directives@0.4.1(vinxi@0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1))': + '@vinxi/plugin-directives@0.4.3(vinxi@0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1))': dependencies: - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.6 acorn: 8.12.1 acorn-jsx: 5.3.2(acorn@8.12.1) acorn-loose: 8.3.0 @@ -13598,48 +12348,48 @@ snapshots: astring: 1.8.6 magicast: 0.2.11 recast: 0.23.4 - tslib: 2.6.2 - vinxi: 0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1) + tslib: 2.7.0 + vinxi: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) - '@vinxi/react-server-dom@0.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1))': + '@vinxi/react-server-dom@0.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1))': dependencies: acorn-loose: 8.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - vite: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + vite: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - '@vinxi/react@0.2.3': {} + '@vinxi/react@0.2.5': {} - '@vinxi/server-components@0.4.1(vinxi@0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1))': + '@vinxi/server-components@0.4.3(vinxi@0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1))': dependencies: - '@vinxi/plugin-directives': 0.4.1(vinxi@0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1)) + '@vinxi/plugin-directives': 0.4.3(vinxi@0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1)) acorn: 8.12.1 acorn-loose: 8.3.0 acorn-typescript: 1.4.13(acorn@8.12.1) astring: 1.8.6 magicast: 0.2.11 recast: 0.23.4 - vinxi: 0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1) + vinxi: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) - '@vinxi/server-functions@0.4.1(vinxi@0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1))': + '@vinxi/server-functions@0.4.3(vinxi@0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1))': dependencies: - '@vinxi/plugin-directives': 0.4.1(vinxi@0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1)) + '@vinxi/plugin-directives': 0.4.3(vinxi@0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1)) acorn: 8.12.1 acorn-loose: 8.3.0 acorn-typescript: 1.4.13(acorn@8.12.1) astring: 1.8.6 magicast: 0.2.11 recast: 0.23.4 - vinxi: 0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1) + vinxi: 0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1) - '@vitejs/plugin-react@4.3.1(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1))': + '@vitejs/plugin-react@4.3.1(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1))': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + vite: 5.4.5(@types/node@22.5.4)(terser@5.31.1) transitivePeerDependencies: - supports-color @@ -13647,7 +12397,7 @@ snapshots: dependencies: '@vitest/spy': 1.6.0 '@vitest/utils': 1.6.0 - chai: 4.4.1 + chai: 4.5.0 '@vitest/runner@1.6.0': dependencies: @@ -13657,7 +12407,7 @@ snapshots: '@vitest/snapshot@1.6.0': dependencies: - magic-string: 0.30.10 + magic-string: 0.30.11 pathe: 1.1.2 pretty-format: 29.7.0 @@ -13672,25 +12422,12 @@ snapshots: loupe: 2.3.7 pretty-format: 29.7.0 - '@volar/language-core@1.11.1': - dependencies: - '@volar/source-map': 1.11.1 - '@volar/language-core@2.4.0': dependencies: '@volar/source-map': 2.4.0 - '@volar/source-map@1.11.1': - dependencies: - muggle-string: 0.3.1 - '@volar/source-map@2.4.0': {} - '@volar/typescript@1.11.1': - dependencies: - '@volar/language-core': 1.11.1 - path-browserify: 1.0.1 - '@volar/typescript@2.4.0': dependencies: '@volar/language-core': 2.4.0 @@ -13699,11 +12436,11 @@ snapshots: '@vue/compiler-core@3.4.27': dependencies: - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.6 '@vue/shared': 3.4.27 entities: 4.5.0 estree-walker: 2.0.2 - source-map-js: 1.2.0 + source-map-js: 1.2.1 '@vue/compiler-dom@3.4.27': dependencies: @@ -13715,21 +12452,7 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - '@vue/language-core@1.8.27(typescript@5.5.3)': - dependencies: - '@volar/language-core': 1.11.1 - '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.4.27 - '@vue/shared': 3.4.27 - computeds: 0.0.1 - minimatch: 9.0.5 - muggle-string: 0.3.1 - path-browserify: 1.0.1 - vue-template-compiler: 2.7.16 - optionalDependencies: - typescript: 5.5.3 - - '@vue/language-core@2.0.29(typescript@5.5.3)': + '@vue/language-core@2.0.29(typescript@5.6.2)': dependencies: '@volar/language-core': 2.4.0 '@vue/compiler-dom': 3.4.27 @@ -13740,7 +12463,7 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 '@vue/shared@3.4.27': {} @@ -13822,22 +12545,22 @@ snapshots: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4))': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack-dev-server@5.1.0)(webpack@5.94.0))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4))': dependencies: - webpack: 5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.0.4)(webpack@5.93.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.1.0)(webpack@5.94.0) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4))': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack-dev-server@5.1.0)(webpack@5.94.0))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4))': dependencies: - webpack: 5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.0.4)(webpack@5.93.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.1.0)(webpack@5.94.0) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.93.0))(webpack-dev-server@5.0.4(webpack-cli@5.1.4)(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4))': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack-dev-server@5.1.0)(webpack@5.94.0))(webpack-dev-server@5.1.0(webpack-cli@5.1.4)(webpack@5.94.0))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4))': dependencies: - webpack: 5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.0.4)(webpack@5.93.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.1.0)(webpack@5.94.0) optionalDependencies: - webpack-dev-server: 5.0.4(webpack-cli@5.1.4)(webpack@5.93.0) + webpack-dev-server: 5.1.0(webpack-cli@5.1.4)(webpack@5.94.0) '@xtuc/ieee754@1.2.0': {} @@ -13848,15 +12571,12 @@ snapshots: '@yarnpkg/parsers@3.0.0-rc.46': dependencies: js-yaml: 3.14.1 - tslib: 2.6.2 + tslib: 2.7.0 '@zkochan/js-yaml@0.0.7': dependencies: argparse: 2.0.1 - '@zxing/text-encoding@0.9.0': - optional: true - JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 @@ -13889,34 +12609,31 @@ snapshots: dependencies: acorn: 8.12.1 - acorn-walk@8.3.2: {} + acorn-walk@8.3.4: + dependencies: + acorn: 8.12.1 acorn@8.12.1: {} agent-base@6.0.2: dependencies: - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color agent-base@7.1.1: dependencies: - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - ajv-draft-04@1.0.0(ajv@8.13.0): optionalDependencies: ajv: 8.13.0 - ajv-formats@2.1.1(ajv@8.12.0): + ajv-formats@2.1.1(ajv@8.13.0): optionalDependencies: - ajv: 8.12.0 + ajv: 8.13.0 ajv-formats@3.0.1(ajv@8.13.0): optionalDependencies: @@ -13926,9 +12643,9 @@ snapshots: dependencies: ajv: 6.12.6 - ajv-keywords@5.1.0(ajv@8.12.0): + ajv-keywords@5.1.0(ajv@8.13.0): dependencies: - ajv: 8.12.0 + ajv: 8.13.0 fast-deep-equal: 3.1.3 ajv@6.12.6: @@ -13962,6 +12679,10 @@ snapshots: dependencies: type-fest: 0.21.3 + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + ansi-html-community@0.0.8: {} ansi-regex@5.0.1: {} @@ -14024,21 +12745,16 @@ snapshots: aria-hidden@1.2.3: dependencies: - tslib: 2.6.2 + tslib: 2.7.0 aria-query@5.3.0: dependencies: dequal: 2.0.3 - arktype@2.0.0-beta.5: - dependencies: - '@ark/schema': 0.3.2 - '@ark/util': 0.2.1 - - array-buffer-byte-length@1.0.1: + arktype@2.0.0-rc.8: dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 + '@ark/schema': 0.10.0 + '@ark/util': 0.10.0 array-each@1.0.1: {} @@ -14046,77 +12762,8 @@ snapshots: array-ify@1.0.0: {} - array-includes@3.1.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 - array-slice@1.1.0: {} - array-union@2.1.0: {} - - array.prototype.findlast@1.2.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - - array.prototype.findlastindex@1.2.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - array.prototype.flatmap@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - array.prototype.toreversed@1.1.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - array.prototype.tosorted@1.1.3: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 - - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - assert@2.1.0: dependencies: call-bind: 1.0.7 @@ -14127,39 +12774,33 @@ snapshots: assertion-error@1.1.0: {} - ast-types-flow@0.0.8: {} - ast-types@0.16.1: dependencies: - tslib: 2.6.2 + tslib: 2.7.0 astring@1.8.6: {} - async-exit-hook@2.0.1: {} - async-sema@3.1.1: {} async@3.2.5: {} asynckit@0.4.0: {} - autoprefixer@10.4.20(postcss@8.4.40): + autoprefixer@10.4.20(postcss@8.4.47): dependencies: browserslist: 4.23.3 - caniuse-lite: 1.0.30001647 + caniuse-lite: 1.0.30001659 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.1 - postcss: 8.4.40 + picocolors: 1.1.0 + postcss: 8.4.47 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - axe-core@4.7.0: {} - - axios@1.7.2: + axios@1.7.7: dependencies: follow-redirects: 1.15.6 form-data: 4.0.0 @@ -14167,77 +12808,19 @@ snapshots: transitivePeerDependencies: - debug - axobject-query@3.2.1: - dependencies: - dequal: 2.0.3 - b4a@1.6.6: {} babel-dead-code-elimination@1.0.6: dependencies: '@babel/core': 7.25.2 - '@babel/parser': 7.25.3 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/parser': 7.25.6 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color babel-plugin-add-module-exports@0.2.1: {} - babel-plugin-macros@3.1.0: - dependencies: - '@babel/runtime': 7.23.5 - cosmiconfig: 7.1.0 - resolve: 1.22.8 - - babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.2): - dependencies: - '@babel/compat-data': 7.25.2 - '@babel/core': 7.25.2 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.25.2): - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) - core-js-compat: 3.37.1 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.2): - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-react-remove-prop-types@0.4.24: {} - - babel-preset-react-app@10.0.1: - dependencies: - '@babel/core': 7.25.2 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.25.2) - '@babel/plugin-proposal-decorators': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.25.2) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.25.2) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.25.2) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.25.2) - '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.25.2) - '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.25.2) - '@babel/plugin-transform-runtime': 7.24.3(@babel/core@7.25.2) - '@babel/preset-env': 7.24.5(@babel/core@7.25.2) - '@babel/preset-react': 7.24.1(@babel/core@7.25.2) - '@babel/preset-typescript': 7.24.1(@babel/core@7.25.2) - '@babel/runtime': 7.23.5 - babel-plugin-macros: 3.1.0 - babel-plugin-transform-react-remove-prop-types: 0.4.24 - transitivePeerDependencies: - - supports-color - balanced-match@1.0.2: {} bare-events@2.2.2: @@ -14261,7 +12844,7 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - body-parser@1.20.2: + body-parser@1.20.3: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -14271,7 +12854,7 @@ snapshots: http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.11.0 + qs: 6.13.0 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 @@ -14311,13 +12894,11 @@ snapshots: browserslist@4.23.3: dependencies: - caniuse-lite: 1.0.30001647 + caniuse-lite: 1.0.30001659 electron-to-chromium: 1.5.4 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) - btoa@1.2.1: {} - buffer-crc32@1.0.0: {} buffer-from@1.1.2: {} @@ -14349,12 +12930,12 @@ snapshots: defu: 6.1.4 dotenv: 16.4.5 giget: 1.2.1 - jiti: 1.21.0 - mlly: 1.7.0 + jiti: 1.21.6 + mlly: 1.7.1 ohash: 1.1.3 pathe: 1.1.2 perfect-debounce: 1.0.0 - pkg-types: 1.1.1 + pkg-types: 1.2.0 rc9: 2.1.1 cac@6.7.14: {} @@ -14372,25 +12953,30 @@ snapshots: camel-case@4.1.2: dependencies: pascal-case: 3.1.2 - tslib: 2.6.2 + tslib: 2.7.0 camelcase-css@2.0.1: {} camelcase@7.0.1: {} - caniuse-lite@1.0.30001647: {} + caniuse-api@3.0.0: + dependencies: + browserslist: 4.23.3 + caniuse-lite: 1.0.30001659 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001651: {} + caniuse-lite@1.0.30001659: {} - chai@4.4.1: + chai@4.5.0: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 - deep-eql: 4.1.3 + deep-eql: 4.1.4 get-func-name: 2.0.2 loupe: 2.3.7 pathval: 1.1.1 - type-detect: 4.0.8 + type-detect: 4.1.0 chalk@2.4.2: dependencies: @@ -14410,6 +12996,10 @@ snapshots: chalk@5.3.0: {} + char-regex@1.0.2: {} + + chardet@0.7.0: {} + check-error@1.0.3: dependencies: get-func-name: 2.0.2 @@ -14434,22 +13024,37 @@ snapshots: dependencies: consola: 3.2.3 + cjs-module-lexer@1.4.1: {} + clean-css@5.3.3: dependencies: source-map: 0.6.1 - clean-stack@2.2.0: {} - cli-boxes@3.0.0: {} cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 + cli-highlight@2.1.11: + dependencies: + chalk: 4.1.2 + highlight.js: 10.7.3 + mz: 2.7.0 + parse5: 5.1.1 + parse5-htmlparser2-tree-adapter: 6.0.1 + yargs: 16.2.0 + cli-spinners@2.6.1: {} cli-spinners@2.9.2: {} + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + cli-width@4.1.0: {} client-only@0.0.1: {} @@ -14460,6 +13065,12 @@ snapshots: is-wsl: 3.1.0 is64bit: 2.0.0 + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -14490,25 +13101,12 @@ snapshots: color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - color-support@1.1.3: {} - color@3.2.1: - dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 + colord@2.9.3: {} colorette@2.0.20: {} - colorspace@1.1.4: - dependencies: - color: 3.2.1 - text-hex: 1.0.0 - combinate@1.1.11: {} combined-stream@1.0.8: @@ -14523,10 +13121,9 @@ snapshots: commander@4.1.1: {} - commander@8.3.0: {} + commander@7.2.0: {} - commander@9.5.0: - optional: true + commander@8.3.0: {} commondir@1.0.1: {} @@ -14535,8 +13132,6 @@ snapshots: array-ify: 1.0.0 dot-prop: 5.3.0 - compare-versions@6.0.0-rc.1: {} - compare-versions@6.1.1: {} compress-commons@6.0.2: @@ -14581,8 +13176,6 @@ snapshots: confbox@0.1.7: {} - confusing-browser-globals@1.0.11: {} - connect-history-api-fallback@2.0.0: {} consola@3.2.3: {} @@ -14608,26 +13201,21 @@ snapshots: convert-source-map@2.0.0: {} - convex@1.13.2(eslint@8.57.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + convex@1.16.0(@clerk/clerk-react@5.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - esbuild: 0.17.19 - eslint-plugin-require-extensions: 0.1.3(eslint@8.57.0) + esbuild: 0.23.0 + globals: 15.9.0 jwt-decode: 3.1.2 - node-fetch: 2.7.0 prettier: 3.2.5 optionalDependencies: + '@clerk/clerk-react': 5.8.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - encoding - - eslint cookie-es@1.1.0: {} cookie-signature@1.0.6: {} - cookie-signature@1.2.1: {} - cookie@0.5.0: {} cookie@0.6.0: {} @@ -14636,24 +13224,10 @@ snapshots: dependencies: is-what: 4.1.8 - core-js-compat@3.37.1: - dependencies: - browserslist: 4.23.3 - - core-js@3.32.2: {} - core-js@3.38.1: {} core-util-is@1.0.3: {} - cosmiconfig@7.1.0: - dependencies: - '@types/parse-json': 4.0.2 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - crc-32@1.2.2: {} crc32-stream@6.0.0: @@ -14677,6 +13251,10 @@ snapshots: crossws@0.2.4: {} + css-declaration-sorter@7.2.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + css-select@4.3.0: dependencies: boolbase: 1.0.0 @@ -14685,12 +13263,78 @@ snapshots: domutils: 2.8.0 nth-check: 2.1.1 + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + css-what@6.1.0: {} css.escape@1.5.1: {} cssesc@3.0.0: {} + cssnano-preset-default@7.0.6(postcss@8.4.47): + dependencies: + browserslist: 4.23.3 + css-declaration-sorter: 7.2.0(postcss@8.4.47) + cssnano-utils: 5.0.0(postcss@8.4.47) + postcss: 8.4.47 + postcss-calc: 10.0.2(postcss@8.4.47) + postcss-colormin: 7.0.2(postcss@8.4.47) + postcss-convert-values: 7.0.4(postcss@8.4.47) + postcss-discard-comments: 7.0.3(postcss@8.4.47) + postcss-discard-duplicates: 7.0.1(postcss@8.4.47) + postcss-discard-empty: 7.0.0(postcss@8.4.47) + postcss-discard-overridden: 7.0.0(postcss@8.4.47) + postcss-merge-longhand: 7.0.4(postcss@8.4.47) + postcss-merge-rules: 7.0.4(postcss@8.4.47) + postcss-minify-font-values: 7.0.0(postcss@8.4.47) + postcss-minify-gradients: 7.0.0(postcss@8.4.47) + postcss-minify-params: 7.0.2(postcss@8.4.47) + postcss-minify-selectors: 7.0.4(postcss@8.4.47) + postcss-normalize-charset: 7.0.0(postcss@8.4.47) + postcss-normalize-display-values: 7.0.0(postcss@8.4.47) + postcss-normalize-positions: 7.0.0(postcss@8.4.47) + postcss-normalize-repeat-style: 7.0.0(postcss@8.4.47) + postcss-normalize-string: 7.0.0(postcss@8.4.47) + postcss-normalize-timing-functions: 7.0.0(postcss@8.4.47) + postcss-normalize-unicode: 7.0.2(postcss@8.4.47) + postcss-normalize-url: 7.0.0(postcss@8.4.47) + postcss-normalize-whitespace: 7.0.0(postcss@8.4.47) + postcss-ordered-values: 7.0.1(postcss@8.4.47) + postcss-reduce-initial: 7.0.2(postcss@8.4.47) + postcss-reduce-transforms: 7.0.0(postcss@8.4.47) + postcss-svgo: 7.0.1(postcss@8.4.47) + postcss-unique-selectors: 7.0.3(postcss@8.4.47) + + cssnano-utils@5.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + cssnano@7.0.6(postcss@8.4.47): + dependencies: + cssnano-preset-default: 7.0.6(postcss@8.4.47) + lilconfig: 3.1.2 + postcss: 8.4.47 + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + cssstyle@4.0.1: dependencies: rrweb-cssom: 0.6.0 @@ -14705,34 +13349,12 @@ snapshots: execa: 0.6.3 is-git-repository: 1.1.1 - damerau-levenshtein@1.0.8: {} - - data-uri-to-buffer@3.0.1: {} - data-uri-to-buffer@4.0.1: {} data-urls@5.0.0: dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 date-fns@2.30.0: dependencies: @@ -14755,19 +13377,15 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.5: - dependencies: - ms: 2.1.2 - debug@4.3.6: dependencies: ms: 2.1.2 decimal.js@10.4.3: {} - deep-eql@4.1.3: + deep-eql@4.1.4: dependencies: - type-detect: 4.0.8 + type-detect: 4.1.0 deep-is@0.1.4: {} @@ -14780,10 +13398,6 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.0 - default-gateway@6.0.3: - dependencies: - execa: 5.1.1 - defaults@1.0.4: dependencies: clone: 1.0.4 @@ -14846,10 +13460,6 @@ snapshots: dependencies: '@leichtgewicht/ip-codec': 2.0.5 - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - doctrine@3.0.0: dependencies: esutils: 2.0.3 @@ -14868,22 +13478,38 @@ snapshots: domhandler: 4.3.1 entities: 2.2.0 + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + domelementtype@2.3.0: {} domhandler@4.3.1: dependencies: domelementtype: 2.3.0 + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + domutils@2.8.0: dependencies: dom-serializer: 1.4.1 domelementtype: 2.3.0 domhandler: 4.3.1 + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dot-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.7.0 dot-prop@5.3.0: dependencies: @@ -14911,20 +13537,17 @@ snapshots: emoji-regex@9.2.2: {} - enabled@2.0.0: {} + emojilib@2.4.0: {} encodeurl@1.0.2: {} + encodeurl@2.0.0: {} + end-of-stream@1.4.4: dependencies: once: 1.4.0 - enhanced-resolve@5.12.0: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - - enhanced-resolve@5.17.0: + enhanced-resolve@5.17.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -14939,139 +13562,52 @@ snapshots: envinfo@7.13.0: {} - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 + environment@1.1.0: {} error-stack-parser@2.1.4: dependencies: stackframe: 1.3.4 - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 es-errors@1.3.0: {} - es-iterator-helpers@1.0.18: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - iterator.prototype: 1.1.2 - safe-array-concat: 1.1.2 - es-module-lexer@1.5.4: {} - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.0.2: + esbuild-register@3.6.0(esbuild@0.23.1): dependencies: - hasown: 2.0.2 - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - - esbuild-register@3.6.0(esbuild@0.21.5): - dependencies: - debug: 4.3.5 - esbuild: 0.21.5 + debug: 4.3.6 + esbuild: 0.23.1 transitivePeerDependencies: - supports-color - esbuild@0.17.19: + esbuild@0.19.12: optionalDependencies: - '@esbuild/android-arm': 0.17.19 - '@esbuild/android-arm64': 0.17.19 - '@esbuild/android-x64': 0.17.19 - '@esbuild/darwin-arm64': 0.17.19 - '@esbuild/darwin-x64': 0.17.19 - '@esbuild/freebsd-arm64': 0.17.19 - '@esbuild/freebsd-x64': 0.17.19 - '@esbuild/linux-arm': 0.17.19 - '@esbuild/linux-arm64': 0.17.19 - '@esbuild/linux-ia32': 0.17.19 - '@esbuild/linux-loong64': 0.17.19 - '@esbuild/linux-mips64el': 0.17.19 - '@esbuild/linux-ppc64': 0.17.19 - '@esbuild/linux-riscv64': 0.17.19 - '@esbuild/linux-s390x': 0.17.19 - '@esbuild/linux-x64': 0.17.19 - '@esbuild/netbsd-x64': 0.17.19 - '@esbuild/openbsd-x64': 0.17.19 - '@esbuild/sunos-x64': 0.17.19 - '@esbuild/win32-arm64': 0.17.19 - '@esbuild/win32-ia32': 0.17.19 - '@esbuild/win32-x64': 0.17.19 + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 esbuild@0.20.2: optionalDependencies: @@ -15125,50 +13661,75 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 + esbuild@0.23.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.0 + '@esbuild/android-arm': 0.23.0 + '@esbuild/android-arm64': 0.23.0 + '@esbuild/android-x64': 0.23.0 + '@esbuild/darwin-arm64': 0.23.0 + '@esbuild/darwin-x64': 0.23.0 + '@esbuild/freebsd-arm64': 0.23.0 + '@esbuild/freebsd-x64': 0.23.0 + '@esbuild/linux-arm': 0.23.0 + '@esbuild/linux-arm64': 0.23.0 + '@esbuild/linux-ia32': 0.23.0 + '@esbuild/linux-loong64': 0.23.0 + '@esbuild/linux-mips64el': 0.23.0 + '@esbuild/linux-ppc64': 0.23.0 + '@esbuild/linux-riscv64': 0.23.0 + '@esbuild/linux-s390x': 0.23.0 + '@esbuild/linux-x64': 0.23.0 + '@esbuild/netbsd-x64': 0.23.0 + '@esbuild/openbsd-arm64': 0.23.0 + '@esbuild/openbsd-x64': 0.23.0 + '@esbuild/sunos-x64': 0.23.0 + '@esbuild/win32-arm64': 0.23.0 + '@esbuild/win32-ia32': 0.23.0 + '@esbuild/win32-x64': 0.23.0 + + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + escalade@3.1.2: {} escape-html@1.0.3: {} escape-string-regexp@1.0.5: {} - escape-string-regexp@2.0.0: {} - escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@8.57.0): + eslint-compat-utils@0.5.1(eslint@9.10.0(jiti@1.21.6)): dependencies: - eslint: 8.57.0 + eslint: 9.10.0(jiti@1.21.6) semver: 7.6.3 - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.6(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.25.2))(eslint@8.57.0)(typescript@5.5.3): - dependencies: - '@babel/core': 7.25.2 - '@babel/eslint-parser': 7.24.5(@babel/core@7.25.2)(eslint@8.57.0) - '@rushstack/eslint-patch': 1.10.3 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.3) - babel-preset-react-app: 10.0.1 - confusing-browser-globals: 1.0.11 - eslint: 8.57.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.6(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.25.2))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) - eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) - eslint-plugin-react: 7.34.1(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) - eslint-plugin-testing-library: 5.11.1(eslint@8.57.0)(typescript@5.5.3) - optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - '@babel/plugin-syntax-flow' - - '@babel/plugin-transform-react-jsx' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - jest - - supports-color - eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 @@ -15177,310 +13738,219 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.3) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-plugin-es-x@7.8.0(eslint@8.57.0): + eslint-plugin-es-x@7.8.0(eslint@9.10.0(jiti@1.21.6)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6)) '@eslint-community/regexpp': 4.11.0 - eslint: 8.57.0 - eslint-compat-utils: 0.5.1(eslint@8.57.0) - - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.6(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.25.2))(eslint@8.57.0): - dependencies: - '@babel/plugin-syntax-flow': 7.24.6(@babel/core@7.25.2) - '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.25.2) - eslint: 8.57.0 - lodash: 4.17.21 - string-natural-compare: 3.0.1 + eslint: 9.10.0(jiti@1.21.6) + eslint-compat-utils: 0.5.1(eslint@9.10.0(jiti@1.21.6)) - eslint-plugin-import-x@3.1.0(eslint@8.57.0)(typescript@5.5.3): + eslint-plugin-import-x@4.1.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): dependencies: - '@typescript-eslint/utils': 7.17.0(eslint@8.57.0)(typescript@5.5.3) - debug: 4.3.5 + '@typescript-eslint/typescript-estree': 8.5.0(typescript@5.6.2) + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + debug: 4.3.6 doctrine: 3.0.0 - eslint: 8.57.0 + eslint: 9.10.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.7.5 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 stable-hash: 0.0.4 - tslib: 2.6.2 - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0): - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) - hasown: 2.0.2 - is-core-module: 2.13.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.3) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3): - dependencies: - '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.3) - eslint: 8.57.0 - optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) + tslib: 2.7.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): - dependencies: - '@babel/runtime': 7.23.5 - aria-query: 5.3.0 - array-includes: 3.1.8 - array.prototype.flatmap: 1.3.2 - ast-types-flow: 0.0.8 - axe-core: 4.7.0 - axobject-query: 3.2.1 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.18 - eslint: 8.57.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.2 - object.entries: 1.1.8 - object.fromentries: 2.0.8 - - eslint-plugin-n@17.10.2(eslint@8.57.0): + eslint-plugin-n@17.10.2(eslint@9.10.0(jiti@1.21.6)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - enhanced-resolve: 5.17.0 - eslint: 8.57.0 - eslint-plugin-es-x: 7.8.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6)) + enhanced-resolve: 5.17.1 + eslint: 9.10.0(jiti@1.21.6) + eslint-plugin-es-x: 7.8.0(eslint@9.10.0(jiti@1.21.6)) get-tsconfig: 4.7.5 globals: 15.9.0 ignore: 5.3.1 minimatch: 9.0.5 semver: 7.6.3 - eslint-plugin-react-debug@1.8.2(eslint@8.57.0)(typescript@5.5.3): - dependencies: - '@eslint-react/ast': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/core': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/jsx': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/shared': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/tools': 1.8.2 - '@eslint-react/types': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/type-utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) - eslint: 8.57.0 - remeda: 2.7.0 + eslint-plugin-react-debug@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): + dependencies: + '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/core': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/shared': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/tools': 1.14.1 + '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/var': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.5.0 + '@typescript-eslint/type-utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + eslint: 9.10.0(jiti@1.21.6) string-ts: 2.2.0 + ts-pattern: 5.3.1 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-dom@1.8.2(eslint@8.57.0)(typescript@5.5.3): - dependencies: - '@eslint-react/ast': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/core': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/jsx': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/shared': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/tools': 1.8.2 - '@eslint-react/types': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/var': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) - eslint: 8.57.0 - remeda: 2.7.0 + eslint-plugin-react-dom@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): + dependencies: + '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/core': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/shared': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/tools': 1.14.1 + '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/var': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.5.0 + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + eslint: 9.10.0(jiti@1.21.6) + ts-pattern: 5.3.1 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@1.8.2(eslint@8.57.0)(typescript@5.5.3): - dependencies: - '@eslint-react/ast': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/core': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/jsx': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/shared': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/tools': 1.8.2 - '@eslint-react/types': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/var': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/type-utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) - eslint: 8.57.0 - remeda: 2.7.0 + eslint-plugin-react-hooks-extra@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): + dependencies: + '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/core': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/shared': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/tools': 1.14.1 + '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/var': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.5.0 + '@typescript-eslint/type-utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + eslint: 9.10.0(jiti@1.21.6) + ts-pattern: 5.3.1 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + eslint-plugin-react-hooks@5.1.0-rc-fb9a90fa48-20240614(eslint@9.10.0(jiti@1.21.6)): dependencies: - eslint: 8.57.0 + eslint: 9.10.0(jiti@1.21.6) - eslint-plugin-react-naming-convention@1.8.2(eslint@8.57.0)(typescript@5.5.3): + eslint-plugin-react-naming-convention@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): dependencies: - '@eslint-react/ast': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/core': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/jsx': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/shared': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/tools': 1.8.2 - '@eslint-react/types': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/type-utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) - eslint: 8.57.0 - remeda: 2.7.0 + '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/core': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/shared': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/tools': 1.14.1 + '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.5.0 + '@typescript-eslint/type-utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + eslint: 9.10.0(jiti@1.21.6) + ts-pattern: 5.3.1 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - eslint-plugin-react-x@1.8.2(eslint@8.57.0)(typescript@5.5.3): - dependencies: - '@eslint-react/ast': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/core': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/jsx': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/shared': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/tools': 1.8.2 - '@eslint-react/types': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@eslint-react/var': 1.8.2(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/type-utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/utils': 8.0.0(eslint@8.57.0)(typescript@5.5.3) - eslint: 8.57.0 - is-immutable-type: 4.0.0(eslint@8.57.0)(typescript@5.5.3) - remeda: 2.7.0 + eslint-plugin-react-web-api@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): + dependencies: + '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/core': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/shared': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/tools': 1.14.1 + '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/var': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.5.0 + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + birecord: 0.1.1 + eslint: 9.10.0(jiti@1.21.6) + ts-pattern: 5.3.1 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - eslint-plugin-react@7.34.1(eslint@8.57.0): - dependencies: - array-includes: 3.1.8 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 - array.prototype.toreversed: 1.1.2 - array.prototype.tosorted: 1.1.3 - doctrine: 2.1.0 - es-iterator-helpers: 1.0.18 - eslint: 8.57.0 - estraverse: 5.3.0 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.8 - object.fromentries: 2.0.8 - object.hasown: 1.1.4 - object.values: 1.2.0 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.11 - - eslint-plugin-require-extensions@0.1.3(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - - eslint-plugin-testing-library@5.11.1(eslint@8.57.0)(typescript@5.5.3): - dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.3) - eslint: 8.57.0 + eslint-plugin-react-x@1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): + dependencies: + '@eslint-react/ast': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/core': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/jsx': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/shared': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/tools': 1.14.1 + '@eslint-react/types': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@eslint-react/var': 1.14.1(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.5.0 + '@typescript-eslint/type-utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/types': 8.5.0 + '@typescript-eslint/utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + eslint: 9.10.0(jiti@1.21.6) + is-immutable-type: 5.0.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + ts-pattern: 5.3.1 + optionalDependencies: + typescript: 5.6.2 transitivePeerDependencies: - supports-color - - typescript eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@7.2.2: + eslint-scope@8.0.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-visitor-keys@2.1.0: {} - eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.0.0: {} - eslint@8.57.0: + eslint@9.10.0(jiti@1.21.6): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6)) '@eslint-community/regexpp': 4.11.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 + '@eslint/config-array': 0.18.0 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.10.0 + '@eslint/plugin-kit': 0.1.0 '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.5 - doctrine: 3.0.0 + debug: 4.3.6 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.0.2 + eslint-visitor-keys: 4.0.0 + espree: 10.1.0 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.3 strip-ansi: 6.0.1 text-table: 0.2.0 + optionalDependencies: + jiti: 1.21.6 transitivePeerDependencies: - supports-color @@ -15490,12 +13960,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 4.0.0 - espree@9.6.1: - dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 3.4.3 - esprima@4.0.1: {} esquery@1.5.0: @@ -15536,18 +14000,6 @@ snapshots: signal-exit: 3.0.7 strip-eof: 1.0.0 - execa@5.1.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - execa@8.0.1: dependencies: cross-spawn: 7.0.3 @@ -15564,34 +14016,34 @@ snapshots: dependencies: homedir-polyfill: 1.0.3 - express@4.19.2: + express@4.21.0: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.2 + body-parser: 1.20.3 content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.6.0 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0 + finalhandler: 1.3.1 fresh: 0.5.2 http-errors: 2.0.0 - merge-descriptors: 1.0.1 + merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.7 + path-to-regexp: 0.1.10 proxy-addr: 2.0.7 - qs: 6.11.0 + qs: 6.13.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 + send: 0.19.0 + serve-static: 1.16.2 setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -15602,9 +14054,11 @@ snapshots: extend@3.0.2: {} - fast-decode-uri-component@1.0.1: {} - - fast-deep-equal@2.0.1: {} + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 fast-deep-equal@3.1.3: {} @@ -15622,10 +14076,6 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-querystring@1.1.2: - dependencies: - fast-decode-uri-component: 1.0.1 - fastest-levenshtein@1.0.16: {} fastq@1.17.1: @@ -15636,20 +14086,20 @@ snapshots: dependencies: websocket-driver: 0.7.4 - fecha@4.2.3: {} - fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.2.1 + fflate@0.8.2: {} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 - file-entry-cache@6.0.1: + file-entry-cache@8.0.0: dependencies: - flat-cache: 3.2.0 + flat-cache: 4.0.1 file-uri-to-path@1.0.0: {} @@ -15657,10 +14107,10 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@1.2.0: + finalhandler@1.3.1: dependencies: debug: 2.6.9 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 @@ -15696,18 +14146,15 @@ snapshots: flagged-respawn@2.0.0: {} - flat-cache@3.2.0: + flat-cache@4.0.1: dependencies: flatted: 3.3.1 keyv: 4.5.4 - rimraf: 3.0.2 flat@5.0.2: {} flatted@3.3.1: {} - fn.name@1.1.0: {} - follow-redirects@1.15.6: {} for-each@0.3.3: @@ -15739,9 +14186,9 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@11.3.21(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + framer-motion@11.5.4(@emotion/is-prop-valid@0.8.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - tslib: 2.6.2 + tslib: 2.7.0 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 react: 18.3.1 @@ -15781,15 +14228,6 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - - functions-have-names@1.2.3: {} - gauge@3.0.2: dependencies: aproba: 2.0.0 @@ -15824,16 +14262,8 @@ snapshots: get-stream@3.0.0: {} - get-stream@6.0.1: {} - get-stream@8.0.1: {} - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - get-tsconfig@4.7.5: dependencies: resolve-pkg-maps: 1.0.0 @@ -15901,25 +14331,17 @@ snapshots: globals@11.12.0: {} - globals@13.24.0: - dependencies: - type-fest: 0.20.2 + globals@14.0.0: {} globals@15.9.0: {} - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.0.1 - - globby@11.1.0: + globby@13.2.2: dependencies: - array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 ignore: 5.3.1 merge2: 1.4.1 - slash: 3.0.0 + slash: 4.0.0 globby@14.0.1: dependencies: @@ -15940,8 +14362,6 @@ snapshots: dependencies: get-intrinsic: 1.2.4 - graceful-fs@4.2.10: {} - graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -15969,8 +14389,6 @@ snapshots: handle-thing@2.0.1: {} - has-bigints@1.0.2: {} - has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -15997,6 +14415,8 @@ snapshots: headers-polyfill@4.0.3: {} + highlight.js@10.7.3: {} + homedir-polyfill@1.0.3: dependencies: parse-passwd: 1.0.0 @@ -16026,12 +14446,7 @@ snapshots: relateurl: 0.2.7 terser: 5.31.1 - html-rspack-plugin@5.5.7: - dependencies: - lodash: 4.17.21 - tapable: 2.2.1 - - html-webpack-plugin@5.6.0(@rspack/core@0.7.5(@swc/helpers@0.5.11))(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4)): + html-webpack-plugin@5.6.0(@rspack/core@1.0.5(@swc/helpers@0.5.13))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -16039,8 +14454,8 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - '@rspack/core': 0.7.5(@swc/helpers@0.5.11) - webpack: 5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4) + '@rspack/core': 1.0.5(@swc/helpers@0.5.13) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4) htmlparser2@6.1.0: dependencies: @@ -16071,7 +14486,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.1 - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color @@ -16097,31 +14512,22 @@ snapshots: http-shutdown@1.2.2: {} - https-proxy-agent@5.0.0: - dependencies: - agent-base: 6.0.2 - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.5: dependencies: agent-base: 7.1.1 - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color httpxy@0.1.5: {} - human-signals@2.1.0: {} - human-signals@5.0.0: {} hyperdyperid@1.2.0: {} @@ -16173,12 +14579,6 @@ snapshots: ini@1.3.8: {} - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 - interpret@3.1.1: {} invariant@2.2.4: @@ -16189,7 +14589,7 @@ snapshots: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.3.5 + debug: 4.3.6 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -16215,32 +14615,10 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - - is-arrayish@0.2.1: {} - - is-arrayish@0.3.2: {} - - is-async-function@2.0.0: - dependencies: - has-tostringtag: 1.0.2 - - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 @@ -16251,24 +14629,12 @@ snapshots: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.2 - is-docker@2.2.1: {} is-docker@3.0.0: {} is-extglob@2.1.1: {} - is-finalizationregistry@1.0.2: - dependencies: - call-bind: 1.0.7 - is-fullwidth-code-point@3.0.0: {} is-generator-function@1.0.10: @@ -16284,13 +14650,13 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-immutable-type@4.0.0(eslint@8.57.0)(typescript@5.5.3): + is-immutable-type@5.0.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): dependencies: - '@typescript-eslint/type-utils': 7.17.0(eslint@8.57.0)(typescript@5.5.3) - eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.5.3) - ts-declaration-location: 1.0.2(typescript@5.5.3) - typescript: 5.5.3 + '@typescript-eslint/type-utils': 8.5.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + eslint: 9.10.0(jiti@1.21.6) + ts-api-utils: 1.3.0(typescript@5.6.2) + ts-declaration-location: 1.0.4(typescript@5.6.2) + typescript: 5.6.2 transitivePeerDependencies: - supports-color @@ -16300,8 +14666,6 @@ snapshots: is-interactive@1.0.0: {} - is-map@2.0.3: {} - is-module@1.0.0: {} is-nan@1.3.2: @@ -16309,16 +14673,10 @@ snapshots: call-bind: 1.0.7 define-properties: 1.2.1 - is-negative-zero@2.0.3: {} - is-network-error@1.1.0: {} is-node-process@1.2.0: {} - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-number@7.0.0: {} is-obj@2.0.0: {} @@ -16341,35 +14699,16 @@ snapshots: dependencies: '@types/estree': 1.0.5 - is-regex@1.1.4: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - is-relative@1.0.0: dependencies: is-unc-path: 1.0.0 - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.7 - is-stream@1.1.0: {} is-stream@2.0.1: {} is-stream@3.0.0: {} - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - is-text-path@2.0.0: dependencies: text-extensions: 2.4.0 @@ -16382,21 +14721,8 @@ snapshots: dependencies: unc-path-regex: 0.1.2 - is-unicode-supported@0.1.0: {} - - is-uuid@1.0.2: {} - - is-weakmap@2.0.2: {} - - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.7 - - is-weakset@2.0.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - + is-unicode-supported@0.1.0: {} + is-what@4.1.8: {} is-windows@1.0.2: {} @@ -16415,9 +14741,7 @@ snapshots: isarray@1.0.0: {} - isarray@2.0.5: {} - - isbot@5.1.14: {} + isbot@5.1.17: {} isexe@2.0.0: {} @@ -16425,14 +14749,6 @@ snapshots: isobject@3.0.1: {} - iterator.prototype@1.1.2: - dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.6 - set-function-name: 2.0.2 - jackspeak@3.4.0: dependencies: '@isaacs/cliui': 8.0.2 @@ -16450,11 +14766,11 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.14.9 + '@types/node': 22.5.4 merge-stream: 2.0.0 supports-color: 8.1.1 - jiti@1.21.0: {} + jiti@1.21.6: {} jju@1.4.0: {} @@ -16473,7 +14789,7 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@24.1.1: + jsdom@25.0.0: dependencies: cssstyle: 4.0.1 data-urls: 5.0.0 @@ -16501,8 +14817,6 @@ snapshots: - supports-color - utf-8-validate - jsesc@0.5.0: {} - jsesc@2.5.2: {} jsesc@3.0.2: {} @@ -16511,22 +14825,14 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-parse-even-better-errors@3.0.2: {} - json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} json-stable-stringify-without-jsonify@1.0.1: {} - json5@1.0.2: - dependencies: - minimist: 1.2.8 - json5@2.2.3: {} - jsonata@1.8.7: {} - jsonc-parser@3.2.0: {} jsonfile@4.0.0: @@ -16541,13 +14847,6 @@ snapshots: jsonparse@1.3.1: {} - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.8 - array.prototype.flat: 1.3.2 - object.assign: 4.1.5 - object.values: 1.2.0 - jwt-decode@3.1.2: {} keyv@4.5.4: @@ -16562,41 +14861,17 @@ snapshots: kolorist@1.8.0: {} - kuler@2.0.0: {} - - ky@1.5.0: {} - - language-subtag-registry@0.3.22: {} - - language-tags@1.0.9: - dependencies: - language-subtag-registry: 0.3.22 + ky@1.7.2: {} launch-editor@2.8.0: dependencies: - picocolors: 1.0.1 + picocolors: 1.1.0 shell-quote: 1.8.1 - launchdarkly-eventsource@2.0.3: {} - - launchdarkly-js-sdk-common@5.2.0: - dependencies: - base64-js: 1.5.1 - fast-deep-equal: 2.0.1 - uuid: 8.3.2 - - launchdarkly-node-client-sdk@3.2.1: - dependencies: - launchdarkly-eventsource: 2.0.3 - launchdarkly-js-sdk-common: 5.2.0 - node-localstorage: 1.3.1 - lazystream@1.0.1: dependencies: readable-stream: 2.3.8 - levdist@1.0.0: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -16614,15 +14889,11 @@ snapshots: lilconfig@2.1.0: {} - lilconfig@3.1.1: {} - - line-diff@2.1.1: - dependencies: - levdist: 1.0.0 + lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} - lines-and-columns@2.0.4: {} + lines-and-columns@2.0.3: {} linkify-it@5.0.0: dependencies: @@ -16640,8 +14911,8 @@ snapshots: get-port-please: 3.1.2 h3: 1.11.1 http-shutdown: 1.2.2 - jiti: 1.21.0 - mlly: 1.7.0 + jiti: 1.21.6 + mlly: 1.7.1 node-forge: 1.3.1 pathe: 1.1.2 std-env: 3.7.0 @@ -16655,8 +14926,8 @@ snapshots: local-pkg@0.5.0: dependencies: - mlly: 1.7.0 - pkg-types: 1.1.1 + mlly: 1.7.1 + pkg-types: 1.2.0 locate-path@5.0.0: dependencies: @@ -16666,18 +14937,16 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.debounce@4.0.8: {} - lodash.defaults@4.2.0: {} - lodash.get@4.4.2: {} - lodash.isarguments@3.1.0: {} - lodash.isequal@4.5.0: {} + lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} + lodash.uniq@4.5.0: {} + lodash@4.17.21: {} log-symbols@4.1.0: @@ -16685,17 +14954,6 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - logform@2.6.1: - dependencies: - '@colors/colors': 1.6.0 - '@types/triple-beam': 1.3.5 - fecha: 4.2.3 - ms: 2.1.3 - safe-stable-stringify: 2.4.3 - triple-beam: 1.4.1 - - long@5.2.3: {} - loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -16706,9 +14964,9 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.6.2 + tslib: 2.7.0 - lru-cache@10.2.2: {} + lru-cache@10.4.3: {} lru-cache@4.1.5: dependencies: @@ -16727,18 +14985,14 @@ snapshots: lz-string@1.5.0: {} - magic-string@0.30.10: - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - magic-string@0.30.11: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 magicast@0.2.11: dependencies: - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 recast: 0.23.4 make-dir@3.1.0: @@ -16758,20 +15012,36 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 + marked-terminal@7.1.0(marked@9.1.6): + dependencies: + ansi-escapes: 7.0.0 + chalk: 5.3.0 + cli-highlight: 2.1.11 + cli-table3: 0.6.5 + marked: 9.1.6 + node-emoji: 2.1.3 + supports-hyperlinks: 3.1.0 + + marked@9.1.6: {} + + mdn-data@2.0.28: {} + + mdn-data@2.0.30: {} + mdurl@2.0.0: {} media-typer@0.3.0: {} memfs@4.9.3: dependencies: - '@jsonjoy.com/json-pack': 1.0.4(tslib@2.6.2) - '@jsonjoy.com/util': 1.2.0(tslib@2.6.2) - tree-dump: 1.0.2(tslib@2.6.2) - tslib: 2.6.2 + '@jsonjoy.com/json-pack': 1.0.4(tslib@2.7.0) + '@jsonjoy.com/util': 1.2.0(tslib@2.7.0) + tree-dump: 1.0.2(tslib@2.7.0) + tslib: 2.7.0 meow@12.1.1: {} - merge-descriptors@1.0.1: {} + merge-descriptors@1.0.3: {} merge-stream@2.0.0: {} @@ -16804,6 +15074,10 @@ snapshots: minimalistic-assert@1.0.1: {} + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@3.0.8: dependencies: brace-expansion: 1.1.11 @@ -16839,38 +15113,49 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 - mixpanel@0.18.0: - dependencies: - https-proxy-agent: 5.0.0 - transitivePeerDependencies: - - supports-color - mkdirp@1.0.4: {} - mlly@1.7.0: + mkdist@1.5.7(typescript@5.6.2)(vue-tsc@2.0.29(typescript@5.6.2)): + dependencies: + autoprefixer: 10.4.20(postcss@8.4.47) + citty: 0.1.6 + cssnano: 7.0.6(postcss@8.4.47) + defu: 6.1.4 + esbuild: 0.23.1 + fast-glob: 3.3.2 + jiti: 1.21.6 + mlly: 1.7.1 + pathe: 1.1.2 + pkg-types: 1.2.0 + postcss: 8.4.47 + postcss-nested: 6.2.0(postcss@8.4.47) + semver: 7.6.3 + optionalDependencies: + typescript: 5.6.2 + vue-tsc: 2.0.29(typescript@5.6.2) + + mlly@1.7.1: dependencies: acorn: 8.12.1 pathe: 1.1.2 - pkg-types: 1.1.1 + pkg-types: 1.2.0 ufo: 1.5.3 mri@1.2.0: {} - mrmime@1.0.1: {} - ms@2.0.0: {} ms@2.1.2: {} ms@2.1.3: {} - msw@2.3.5(typescript@5.5.3): + msw@2.4.7(typescript@5.6.2): dependencies: '@bundled-es-modules/cookie': 2.0.0 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 3.1.10 - '@mswjs/interceptors': 0.29.1 + '@inquirer/confirm': 3.2.0 + '@mswjs/interceptors': 0.35.6 '@open-draft/until': 2.1.0 '@types/cookie': 0.6.0 '@types/statuses': 2.0.5 @@ -16878,15 +15163,13 @@ snapshots: graphql: 16.9.0 headers-polyfill: 4.0.3 is-node-process: 1.2.0 - outvariant: 1.4.2 + outvariant: 1.4.3 path-to-regexp: 6.2.2 strict-event-emitter: 0.5.1 type-fest: 4.23.0 yargs: 17.7.2 optionalDependencies: - typescript: 5.5.3 - - muggle-string@0.3.1: {} + typescript: 5.6.2 muggle-string@0.4.1: {} @@ -16905,8 +15188,6 @@ snapshots: nanoid@3.3.7: {} - natural-compare-lite@1.4.0: {} - natural-compare@1.4.0: {} negotiator@0.6.3: {} @@ -16917,14 +15198,14 @@ snapshots: dependencies: '@cloudflare/kv-asset-handler': 0.3.2 '@netlify/functions': 2.6.3(@opentelemetry/api@1.8.0) - '@rollup/plugin-alias': 5.1.0(rollup@4.18.0) - '@rollup/plugin-commonjs': 25.0.7(rollup@4.18.0) - '@rollup/plugin-inject': 5.0.5(rollup@4.18.0) - '@rollup/plugin-json': 6.1.0(rollup@4.18.0) - '@rollup/plugin-node-resolve': 15.2.3(rollup@4.18.0) - '@rollup/plugin-replace': 5.0.7(rollup@4.18.0) - '@rollup/plugin-terser': 0.4.4(rollup@4.18.0) - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/plugin-alias': 5.1.0(rollup@4.21.2) + '@rollup/plugin-commonjs': 25.0.7(rollup@4.21.2) + '@rollup/plugin-inject': 5.0.5(rollup@4.21.2) + '@rollup/plugin-json': 6.1.0(rollup@4.21.2) + '@rollup/plugin-node-resolve': 15.2.3(rollup@4.21.2) + '@rollup/plugin-replace': 5.0.7(rollup@4.21.2) + '@rollup/plugin-terser': 0.4.4(rollup@4.21.2) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) '@types/http-proxy': 1.17.14 '@vercel/nft': 0.26.5 archiver: 7.0.1 @@ -16951,13 +15232,13 @@ snapshots: httpxy: 0.1.5 ioredis: 5.4.1 is-primitive: 3.0.1 - jiti: 1.21.0 + jiti: 1.21.6 klona: 2.0.6 knitwork: 1.1.0 listhen: 1.7.2 - magic-string: 0.30.10 + magic-string: 0.30.11 mime: 4.0.3 - mlly: 1.7.0 + mlly: 1.7.1 mri: 1.2.0 node-fetch-native: 1.6.4 ofetch: 1.3.4 @@ -16965,21 +15246,21 @@ snapshots: openapi-typescript: 6.7.5 pathe: 1.1.2 perfect-debounce: 1.0.0 - pkg-types: 1.1.1 + pkg-types: 1.2.0 pretty-bytes: 6.1.1 radix3: 1.1.2 - rollup: 4.18.0 - rollup-plugin-visualizer: 5.12.0(rollup@4.18.0) + rollup: 4.21.2 + rollup-plugin-visualizer: 5.12.0(rollup@4.21.2) scule: 1.3.0 semver: 7.6.3 serve-placeholder: 2.0.1 - serve-static: 1.15.0 + serve-static: 1.16.2 std-env: 3.7.0 ufo: 1.5.3 uncrypto: 0.1.3 unctx: 2.3.1 unenv: 1.9.0 - unimport: 3.7.1(rollup@4.18.0) + unimport: 3.7.1(rollup@4.21.2) unstorage: 1.10.2(ioredis@5.4.1) unwasm: 0.3.9 transitivePeerDependencies: @@ -17006,12 +15287,19 @@ snapshots: no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.6.2 + tslib: 2.7.0 node-addon-api@7.1.0: {} node-domexception@1.0.0: {} + node-emoji@2.1.3: + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + node-fetch-native@1.6.4: {} node-fetch@2.7.0: @@ -17028,10 +15316,6 @@ snapshots: node-gyp-build@4.8.1: {} - node-localstorage@1.3.1: - dependencies: - write-file-atomic: 1.3.4 - node-machine-id@1.1.12: {} node-releases@2.0.18: {} @@ -17082,14 +15366,14 @@ snapshots: nwsapi@2.2.12: {} - nx@19.5.6(@swc/core@1.7.6(@swc/helpers@0.5.11)): + nx@19.7.3(@swc/core@1.7.26): dependencies: '@napi-rs/wasm-runtime': 0.2.4 - '@nrwl/tao': 19.5.6(@swc/core@1.7.6(@swc/helpers@0.5.11)) + '@nrwl/tao': 19.7.3(@swc/core@1.7.26) '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.46 '@zkochan/js-yaml': 0.0.7 - axios: 1.7.2 + axios: 1.7.7 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 @@ -17104,7 +15388,7 @@ snapshots: ignore: 5.3.1 jest-diff: 29.7.0 jsonc-parser: 3.2.0 - lines-and-columns: 2.0.4 + lines-and-columns: 2.0.3 minimatch: 9.0.3 node-machine-id: 1.1.12 npm-run-path: 4.0.1 @@ -17116,21 +15400,21 @@ snapshots: tar-stream: 2.2.0 tmp: 0.2.3 tsconfig-paths: 4.2.0 - tslib: 2.6.2 + tslib: 2.7.0 yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 19.5.6 - '@nx/nx-darwin-x64': 19.5.6 - '@nx/nx-freebsd-x64': 19.5.6 - '@nx/nx-linux-arm-gnueabihf': 19.5.6 - '@nx/nx-linux-arm64-gnu': 19.5.6 - '@nx/nx-linux-arm64-musl': 19.5.6 - '@nx/nx-linux-x64-gnu': 19.5.6 - '@nx/nx-linux-x64-musl': 19.5.6 - '@nx/nx-win32-arm64-msvc': 19.5.6 - '@nx/nx-win32-x64-msvc': 19.5.6 - '@swc/core': 1.7.6(@swc/helpers@0.5.11) + '@nx/nx-darwin-arm64': 19.7.3 + '@nx/nx-darwin-x64': 19.7.3 + '@nx/nx-freebsd-x64': 19.7.3 + '@nx/nx-linux-arm-gnueabihf': 19.7.3 + '@nx/nx-linux-arm64-gnu': 19.7.3 + '@nx/nx-linux-arm64-musl': 19.7.3 + '@nx/nx-linux-x64-gnu': 19.7.3 + '@nx/nx-linux-x64-musl': 19.7.3 + '@nx/nx-win32-arm64-msvc': 19.7.3 + '@nx/nx-win32-x64-msvc': 19.7.3 + '@swc/core': 1.7.26(@swc/helpers@0.5.13) transitivePeerDependencies: - debug @@ -17168,41 +15452,10 @@ snapshots: for-own: 1.0.0 isobject: 3.0.1 - object.entries@1.1.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - - object.hasown@1.1.4: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - object.pick@1.3.0: dependencies: isobject: 3.0.1 - object.values@1.2.0: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - obuf@1.1.2: {} ofetch@1.3.4: @@ -17223,10 +15476,6 @@ snapshots: dependencies: wrappy: 1.0.2 - one-time@1.0.0: - dependencies: - fn.name: 1.1.0 - onetime@5.1.2: dependencies: mimic-fn: 2.1.0 @@ -17277,7 +15526,9 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 - outvariant@1.4.2: {} + os-tmpdir@1.0.2: {} + + outvariant@1.4.3: {} p-finally@1.0.0: {} @@ -17291,7 +15542,7 @@ snapshots: p-limit@5.0.0: dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.1.1 p-locate@4.1.0: dependencies: @@ -17301,10 +15552,6 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 - p-retry@6.2.0: dependencies: '@types/retry': 0.12.2 @@ -17318,7 +15565,7 @@ snapshots: param-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.7.0 parent-module@1.0.1: dependencies: @@ -17330,14 +15577,15 @@ snapshots: map-cache: 0.2.2 path-root: 0.1.1 - parse-json@5.2.0: + parse-passwd@1.0.0: {} + + parse5-htmlparser2-tree-adapter@6.0.1: dependencies: - '@babel/code-frame': 7.24.7 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 + parse5: 6.0.1 - parse-passwd@1.0.0: {} + parse5@5.1.1: {} + + parse5@6.0.1: {} parse5@7.1.2: dependencies: @@ -17348,7 +15596,7 @@ snapshots: pascal-case@3.1.2: dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.7.0 path-browserify@1.0.1: {} @@ -17372,10 +15620,10 @@ snapshots: path-scurry@1.11.1: dependencies: - lru-cache: 10.2.2 + lru-cache: 10.4.3 minipass: 7.1.2 - path-to-regexp@0.1.7: {} + path-to-regexp@0.1.10: {} path-to-regexp@6.2.2: {} @@ -17389,7 +15637,7 @@ snapshots: perfect-debounce@1.0.0: {} - picocolors@1.0.1: {} + picocolors@1.1.0: {} picomatch@2.3.1: {} @@ -17403,64 +15651,207 @@ snapshots: dependencies: find-up: 4.1.0 - pkg-types@1.1.1: + pkg-types@1.2.0: dependencies: confbox: 0.1.7 - mlly: 1.7.0 + mlly: 1.7.1 pathe: 1.1.2 - playwright-core@1.45.3: {} + playwright-core@1.47.1: {} - playwright@1.45.3: + playwright@1.47.1: dependencies: - playwright-core: 1.45.3 + playwright-core: 1.47.1 optionalDependencies: fsevents: 2.3.2 possible-typed-array-names@1.0.0: {} - postcss-import@15.1.0(postcss@8.4.40): + postcss-calc@10.0.2(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + + postcss-colormin@7.0.2(postcss@8.4.47): + dependencies: + browserslist: 4.23.3 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-convert-values@7.0.4(postcss@8.4.47): + dependencies: + browserslist: 4.23.3 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-discard-comments@7.0.3(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + + postcss-discard-duplicates@7.0.1(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + postcss-discard-empty@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + postcss-discard-overridden@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + postcss-import@15.1.0(postcss@8.4.47): dependencies: - postcss: 8.4.40 + postcss: 8.4.47 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.40): + postcss-js@4.0.1(postcss@8.4.47): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.40 + postcss: 8.4.47 - postcss-load-config@4.0.2(postcss@8.4.40): + postcss-load-config@4.0.2(postcss@8.4.47): dependencies: - lilconfig: 3.1.1 + lilconfig: 3.1.2 yaml: 2.4.5 optionalDependencies: - postcss: 8.4.40 + postcss: 8.4.47 + + postcss-merge-longhand@7.0.4(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + stylehacks: 7.0.4(postcss@8.4.47) + + postcss-merge-rules@7.0.4(postcss@8.4.47): + dependencies: + browserslist: 4.23.3 + caniuse-api: 3.0.0 + cssnano-utils: 5.0.0(postcss@8.4.47) + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + + postcss-minify-font-values@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 - postcss-nested@6.0.1(postcss@8.4.40): + postcss-minify-gradients@7.0.0(postcss@8.4.47): dependencies: - postcss: 8.4.40 - postcss-selector-parser: 6.0.16 + colord: 2.9.3 + cssnano-utils: 5.0.0(postcss@8.4.47) + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-minify-params@7.0.2(postcss@8.4.47): + dependencies: + browserslist: 4.23.3 + cssnano-utils: 5.0.0(postcss@8.4.47) + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-minify-selectors@7.0.4(postcss@8.4.47): + dependencies: + cssesc: 3.0.0 + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + + postcss-nested@6.2.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + + postcss-normalize-charset@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + postcss-normalize-display-values@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@7.0.2(postcss@8.4.47): + dependencies: + browserslist: 4.23.3 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-ordered-values@7.0.1(postcss@8.4.47): + dependencies: + cssnano-utils: 5.0.0(postcss@8.4.47) + postcss: 8.4.47 + postcss-value-parser: 4.2.0 - postcss-selector-parser@6.0.16: + postcss-reduce-initial@7.0.2(postcss@8.4.47): + dependencies: + browserslist: 4.23.3 + caniuse-api: 3.0.0 + postcss: 8.4.47 + + postcss-reduce-transforms@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-value-parser@4.2.0: {} + postcss-svgo@7.0.1(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + svgo: 3.3.2 - postcss@8.4.31: + postcss-unique-selectors@7.0.3(postcss@8.4.47): dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + + postcss-value-parser@4.2.0: {} - postcss@8.4.40: + postcss@8.4.47: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.0 + source-map-js: 1.2.1 prelude-ls@1.2.1: {} @@ -17487,35 +15878,16 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.2.0 - prisma@5.18.0: + prisma@5.19.1: dependencies: - '@prisma/engines': 5.18.0 + '@prisma/engines': 5.19.1 + optionalDependencies: + fsevents: 2.3.3 process-nextick-args@2.0.1: {} process@0.11.10: {} - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - - protobufjs@7.3.2: - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 20.14.9 - long: 5.2.3 - proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -17527,17 +15899,17 @@ snapshots: psl@1.9.0: {} - publint@0.2.9: + publint@0.2.10: dependencies: npm-packlist: 5.1.3 - picocolors: 1.0.1 + picocolors: 1.1.0 sade: 1.8.1 punycode.js@2.3.1: {} punycode@2.3.1: {} - qs@6.11.0: + qs@6.13.0: dependencies: side-channel: 1.0.6 @@ -17582,34 +15954,30 @@ snapshots: transitivePeerDependencies: - csstype - react-is@16.13.1: {} - react-is@17.0.2: {} react-is@18.2.0: {} - react-refresh@0.14.0: {} - react-refresh@0.14.2: {} - react-remove-scroll-bar@2.3.4(@types/react@18.3.3)(react@18.3.1): + react-remove-scroll-bar@2.3.4(@types/react@18.3.5)(react@18.3.1): dependencies: react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) - tslib: 2.6.2 + react-style-singleton: 2.2.1(@types/react@18.3.5)(react@18.3.1) + tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 - react-remove-scroll@2.5.7(@types/react@18.3.3)(react@18.3.1): + react-remove-scroll@2.5.7(@types/react@18.3.5)(react@18.3.1): dependencies: react: 18.3.1 - react-remove-scroll-bar: 2.3.4(@types/react@18.3.3)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) - tslib: 2.6.2 - use-callback-ref: 1.3.0(@types/react@18.3.3)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1) + react-remove-scroll-bar: 2.3.4(@types/react@18.3.5)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.5)(react@18.3.1) + tslib: 2.7.0 + use-callback-ref: 1.3.0(@types/react@18.3.5)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.5)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 react-router-dom@6.26.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -17623,14 +15991,14 @@ snapshots: '@remix-run/router': 1.19.0 react: 18.3.1 - react-style-singleton@2.2.1(@types/react@18.3.3)(react@18.3.1): + react-style-singleton@2.2.1(@types/react@18.3.5)(react@18.3.1): dependencies: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.3.1 - tslib: 2.6.2 + tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 react@18.3.1: dependencies: @@ -17678,7 +16046,7 @@ snapshots: ast-types: 0.16.1 esprima: 4.0.1 source-map: 0.6.1 - tslib: 2.6.2 + tslib: 2.7.0 rechoir@0.8.0: dependencies: @@ -17697,63 +16065,19 @@ snapshots: dependencies: redis-errors: 1.2.0 - reflect.getprototypeof@1.0.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - which-builtin-type: 1.1.3 - - regenerate-unicode-properties@10.1.1: - dependencies: - regenerate: 1.4.2 - - regenerate@1.4.2: {} - regenerator-runtime@0.14.0: {} - regenerator-transform@0.15.2: - dependencies: - '@babel/runtime': 7.23.5 - - regexp.prototype.flags@1.5.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - - regexpu-core@5.3.2: - dependencies: - '@babel/regjsgen': 0.8.0 - regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.1 - regjsparser: 0.9.1 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 - - regjsparser@0.9.1: - dependencies: - jsesc: 0.5.0 - relateurl@0.2.7: {} - remeda@2.7.0: - dependencies: - type-fest: 4.23.0 - - remix-auth-form@1.5.0(@remix-run/server-runtime@2.11.1(typescript@5.5.3))(remix-auth@3.7.0(@remix-run/react@2.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(@remix-run/server-runtime@2.11.1(typescript@5.5.3))): + remix-auth-form@1.5.0(@remix-run/server-runtime@2.11.2(typescript@5.6.2))(remix-auth@3.7.0(@remix-run/react@2.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@remix-run/server-runtime@2.11.2(typescript@5.6.2))): dependencies: - '@remix-run/server-runtime': 2.11.1(typescript@5.5.3) - remix-auth: 3.7.0(@remix-run/react@2.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(@remix-run/server-runtime@2.11.1(typescript@5.5.3)) + '@remix-run/server-runtime': 2.11.2(typescript@5.6.2) + remix-auth: 3.7.0(@remix-run/react@2.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@remix-run/server-runtime@2.11.2(typescript@5.6.2)) - remix-auth@3.7.0(@remix-run/react@2.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(@remix-run/server-runtime@2.11.1(typescript@5.5.3)): + remix-auth@3.7.0(@remix-run/react@2.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2))(@remix-run/server-runtime@2.11.2(typescript@5.6.2)): dependencies: - '@remix-run/react': 2.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3) - '@remix-run/server-runtime': 2.11.1(typescript@5.5.3) + '@remix-run/react': 2.11.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) + '@remix-run/server-runtime': 2.11.2(typescript@5.6.2) uuid: 8.3.2 renderkid@3.0.0: @@ -17785,23 +16109,12 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.19.0: - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.5: - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - restore-cursor@3.1.0: dependencies: onetime: 5.1.2 @@ -17819,41 +16132,53 @@ snapshots: dependencies: glob: 10.4.5 - rollup-plugin-preserve-directives@0.4.0(rollup@4.18.0): + rollup-plugin-dts@6.1.1(rollup@3.29.4)(typescript@5.6.2): + dependencies: + magic-string: 0.30.11 + rollup: 3.29.4 + typescript: 5.6.2 + optionalDependencies: + '@babel/code-frame': 7.24.7 + + rollup-plugin-preserve-directives@0.4.0(rollup@4.21.2): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - magic-string: 0.30.10 - rollup: 4.18.0 + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) + magic-string: 0.30.11 + rollup: 4.21.2 - rollup-plugin-visualizer@5.12.0(rollup@4.18.0): + rollup-plugin-visualizer@5.12.0(rollup@4.21.2): dependencies: open: 8.4.2 picomatch: 2.3.1 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: - rollup: 4.18.0 + rollup: 4.21.2 + + rollup@3.29.4: + optionalDependencies: + fsevents: 2.3.3 - rollup@4.18.0: + rollup@4.21.2: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.18.0 - '@rollup/rollup-android-arm64': 4.18.0 - '@rollup/rollup-darwin-arm64': 4.18.0 - '@rollup/rollup-darwin-x64': 4.18.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 - '@rollup/rollup-linux-arm-musleabihf': 4.18.0 - '@rollup/rollup-linux-arm64-gnu': 4.18.0 - '@rollup/rollup-linux-arm64-musl': 4.18.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 - '@rollup/rollup-linux-riscv64-gnu': 4.18.0 - '@rollup/rollup-linux-s390x-gnu': 4.18.0 - '@rollup/rollup-linux-x64-gnu': 4.18.0 - '@rollup/rollup-linux-x64-musl': 4.18.0 - '@rollup/rollup-win32-arm64-msvc': 4.18.0 - '@rollup/rollup-win32-ia32-msvc': 4.18.0 - '@rollup/rollup-win32-x64-msvc': 4.18.0 + '@rollup/rollup-android-arm-eabi': 4.21.2 + '@rollup/rollup-android-arm64': 4.21.2 + '@rollup/rollup-darwin-arm64': 4.21.2 + '@rollup/rollup-darwin-x64': 4.21.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.2 + '@rollup/rollup-linux-arm-musleabihf': 4.21.2 + '@rollup/rollup-linux-arm64-gnu': 4.21.2 + '@rollup/rollup-linux-arm64-musl': 4.21.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2 + '@rollup/rollup-linux-riscv64-gnu': 4.21.2 + '@rollup/rollup-linux-s390x-gnu': 4.21.2 + '@rollup/rollup-linux-x64-gnu': 4.21.2 + '@rollup/rollup-linux-x64-musl': 4.21.2 + '@rollup/rollup-win32-arm64-msvc': 4.21.2 + '@rollup/rollup-win32-ia32-msvc': 4.21.2 + '@rollup/rollup-win32-x64-msvc': 4.21.2 fsevents: 2.3.3 rrweb-cssom@0.6.0: {} @@ -17868,31 +16193,16 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.6.2 + tslib: 2.7.0 sade@1.8.1: dependencies: mri: 1.2.0 - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - - safe-stable-stringify@2.4.3: {} - safer-buffer@2.1.2: {} saxes@6.0.0: @@ -17912,9 +16222,9 @@ snapshots: schema-utils@4.2.0: dependencies: '@types/json-schema': 7.0.15 - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - ajv-keywords: 5.1.0(ajv@8.12.0) + ajv: 8.13.0 + ajv-formats: 2.1.1(ajv@8.13.0) + ajv-keywords: 5.1.0(ajv@8.13.0) scule@1.3.0: {} @@ -17933,7 +16243,7 @@ snapshots: semver@7.6.3: {} - send@0.18.0: + send@0.19.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -17971,12 +16281,12 @@ snapshots: dependencies: defu: 6.1.4 - serve-static@1.15.0: + serve-static@1.16.2: dependencies: - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 0.19.0 transitivePeerDependencies: - supports-color @@ -17993,19 +16303,10 @@ snapshots: gopd: 1.0.1 has-property-descriptors: 1.0.2 - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - setprototypeof@1.1.0: {} setprototypeof@1.2.0: {} - sha-1@1.0.0: {} - shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 @@ -18048,28 +16349,24 @@ snapshots: dependencies: '@kwsites/file-exists': 1.1.1 '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.5 + debug: 4.3.6 transitivePeerDependencies: - supports-color - simple-swizzle@0.2.2: + skin-tone@2.0.0: dependencies: - is-arrayish: 0.3.2 - - slash@3.0.0: {} + unicode-emoji-modifier-base: 1.0.0 slash@4.0.0: {} slash@5.1.0: {} - slide@1.1.6: {} - smob@1.4.1: {} snake-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.7.0 snakecase-keys@5.4.4: dependencies: @@ -18077,30 +16374,13 @@ snapshots: snake-case: 3.0.4 type-fest: 2.19.0 - snappy@7.2.2: - optionalDependencies: - '@napi-rs/snappy-android-arm-eabi': 7.2.2 - '@napi-rs/snappy-android-arm64': 7.2.2 - '@napi-rs/snappy-darwin-arm64': 7.2.2 - '@napi-rs/snappy-darwin-x64': 7.2.2 - '@napi-rs/snappy-freebsd-x64': 7.2.2 - '@napi-rs/snappy-linux-arm-gnueabihf': 7.2.2 - '@napi-rs/snappy-linux-arm64-gnu': 7.2.2 - '@napi-rs/snappy-linux-arm64-musl': 7.2.2 - '@napi-rs/snappy-linux-x64-gnu': 7.2.2 - '@napi-rs/snappy-linux-x64-musl': 7.2.2 - '@napi-rs/snappy-win32-arm64-msvc': 7.2.2 - '@napi-rs/snappy-win32-ia32-msvc': 7.2.2 - '@napi-rs/snappy-win32-x64-msvc': 7.2.2 - optional: true - sockjs@0.3.24: dependencies: faye-websocket: 0.11.4 uuid: 8.3.2 websocket-driver: 0.7.4 - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} source-map-support@0.5.21: dependencies: @@ -18115,7 +16395,7 @@ snapshots: spdy-transport@3.0.0: dependencies: - debug: 4.3.5 + debug: 4.3.6 detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -18126,7 +16406,7 @@ snapshots: spdy@4.0.2: dependencies: - debug: 4.3.5 + debug: 4.3.6 handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -18140,12 +16420,6 @@ snapshots: stable-hash@0.0.4: {} - stack-trace@0.0.10: {} - - stack-utils@2.0.6: - dependencies: - escape-string-regexp: 2.0.0 - stackback@0.0.2: {} stackframe@1.3.4: {} @@ -18158,8 +16432,6 @@ snapshots: std-env@3.7.0: {} - stream-slice@0.1.2: {} - streamx@2.16.1: dependencies: fast-fifo: 1.3.2 @@ -18171,8 +16443,6 @@ snapshots: string-argv@0.3.2: {} - string-natural-compare@3.0.1: {} - string-ts@2.2.0: {} string-width@4.2.3: @@ -18187,40 +16457,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.matchall@4.0.11: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.2 - set-function-name: 2.0.2 - side-channel: 1.0.6 - - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -18241,8 +16477,6 @@ snapshots: strip-eof@1.0.0: {} - strip-final-newline@2.0.0: {} - strip-final-newline@3.0.0: {} strip-indent@3.0.0: @@ -18265,6 +16499,12 @@ snapshots: minimist: 1.2.8 through: 2.3.8 + stylehacks@7.0.4(postcss@8.4.47): + dependencies: + browserslist: 4.23.3 + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -18279,8 +16519,6 @@ snapshots: dependencies: copy-anything: 3.0.2 - superstruct@1.0.4: {} - supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -18295,18 +16533,28 @@ snapshots: supports-color@9.4.0: {} - supports-hyperlinks@2.3.0: + supports-hyperlinks@3.1.0: dependencies: has-flag: 4.0.0 supports-color: 7.2.0 supports-preserve-symlinks-flag@1.0.0: {} - swc-loader@0.2.6(@swc/core@1.7.6(@swc/helpers@0.5.11))(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4)): + svgo@3.3.2: dependencies: - '@swc/core': 1.7.6(@swc/helpers@0.5.11) + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.1.0 + css-tree: 2.3.1 + css-what: 6.1.0 + csso: 5.0.5 + picocolors: 1.1.0 + + swc-loader@0.2.6(@swc/core@1.7.26(@swc/helpers@0.5.13))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4)): + dependencies: + '@swc/core': 1.7.26(@swc/helpers@0.5.13) '@swc/counter': 0.1.3 - webpack: 5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4) swr@2.2.5(react@18.3.1): dependencies: @@ -18318,9 +16566,9 @@ snapshots: system-architecture@0.1.0: {} - tailwind-merge@2.4.0: {} + tailwind-merge@2.5.2: {} - tailwindcss@3.4.7: + tailwindcss@3.4.11: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -18330,18 +16578,18 @@ snapshots: fast-glob: 3.3.2 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.21.0 + jiti: 1.21.6 lilconfig: 2.1.0 micromatch: 4.0.7 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.0.1 - postcss: 8.4.40 - postcss-import: 15.1.0(postcss@8.4.40) - postcss-js: 4.0.1(postcss@8.4.40) - postcss-load-config: 4.0.2(postcss@8.4.40) - postcss-nested: 6.0.1(postcss@8.4.40) - postcss-selector-parser: 6.0.16 + picocolors: 1.1.0 + postcss: 8.4.47 + postcss-import: 15.1.0(postcss@8.4.47) + postcss-js: 4.0.1(postcss@8.4.47) + postcss-load-config: 4.0.2(postcss@8.4.47) + postcss-nested: 6.2.0(postcss@8.4.47) + postcss-selector-parser: 6.1.2 resolve: 1.22.8 sucrase: 3.35.0 transitivePeerDependencies: @@ -18372,34 +16620,29 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - terminal-link@2.1.1: - dependencies: - ansi-escapes: 4.3.2 - supports-hyperlinks: 2.3.0 - - terser-webpack-plugin@5.3.10(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4)): + terser-webpack-plugin@5.3.10(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.31.1 - webpack: 5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4) optionalDependencies: - '@swc/core': 1.7.6(@swc/helpers@0.5.11) - esbuild: 0.21.5 + '@swc/core': 1.7.26(@swc/helpers@0.5.13) + esbuild: 0.23.1 - terser-webpack-plugin@5.3.10(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)): + terser-webpack-plugin@5.3.10(@swc/core@1.7.26)(esbuild@0.23.1)(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.1)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.31.1 - webpack: 5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5) + webpack: 5.94.0(@swc/core@1.7.26)(esbuild@0.23.1) optionalDependencies: - '@swc/core': 1.7.6(@swc/helpers@0.5.11) - esbuild: 0.21.5 + '@swc/core': 1.7.26(@swc/helpers@0.5.13) + esbuild: 0.23.1 terser@5.31.1: dependencies: @@ -18410,8 +16653,6 @@ snapshots: text-extensions@2.4.0: {} - text-hex@1.0.0: {} - text-table@0.2.0: {} thenify-all@1.6.0: @@ -18422,9 +16663,9 @@ snapshots: dependencies: any-promise: 1.3.0 - thingies@1.21.0(tslib@2.6.2): + thingies@1.21.0(tslib@2.7.0): dependencies: - tslib: 2.6.2 + tslib: 2.7.0 through@2.3.8: {} @@ -18440,6 +16681,10 @@ snapshots: tinyspy@2.2.1: {} + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + tmp@0.2.3: {} to-fast-properties@2.0.0: {} @@ -18463,37 +16708,28 @@ snapshots: dependencies: punycode: 2.3.1 - tree-dump@1.0.2(tslib@2.6.2): + tree-dump@1.0.2(tslib@2.7.0): dependencies: - tslib: 2.6.2 + tslib: 2.7.0 tree-kill@1.2.2: {} - triple-beam@1.4.1: {} - - ts-api-utils@1.3.0(typescript@5.5.3): + ts-api-utils@1.3.0(typescript@5.6.2): dependencies: - typescript: 5.5.3 + typescript: 5.6.2 - ts-declaration-location@1.0.2(typescript@5.5.3): + ts-declaration-location@1.0.4(typescript@5.6.2): dependencies: - minimatch: 9.0.5 - typescript: 5.5.3 + minimatch: 10.0.1 + typescript: 5.6.2 ts-interface-checker@0.1.13: {} - ts-pattern@5.2.0: {} + ts-pattern@5.3.1: {} - tsconfck@3.0.3(typescript@5.5.3): + tsconfck@3.0.3(typescript@5.6.2): optionalDependencies: - typescript: 5.5.3 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 + typescript: 5.6.2 tsconfig-paths@4.2.0: dependencies: @@ -18501,26 +16737,26 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tslib@1.14.1: {} - tslib@2.4.1: {} - tslib@2.6.2: {} + tslib@2.7.0: {} - tsutils@3.21.0(typescript@5.5.3): + tsx@4.19.1: dependencies: - tslib: 1.14.1 - typescript: 5.5.3 + esbuild: 0.23.1 + get-tsconfig: 4.7.5 + optionalDependencies: + fsevents: 2.3.3 turbo-stream@2.2.0: {} + turbo-stream@2.3.0: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} - - type-fest@0.20.2: {} + type-detect@4.1.0: {} type-fest@0.21.3: {} @@ -18535,69 +16771,35 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - - typedoc-plugin-frontmatter@1.0.0(typedoc-plugin-markdown@4.2.6(typedoc@0.26.6(typescript@5.5.3))): + typedoc-plugin-frontmatter@1.0.0(typedoc-plugin-markdown@4.2.6(typedoc@0.26.6(typescript@5.6.2))): dependencies: - typedoc-plugin-markdown: 4.2.6(typedoc@0.26.6(typescript@5.5.3)) + typedoc-plugin-markdown: 4.2.6(typedoc@0.26.6(typescript@5.6.2)) yaml: 2.4.5 - typedoc-plugin-markdown@4.2.6(typedoc@0.26.6(typescript@5.5.3)): + typedoc-plugin-markdown@4.2.6(typedoc@0.26.6(typescript@5.6.2)): dependencies: - typedoc: 0.26.6(typescript@5.5.3) + typedoc: 0.26.6(typescript@5.6.2) - typedoc@0.26.6(typescript@5.5.3): + typedoc@0.26.6(typescript@5.6.2): dependencies: lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 shiki: 1.11.0 - typescript: 5.5.3 + typescript: 5.6.2 yaml: 2.4.5 - typescript-eslint@7.18.0(eslint@8.57.0)(typescript@5.5.3): + typescript-eslint@8.3.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): dependencies: - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.3) - eslint: 8.57.0 + '@typescript-eslint/eslint-plugin': 8.3.0(@typescript-eslint/parser@8.3.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/parser': 8.3.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) + '@typescript-eslint/utils': 8.3.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: + - eslint - supports-color - typescript@5.0.4: {} - typescript@5.1.6: {} typescript@5.2.2: {} @@ -18608,18 +16810,48 @@ snapshots: typescript@5.4.5: {} - typescript@5.5.3: {} + typescript@5.5.4: {} + + typescript@5.6.1-rc: {} + + typescript@5.6.2: {} uc.micro@2.1.0: {} ufo@1.5.3: {} - unbox-primitive@1.0.2: + unbuild@2.0.0(typescript@5.6.2)(vue-tsc@2.0.29(typescript@5.6.2)): dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 + '@rollup/plugin-alias': 5.1.0(rollup@3.29.4) + '@rollup/plugin-commonjs': 25.0.7(rollup@3.29.4) + '@rollup/plugin-json': 6.1.0(rollup@3.29.4) + '@rollup/plugin-node-resolve': 15.2.3(rollup@3.29.4) + '@rollup/plugin-replace': 5.0.7(rollup@3.29.4) + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + chalk: 5.3.0 + citty: 0.1.6 + consola: 3.2.3 + defu: 6.1.4 + esbuild: 0.19.12 + globby: 13.2.2 + hookable: 5.5.3 + jiti: 1.21.6 + magic-string: 0.30.11 + mkdist: 1.5.7(typescript@5.6.2)(vue-tsc@2.0.29(typescript@5.6.2)) + mlly: 1.7.1 + pathe: 1.1.2 + pkg-types: 1.2.0 + pretty-bytes: 6.1.1 + rollup: 3.29.4 + rollup-plugin-dts: 6.1.1(rollup@3.29.4)(typescript@5.6.2) + scule: 1.3.0 + untyped: 1.4.2 + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - sass + - supports-color + - vue-tsc unc-path-regex@0.1.2: {} @@ -18629,19 +16861,17 @@ snapshots: dependencies: acorn: 8.12.1 estree-walker: 3.0.3 - magic-string: 0.30.10 + magic-string: 0.30.11 unplugin: 1.12.2 - undici-types@5.26.5: {} - undici-types@5.28.4: {} + undici-types@6.19.8: {} + undici@5.28.4: dependencies: '@fastify/busboy': 2.1.0 - undici@6.19.7: {} - unenv@1.9.0: dependencies: consola: 3.2.3 @@ -18650,31 +16880,22 @@ snapshots: node-fetch-native: 1.6.4 pathe: 1.1.2 - unicode-canonical-property-names-ecmascript@2.0.0: {} - - unicode-match-property-ecmascript@2.0.0: - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 - unicode-property-aliases-ecmascript: 2.1.0 - - unicode-match-property-value-ecmascript@2.1.0: {} - - unicode-property-aliases-ecmascript@2.1.0: {} + unicode-emoji-modifier-base@1.0.0: {} unicorn-magic@0.1.0: {} - unimport@3.7.1(rollup@4.18.0): + unimport@3.7.1(rollup@4.21.2): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) acorn: 8.12.1 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 fast-glob: 3.3.2 local-pkg: 0.5.0 - magic-string: 0.30.10 - mlly: 1.7.0 + magic-string: 0.30.11 + mlly: 1.7.1 pathe: 1.1.2 - pkg-types: 1.1.1 + pkg-types: 1.2.0 scule: 1.3.0 strip-literal: 1.3.0 unplugin: 1.12.2 @@ -18703,7 +16924,7 @@ snapshots: destr: 2.0.3 h3: 1.11.1 listhen: 1.7.2 - lru-cache: 10.2.2 + lru-cache: 10.4.3 mri: 1.2.0 node-fetch-native: 1.6.4 ofetch: 1.3.4 @@ -18719,20 +16940,32 @@ snapshots: consola: 3.2.3 pathe: 1.1.2 + untyped@1.4.2: + dependencies: + '@babel/core': 7.25.2 + '@babel/standalone': 7.25.6 + '@babel/types': 7.25.6 + defu: 6.1.4 + jiti: 1.21.6 + mri: 1.2.0 + scule: 1.3.0 + transitivePeerDependencies: + - supports-color + unwasm@0.3.9: dependencies: knitwork: 1.1.0 - magic-string: 0.30.10 - mlly: 1.7.0 + magic-string: 0.30.11 + mlly: 1.7.1 pathe: 1.1.2 - pkg-types: 1.1.1 + pkg-types: 1.2.0 unplugin: 1.12.2 update-browserslist-db@1.1.0(browserslist@4.23.3): dependencies: browserslist: 4.23.3 escalade: 3.1.2 - picocolors: 1.0.1 + picocolors: 1.1.0 uqr@0.1.2: {} @@ -18745,24 +16978,22 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - url-polyfill@1.1.12: {} - urlpattern-polyfill@8.0.2: {} - use-callback-ref@1.3.0(@types/react@18.3.3)(react@18.3.1): + use-callback-ref@1.3.0(@types/react@18.3.5)(react@18.3.1): dependencies: react: 18.3.1 - tslib: 2.6.2 + tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 - use-sidecar@1.1.2(@types/react@18.3.3)(react@18.3.1): + use-sidecar@1.1.2(@types/react@18.3.5)(react@18.3.1): dependencies: detect-node-es: 1.1.0 react: 18.3.1 - tslib: 2.6.2 + tslib: 2.7.0 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.5 use-sync-external-store@1.2.2(react@18.3.1): dependencies: @@ -18786,88 +17017,19 @@ snapshots: v8flags@4.0.1: {} - valibot@0.36.0: {} - - valibot@0.37.0(typescript@5.5.3): + valibot@0.42.0(typescript@5.6.2): optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 - validator@13.12.0: {} + validate-npm-package-name@5.0.1: {} vary@1.1.2: {} - vinxi@0.3.12(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1): - dependencies: - '@babel/core': 7.25.2 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) - '@types/micromatch': 4.0.7 - '@vinxi/listhen': 1.5.6 - boxen: 7.1.1 - chokidar: 3.6.0 - citty: 0.1.6 - consola: 3.2.3 - crossws: 0.2.4 - dax-sh: 0.39.2 - defu: 6.1.4 - es-module-lexer: 1.5.4 - esbuild: 0.20.2 - fast-glob: 3.3.2 - get-port-please: 3.1.2 - h3: 1.11.1 - hookable: 5.5.3 - http-proxy: 1.18.1 - micromatch: 4.0.7 - nitropack: 2.9.6(@opentelemetry/api@1.8.0) - node-fetch-native: 1.6.4 - path-to-regexp: 6.2.2 - pathe: 1.1.2 - radix3: 1.1.2 - resolve: 1.22.8 - serve-placeholder: 2.0.1 - serve-static: 1.15.0 - ufo: 1.5.3 - unctx: 2.3.1 - unenv: 1.9.0 - unstorage: 1.10.2(ioredis@5.4.1) - vite: 5.3.5(@types/node@20.14.9)(terser@5.31.1) - zod: 3.23.8 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@libsql/client' - - '@netlify/blobs' - - '@opentelemetry/api' - - '@planetscale/database' - - '@types/node' - - '@upstash/redis' - - '@vercel/kv' - - better-sqlite3 - - debug - - drizzle-orm - - encoding - - idb-keyval - - ioredis - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - - uWebSockets.js - - xml2js - - vinxi@0.4.1(@opentelemetry/api@1.8.0)(@types/node@20.14.9)(ioredis@5.4.1)(terser@5.31.1): + vinxi@0.4.3(@opentelemetry/api@1.8.0)(@types/node@22.5.4)(ioredis@5.4.1)(terser@5.31.1): dependencies: '@babel/core': 7.25.2 '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2) '@types/micromatch': 4.0.7 '@vinxi/listhen': 1.5.6 boxen: 7.1.1 @@ -18892,12 +17054,12 @@ snapshots: radix3: 1.1.2 resolve: 1.22.8 serve-placeholder: 2.0.1 - serve-static: 1.15.0 + serve-static: 1.16.2 ufo: 1.5.3 unctx: 2.3.1 unenv: 1.9.0 unstorage: 1.10.2(ioredis@5.4.1) - vite: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + vite: 5.4.5(@types/node@22.5.4)(terser@5.31.1) zod: 3.23.8 transitivePeerDependencies: - '@azure/app-configuration' @@ -18923,6 +17085,7 @@ snapshots: - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color @@ -18930,130 +17093,104 @@ snapshots: - uWebSockets.js - xml2js - vite-node@1.6.0(@types/node@20.14.9)(terser@5.31.1): + vite-node@1.6.0(@types/node@22.5.4)(terser@5.31.1): dependencies: cac: 6.7.14 - debug: 4.3.5 + debug: 4.3.6 pathe: 1.1.2 - picocolors: 1.0.1 - vite: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + picocolors: 1.1.0 + vite: 5.4.5(@types/node@22.5.4)(terser@5.31.1) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - vite-plugin-babel@1.2.0(@babel/core@7.25.2)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)): + vite-plugin-babel@1.2.0(@babel/core@7.25.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)): dependencies: '@babel/core': 7.25.2 - vite: 5.3.5(@types/node@20.14.9)(terser@5.31.1) - - vite-plugin-dts@3.9.1(@types/node@20.14.9)(rollup@4.18.0)(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)): - dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@20.14.9) - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - '@vue/language-core': 1.8.27(typescript@5.5.3) - debug: 4.3.5 - kolorist: 1.8.0 - magic-string: 0.30.10 - typescript: 5.5.3 - vue-tsc: 1.8.27(typescript@5.5.3) - optionalDependencies: - vite: 5.3.5(@types/node@20.14.9)(terser@5.31.1) - transitivePeerDependencies: - - '@types/node' - - rollup - - supports-color + vite: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - vite-plugin-dts@4.0.3(@types/node@20.14.9)(rollup@4.18.0)(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)): + vite-plugin-dts@4.0.3(@types/node@22.5.4)(rollup@4.21.2)(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)): dependencies: - '@microsoft/api-extractor': 7.47.4(@types/node@20.14.9) - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@microsoft/api-extractor': 7.47.4(@types/node@22.5.4) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) '@volar/typescript': 2.4.0 - '@vue/language-core': 2.0.29(typescript@5.5.3) + '@vue/language-core': 2.0.29(typescript@5.6.2) compare-versions: 6.1.1 debug: 4.3.6 kolorist: 1.8.0 local-pkg: 0.5.0 magic-string: 0.30.11 - typescript: 5.5.3 - vue-tsc: 2.0.29(typescript@5.5.3) + typescript: 5.6.2 + vue-tsc: 2.0.29(typescript@5.6.2) optionalDependencies: - vite: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + vite: 5.4.5(@types/node@22.5.4)(terser@5.31.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.8.0(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)): - dependencies: - vite: 5.3.5(@types/node@20.14.9)(terser@5.31.1) - - vite-tsconfig-paths@4.3.2(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)): + vite-plugin-externalize-deps@0.8.0(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)): dependencies: - debug: 4.3.5 - globrex: 0.1.2 - tsconfck: 3.0.3(typescript@5.5.3) - optionalDependencies: - vite: 5.3.5(@types/node@20.14.9)(terser@5.31.1) - transitivePeerDependencies: - - supports-color - - typescript + vite: 5.4.5(@types/node@22.5.4)(terser@5.31.1) - vite-tsconfig-paths@5.0.1(typescript@5.5.3)(vite@5.3.5(@types/node@20.14.9)(terser@5.31.1)): + vite-tsconfig-paths@5.0.1(typescript@5.6.2)(vite@5.4.5(@types/node@22.5.4)(terser@5.31.1)): dependencies: - debug: 4.3.5 + debug: 4.3.6 globrex: 0.1.2 - tsconfck: 3.0.3(typescript@5.5.3) + tsconfck: 3.0.3(typescript@5.6.2) optionalDependencies: - vite: 5.3.5(@types/node@20.14.9)(terser@5.31.1) + vite: 5.4.5(@types/node@22.5.4)(terser@5.31.1) transitivePeerDependencies: - supports-color - typescript - vite@5.3.5(@types/node@20.14.9)(terser@5.31.1): + vite@5.4.5(@types/node@22.5.4)(terser@5.31.1): dependencies: esbuild: 0.21.5 - postcss: 8.4.40 - rollup: 4.18.0 + postcss: 8.4.47 + rollup: 4.21.2 optionalDependencies: - '@types/node': 20.14.9 + '@types/node': 22.5.4 fsevents: 2.3.3 terser: 5.31.1 - vitest@1.6.0(@types/node@20.14.9)(jsdom@24.1.1)(terser@5.31.1): + vitest@1.6.0(@types/node@22.5.4)(jsdom@25.0.0)(terser@5.31.1): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 '@vitest/snapshot': 1.6.0 '@vitest/spy': 1.6.0 '@vitest/utils': 1.6.0 - acorn-walk: 8.3.2 - chai: 4.4.1 - debug: 4.3.5 + acorn-walk: 8.3.4 + chai: 4.5.0 + debug: 4.3.6 execa: 8.0.1 local-pkg: 0.5.0 - magic-string: 0.30.10 + magic-string: 0.30.11 pathe: 1.1.2 - picocolors: 1.0.1 + picocolors: 1.1.0 std-env: 3.7.0 strip-literal: 2.1.0 tinybench: 2.8.0 tinypool: 0.8.4 - vite: 5.3.5(@types/node@20.14.9)(terser@5.31.1) - vite-node: 1.6.0(@types/node@20.14.9)(terser@5.31.1) - why-is-node-running: 2.2.2 + vite: 5.4.5(@types/node@22.5.4)(terser@5.31.1) + vite-node: 1.6.0(@types/node@22.5.4)(terser@5.31.1) + why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.14.9 - jsdom: 24.1.1 + '@types/node': 22.5.4 + jsdom: 25.0.0 transitivePeerDependencies: - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color @@ -19061,24 +17198,12 @@ snapshots: vscode-uri@3.0.8: {} - vue-template-compiler@2.7.16: - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - - vue-tsc@1.8.27(typescript@5.5.3): - dependencies: - '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.27(typescript@5.5.3) - semver: 7.6.3 - typescript: 5.5.3 - - vue-tsc@2.0.29(typescript@5.5.3): + vue-tsc@2.0.29(typescript@5.6.2): dependencies: '@volar/typescript': 2.4.0 - '@vue/language-core': 2.0.29(typescript@5.5.3) + '@vue/language-core': 2.0.29(typescript@5.6.2) semver: 7.6.3 - typescript: 5.5.3 + typescript: 5.6.2 w3c-xmlserializer@5.0.0: dependencies: @@ -19097,24 +17222,18 @@ snapshots: dependencies: defaults: 1.0.4 - web-encoding@1.1.5: - dependencies: - util: 0.12.5 - optionalDependencies: - '@zxing/text-encoding': 0.9.0 - web-streams-polyfill@3.2.1: {} webidl-conversions@3.0.1: {} webidl-conversions@7.0.0: {} - webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.93.0): + webpack-cli@5.1.4(webpack-dev-server@5.1.0)(webpack@5.94.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4)) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4)) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack-dev-server@5.0.4)(webpack@5.93.0))(webpack-dev-server@5.0.4(webpack-cli@5.1.4)(webpack@5.93.0))(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4)) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack-dev-server@5.1.0)(webpack@5.94.0))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4)) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack-dev-server@5.1.0)(webpack@5.94.0))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4)) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack-dev-server@5.1.0)(webpack@5.94.0))(webpack-dev-server@5.1.0(webpack-cli@5.1.4)(webpack@5.94.0))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4)) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 @@ -19123,12 +17242,12 @@ snapshots: import-local: 3.1.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4) webpack-merge: 5.10.0 optionalDependencies: - webpack-dev-server: 5.0.4(webpack-cli@5.1.4)(webpack@5.93.0) + webpack-dev-server: 5.1.0(webpack-cli@5.1.4)(webpack@5.94.0) - webpack-dev-middleware@7.2.1(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4)): + webpack-dev-middleware@7.4.2(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4)): dependencies: colorette: 2.0.20 memfs: 4.9.3 @@ -19137,9 +17256,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.2.0 optionalDependencies: - webpack: 5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4) - webpack-dev-server@5.0.4(webpack-cli@5.1.4)(webpack@5.93.0): + webpack-dev-server@5.1.0(webpack-cli@5.1.4)(webpack@5.94.0): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -19154,8 +17273,7 @@ snapshots: colorette: 2.0.20 compression: 1.7.4 connect-history-api-fallback: 2.0.0 - default-gateway: 6.0.3 - express: 4.19.2 + express: 4.21.0 graceful-fs: 4.2.11 html-entities: 2.5.2 http-proxy-middleware: 2.0.6(@types/express@4.17.21) @@ -19163,17 +17281,16 @@ snapshots: launch-editor: 2.8.0 open: 10.1.0 p-retry: 6.2.0 - rimraf: 5.0.10 schema-utils: 4.2.0 selfsigned: 2.4.1 serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.2.1(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4)) + webpack-dev-middleware: 7.4.2(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4)) ws: 8.18.0 optionalDependencies: - webpack: 5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.0.4)(webpack@5.93.0) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.1.0)(webpack@5.94.0) transitivePeerDependencies: - bufferutil - debug @@ -19190,9 +17307,8 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5): + webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4): dependencies: - '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 @@ -19201,7 +17317,7 @@ snapshots: acorn-import-attributes: 1.9.5(acorn@8.12.1) browserslist: 4.23.3 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.17.0 + enhanced-resolve: 5.17.1 es-module-lexer: 1.5.4 eslint-scope: 5.1.1 events: 3.3.0 @@ -19213,17 +17329,18 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack-cli@5.1.4)) watchpack: 2.4.1 webpack-sources: 3.2.3 + optionalDependencies: + webpack-cli: 5.1.4(webpack-dev-server@5.1.0)(webpack@5.94.0) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4): + webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.1): dependencies: - '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 @@ -19232,7 +17349,7 @@ snapshots: acorn-import-attributes: 1.9.5(acorn@8.12.1) browserslist: 4.23.3 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.17.0 + enhanced-resolve: 5.17.1 es-module-lexer: 1.5.4 eslint-scope: 5.1.1 events: 3.3.0 @@ -19244,11 +17361,9 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack@5.93.0(@swc/core@1.7.6(@swc/helpers@0.5.11))(esbuild@0.21.5)(webpack-cli@5.1.4)) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.26)(esbuild@0.23.1)(webpack@5.94.0(@swc/core@1.7.26)(esbuild@0.23.1)) watchpack: 2.4.1 webpack-sources: 3.2.3 - optionalDependencies: - webpack-cli: 5.1.4(webpack-dev-server@5.0.4)(webpack@5.93.0) transitivePeerDependencies: - '@swc/core' - esbuild @@ -19278,36 +17393,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - - which-builtin-type@1.1.3: - dependencies: - function.prototype.name: 1.1.6 - has-tostringtag: 1.0.2 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 - isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.3 - which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 @@ -19328,7 +17413,7 @@ snapshots: dependencies: isexe: 3.1.1 - why-is-node-running@2.2.2: + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 @@ -19343,36 +17428,6 @@ snapshots: wildcard@2.0.1: {} - winston-loki@6.1.2: - dependencies: - async-exit-hook: 2.0.1 - btoa: 1.2.1 - protobufjs: 7.3.2 - url-polyfill: 1.1.12 - winston-transport: 4.7.1 - optionalDependencies: - snappy: 7.2.2 - - winston-transport@4.7.1: - dependencies: - logform: 2.6.1 - readable-stream: 3.6.2 - triple-beam: 1.4.1 - - winston@3.14.2: - dependencies: - '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.3 - async: 3.2.5 - is-stream: 2.0.1 - logform: 2.6.1 - one-time: 1.0.0 - readable-stream: 3.6.2 - safe-stable-stringify: 2.4.3 - stack-trace: 0.0.10 - triple-beam: 1.4.1 - winston-transport: 4.7.1 - wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -19393,12 +17448,6 @@ snapshots: wrappy@1.0.2: {} - write-file-atomic@1.3.4: - dependencies: - graceful-fs: 4.2.11 - imurmurhash: 0.1.4 - slide: 1.1.6 - ws@8.18.0: {} xml-name-validator@5.0.0: {} @@ -19413,12 +17462,22 @@ snapshots: yallist@4.0.0: {} - yaml@1.10.2: {} - yaml@2.4.5: {} + yargs-parser@20.2.9: {} + yargs-parser@21.1.1: {} + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -19431,15 +17490,15 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.0.0: {} + yocto-queue@1.1.1: {} - z-schema@5.0.5: + yocto-spinner@0.1.0: dependencies: - lodash.get: 4.4.2 - lodash.isequal: 4.5.0 - validator: 13.12.0 - optionalDependencies: - commander: 9.5.0 + yoctocolors: 2.1.1 + + yoctocolors-cjs@2.1.2: {} + + yoctocolors@2.1.1: {} zip-stream@6.0.1: dependencies: @@ -19447,8 +17506,4 @@ snapshots: compress-commons: 6.0.2 readable-stream: 4.5.2 - zod-validation-error@1.2.0(zod@3.23.8): - dependencies: - zod: 3.23.8 - zod@3.23.8: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index df6b37ce34..a48d64989f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,5 @@ packages: - 'packages/*' - 'examples/react/*' + - 'e2e/react-router/*' + - 'e2e/start/*' diff --git a/scripts/publish.js b/scripts/publish.js index 64dbe71ca4..3f2f8b10c7 100644 --- a/scripts/publish.js +++ b/scripts/publish.js @@ -40,6 +40,10 @@ await publish({ name: '@tanstack/router-generator', packageDir: 'packages/router-generator', }, + { + name: '@tanstack/virtual-file-routes', + packageDir: 'packages/virtual-file-routes', + }, { name: '@tanstack/router-cli', packageDir: 'packages/router-cli', @@ -64,6 +68,14 @@ await publish({ name: '@tanstack/start-vite-plugin', packageDir: 'packages/start-vite-plugin', }, + { + name: '@tanstack/create-router', + packageDir: 'packages/create-router', + }, + { + name: '@tanstack/eslint-plugin-router', + packageDir: 'packages/eslint-plugin-router', + }, ], branchConfigs: { main: {