diff --git a/.gitignore b/.gitignore index 6c9f1720dc3..d1682ba1790 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ artifacts coverage *.tgz .wrangler +**/.angular/ # tests packages/router-generator/tests/**/*.gen.ts diff --git a/e2e/angular-router-experimental/basic/angular.json b/e2e/angular-router-experimental/basic/angular.json new file mode 100644 index 00000000000..fc33c3d880e --- /dev/null +++ b/e2e/angular-router-experimental/basic/angular.json @@ -0,0 +1,61 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "cli": { + "packageManager": "pnpm", + "analytics": false + }, + "newProjectRoot": "projects", + "projects": { + "angular-router-basic": { + "projectType": "application", + "schematics": {}, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular/build:application", + "options": { + "conditions": ["module", "style"], + "browser": "src/main.ts", + "tsConfig": "tsconfig.app.json", + "assets": [], + "styles": ["src/styles.css"] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kB", + "maximumError": "1MB" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular/build:dev-server", + "configurations": { + "production": { + "buildTarget": "angular-router-basic:build:production" + }, + "development": { + "buildTarget": "angular-router-basic:build:development" + } + }, + "defaultConfiguration": "development" + } + } + } + } +} + diff --git a/e2e/angular-router-experimental/basic/package.json b/e2e/angular-router-experimental/basic/package.json new file mode 100644 index 00000000000..489eded5371 --- /dev/null +++ b/e2e/angular-router-experimental/basic/package.json @@ -0,0 +1,32 @@ +{ + "name": "tanstack-router-e2e-angular-basic", + "private": true, + "type": "module", + "scripts": { + "dev": "ng serve", + "build": "ng build", + "preview": "ng serve --configuration production", + "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" + }, + "dependencies": { + "@angular/common": "^21.0.4", + "@angular/core": "^21.0.4", + "@angular/platform-browser": "^21.0.4", + "@tanstack/angular-router-experimental": "workspace:^", + "@tanstack/angular-router-devtools": "workspace:^", + "redaxios": "^0.5.1", + "zod": "^3.24.2" + }, + "devDependencies": { + "@angular/build": "^21.0.4", + "@angular/cli": "^21.0.4", + "@angular/compiler-cli": "^21.0.4", + "@playwright/test": "^1.50.1", + "@tailwindcss/postcss": "^4.1.18", + "@tanstack/router-e2e-utils": "workspace:^", + "@types/node": "22.10.2", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18", + "typescript": "~5.9.2" + } +} diff --git a/e2e/angular-router-experimental/basic/playwright.config.ts b/e2e/angular-router-experimental/basic/playwright.config.ts new file mode 100644 index 00000000000..7a20030f87c --- /dev/null +++ b/e2e/angular-router-experimental/basic/playwright.config.ts @@ -0,0 +1,43 @@ +import { defineConfig, devices } from '@playwright/test' +import { + getDummyServerPort, + getTestServerPort, +} from '@tanstack/router-e2e-utils' +import packageJson from './package.json' with { type: 'json' } + +const PORT = await getTestServerPort(packageJson.name) +const EXTERNAL_PORT = await getDummyServerPort(packageJson.name) +const baseURL = `http://localhost:${PORT}` + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + workers: 1, + + reporter: [['line']], + + globalSetup: './tests/setup/global.setup.ts', + globalTeardown: './tests/setup/global.teardown.ts', + + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL, + }, + + webServer: { + command: `NODE_ENV=test SERVER_PORT=${PORT} EXTERNAL_PORT=${EXTERNAL_PORT} pnpm build && pnpm preview --port ${PORT}`, + url: baseURL, + reuseExistingServer: !process.env.CI, + stdout: 'pipe', + }, + + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], +}) + diff --git a/e2e/angular-router-experimental/basic/src/index.html b/e2e/angular-router-experimental/basic/src/index.html new file mode 100644 index 00000000000..9fbcbb74529 --- /dev/null +++ b/e2e/angular-router-experimental/basic/src/index.html @@ -0,0 +1,13 @@ + + + + + + Angular Router E2E + + + + + + + diff --git a/e2e/angular-router-experimental/basic/src/main.ts b/e2e/angular-router-experimental/basic/src/main.ts new file mode 100644 index 00000000000..112029054d7 --- /dev/null +++ b/e2e/angular-router-experimental/basic/src/main.ts @@ -0,0 +1,587 @@ +import { Component, computed, signal } from '@angular/core' +import { JsonPipe } from '@angular/common' +import { bootstrapApplication } from '@angular/platform-browser' +import { + Outlet, + Link, + RouterProvider, + createRootRoute, + createRoute, + createRouter, + injectErrorState, + injectRouter, + injectRouterState, + redirect, +} from '@tanstack/angular-router-experimental' +import { TanStackRouterDevtools } from '@tanstack/angular-router-devtools' +import { NotFoundError, fetchPost, fetchPosts } from './posts' +import './styles.css' + +const rootRoute = createRootRoute({ + component: () => RootComponent, + notFoundComponent: () => NotFoundComponent, +}) + +@Component({ + selector: 'app-root-layout', + standalone: true, + imports: [Outlet, Link, TanStackRouterDevtools], + template: ` +
+
+ + Home + + + Posts + + View Transition + + View Transition types + + + Layout + + + This Route Does Not Exist + +
+ + Link in SVG + + + + +
+
+ + +
+ `, +}) +class RootComponent { + routerState = injectRouterState() + + isActive(path: string): boolean { + const currentPath = this.routerState().location.pathname + if (path === '/') { + return currentPath === path + } + return currentPath === path || currentPath.startsWith(path + '/') + } +} + +@Component({ + selector: 'app-not-found', + standalone: true, + imports: [Link], + template: ` +
+

This is the notFoundComponent configured on root route

+ Start Over +
+ `, +}) +class NotFoundComponent {} + +const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, +}) + +@Component({ + selector: 'app-index', + standalone: true, + template: ` +
+

Welcome Home!

+
+ `, +}) +class IndexComponent {} + +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, +}) + +@Component({ + selector: 'app-posts-index', + standalone: true, + template: `
Select a post.
`, +}) +class PostsIndexComponent {} + +const postRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '$postId', + errorComponent: () => PostErrorComponent, + loader: ({ params }) => fetchPost(params.postId), + component: () => PostComponent, +}) + +@Component({ + selector: 'app-post-error', + standalone: true, + template: ` + @if (isNotFoundError()) { +
{{ errorState.error.message }}
+ } @else { + + } + `, +}) +class PostErrorComponent { + errorState = injectErrorState() + isNotFoundError = computed( + () => this.errorState.error instanceof NotFoundError, + ) +} + +@Component({ + selector: 'app-post', + standalone: true, + template: ` +
+

{{ post().title }}

+
+
{{ post().body }}
+
+ `, +}) +class PostComponent { + post = postRoute.injectLoaderData() +} + +const layoutRoute = createRoute({ + getParentRoute: () => rootRoute, + id: '_layout', + component: () => LayoutComponent, +}) + +@Component({ + selector: 'app-layout', + standalone: true, + imports: [Outlet], + template: ` +
+
I'm a layout
+
+ +
+
+ `, +}) +class LayoutComponent {} + +const layout2Route = createRoute({ + getParentRoute: () => layoutRoute, + id: '_layout-2', + component: () => Layout2Component, +}) + +@Component({ + selector: 'app-layout-2', + standalone: true, + imports: [Outlet, Link], + template: ` +
+
I'm a nested layout
+ +
+ +
+
+ `, +}) +class Layout2Component { + routerState = injectRouterState() + + isActive(path: string): boolean { + const currentPath = this.routerState().location.pathname + return currentPath === path || currentPath.startsWith(path + '/') + } +} + +const layoutARoute = createRoute({ + getParentRoute: () => layout2Route, + path: '/layout-a', + component: () => LayoutAComponent, +}) + +@Component({ + selector: 'app-layout-a', + standalone: true, + template: `
I'm layout A!
`, +}) +class LayoutAComponent {} + +const layoutBRoute = createRoute({ + getParentRoute: () => layout2Route, + path: '/layout-b', + component: () => LayoutBComponent, +}) + +@Component({ + selector: 'app-layout-b', + standalone: true, + template: `
I'm layout B!
`, +}) +class LayoutBComponent {} + +const paramsPsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/params-ps', +}) + +const paramsPsIndexRoute = createRoute({ + getParentRoute: () => paramsPsRoute, + path: '/', + component: () => ParamsIndexComponent, +}) + +@Component({ + selector: 'app-params-index', + standalone: true, + imports: [Link], + template: ` +
+

Named path params

+ +
+

Wildcard path params

+ +
+ `, +}) +class ParamsIndexComponent {} + +const paramsPsNamedRoute = createRoute({ + getParentRoute: () => paramsPsRoute, + path: '/named', +}) + +const paramsPsNamedIndexRoute = createRoute({ + getParentRoute: () => paramsPsNamedRoute, + path: '/', + beforeLoad: () => { + throw redirect({ to: '/params-ps' }) + }, +}) + +const paramsPsNamedFooRoute = createRoute({ + getParentRoute: () => paramsPsNamedRoute, + path: '/$foo', + component: () => ParamsNamedFooComponent, +}) + +@Component({ + selector: 'app-params-named-foo', + standalone: true, + template: ` +
+

ParamsNamedFoo

+
{{ paramsJson() }}
+
+ `, +}) +class ParamsNamedFooComponent { + params = paramsPsNamedFooRoute.injectParams() + paramsJson = computed(() => JSON.stringify(this.params())) +} + +const paramsPsNamedFooPrefixRoute = createRoute({ + getParentRoute: () => paramsPsNamedRoute, + path: '/prefix{$foo}', + component: () => ParamsNamedFooPrefixComponent, +}) + +@Component({ + selector: 'app-params-named-foo-prefix', + standalone: true, + template: ` +
+

ParamsNamedFooPrefix

+
{{ paramsJson() }}
+
+ `, +}) +class ParamsNamedFooPrefixComponent { + params = paramsPsNamedFooPrefixRoute.injectParams() + paramsJson = computed(() => JSON.stringify(this.params())) +} + +const paramsPsNamedFooSuffixRoute = createRoute({ + getParentRoute: () => paramsPsNamedRoute, + path: '/{$foo}suffix', + component: () => ParamsNamedFooSuffixComponent, +}) + +@Component({ + selector: 'app-params-named-foo-suffix', + standalone: true, + template: ` +
+

ParamsNamedFooSuffix

+
{{ paramsJson() }}
+
+ `, +}) +class ParamsNamedFooSuffixComponent { + params = paramsPsNamedFooSuffixRoute.injectParams() + paramsJson = computed(() => JSON.stringify(this.params())) +} + +const paramsPsWildcardRoute = createRoute({ + getParentRoute: () => paramsPsRoute, + path: '/wildcard', +}) + +const paramsPsWildcardIndexRoute = createRoute({ + getParentRoute: () => paramsPsWildcardRoute, + path: '/', + beforeLoad: () => { + throw redirect({ to: '/params-ps' }) + }, +}) + +const paramsPsWildcardSplatRoute = createRoute({ + getParentRoute: () => paramsPsWildcardRoute, + path: '$', + component: () => ParamsWildcardSplatComponent, +}) + +@Component({ + selector: 'app-params-wildcard-splat', + standalone: true, + template: ` +
+

ParamsWildcardSplat

+
{{ paramsJson() }}
+
+ `, +}) +class ParamsWildcardSplatComponent { + params = paramsPsWildcardSplatRoute.injectParams() + paramsJson = computed(() => JSON.stringify(this.params())) +} + +const paramsPsWildcardSplatPrefixRoute = createRoute({ + getParentRoute: () => paramsPsWildcardRoute, + path: 'prefix{$}', + component: () => ParamsWildcardSplatPrefixComponent, +}) + +@Component({ + selector: 'app-params-wildcard-splat-prefix', + standalone: true, + template: ` +
+

ParamsWildcardSplatPrefix

+
{{ paramsJson() }}
+
+ `, +}) +class ParamsWildcardSplatPrefixComponent { + params = paramsPsWildcardSplatPrefixRoute.injectParams() + paramsJson = computed(() => JSON.stringify(this.params())) +} + +const paramsPsWildcardSplatSuffixRoute = createRoute({ + getParentRoute: () => paramsPsWildcardRoute, + path: '{$}suffix', + component: () => ParamsWildcardSplatSuffixComponent, +}) + +@Component({ + selector: 'app-params-wildcard-splat-suffix', + standalone: true, + template: ` +
+

ParamsWildcardSplatSuffix

+
{{ paramsJson() }}
+
+ `, +}) +class ParamsWildcardSplatSuffixComponent { + params = paramsPsWildcardSplatSuffixRoute.injectParams() + paramsJson = computed(() => JSON.stringify(this.params())) +} + +@Component({ + selector: 'app-error', + standalone: true, + imports: [JsonPipe], + template: ` +
+

Error

+
{{ errorState.error | json }}
+ +
+ `, +}) +class ErrorComponent { + errorState = injectErrorState() + router = injectRouter() + + reset() { + this.router.invalidate() + } +} + +const routeTree = rootRoute.addChildren([ + postsRoute.addChildren([postRoute, postsIndexRoute]), + layoutRoute.addChildren([ + layout2Route.addChildren([layoutARoute, layoutBRoute]), + ]), + paramsPsRoute.addChildren([ + paramsPsNamedRoute.addChildren([ + paramsPsNamedFooPrefixRoute, + paramsPsNamedFooSuffixRoute, + paramsPsNamedFooRoute, + paramsPsNamedIndexRoute, + ]), + paramsPsWildcardRoute.addChildren([ + paramsPsWildcardSplatRoute, + paramsPsWildcardSplatPrefixRoute, + paramsPsWildcardSplatSuffixRoute, + paramsPsWildcardIndexRoute, + ]), + paramsPsIndexRoute, + ]), + indexRoute, +]) + +// Set up a Router instance +const router = createRouter({ + routeTree, + defaultPreload: 'intent', + defaultStaleTime: 5000, + scrollRestoration: true, + defaultErrorComponent: () => ErrorComponent, +}) + +// Register things for typesafety +declare module '@tanstack/angular-router-experimental' { + interface Register { + router: typeof router + } +} + +@Component({ + selector: 'app-root', + standalone: true, + imports: [RouterProvider], + template: ``, +}) +class AppComponent { + router = router +} + +bootstrapApplication(AppComponent).catch((err) => console.error(err)) diff --git a/e2e/angular-router-experimental/basic/src/posts.lazy.ts b/e2e/angular-router-experimental/basic/src/posts.lazy.ts new file mode 100644 index 00000000000..a42d3e0a7f3 --- /dev/null +++ b/e2e/angular-router-experimental/basic/src/posts.lazy.ts @@ -0,0 +1,39 @@ +import { Component, computed } from '@angular/core' +import { Outlet, Link, createLazyRoute } from '@tanstack/angular-router-experimental' + +export const Route = createLazyRoute('/posts')({ + component: () => PostsComponent, +}) + +@Component({ + selector: 'app-posts', + standalone: true, + imports: [Outlet, Link], + template: ` +
+ + +
+ `, +}) +class PostsComponent { + posts = Route.injectLoaderData() + postsWithExtra = computed(() => [ + ...this.posts(), + { id: 'i-do-not-exist', title: 'Non-existent Post' }, + ]) +} diff --git a/e2e/angular-router-experimental/basic/src/posts.ts b/e2e/angular-router-experimental/basic/src/posts.ts new file mode 100644 index 00000000000..5a339f29cf5 --- /dev/null +++ b/e2e/angular-router-experimental/basic/src/posts.ts @@ -0,0 +1,39 @@ +import axios from 'redaxios' + +export class NotFoundError extends Error {} + +type PostType = { + id: string + title: string + body: string +} + +let queryURL = 'https://jsonplaceholder.typicode.com' + +if (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') { + const externalPort = process.env.EXTERNAL_PORT + if (externalPort) { + queryURL = `http://localhost:${externalPort}` + } +} + +export const fetchPosts = async () => { + console.info('Fetching posts...') + return axios + .get>(`${queryURL}/posts`) + .then((r) => r.data.slice(0, 10)) +} + +export const fetchPost = async (postId: string) => { + console.info(`Fetching post with id ${postId}...`) + const post = await axios + .get(`${queryURL}/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/angular-router-experimental/basic/src/styles.css b/e2e/angular-router-experimental/basic/src/styles.css new file mode 100644 index 00000000000..ecf40776164 --- /dev/null +++ b/e2e/angular-router-experimental/basic/src/styles.css @@ -0,0 +1,22 @@ +@import 'tailwindcss'; + +@layer base { + *, + ::after, + ::before, + ::backdrop, + ::file-selector-button { + border-color: var(--color-gray-200, currentcolor); + } +} + +html { + color-scheme: light dark; +} +* { + @apply border-gray-200 dark:border-gray-800; +} +body { + @apply bg-gray-50 text-gray-950 dark:bg-gray-900 dark:text-gray-200; +} + diff --git a/e2e/angular-router-experimental/basic/test-results/.last-run.json b/e2e/angular-router-experimental/basic/test-results/.last-run.json new file mode 100644 index 00000000000..cbcc1fbac11 --- /dev/null +++ b/e2e/angular-router-experimental/basic/test-results/.last-run.json @@ -0,0 +1,4 @@ +{ + "status": "passed", + "failedTests": [] +} \ No newline at end of file diff --git a/e2e/angular-router-experimental/basic/tests/app.spec.ts b/e2e/angular-router-experimental/basic/tests/app.spec.ts new file mode 100644 index 00000000000..84f87952f47 --- /dev/null +++ b/e2e/angular-router-experimental/basic/tests/app.spec.ts @@ -0,0 +1,52 @@ +import { expect, test } from '@playwright/test' +import { getTestServerPort } from '@tanstack/router-e2e-utils' +import packageJson from '../package.json' with { type: 'json' } + +const PORT = await getTestServerPort(packageJson.name) + +test.beforeEach(async ({ page }) => { + await page.goto('/') +}) + +test('Navigating to a post page', async ({ page }) => { + await page.getByRole('link', { name: 'Posts', exact: true }).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.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!') +}) + +test('Navigating to a post page with viewTransition', async ({ page }) => { + await page.getByRole('link', { name: 'View Transition', exact: true }).click() + await page.getByRole('link', { name: 'sunt aut facere repe' }).click() + await expect(page.getByRole('heading')).toContainText('sunt aut facere') +}) + +test('Navigating to a post page with viewTransition types', async ({ + page, +}) => { + await page.getByRole('link', { name: 'View Transition types' }).click() + await page.getByRole('link', { name: 'sunt aut facere repe' }).click() + await expect(page.getByRole('heading')).toContainText('sunt aut facere') +}) + diff --git a/e2e/angular-router-experimental/basic/tests/params.spec.ts b/e2e/angular-router-experimental/basic/tests/params.spec.ts new file mode 100644 index 00000000000..5270ca92a1f --- /dev/null +++ b/e2e/angular-router-experimental/basic/tests/params.spec.ts @@ -0,0 +1,150 @@ +import { expect, test } from '@playwright/test' + +test.describe('params operations + prefix/suffix', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/params-ps') + }) + + test.describe('named params', () => { + const NAMED_PARAMS_PAIRS = [ + // Test ID | Expected href + { + id: 'l-to-named-foo', + pathname: '/params-ps/named/foo', + params: { foo: 'foo' }, + destHeadingId: 'ParamsNamedFoo', + }, + { + id: 'l-to-named-prefixfoo', + pathname: '/params-ps/named/prefixfoo', + params: { foo: 'foo' }, + destHeadingId: 'ParamsNamedFooPrefix', + }, + { + id: 'l-to-named-foosuffix', + pathname: '/params-ps/named/foosuffix', + params: { foo: 'foo' }, + destHeadingId: 'ParamsNamedFooSuffix', + }, + ] satisfies Array<{ + id: string + pathname: string + params: Record + destHeadingId: string + }> + + test.describe('Link', () => { + NAMED_PARAMS_PAIRS.forEach(({ id, pathname }) => { + test(`interpolation for testid="${id}" has href="${pathname}"`, async ({ + page, + }) => { + const link = page.getByTestId(id) + await expect(link).toHaveAttribute('href', pathname) + }) + }) + + NAMED_PARAMS_PAIRS.forEach(({ id, pathname }) => { + test(`navigation for testid="${id}" succeeds to href="${pathname}"`, async ({ + page, + }) => { + const link = page.getByTestId(id) + await link.click() + await page.waitForLoadState('networkidle') + const pagePathname = new URL(page.url()).pathname + expect(pagePathname).toBe(pathname) + }) + }) + }) + + NAMED_PARAMS_PAIRS.forEach(({ pathname, params, destHeadingId }) => { + test(`on first-load to "${pathname}" has correct params`, async ({ + page, + }) => { + await page.goto(pathname) + await page.waitForLoadState('networkidle') + const pagePathname = new URL(page.url()).pathname + expect(pagePathname).toBe(pathname) + + const headingEl = page.getByRole('heading', { name: destHeadingId }) + await expect(headingEl).toBeVisible() + + const paramsEl = page.getByTestId('params-output') + const paramsText = await paramsEl.innerText() + const paramsObj = JSON.parse(paramsText) + expect(paramsObj).toEqual(params) + }) + }) + }) + + test.describe('wildcard param', () => { + const WILDCARD_PARAM_PAIRS = [ + // Test ID | Expected href + { + id: 'l-to-wildcard-foo', + pathname: '/params-ps/wildcard/foo', + params: { '*': 'foo', _splat: 'foo' }, + destHeadingId: 'ParamsWildcardSplat', + }, + { + id: 'l-to-wildcard-prefixfoo', + pathname: '/params-ps/wildcard/prefixfoo', + params: { '*': 'foo', _splat: 'foo' }, + destHeadingId: 'ParamsWildcardSplatPrefix', + }, + { + id: 'l-to-wildcard-foosuffix', + pathname: '/params-ps/wildcard/foosuffix', + params: { '*': 'foo', _splat: 'foo' }, + destHeadingId: 'ParamsWildcardSplatSuffix', + }, + ] satisfies Array<{ + id: string + pathname: string + params: Record + destHeadingId: string + }> + + test.describe('Link', () => { + WILDCARD_PARAM_PAIRS.forEach(({ id, pathname }) => { + test(`interpolation for testid="${id}" has href="${pathname}"`, async ({ + page, + }) => { + const link = page.getByTestId(id) + await expect(link).toHaveAttribute('href', pathname) + }) + }) + + WILDCARD_PARAM_PAIRS.forEach(({ id, pathname }) => { + test(`navigation for testid="${id}" succeeds to href="${pathname}"`, async ({ + page, + }) => { + const link = page.getByTestId(id) + await link.click() + await page.waitForLoadState('networkidle') + const pagePathname = new URL(page.url()).pathname + expect(pagePathname).toBe(pathname) + }) + }) + }) + + WILDCARD_PARAM_PAIRS.forEach(({ pathname, params, destHeadingId }) => { + test(`on first-load to "${pathname}" has correct params`, async ({ + page, + }) => { + await page.goto(pathname) + await page.waitForLoadState('networkidle') + const pagePathname = new URL(page.url()).pathname + expect(pagePathname).toBe(pathname) + + const headingEl = page.getByRole('heading', { name: destHeadingId }) + await expect(headingEl).toBeVisible() + + const paramsEl = page.getByTestId('params-output') + const paramsText = await paramsEl.innerText() + const paramsObj = JSON.parse(paramsText) + expect(paramsObj).toEqual(params) + }) + }) + }) +}) + diff --git a/e2e/angular-router-experimental/basic/tests/setup/global.setup.ts b/e2e/angular-router-experimental/basic/tests/setup/global.setup.ts new file mode 100644 index 00000000000..0f402c20ea0 --- /dev/null +++ b/e2e/angular-router-experimental/basic/tests/setup/global.setup.ts @@ -0,0 +1,7 @@ +import { e2eStartDummyServer } from '@tanstack/router-e2e-utils' +import packageJson from '../../package.json' with { type: 'json' } + +export default async function setup() { + await e2eStartDummyServer(packageJson.name) +} + diff --git a/e2e/angular-router-experimental/basic/tests/setup/global.teardown.ts b/e2e/angular-router-experimental/basic/tests/setup/global.teardown.ts new file mode 100644 index 00000000000..68eef095381 --- /dev/null +++ b/e2e/angular-router-experimental/basic/tests/setup/global.teardown.ts @@ -0,0 +1,7 @@ +import { e2eStopDummyServer } from '@tanstack/router-e2e-utils' +import packageJson from '../../package.json' with { type: 'json' } + +export default async function teardown() { + await e2eStopDummyServer(packageJson.name) +} + diff --git a/e2e/angular-router-experimental/basic/tsconfig.app.json b/e2e/angular-router-experimental/basic/tsconfig.app.json new file mode 100644 index 00000000000..1483d1e95bd --- /dev/null +++ b/e2e/angular-router-experimental/basic/tsconfig.app.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": ["node"] + }, + "files": ["src/main.ts"], + "include": ["src/**/*.ts"] +} + diff --git a/e2e/angular-router-experimental/basic/tsconfig.json b/e2e/angular-router-experimental/basic/tsconfig.json new file mode 100644 index 00000000000..2328d57a844 --- /dev/null +++ b/e2e/angular-router-experimental/basic/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "strict": true, + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "bundler", + "lib": ["ES2022", "DOM"], + "skipLibCheck": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "types": ["@playwright/test", "node"] + }, + "include": ["src/**/*", "tests/**/*"], + "exclude": ["node_modules", "dist"] +} + diff --git a/examples/angular/basic-file-based/README.md b/examples/angular/basic-file-based/README.md new file mode 100644 index 00000000000..c1f2a48f73b --- /dev/null +++ b/examples/angular/basic-file-based/README.md @@ -0,0 +1,42 @@ +# TanStack Router - Angular Basic File-based Example + +This example showcases **file-based route generation** for Angular using `@tanstack/angular-router-experimental` and `@tanstack/router-plugin` with Vite, aligned with the React basic-file-based example. + +## What's demonstrated + +- **Target: Angular** – The router generator is configured with `target: 'angular'` so route files use Angular standalone components and `@tanstack/angular-router-experimental'`. +- **Autogenerated route files** – Adding new files under `src/routes/` (e.g. `__root.ts`, `index.ts`, `about.ts`, `posts.route.ts`) and running the dev server or generator will scaffold Angular components and route definitions. +- **Generated route tree** – `src/routeTree.gen.ts` is produced by the plugin and wired into the app router. + +## Setup + +From the repo root: + +```bash +pnpm install +cd examples/angular/basic-file-based +pnpm dev +``` + +Open http://localhost:3001. + +## Project structure + +- `src/routes/` – File-based routes. The generator creates/updates files here. +- `src/routeTree.gen.ts` – Generated route tree (do not edit by hand). +- `src/router.ts` – Router instance using the generated `routeTree`. +- `vite.config.ts` – Plugin config: `tanstackRouter({ target: 'angular', ... })`. + +## Adding new routes + +1. Add a new file under `src/routes/`, e.g. `src/routes/contact.ts`. +2. Run `pnpm dev` (or `pnpm generate`). The plugin will scaffold the route file with an Angular component and `createFileRoute(...)`. +3. The route tree is updated automatically; navigate to `/contact`. + +## Generating routes manually + +```bash +pnpm generate +``` + +This runs the TanStack Router generator (e.g. via `tsr generate` if the CLI is installed) and updates route files and `routeTree.gen.ts`. diff --git a/examples/angular/basic-file-based/index.html b/examples/angular/basic-file-based/index.html new file mode 100644 index 00000000000..6c4f87e3001 --- /dev/null +++ b/examples/angular/basic-file-based/index.html @@ -0,0 +1,13 @@ + + + + + + + TanStack Router - Angular File-based + + + + + + diff --git a/examples/angular/basic-file-based/package.json b/examples/angular/basic-file-based/package.json new file mode 100644 index 00000000000..dcd695be171 --- /dev/null +++ b/examples/angular/basic-file-based/package.json @@ -0,0 +1,30 @@ +{ + "name": "tanstack-router-angular-example-basic-file-based", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port 3001", + "build": "vite build", + "preview": "vite preview", + "generate": "tsr generate" + }, + "dependencies": { + "@angular/common": "21.0.4", + "@angular/compiler": "21.0.4", + "@angular/core": "21.0.4", + "@angular/platform-browser": "21.0.4", + "@tanstack/angular-router-experimental": "workspace:^", + "@tanstack/angular-router-devtools": "workspace:^", + "@tailwindcss/vite": "^4.1.18", + "rxjs": "~7.8.0", + "tailwindcss": "^4.1.18", + "tslib": "^2.3.0" + }, + "devDependencies": { + "@analogjs/vite-plugin-angular": "^2.2.1", + "@tanstack/router-cli": "workspace:*", + "@tanstack/router-plugin": "workspace:*", + "typescript": "~5.9.2", + "vite": "^7.1.7" + } +} diff --git a/examples/angular/basic-file-based/src/app/app.config.ts b/examples/angular/basic-file-based/src/app/app.config.ts new file mode 100644 index 00000000000..f27099f33c0 --- /dev/null +++ b/examples/angular/basic-file-based/src/app/app.config.ts @@ -0,0 +1,5 @@ +import { ApplicationConfig } from '@angular/core' + +export const appConfig: ApplicationConfig = { + providers: [], +} diff --git a/examples/angular/basic-file-based/src/app/app.ts b/examples/angular/basic-file-based/src/app/app.ts new file mode 100644 index 00000000000..829f370d144 --- /dev/null +++ b/examples/angular/basic-file-based/src/app/app.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core' +import { RouterProvider } from '@tanstack/angular-router-experimental' +import { router } from '../router' + +@Component({ + selector: 'app-root', + standalone: true, + imports: [RouterProvider], + template: ``, +}) +export class App { + router = router +} diff --git a/examples/angular/basic-file-based/src/main.ts b/examples/angular/basic-file-based/src/main.ts new file mode 100644 index 00000000000..24b9d6e3b2d --- /dev/null +++ b/examples/angular/basic-file-based/src/main.ts @@ -0,0 +1,6 @@ +import { bootstrapApplication } from '@angular/platform-browser' +import { App } from './app/app' +import { appConfig } from './app/app.config' +import './styles.css' + +bootstrapApplication(App, appConfig).catch((err) => console.error(err)) diff --git a/examples/angular/basic-file-based/src/posts.ts b/examples/angular/basic-file-based/src/posts.ts new file mode 100644 index 00000000000..42f0d995c63 --- /dev/null +++ b/examples/angular/basic-file-based/src/posts.ts @@ -0,0 +1,29 @@ +import { notFound } from '@tanstack/angular-router-experimental' + +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 res = await fetch( + `https://jsonplaceholder.typicode.com/posts/${postId}`, + ) + if (res.status === 404) { + throw notFound() + } + if (!res.ok) throw new Error(await res.text()) + return res.json() as Promise +} + +export const fetchPosts = async () => { + console.info('Fetching posts...') + await new Promise((r) => setTimeout(r, 500)) + const res = await fetch('https://jsonplaceholder.typicode.com/posts') + if (!res.ok) throw new Error(await res.text()) + const data = (await res.json()) as PostType[] + return data.slice(0, 10) +} diff --git a/examples/angular/basic-file-based/src/routeTree.gen.ts b/examples/angular/basic-file-based/src/routeTree.gen.ts new file mode 100644 index 00000000000..625123d4574 --- /dev/null +++ b/examples/angular/basic-file-based/src/routeTree.gen.ts @@ -0,0 +1,250 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root' +import { Route as AnchorRouteImport } from './routes/anchor' +import { Route as PathlessLayoutRouteImport } from './routes/_pathlessLayout' +import { Route as PostsRouteRouteImport } from './routes/posts.route' +import { Route as IndexRouteImport } from './routes/index' +import { Route as PostsIndexRouteImport } from './routes/posts.index' +import { Route as PostsPostIdRouteImport } from './routes/posts.$postId' +import { Route as PathlessLayoutNestedLayoutRouteImport } from './routes/_pathlessLayout/_nested-layout' +import { Route as PathlessLayoutNestedLayoutRouteBRouteImport } from './routes/_pathlessLayout/_nested-layout/route-b' +import { Route as PathlessLayoutNestedLayoutRouteARouteImport } from './routes/_pathlessLayout/_nested-layout/route-a' + +const AnchorRoute = AnchorRouteImport.update({ + id: '/anchor', + path: '/anchor', + getParentRoute: () => rootRouteImport, +} as any) +const PathlessLayoutRoute = PathlessLayoutRouteImport.update({ + id: '/_pathlessLayout', + getParentRoute: () => rootRouteImport, +} as any) +const PostsRouteRoute = PostsRouteRouteImport.update({ + id: '/posts', + path: '/posts', + getParentRoute: () => rootRouteImport, +} as any) +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) +const PostsIndexRoute = PostsIndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => PostsRouteRoute, +} as any) +const PostsPostIdRoute = PostsPostIdRouteImport.update({ + id: '/$postId', + path: '/$postId', + getParentRoute: () => PostsRouteRoute, +} as any) +const PathlessLayoutNestedLayoutRoute = + PathlessLayoutNestedLayoutRouteImport.update({ + id: '/_nested-layout', + getParentRoute: () => PathlessLayoutRoute, + } as any) +const PathlessLayoutNestedLayoutRouteBRoute = + PathlessLayoutNestedLayoutRouteBRouteImport.update({ + id: '/route-b', + path: '/route-b', + getParentRoute: () => PathlessLayoutNestedLayoutRoute, + } as any) +const PathlessLayoutNestedLayoutRouteARoute = + PathlessLayoutNestedLayoutRouteARouteImport.update({ + id: '/route-a', + path: '/route-a', + getParentRoute: () => PathlessLayoutNestedLayoutRoute, + } as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/posts': typeof PostsRouteRouteWithChildren + '/anchor': typeof AnchorRoute + '/posts/$postId': typeof PostsPostIdRoute + '/posts/': typeof PostsIndexRoute + '/route-a': typeof PathlessLayoutNestedLayoutRouteARoute + '/route-b': typeof PathlessLayoutNestedLayoutRouteBRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/anchor': typeof AnchorRoute + '/posts/$postId': typeof PostsPostIdRoute + '/posts': typeof PostsIndexRoute + '/route-a': typeof PathlessLayoutNestedLayoutRouteARoute + '/route-b': typeof PathlessLayoutNestedLayoutRouteBRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute + '/posts': typeof PostsRouteRouteWithChildren + '/_pathlessLayout': typeof PathlessLayoutRouteWithChildren + '/anchor': typeof AnchorRoute + '/_pathlessLayout/_nested-layout': typeof PathlessLayoutNestedLayoutRouteWithChildren + '/posts/$postId': typeof PostsPostIdRoute + '/posts/': typeof PostsIndexRoute + '/_pathlessLayout/_nested-layout/route-a': typeof PathlessLayoutNestedLayoutRouteARoute + '/_pathlessLayout/_nested-layout/route-b': typeof PathlessLayoutNestedLayoutRouteBRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '/posts' + | '/anchor' + | '/posts/$postId' + | '/posts/' + | '/route-a' + | '/route-b' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/anchor' | '/posts/$postId' | '/posts' | '/route-a' | '/route-b' + id: + | '__root__' + | '/' + | '/posts' + | '/_pathlessLayout' + | '/anchor' + | '/_pathlessLayout/_nested-layout' + | '/posts/$postId' + | '/posts/' + | '/_pathlessLayout/_nested-layout/route-a' + | '/_pathlessLayout/_nested-layout/route-b' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + PostsRouteRoute: typeof PostsRouteRouteWithChildren + PathlessLayoutRoute: typeof PathlessLayoutRouteWithChildren + AnchorRoute: typeof AnchorRoute +} + +declare module '@tanstack/angular-router-experimental' { + interface FileRoutesByPath { + '/anchor': { + id: '/anchor' + path: '/anchor' + fullPath: '/anchor' + preLoaderRoute: typeof AnchorRouteImport + parentRoute: typeof rootRouteImport + } + '/_pathlessLayout': { + id: '/_pathlessLayout' + path: '' + fullPath: '' + preLoaderRoute: typeof PathlessLayoutRouteImport + parentRoute: typeof rootRouteImport + } + '/posts': { + id: '/posts' + path: '/posts' + fullPath: '/posts' + preLoaderRoute: typeof PostsRouteRouteImport + parentRoute: typeof rootRouteImport + } + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + '/posts/': { + id: '/posts/' + path: '/' + fullPath: '/posts/' + preLoaderRoute: typeof PostsIndexRouteImport + parentRoute: typeof PostsRouteRoute + } + '/posts/$postId': { + id: '/posts/$postId' + path: '/$postId' + fullPath: '/posts/$postId' + preLoaderRoute: typeof PostsPostIdRouteImport + parentRoute: typeof PostsRouteRoute + } + '/_pathlessLayout/_nested-layout': { + id: '/_pathlessLayout/_nested-layout' + path: '' + fullPath: '' + preLoaderRoute: typeof PathlessLayoutNestedLayoutRouteImport + parentRoute: typeof PathlessLayoutRoute + } + '/_pathlessLayout/_nested-layout/route-b': { + id: '/_pathlessLayout/_nested-layout/route-b' + path: '/route-b' + fullPath: '/route-b' + preLoaderRoute: typeof PathlessLayoutNestedLayoutRouteBRouteImport + parentRoute: typeof PathlessLayoutNestedLayoutRoute + } + '/_pathlessLayout/_nested-layout/route-a': { + id: '/_pathlessLayout/_nested-layout/route-a' + path: '/route-a' + fullPath: '/route-a' + preLoaderRoute: typeof PathlessLayoutNestedLayoutRouteARouteImport + parentRoute: typeof PathlessLayoutNestedLayoutRoute + } + } +} + +interface PostsRouteRouteChildren { + PostsPostIdRoute: typeof PostsPostIdRoute + PostsIndexRoute: typeof PostsIndexRoute +} + +const PostsRouteRouteChildren: PostsRouteRouteChildren = { + PostsPostIdRoute: PostsPostIdRoute, + PostsIndexRoute: PostsIndexRoute, +} + +const PostsRouteRouteWithChildren = PostsRouteRoute._addFileChildren( + PostsRouteRouteChildren, +) + +interface PathlessLayoutNestedLayoutRouteChildren { + PathlessLayoutNestedLayoutRouteARoute: typeof PathlessLayoutNestedLayoutRouteARoute + PathlessLayoutNestedLayoutRouteBRoute: typeof PathlessLayoutNestedLayoutRouteBRoute +} + +const PathlessLayoutNestedLayoutRouteChildren: PathlessLayoutNestedLayoutRouteChildren = + { + PathlessLayoutNestedLayoutRouteARoute: + PathlessLayoutNestedLayoutRouteARoute, + PathlessLayoutNestedLayoutRouteBRoute: + PathlessLayoutNestedLayoutRouteBRoute, + } + +const PathlessLayoutNestedLayoutRouteWithChildren = + PathlessLayoutNestedLayoutRoute._addFileChildren( + PathlessLayoutNestedLayoutRouteChildren, + ) + +interface PathlessLayoutRouteChildren { + PathlessLayoutNestedLayoutRoute: typeof PathlessLayoutNestedLayoutRouteWithChildren +} + +const PathlessLayoutRouteChildren: PathlessLayoutRouteChildren = { + PathlessLayoutNestedLayoutRoute: PathlessLayoutNestedLayoutRouteWithChildren, +} + +const PathlessLayoutRouteWithChildren = PathlessLayoutRoute._addFileChildren( + PathlessLayoutRouteChildren, +) + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + PostsRouteRoute: PostsRouteRouteWithChildren, + PathlessLayoutRoute: PathlessLayoutRouteWithChildren, + AnchorRoute: AnchorRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() diff --git a/examples/angular/basic-file-based/src/router.ts b/examples/angular/basic-file-based/src/router.ts new file mode 100644 index 00000000000..f9b2da7b2ec --- /dev/null +++ b/examples/angular/basic-file-based/src/router.ts @@ -0,0 +1,13 @@ +import { createRouter } from '@tanstack/angular-router-experimental' +import { routeTree } from './routeTree.gen' + +export const router = createRouter({ + routeTree, + defaultPreload: 'intent', +}) + +declare module '@tanstack/angular-router-experimental' { + interface Register { + router: typeof router + } +} diff --git a/examples/angular/basic-file-based/src/routes/__root.ts b/examples/angular/basic-file-based/src/routes/__root.ts new file mode 100644 index 00000000000..46ea8da6fc9 --- /dev/null +++ b/examples/angular/basic-file-based/src/routes/__root.ts @@ -0,0 +1,58 @@ +import { Component } from '@angular/core' +import { + Link, + Outlet, + createRootRoute, +} from '@tanstack/angular-router-experimental' +import { TanStackRouterDevtools } from '@tanstack/angular-router-devtools' + +export const Route = createRootRoute({ + component: () => RootComponent, + notFoundComponent: () => NotFoundComponent, +}) + +@Component({ + selector: 'root-route', + standalone: true, + template: ` + +
+ + + `, + imports: [Outlet, Link, TanStackRouterDevtools], +}) +class RootComponent {} + +@Component({ + selector: 'not-found', + standalone: true, + template: ` +
+

This is the notFoundComponent configured on root route

+ Start Over +
+ `, + imports: [Link], +}) +class NotFoundComponent {} diff --git a/examples/angular/basic-file-based/src/routes/_pathlessLayout.ts b/examples/angular/basic-file-based/src/routes/_pathlessLayout.ts new file mode 100644 index 00000000000..157529d412e --- /dev/null +++ b/examples/angular/basic-file-based/src/routes/_pathlessLayout.ts @@ -0,0 +1,19 @@ +import { Component } from '@angular/core' +import { createFileRoute, Outlet } from '@tanstack/angular-router-experimental' + +export const Route = createFileRoute('/_pathlessLayout')({ + component: () => PathlessLayoutComponent, +}) + +@Component({ + selector: 'route-component', + standalone: true, + template: ` +
+
I'm a pathless layout
+
+
+ `, + imports: [Outlet], +}) +class PathlessLayoutComponent {} diff --git a/examples/angular/basic-file-based/src/routes/_pathlessLayout/_nested-layout.ts b/examples/angular/basic-file-based/src/routes/_pathlessLayout/_nested-layout.ts new file mode 100644 index 00000000000..faedf2e1c5c --- /dev/null +++ b/examples/angular/basic-file-based/src/routes/_pathlessLayout/_nested-layout.ts @@ -0,0 +1,23 @@ +import { Component } from '@angular/core' +import { createFileRoute, Link, Outlet } from '@tanstack/angular-router-experimental' + +export const Route = createFileRoute('/_pathlessLayout/_nested-layout')({ + component: () => NestedLayoutComponent, +}) + +@Component({ + selector: 'route-component', + standalone: true, + template: ` +
+
I'm a nested pathless layout
+ +
+
+ `, + imports: [Link, Outlet], +}) +class NestedLayoutComponent {} diff --git a/examples/angular/basic-file-based/src/routes/_pathlessLayout/_nested-layout/route-a.ts b/examples/angular/basic-file-based/src/routes/_pathlessLayout/_nested-layout/route-a.ts new file mode 100644 index 00000000000..9dcc8fe57a6 --- /dev/null +++ b/examples/angular/basic-file-based/src/routes/_pathlessLayout/_nested-layout/route-a.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core' +import { createFileRoute } from '@tanstack/angular-router-experimental' + +export const Route = createFileRoute('/_pathlessLayout/_nested-layout/route-a')({ + component: () => RouteAComponent, +}) + +@Component({ + selector: 'route-component', + standalone: true, + template: `
I'm layout A!
`, +}) +class RouteAComponent {} diff --git a/examples/angular/basic-file-based/src/routes/_pathlessLayout/_nested-layout/route-b.ts b/examples/angular/basic-file-based/src/routes/_pathlessLayout/_nested-layout/route-b.ts new file mode 100644 index 00000000000..37e77920251 --- /dev/null +++ b/examples/angular/basic-file-based/src/routes/_pathlessLayout/_nested-layout/route-b.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core' +import { createFileRoute } from '@tanstack/angular-router-experimental' + +export const Route = createFileRoute('/_pathlessLayout/_nested-layout/route-b')({ + component: () => RouteBComponent, +}) + +@Component({ + selector: 'route-component', + standalone: true, + template: `
I'm layout B!
`, +}) +class RouteBComponent {} diff --git a/examples/angular/basic-file-based/src/routes/anchor.ts b/examples/angular/basic-file-based/src/routes/anchor.ts new file mode 100644 index 00000000000..dd2ed2dde9c --- /dev/null +++ b/examples/angular/basic-file-based/src/routes/anchor.ts @@ -0,0 +1,60 @@ +import { Component } from '@angular/core' +import { createFileRoute, Link } from '@tanstack/angular-router-experimental' + +export const Route = createFileRoute('/anchor')({ + component: () => AnchorComponent, +}) + +@Component({ + selector: 'route-component', + standalone: true, + template: ` +
+ +
+
+

Default Anchor

+
+
+

No Scroll Into View

+
+
+

Smooth Scroll

+
+
+
+ `, + imports: [Link], +}) +class AnchorComponent { + route = Route +} diff --git a/examples/angular/basic-file-based/src/routes/index.ts b/examples/angular/basic-file-based/src/routes/index.ts new file mode 100644 index 00000000000..c6feb029e0a --- /dev/null +++ b/examples/angular/basic-file-based/src/routes/index.ts @@ -0,0 +1,17 @@ +import { Component } from '@angular/core' +import { createFileRoute } from '@tanstack/angular-router-experimental' + +export const Route = createFileRoute('/')({ + component: () => IndexComponent, +}) + +@Component({ + selector: 'route-component', + standalone: true, + template: ` +
+

Welcome Home!

+
+ `, +}) +class IndexComponent {} diff --git a/examples/angular/basic-file-based/src/routes/posts.$postId.ts b/examples/angular/basic-file-based/src/routes/posts.$postId.ts new file mode 100644 index 00000000000..b2f4eac0e41 --- /dev/null +++ b/examples/angular/basic-file-based/src/routes/posts.$postId.ts @@ -0,0 +1,46 @@ +import { Component } from '@angular/core' +import { + createFileRoute, + injectErrorState, +} from '@tanstack/angular-router-experimental' +import { fetchPost } from '../posts' + +export const Route = createFileRoute('/posts/$postId')({ + loader: ({ params }) => fetchPost(params.postId), + errorComponent: () => PostErrorComponent, + notFoundComponent: () => PostNotFoundComponent, + component: () => PostComponent, +}) + +@Component({ + selector: 'post-error', + standalone: true, + template: ` +
Error: {{ errorState().error.message }}
+ + `, +}) +class PostErrorComponent { + errorState = injectErrorState() +} + +@Component({ + selector: 'post-not-found', + standalone: true, + template: `

Post not found

`, +}) +class PostNotFoundComponent {} + +@Component({ + selector: 'route-component', + standalone: true, + template: ` +
+

{{ post().title }}

+
{{ post().body }}
+
+ `, +}) +class PostComponent { + post = Route.injectLoaderData() +} diff --git a/examples/angular/basic-file-based/src/routes/posts.index.ts b/examples/angular/basic-file-based/src/routes/posts.index.ts new file mode 100644 index 00000000000..d042a16895b --- /dev/null +++ b/examples/angular/basic-file-based/src/routes/posts.index.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core' +import { createFileRoute } from '@tanstack/angular-router-experimental' + +export const Route = createFileRoute('/posts/')({ + component: () => PostsIndexComponent, +}) + +@Component({ + selector: 'route-component', + standalone: true, + template: `
Select a post.
`, +}) +class PostsIndexComponent {} diff --git a/examples/angular/basic-file-based/src/routes/posts.route.ts b/examples/angular/basic-file-based/src/routes/posts.route.ts new file mode 100644 index 00000000000..4b6cdc632a9 --- /dev/null +++ b/examples/angular/basic-file-based/src/routes/posts.route.ts @@ -0,0 +1,47 @@ +import { Component, computed } from '@angular/core' +import { + createFileRoute, + Link, + Outlet, +} from '@tanstack/angular-router-experimental' +import { fetchPosts } from '../posts' + +export const Route = createFileRoute('/posts')({ + loader: fetchPosts, + component: () => PostsLayoutComponent, +}) + +@Component({ + selector: 'route-component', + standalone: true, + template: ` +
+ +
+ +
+ `, + imports: [Link, Outlet], +}) +class PostsLayoutComponent { + posts = Route.injectLoaderData() + postsWithFake = computed(() => [ + ...this.posts(), + { id: 'i-do-not-exist', title: 'Non-existent Post' }, + ]) +} diff --git a/examples/angular/basic-file-based/src/styles.css b/examples/angular/basic-file-based/src/styles.css new file mode 100644 index 00000000000..37a1064738a --- /dev/null +++ b/examples/angular/basic-file-based/src/styles.css @@ -0,0 +1,21 @@ +@import 'tailwindcss'; + +@layer base { + *, + ::after, + ::before, + ::backdrop, + ::file-selector-button { + border-color: var(--color-gray-200, currentcolor); + } +} + +html { + color-scheme: light dark; +} +* { + @apply border-gray-200 dark:border-gray-800; +} +body { + @apply bg-gray-50 text-gray-950 dark:bg-gray-900 dark:text-gray-200; +} diff --git a/examples/angular/basic-file-based/tsconfig.app.json b/examples/angular/basic-file-based/tsconfig.app.json new file mode 100644 index 00000000000..8426ad9558b --- /dev/null +++ b/examples/angular/basic-file-based/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.spec.ts"] +} diff --git a/examples/angular/basic-file-based/tsconfig.json b/examples/angular/basic-file-based/tsconfig.json new file mode 100644 index 00000000000..8c124a823d4 --- /dev/null +++ b/examples/angular/basic-file-based/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/out-tsc", + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "esModuleInterop": true, + "sourceMap": true, + "declaration": false, + "experimentalDecorators": true, + "moduleResolution": "bundler", + "importHelpers": true, + "target": "ES2022", + "module": "ES2022", + "lib": ["ES2022", "dom"], + "useDefineForClassFields": false + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + }, + "include": ["src/**/*.ts"] +} diff --git a/examples/angular/basic-file-based/tsr.config.json b/examples/angular/basic-file-based/tsr.config.json new file mode 100644 index 00000000000..a6e9abd5e53 --- /dev/null +++ b/examples/angular/basic-file-based/tsr.config.json @@ -0,0 +1,5 @@ +{ + "target": "angular", + "routesDirectory": "./src/routes", + "generatedRouteTree": "./src/routeTree.gen.ts" +} diff --git a/examples/angular/basic-file-based/vite.config.ts b/examples/angular/basic-file-based/vite.config.ts new file mode 100644 index 00000000000..137b49cf8ea --- /dev/null +++ b/examples/angular/basic-file-based/vite.config.ts @@ -0,0 +1,18 @@ +import { defineConfig } from 'vite' +import angular from '@analogjs/vite-plugin-angular' +import { tanstackRouter } from '@tanstack/router-plugin/vite' +import tailwindcss from '@tailwindcss/vite' + +export default defineConfig({ + plugins: [ + tailwindcss(), + tanstackRouter({ + target: 'angular', + routesDirectory: './src/routes', + generatedRouteTree: './src/routeTree.gen.ts', + }), + angular({ + tsconfig: './tsconfig.json', + }), + ], +}) diff --git a/examples/angular/basic/.editorconfig b/examples/angular/basic/.editorconfig new file mode 100644 index 00000000000..f166060da1c --- /dev/null +++ b/examples/angular/basic/.editorconfig @@ -0,0 +1,17 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single +ij_typescript_use_double_quotes = false + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/examples/angular/basic/.gitignore b/examples/angular/basic/.gitignore new file mode 100644 index 00000000000..c0a199b30cb --- /dev/null +++ b/examples/angular/basic/.gitignore @@ -0,0 +1,43 @@ +# See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files. + +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# Miscellaneous +.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings +__screenshots__/ + +# System files +.DS_Store +Thumbs.db diff --git a/examples/angular/basic/.vscode/extensions.json b/examples/angular/basic/.vscode/extensions.json new file mode 100644 index 00000000000..77b374577de --- /dev/null +++ b/examples/angular/basic/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 + "recommendations": ["angular.ng-template"] +} diff --git a/examples/angular/basic/.vscode/launch.json b/examples/angular/basic/.vscode/launch.json new file mode 100644 index 00000000000..925af837050 --- /dev/null +++ b/examples/angular/basic/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "ng serve", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: start", + "url": "http://localhost:4200/" + }, + { + "name": "ng test", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: test", + "url": "http://localhost:9876/debug.html" + } + ] +} diff --git a/examples/angular/basic/.vscode/tasks.json b/examples/angular/basic/.vscode/tasks.json new file mode 100644 index 00000000000..244306f98af --- /dev/null +++ b/examples/angular/basic/.vscode/tasks.json @@ -0,0 +1,42 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "start", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "Changes detected" + }, + "endsPattern": { + "regexp": "bundle generation (complete|failed)" + } + } + } + }, + { + "type": "npm", + "script": "test", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "Changes detected" + }, + "endsPattern": { + "regexp": "bundle generation (complete|failed)" + } + } + } + } + ] +} diff --git a/examples/angular/basic/README.md b/examples/angular/basic/README.md new file mode 100644 index 00000000000..6bf146f8b52 --- /dev/null +++ b/examples/angular/basic/README.md @@ -0,0 +1,59 @@ +# Angular + +This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 21.0.4. + +## Development server + +To start a local development server, run: + +```bash +ng serve +``` + +Once the server is running, open your browser and navigate to `http://localhost:4200/`. The application will automatically reload whenever you modify any of the source files. + +## Code scaffolding + +Angular CLI includes powerful code scaffolding tools. To generate a new component, run: + +```bash +ng generate component component-name +``` + +For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run: + +```bash +ng generate --help +``` + +## Building + +To build the project run: + +```bash +ng build +``` + +This will compile your project and store the build artifacts in the `dist/` directory. By default, the production build optimizes your application for performance and speed. + +## Running unit tests + +To execute unit tests with the [Vitest](https://vitest.dev/) test runner, use the following command: + +```bash +ng test +``` + +## Running end-to-end tests + +For end-to-end (e2e) testing, run: + +```bash +ng e2e +``` + +Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs. + +## Additional Resources + +For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page. diff --git a/examples/angular/basic/angular.json b/examples/angular/basic/angular.json new file mode 100644 index 00000000000..577fe8ee3bd --- /dev/null +++ b/examples/angular/basic/angular.json @@ -0,0 +1,72 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "cli": { + "packageManager": "pnpm", + "analytics": false + }, + "newProjectRoot": "projects", + "projects": { + "angular": { + "projectType": "application", + "schematics": {}, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular/build:application", + "options": { + "browser": "src/main.ts", + "tsConfig": "tsconfig.app.json", + "assets": [ + { + "glob": "**/*", + "input": "public" + } + ], + "styles": ["src/styles.css"] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kB", + "maximumError": "1MB" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "4kB", + "maximumError": "8kB" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular/build:dev-server", + "configurations": { + "production": { + "buildTarget": "angular:build:production" + }, + "development": { + "buildTarget": "angular:build:development" + } + }, + "defaultConfiguration": "development" + }, + "test": { + "builder": "@angular/build:unit-test" + } + } + } + } +} diff --git a/examples/angular/basic/package.json b/examples/angular/basic/package.json new file mode 100644 index 00000000000..018b391c821 --- /dev/null +++ b/examples/angular/basic/package.json @@ -0,0 +1,45 @@ +{ + "name": "tanstack-router-angular-example-basic", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test" + }, + "prettier": { + "printWidth": 100, + "singleQuote": true, + "overrides": [ + { + "files": "*.html", + "options": { + "parser": "angular" + } + } + ] + }, + "private": true, + "packageManager": "pnpm@10.24.0", + "dependencies": { + "@angular/common": "21.0.4", + "@angular/compiler": "21.0.4", + "@angular/core": "21.0.4", + "@angular/forms": "21.0.4", + "@angular/platform-browser": "21.0.4", + "@tanstack/angular-router-experimental": "workspace:^", + "@tanstack/angular-router-devtools": "workspace:^", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zod": "^4.3.4" + }, + "devDependencies": { + "@angular/build": "21.0.4", + "@angular/cli": "21.0.4", + "@angular/compiler-cli": "21.0.4", + "jsdom": "^27.1.0", + "typescript": "~5.9.2", + "vitest": "^4.0.8" + } +} diff --git a/examples/angular/basic/public/favicon.ico b/examples/angular/basic/public/favicon.ico new file mode 100644 index 00000000000..57614f9c967 Binary files /dev/null and b/examples/angular/basic/public/favicon.ico differ diff --git a/examples/angular/basic/src/app/app.config.ts b/examples/angular/basic/src/app/app.config.ts new file mode 100644 index 00000000000..800db519f83 --- /dev/null +++ b/examples/angular/basic/src/app/app.config.ts @@ -0,0 +1,5 @@ +import { ApplicationConfig, provideBrowserGlobalErrorListeners } from '@angular/core' + +export const appConfig: ApplicationConfig = { + providers: [provideBrowserGlobalErrorListeners()], +} diff --git a/examples/angular/basic/src/app/app.css b/examples/angular/basic/src/app/app.css new file mode 100644 index 00000000000..e69de29bb2d diff --git a/examples/angular/basic/src/app/app.html b/examples/angular/basic/src/app/app.html new file mode 100644 index 00000000000..bfa885a599f --- /dev/null +++ b/examples/angular/basic/src/app/app.html @@ -0,0 +1,321 @@ + + +
+
+
+ +

Hello, {{ title() }}

+

Congratulations! Your app is running. 🎉

+
+ +
+
+ @for (item of [ { title: 'Explore the Docs', link: 'https://angular.dev' }, { title: 'Learn + with Tutorials', link: 'https://angular.dev/tutorials' }, { title: 'Prompt and best + practices for AI', link: 'https://angular.dev/ai/develop-with-ai'}, { title: 'CLI Docs', + link: 'https://angular.dev/tools/cli' }, { title: 'Angular Language Service', link: + 'https://angular.dev/tools/language-service' }, { title: 'Angular DevTools', link: + 'https://angular.dev/tools/devtools' }, ]; track item.title) { + + {{ item.title }} + + + + + } +
+ +
+
+
diff --git a/examples/angular/basic/src/app/app.spec.ts b/examples/angular/basic/src/app/app.spec.ts new file mode 100644 index 00000000000..07f925593f4 --- /dev/null +++ b/examples/angular/basic/src/app/app.spec.ts @@ -0,0 +1,23 @@ +import { TestBed } from '@angular/core/testing' +import { App } from './app' + +describe('App', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [App], + }).compileComponents() + }) + + it('should create the app', () => { + const fixture = TestBed.createComponent(App) + const app = fixture.componentInstance + expect(app).toBeTruthy() + }) + + it('should render title', async () => { + const fixture = TestBed.createComponent(App) + await fixture.whenStable() + const compiled = fixture.nativeElement as HTMLElement + expect(compiled.querySelector('h1')?.textContent).toContain('Hello, angular') + }) +}) diff --git a/examples/angular/basic/src/app/app.ts b/examples/angular/basic/src/app/app.ts new file mode 100644 index 00000000000..8986f4f57dd --- /dev/null +++ b/examples/angular/basic/src/app/app.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core' +import { RouterProvider } from '@tanstack/angular-router-experimental' +import { router } from './router' + +@Component({ + selector: 'app-root', + imports: [RouterProvider], + template: ``, +}) +export class App { + router = router +} diff --git a/examples/angular/basic/src/app/router.ts b/examples/angular/basic/src/app/router.ts new file mode 100644 index 00000000000..60598986977 --- /dev/null +++ b/examples/angular/basic/src/app/router.ts @@ -0,0 +1,21 @@ +import { createRouter } from '@tanstack/angular-router-experimental' +import { Route as HomeRoute } from './routes/home.route' +import { Route as AboutRoute } from './routes/about.route' +import { Route as AboutAngularRoute } from './routes/about.angular.route' +import { Route as PostsRoute } from './routes/posts.route' +import { Route as PostDetailRoute } from './routes/posts.$postId.route' +import { Route as RootRoute } from './routes/root.route' + +export const routeTree = RootRoute.addChildren([ + HomeRoute, + AboutRoute.addChildren([AboutAngularRoute]), + PostsRoute.addChildren([PostDetailRoute]), +]) + +export const router = createRouter({ routeTree, defaultPreload: 'render' }) + +declare module '@tanstack/angular-router-experimental' { + interface Register { + router: typeof router + } +} diff --git a/examples/angular/basic/src/app/routes/about.angular.route.ts b/examples/angular/basic/src/app/routes/about.angular.route.ts new file mode 100644 index 00000000000..2a306c21f05 --- /dev/null +++ b/examples/angular/basic/src/app/routes/about.angular.route.ts @@ -0,0 +1,72 @@ +import { Component } from '@angular/core'; +import { createRoute } from '@tanstack/angular-router-experimental'; +import { Route as AboutRoute } from './about.route'; + +@Component({ + selector: 'app-about-angular', + template: ` +
+

About Angular

+

This is a nested route under the About page.

+

+ TanStack Router provides excellent type safety and developer experience for Angular + applications. +

+
+

Key Features:

+
    +
  • Type-safe routing with full TypeScript support
  • +
  • Built-in data loading with loaders
  • +
  • Search parameter validation
  • +
  • Nested routing support
  • +
  • Programmatic navigation
  • +
+
+
+ `, + styles: [ + ` + .about-angular { + padding: 2rem; + max-width: 800px; + margin: 0 auto; + } + h2 { + color: #333; + margin-bottom: 1rem; + } + h3 { + color: #333; + margin-top: 2rem; + margin-bottom: 1rem; + } + p { + color: #666; + line-height: 1.6; + margin-bottom: 1rem; + } + .features { + background-color: #f5f5f5; + padding: 1.5rem; + border-radius: 8px; + margin-top: 1.5rem; + } + ul { + margin: 0; + padding-left: 1.5rem; + color: #666; + } + li { + margin-bottom: 0.5rem; + line-height: 1.6; + } + `, + ], +}) +class AboutAngularComponent {} + +export const Route = createRoute({ + getParentRoute: () => AboutRoute, + path: 'angular', + component: () => AboutAngularComponent, +}); diff --git a/examples/angular/basic/src/app/routes/about.route.ts b/examples/angular/basic/src/app/routes/about.route.ts new file mode 100644 index 00000000000..f7f63438067 --- /dev/null +++ b/examples/angular/basic/src/app/routes/about.route.ts @@ -0,0 +1,80 @@ +import { Component } from '@angular/core'; +import { createRoute, Link } from '@tanstack/angular-router-experimental'; +import { Route as RootRoute } from './root.route'; +import { Outlet, injectNavigate, injectRouterState } from '@tanstack/angular-router-experimental'; + +@Component({ + selector: 'app-about', + imports: [Outlet, Link], + template: ` +
+

About

+

This is the about page.

+

This example demonstrates how to use TanStack Router with Angular.

+ + + + +
+ `, + styles: [ + ` + .about { + padding: 2rem; + } + h2 { + color: #333; + margin-bottom: 1rem; + } + p { + color: #666; + line-height: 1.6; + margin-bottom: 1rem; + } + .about-nav { + display: flex; + gap: 1rem; + margin: 2rem 0; + padding-bottom: 1rem; + border-bottom: 1px solid #eee; + } + .about-nav a { + color: #007bff; + text-decoration: none; + padding: 0.5rem 1rem; + border-radius: 4px; + transition: background-color 0.2s; + } + .about-nav a:hover { + background-color: #f0f0f0; + } + .about-nav a.active { + background-color: #007bff; + color: white; + } + `, + ], +}) +class AboutComponent { + navigate = injectNavigate({ from: '/about' }); + routerState = injectRouterState(); + + isActive(path: string): boolean { + return this.routerState().location.pathname === path; + } +} + +export const Route = createRoute({ + getParentRoute: () => RootRoute, + path: '/about', + component: () => AboutComponent, +}); diff --git a/examples/angular/basic/src/app/routes/home.route.ts b/examples/angular/basic/src/app/routes/home.route.ts new file mode 100644 index 00000000000..99bcc7d0494 --- /dev/null +++ b/examples/angular/basic/src/app/routes/home.route.ts @@ -0,0 +1,36 @@ +import { Component } from '@angular/core'; +import { createRoute } from '@tanstack/angular-router-experimental'; +import { Route as RootRoute } from './root.route'; + +@Component({ + selector: 'app-home', + template: ` +
+

Welcome Home!

+

This is the home page of our simple Angular router example.

+

Navigate to the About page using the link in the navigation above.

+
+ `, + styles: [ + ` + .home { + padding: 2rem; + } + h2 { + color: #333; + margin-bottom: 1rem; + } + p { + color: #666; + line-height: 1.6; + } + `, + ], +}) +class HomeComponent {} + +export const Route = createRoute({ + getParentRoute: () => RootRoute, + path: '/', + component: () => HomeComponent, +}); diff --git a/examples/angular/basic/src/app/routes/posts.$postId.route.ts b/examples/angular/basic/src/app/routes/posts.$postId.route.ts new file mode 100644 index 00000000000..9fc0c019553 --- /dev/null +++ b/examples/angular/basic/src/app/routes/posts.$postId.route.ts @@ -0,0 +1,228 @@ +import { Component } from '@angular/core'; +import { createRoute } from '@tanstack/angular-router-experimental'; +import { Route as PostsRoute } from './posts.route'; + +// Mock data +const POSTS: Record = { + '1': { + id: '1', + title: 'First Post', + content: 'This is the first post content. It contains detailed information about the topic.', + author: 'Alice', + }, + '2': { + id: '2', + title: 'Second Post', + content: 'This is the second post content. It discusses various aspects of the subject.', + author: 'Bob', + }, + '3': { + id: '3', + title: 'Third Post', + content: 'This is the third post content. It provides insights and analysis.', + author: 'Charlie', + }, + '4': { + id: '4', + title: 'Fourth Post', + content: 'This is the fourth post content. It explores different perspectives.', + author: 'Alice', + }, + '5': { + id: '5', + title: 'Fifth Post', + content: 'This is the fifth post content. It concludes the discussion.', + author: 'Bob', + }, +}; + +@Component({ + selector: 'app-post-detail', + template: ` +
+ @if (post()) { + + +
+

{{ post()!.title }}

+

+ By {{ post()!.author }} + Post ID: {{ post()!.id }} +

+
+

{{ post()!.content }}

+
+
+ + + } @else { +
+

Post Not Found

+

Post with ID "{{ params().postId }}" does not exist.

+ +
+ } +
+ `, + styles: [ + ` + .post-detail { + padding: 2rem; + max-width: 800px; + margin: 0 auto; + } + .back-button { + background-color: #007bff; + color: white; + border: none; + padding: 0.5rem 1rem; + border-radius: 4px; + cursor: pointer; + margin-bottom: 2rem; + font-size: 1rem; + } + .back-button:hover { + background-color: #0056b3; + } + article { + background-color: white; + padding: 2rem; + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + margin-bottom: 2rem; + } + article h1 { + margin: 0 0 1rem 0; + color: #333; + } + .meta { + display: flex; + gap: 1rem; + margin-bottom: 1.5rem; + padding-bottom: 1rem; + border-bottom: 1px solid #eee; + color: #666; + font-size: 0.9rem; + } + .meta .author { + font-weight: 500; + } + .content { + color: #333; + line-height: 1.6; + } + .navigation { + background-color: #f5f5f5; + padding: 1.5rem; + border-radius: 8px; + } + .navigation h3 { + margin: 0 0 1rem 0; + color: #333; + } + .nav-buttons { + display: flex; + gap: 0.5rem; + flex-wrap: wrap; + } + .nav-buttons button { + padding: 0.5rem 1rem; + border: 1px solid #ddd; + background-color: white; + border-radius: 4px; + cursor: pointer; + transition: all 0.2s; + } + .nav-buttons button:hover { + background-color: #f0f0f0; + } + .nav-buttons button.active { + background-color: #007bff; + color: white; + border-color: #007bff; + } + .not-found { + text-align: center; + padding: 3rem; + background-color: #fff3cd; + border: 1px solid #ffc107; + border-radius: 8px; + } + .not-found h2 { + color: #856404; + margin-bottom: 1rem; + } + .not-found p { + color: #856404; + margin-bottom: 1.5rem; + } + .not-found button { + background-color: #007bff; + color: white; + border: none; + padding: 0.5rem 1rem; + border-radius: 4px; + cursor: pointer; + } + `, + ], +}) +class PostDetailComponent { + // Inject route params + params = Route.injectParams(); + navigate = Route.injectNavigate(); + + // Get post from loader data + post = Route.injectLoaderData(); + + navigateToPost(postId: string) { + this.navigate({ + to: '/posts/$postId', + params: { postId }, + }); + } + + goBack() { + this.navigate({ + to: '/posts', + }); + } +} + +export const Route = createRoute({ + getParentRoute: () => PostsRoute, + path: '/$postId', + component: () => PostDetailComponent, + loader: async ({ params }) => { + // Simulate network delay + await new Promise((resolve) => setTimeout(resolve, 500)); + + const postId = params.postId; + const post = POSTS[postId]; + + // Return null if post not found (component handles this case) + return post || null; + }, +}); diff --git a/examples/angular/basic/src/app/routes/posts.route.ts b/examples/angular/basic/src/app/routes/posts.route.ts new file mode 100644 index 00000000000..b5d34139053 --- /dev/null +++ b/examples/angular/basic/src/app/routes/posts.route.ts @@ -0,0 +1,213 @@ +import { Component, computed } from '@angular/core'; +import { createRoute, Outlet, Link } from '@tanstack/angular-router-experimental'; +import { Route as RootRoute } from './root.route'; +import { injectSearch, injectNavigate } from '@tanstack/angular-router-experimental'; +import { z } from 'zod'; + +// Mock data +const POSTS = [ + { id: '1', title: 'First Post', content: 'This is the first post content.', author: 'Alice' }, + { id: '2', title: 'Second Post', content: 'This is the second post content.', author: 'Bob' }, + { id: '3', title: 'Third Post', content: 'This is the third post content.', author: 'Charlie' }, + { id: '4', title: 'Fourth Post', content: 'This is the fourth post content.', author: 'Alice' }, + { id: '5', title: 'Fifth Post', content: 'This is the fifth post content.', author: 'Bob' }, +]; + +@Component({ + selector: 'app-posts', + imports: [Outlet, Link], + template: ` +
+ + +

Posts

+ +
+ + + + + +
+ +
+ @for (post of filteredPosts(); track post.id) { +
+

{{ post.title }}

+

By {{ post.author }}

+

{{ post.content }}

+ View Post +
+ } +
+ + @if (filteredPosts().length === 0) { +

No posts found.

+ } +
+ `, + styles: [ + ` + .posts { + padding: 2rem; + } + h2 { + color: #333; + margin-bottom: 1.5rem; + } + .controls { + display: flex; + gap: 1rem; + margin-bottom: 2rem; + padding: 1rem; + background-color: #f5f5f5; + border-radius: 8px; + flex-wrap: wrap; + } + .controls label { + display: flex; + flex-direction: column; + gap: 0.5rem; + font-weight: 500; + } + .controls select, + .controls input { + padding: 0.5rem; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 1rem; + } + .posts-list { + display: grid; + gap: 1rem; + } + .post-card { + padding: 1.5rem; + border: 1px solid #ddd; + border-radius: 8px; + cursor: pointer; + transition: all 0.2s; + background-color: white; + } + .post-card:hover { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + transform: translateY(-2px); + } + .post-card h3 { + margin: 0 0 0.5rem 0; + color: #007bff; + } + .post-card .author { + color: #666; + font-size: 0.9rem; + margin: 0 0 0.5rem 0; + } + .post-card .content { + color: #333; + margin: 0; + } + .no-posts { + text-align: center; + color: #666; + padding: 2rem; + } + `, + ], +}) +class PostsComponent { + // Inject search params + search = injectSearch({ from: '/posts' }); + navigate = injectNavigate({ from: '/posts' }); + + // Computed filtered and sorted posts + filteredPosts = computed(() => { + const searchParams = this.search(); + let posts = [...POSTS]; + + // Filter by author + if (searchParams.author) { + posts = posts.filter((p) => p.author === searchParams.author); + } + + // Sort + const sortBy = searchParams.sort || 'id'; + posts.sort((a, b) => { + if (sortBy === 'id') { + return a.id.localeCompare(b.id); + } + return a[sortBy as keyof typeof a].localeCompare(b[sortBy as keyof typeof b] as string); + }); + + // Pagination (simple - just show first 3 for demo) + const page = searchParams.page || 1; + const pageSize = 3; + const start = (page - 1) * pageSize; + return posts.slice(start, start + pageSize); + }); + + updateAuthor(event: Event) { + const target = event.target as HTMLSelectElement; + this.navigate({ + to: '/posts', + search: { + ...this.search(), + author: target.value || undefined, + page: 1, // Reset to first page + }, + }); + } + + updateSort(event: Event) { + const target = event.target as HTMLSelectElement; + this.navigate({ + to: '/posts', + search: { + ...this.search(), + sort: target.value, + }, + }); + } + + updatePage(event: Event) { + const target = event.target as HTMLInputElement; + const page = parseInt(target.value, 10); + if (page > 0) { + this.navigate({ + to: '/posts', + search: { + ...this.search(), + page: page, + }, + }); + } + } +} + +export const Route = createRoute({ + getParentRoute: () => RootRoute, + path: '/posts', + component: () => PostsComponent, + validateSearch: z.object({ + author: z.string().optional(), + sort: z.string().optional(), + page: z.number().optional(), + }), +}); diff --git a/examples/angular/basic/src/app/routes/root.route.ts b/examples/angular/basic/src/app/routes/root.route.ts new file mode 100644 index 00000000000..7fcdd930240 --- /dev/null +++ b/examples/angular/basic/src/app/routes/root.route.ts @@ -0,0 +1,89 @@ +import { Component } from '@angular/core'; +import { + createRootRoute, + Outlet, + injectNavigate, + injectRouterState, + Link, +} from '@tanstack/angular-router-experimental'; +import { TanStackRouterDevtools } from '@tanstack/angular-router-devtools'; + +@Component({ + selector: 'app-root-layout', + imports: [Outlet, TanStackRouterDevtools, Link], + template: ` +
+ +
+ +
+ +
+ `, + styles: [ + ` + .app-container { + max-width: 800px; + margin: 0 auto; + padding: 2rem; + } + nav { + border-bottom: 2px solid #eee; + padding-bottom: 1rem; + margin-bottom: 2rem; + } + nav h1 { + margin: 0 0 1rem 0; + } + nav ul { + list-style: none; + padding: 0; + margin: 0; + display: flex; + gap: 1rem; + } + nav a { + text-decoration: none; + color: #007bff; + padding: 0.5rem 1rem; + border-radius: 4px; + } + nav a:hover { + background-color: #f0f0f0; + } + nav a.active { + font-weight: bold; + background-color: #e3f2fd; + } + main { + min-height: 400px; + } + `, + ], +}) +class RootLayout { + navigate = injectNavigate(); + routerState = injectRouterState(); + + isActive(path: string): boolean { + const currentPath = this.routerState().location.pathname; + return currentPath === path || currentPath.startsWith(path + '/'); + } +} + +export const Route = createRootRoute({ + component: () => RootLayout, +}); diff --git a/examples/angular/basic/src/index.html b/examples/angular/basic/src/index.html new file mode 100644 index 00000000000..86697fec533 --- /dev/null +++ b/examples/angular/basic/src/index.html @@ -0,0 +1,13 @@ + + + + + Angular + + + + + + + + diff --git a/examples/angular/basic/src/main.ts b/examples/angular/basic/src/main.ts new file mode 100644 index 00000000000..8192dca694e --- /dev/null +++ b/examples/angular/basic/src/main.ts @@ -0,0 +1,5 @@ +import { bootstrapApplication } from '@angular/platform-browser' +import { appConfig } from './app/app.config' +import { App } from './app/app' + +bootstrapApplication(App, appConfig).catch((err) => console.error(err)) diff --git a/examples/angular/basic/src/styles.css b/examples/angular/basic/src/styles.css new file mode 100644 index 00000000000..90d4ee0072c --- /dev/null +++ b/examples/angular/basic/src/styles.css @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/examples/angular/basic/tsconfig.app.json b/examples/angular/basic/tsconfig.app.json new file mode 100644 index 00000000000..a0dcc37c607 --- /dev/null +++ b/examples/angular/basic/tsconfig.app.json @@ -0,0 +1,11 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.spec.ts"] +} diff --git a/examples/angular/basic/tsconfig.json b/examples/angular/basic/tsconfig.json new file mode 100644 index 00000000000..2ab7442758f --- /dev/null +++ b/examples/angular/basic/tsconfig.json @@ -0,0 +1,33 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "compileOnSave": false, + "compilerOptions": { + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "isolatedModules": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "ES2022", + "module": "preserve" + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + }, + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/examples/angular/basic/tsconfig.spec.json b/examples/angular/basic/tsconfig.spec.json new file mode 100644 index 00000000000..26230b0b31d --- /dev/null +++ b/examples/angular/basic/tsconfig.spec.json @@ -0,0 +1,10 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": ["vitest/globals"] + }, + "include": ["src/**/*.d.ts", "src/**/*.spec.ts"] +} diff --git a/examples/angular/kitchen-sink/.postcssrc.json b/examples/angular/kitchen-sink/.postcssrc.json new file mode 100644 index 00000000000..e092dc7c1ef --- /dev/null +++ b/examples/angular/kitchen-sink/.postcssrc.json @@ -0,0 +1,5 @@ +{ + "plugins": { + "@tailwindcss/postcss": {} + } +} diff --git a/examples/angular/kitchen-sink/angular.json b/examples/angular/kitchen-sink/angular.json new file mode 100644 index 00000000000..631b8cbf228 --- /dev/null +++ b/examples/angular/kitchen-sink/angular.json @@ -0,0 +1,73 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "cli": { + "packageManager": "pnpm", + "analytics": false + }, + "newProjectRoot": "projects", + "projects": { + "angular-kitchen-sink": { + "projectType": "application", + "schematics": {}, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular/build:application", + "options": { + "conditions": ["module", "style"], + "browser": "src/main.ts", + "tsConfig": "tsconfig.app.json", + "assets": [ + { + "glob": "**/*", + "input": "public" + } + ], + "styles": ["src/styles.css"] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kB", + "maximumError": "1MB" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "4kB", + "maximumError": "8kB" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular/build:dev-server", + "configurations": { + "production": { + "buildTarget": "angular-kitchen-sink:build:production" + }, + "development": { + "buildTarget": "angular-kitchen-sink:build:development" + } + }, + "defaultConfiguration": "development" + }, + "test": { + "builder": "@angular/build:unit-test" + } + } + } + } +} diff --git a/examples/angular/kitchen-sink/package.json b/examples/angular/kitchen-sink/package.json new file mode 100644 index 00000000000..6271ebd4f74 --- /dev/null +++ b/examples/angular/kitchen-sink/package.json @@ -0,0 +1,50 @@ +{ + "name": "tanstack-router-angular-example-kitchen-sink", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test" + }, + "prettier": { + "printWidth": 100, + "singleQuote": true, + "overrides": [ + { + "files": "*.html", + "options": { + "parser": "angular" + } + } + ] + }, + "private": true, + "packageManager": "pnpm@10.24.0", + "dependencies": { + "@angular/common": "21.0.4", + "@angular/compiler": "21.0.4", + "@angular/core": "21.0.4", + "@angular/forms": "21.0.4", + "@angular/platform-browser": "21.0.4", + "@tanstack/angular-router-experimental": "workspace:^", + "@tanstack/angular-router-devtools": "workspace:^", + "immer": "^10.1.1", + "redaxios": "^0.5.1", + "rxjs": "~7.8.2", + "tslib": "^2.3.0", + "zod": "^3.24.2" + }, + "devDependencies": { + "@angular/build": "21.0.4", + "@angular/cli": "21.0.4", + "@angular/compiler-cli": "21.0.4", + "@tailwindcss/postcss": "^4.1.18", + "jsdom": "^27.1.0", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18", + "typescript": "~5.9.2", + "vitest": "^4.0.8" + } +} diff --git a/examples/angular/kitchen-sink/public/favicon.ico b/examples/angular/kitchen-sink/public/favicon.ico new file mode 100644 index 00000000000..1a1751676f7 Binary files /dev/null and b/examples/angular/kitchen-sink/public/favicon.ico differ diff --git a/examples/angular/kitchen-sink/src/expensive.route.ts b/examples/angular/kitchen-sink/src/expensive.route.ts new file mode 100644 index 00000000000..3794ed4cbeb --- /dev/null +++ b/examples/angular/kitchen-sink/src/expensive.route.ts @@ -0,0 +1,35 @@ +import { Component } from '@angular/core' +import { createLazyRoute, injectErrorState } from '@tanstack/angular-router-experimental' +import { injectRouteErrorHandler } from '@tanstack/angular-router-experimental/experimental' + +@Component({ + selector: 'app-expensive', + standalone: true, + template: ` +
+ I am an "expensive" component... which really just means that I was code-split 😉 +
+ + `, +}) +class ExpensiveComponent { + errorHandler = injectRouteErrorHandler({ from: '/expensive' }) + + throwError() { + this.errorHandler.throw(new Error('Test error')) + } +} + +export const Route = createLazyRoute('/expensive')({ + component: () => ExpensiveComponent, + // errorComponent: () => ExpensiveErrorComponent, +}) + +@Component({ + selector: 'app-expensive-error', + standalone: true, + template: `
It broke! {{ errorState.error.message }}
`, +}) +class ExpensiveErrorComponent { + errorState = injectErrorState() +} diff --git a/examples/angular/kitchen-sink/src/index.html b/examples/angular/kitchen-sink/src/index.html new file mode 100644 index 00000000000..7d9023c2dfc --- /dev/null +++ b/examples/angular/kitchen-sink/src/index.html @@ -0,0 +1,13 @@ + + + + + Angular Kitchen Sink + + + + + + + + diff --git a/examples/angular/kitchen-sink/src/injectMutation.ts b/examples/angular/kitchen-sink/src/injectMutation.ts new file mode 100644 index 00000000000..f8ef6a33b79 --- /dev/null +++ b/examples/angular/kitchen-sink/src/injectMutation.ts @@ -0,0 +1,40 @@ +import { signal } from '@angular/core' + +export function injectMutation(opts: { + fn: (variables: TVariables) => Promise + onSuccess?: (ctx: { data: TData }) => void | Promise +}) { + const submittedAt = signal(undefined) + const variables = signal(undefined) + const error = signal(undefined) + const data = signal(undefined) + const status = signal<'idle' | 'pending' | 'success' | 'error'>('idle') + + const mutate = async (vars: TVariables): Promise => { + status.set('pending') + submittedAt.set(Date.now()) + variables.set(vars) + // + try { + const result = await opts.fn(vars) + await opts.onSuccess?.({ data: result }) + status.set('success') + error.set(undefined) + data.set(result) + return result + } catch (err: any) { + status.set('error') + error.set(err) + throw err + } + } + + return { + status, + variables, + submittedAt, + mutate, + error, + data, + } +} diff --git a/examples/angular/kitchen-sink/src/main.ts b/examples/angular/kitchen-sink/src/main.ts new file mode 100644 index 00000000000..8c61bbdaa33 --- /dev/null +++ b/examples/angular/kitchen-sink/src/main.ts @@ -0,0 +1,1311 @@ +import { + Component, + computed, + effect, + EnvironmentInjector, + inject, + Injector, + input, + linkedSignal, + ProviderToken, + signal, +} from '@angular/core' +import './router-register' +import { bootstrapApplication } from '@angular/platform-browser' +import { + Outlet, + RouterProvider, + createRootRouteWithContext, + createRoute, + createRouter, + injectRouter, + injectRouterState, + Link, + LinkOptions, + notFound, + redirect, + retainSearchParams, + RouterContextOptions, +} from '@tanstack/angular-router-experimental' +import { TanStackRouterDevtoolsInProd } from '@tanstack/angular-router-devtools' +import { z } from 'zod' +import { injectMutation } from './injectMutation' +import './styles.css' +import { JsonPipe } from '@angular/common' +import { UsersService, InvoiceService, Invoice } from './services' + +@Component({ + selector: 'app-spinner', + standalone: true, + template: ` +
+ ⍥ +
+ `, +}) +class SpinnerComponent { + show = input(true) + wait = input<`delay-${number}` | undefined>(undefined) +} + +@Component({ + selector: 'app-invoice-fields', + standalone: true, + styles: ` + :host { + display: block; + } + `, + template: ` +
+

+ +

+
+ +
+
+ `, +}) +class InvoiceFieldsComponent { + invoice = input.required() + disabled = input(false) +} + +type UsersViewSortBy = 'name' | 'id' | 'email' + +type MissingUserData = { + userId: number +} + +function isMissingUserData(data: unknown): data is MissingUserData { + return ( + typeof data === 'object' && + data !== null && + typeof (data as { userId?: unknown }).userId === 'number' + ) +} + +@Component({ + selector: 'app-users-not-found', + standalone: true, + template: ` +
+

User not found

+

+ @if (userId() !== undefined) { + We couldn't find a user with ID {{ userId() }}. + } @else { + We couldn't find the requested user. + } +

+

Rendered by the "{{ routeId() }}" route.

+

Pick another user from the list on the left to continue.

+
+ `, +}) +class UsersNotFoundComponent { + data = signal(null) + routeId = signal('') + + userId = computed(() => { + const d = this.data() + return isMissingUserData(d) ? d.userId : undefined + }) +} + +const rootRoute = createRootRouteWithContext<{ + auth: Auth + inject: Injector['get'] +}>()({ + component: () => RootComponent, + errorComponent: () => ErrorComponent, +}) + +@Component({ + selector: 'app-router-spinner', + standalone: true, + imports: [SpinnerComponent], + template: ``, +}) +class RouterSpinnerComponent { + isLoading = injectRouterState({ select: (s) => s.status === 'pending' }) +} + +@Component({ + selector: 'app-top-loading-bar', + standalone: true, + styles: ` + @keyframes top-loader-indeterminate { + 0% { + transform: translateX(-110%); + } + 100% { + transform: translateX(260%); + } + } + + .top-loader-indeterminate { + animation: top-loader-indeterminate 1.1s linear infinite; + } + `, + template: ` +
+
+
+ `, +}) +class TopLoadingBarComponent { + isLoading = injectRouterState({ select: (s) => s.status === 'pending' }) +} + +@Component({ + selector: 'app-breadcrumbs', + standalone: true, + imports: [Link], + template: ` + @if (matchesWithCrumbs().length > 0) { + + } + `, +}) +class BreadcrumbsComponent { + routerState = injectRouterState() + + matchesWithCrumbs = computed(() => { + const state = this.routerState() + const matches = state.matches + + // Filter out pending matches + if (matches.some((match) => match.status === 'pending')) { + return [] + } + + // Filter matches that have loaderData.crumb + return matches.filter((match) => { + return match.loaderData && typeof match.loaderData === 'object' && 'crumb' in match.loaderData + }) as Array<{ id: string; pathname: string; loaderData: { crumb: string } }> + }) +} + +@Component({ + selector: 'app-root-layout', + standalone: true, + imports: [ + Outlet, + Link, + TopLoadingBarComponent, + RouterSpinnerComponent, + TanStackRouterDevtoolsInProd, + BreadcrumbsComponent, + ], + template: ` +
+ +
+

Kitchen Sink

+ +
+ +
+
+
+
+ @for (link of links(); track link[0]) { + + } +
+
+ +
+
+
+ + `, +}) +class RootComponent { + authSignal = signal(auth) + routerState = injectRouterState() + + links = computed(() => { + const currentAuth = this.authSignal() + const baseLinks: Array<[string, string]> = [ + ['/', 'Home'], + ['/dashboard', 'Dashboard'], + ['/expensive', 'Expensive'], + ['/route-a', 'Pathless Layout A'], + ['/route-b', 'Pathless Layout B'], + ['/profile', 'Profile'], + ] + if (currentAuth.status === 'loggedOut') { + return [...baseLinks, ['/login', 'Login']] + } + return baseLinks + }) + + isActive(path: string): boolean { + const currentPath = this.routerState().location.pathname + return currentPath === path || currentPath.startsWith(path + '/') + } +} + +const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, +}) + +@Component({ + selector: 'app-index', + standalone: true, + imports: [Link], + template: ` +
+
Welcome Home!
+
+ + 1 New Invoice + +
+
+ As you navigate around take note of the UX. It should feel suspense-like, where routes are + only rendered once all of their data and elements are ready. +
+ To exaggerate async effects, play with the artificial request delay slider in the + bottom-left corner. +
+ The last 2 sliders determine if link-hover preloading is enabled (and how long those + preloads stick around) and also whether to cache rendered route data (and for how long). + Both of these default to 0 (or off). +
+
+ `, +}) +class IndexComponent { + invoiceRoute = invoiceRoute +} + +const dashboardLayoutRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'dashboard', + loader: () => ({ crumb: 'Dashboard' }), + component: () => DashboardLayoutComponent, +}) + +@Component({ + selector: 'app-dashboard-layout', + standalone: true, + imports: [Outlet, Link], + template: ` +
+

Dashboard

+
+
+ @for (link of links; track link[0]) { + + {{ link[1] }} + + } +
+
+ + `, +}) +class DashboardLayoutComponent { + routerState = injectRouterState() + links: Array<[string, string, boolean?]> = [ + ['/dashboard', 'Summary', true], + ['/dashboard/invoices', 'Invoices'], + ['/dashboard/users', 'Users'], + ] + + isActive(path: string, exact?: boolean): boolean { + const currentPath = this.routerState().location.pathname + if (exact) { + return currentPath === path + } + return currentPath === path || currentPath.startsWith(path + '/') + } +} + +const dashboardIndexRoute = createRoute({ + getParentRoute: () => dashboardLayoutRoute, + path: '/', + loader: ({ context }) => { + const invoiceService = context.inject(InvoiceService) + return invoiceService.fetchInvoices() + }, + component: () => DashboardIndexComponent, +}) + +@Component({ + selector: 'app-dashboard-index', + standalone: true, + template: ` +
+
+ Welcome to the dashboard! You have + {{ invoices().length }} total invoices. +
+
+ `, +}) +class DashboardIndexComponent { + invoices = dashboardIndexRoute.injectLoaderData() +} + +const invoicesLayoutRoute = createRoute({ + getParentRoute: () => dashboardLayoutRoute, + path: 'invoices', + loader: ({ context }) => { + const invoiceService = context.inject(InvoiceService) + return invoiceService.fetchInvoices() + }, + component: () => InvoicesLayoutComponent, +}) + +@Component({ + selector: 'app-invoices-layout', + standalone: true, + imports: [Outlet, Link, SpinnerComponent], + preserveWhitespaces: false, + template: ` +
+ +
+ +
+
+ `, +}) +class InvoicesLayoutComponent { + invoices = invoicesLayoutRoute.injectLoaderData() + routerState = injectRouterState() + + isActive(path: string): boolean { + return ( + this.routerState().location.pathname === path || + this.routerState().location.pathname.startsWith(path + '/') + ) + } + + isPending(invoiceId: number): boolean { + const matches = this.routerState().matches + const match = matches.find( + (m) => m.routeId === invoiceRoute.id && m.params?.invoiceId === invoiceId, + ) + return match?.status === 'pending' || false + } +} + +const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesLayoutRoute, + path: '/', + component: () => InvoicesIndexComponent, +}) + +@Component({ + selector: 'app-invoices-index', + standalone: true, + imports: [InvoiceFieldsComponent, SpinnerComponent], + template: ` +
+
+
Create a new Invoice:
+ +
+ +
+ @if (createInvoiceMutation.status() === 'success') { +
+ Created! +
+ } @else if (createInvoiceMutation.status() === 'error') { +
+ Failed to create. +
+ } + +
+ `, +}) +class InvoicesIndexComponent { + router = injectRouter() + routerContext = invoicesIndexRoute.injectRouteContext() + + createInvoiceMutation = injectMutation({ + fn: (variables: Partial) => { + const context = this.routerContext() + const invoiceService = context.inject(InvoiceService) + return invoiceService.postInvoice(variables) + }, + onSuccess: () => this.router.invalidate(), + }) + + emptyInvoice = { + body: '', + title: '', + } as Invoice + + onSubmit(event: Event) { + event.preventDefault() + event.stopPropagation() + const form = event.target as HTMLFormElement + const formData = new FormData(form) + this.createInvoiceMutation.mutate({ + title: formData.get('title') as string, + body: formData.get('body') as string, + }) + } +} + +const invoiceRoute = createRoute({ + getParentRoute: () => invoicesLayoutRoute, + path: '$invoiceId', + params: { + parse: (params) => ({ + invoiceId: z.number().int().parse(Number(params.invoiceId)), + }), + stringify: ({ invoiceId }) => ({ invoiceId: `${invoiceId}` }), + }, + validateSearch: (search) => + z + .object({ + showNotes: z.boolean().optional(), + notes: z.string().optional(), + }) + .parse(search), + loader: async ({ params: { invoiceId }, context }) => { + const invoiceService = context.inject(InvoiceService) + const invoice = await invoiceService.fetchInvoiceById(invoiceId) + if (!invoice) throw notFound() + return invoice + }, + component: () => InvoiceComponent, + pendingComponent: () => SpinnerComponent, +}) + +@Component({ + selector: 'app-invoice', + standalone: true, + imports: [Link, InvoiceFieldsComponent], + template: ` +
+ +
+ + {{ search().showNotes ? 'Close Notes' : 'Show Notes' }} + + @if (search().showNotes) { +
+
+ +
+ Notes are stored in the URL. Try copying the URL into a new tab! +
+
+ } +
+
+ +
+ @if ( + updateInvoiceMutation.variables()?.id === invoice().id && + updateInvoiceMutation.submittedAt() + ) { +
+ @if (updateInvoiceMutation.status() === 'success') { +
+ Saved! +
+ } @else if (updateInvoiceMutation.status() === 'error') { +
+ Failed to save. +
+ } +
+ } + + `, +}) +class InvoiceComponent { + router = injectRouter() + search = invoiceRoute.injectSearch() + navigate = invoiceRoute.injectNavigate() + invoice = invoiceRoute.injectLoaderData() + routerContext = invoiceRoute.injectRouteContext() + updateInvoiceMutation = injectMutation({ + fn: (variables: Partial) => { + const context = this.routerContext() + const invoiceService = context.inject(InvoiceService) + return invoiceService.patchInvoice(this.invoice().id, variables) + }, + onSuccess: () => this.router.invalidate(), + }) + notes = signal(this.search().notes ?? '') + + #updateNotes = effect(() => { + const currentNotes = this.notes() + this.navigate({ + search: (old) => ({ + ...old, + notes: currentNotes ? currentNotes : undefined, + }), + params: true, + replace: true, + }) + }) + + onSubmit(event: Event) { + event.preventDefault() + event.stopPropagation() + const form = event.target as HTMLFormElement + const formData = new FormData(form) + this.updateInvoiceMutation.mutate({ + id: this.invoice().id, + title: formData.get('title') as string, + body: formData.get('body') as string, + }) + } + + toggleSearchNotesLinkOptions() { + return { + to: '/dashboard/invoices/$invoiceId', + params: { invoiceId: this.invoice().id }, + search: (old) => ({ + ...old, + showNotes: old.showNotes ? undefined : true, + }), + } as LinkOptions + } +} + +const usersLayoutRoute = createRoute({ + getParentRoute: () => dashboardLayoutRoute, + path: 'users', + validateSearch: z.object({ + usersView: z + .object({ + sortBy: z.enum(['name', 'id', 'email']).optional(), + filterBy: z.string().optional(), + }) + .optional(), + }).parse, + search: { + middlewares: [retainSearchParams(['usersView'])], + }, + loaderDeps: ({ search: { usersView } }) => ({ + filterBy: usersView?.filterBy, + sortBy: usersView?.sortBy ?? 'name', + }), + loader: async ({ deps, context }) => { + const usersService = context.inject(UsersService) + const users = await usersService.fetchUsers(deps) + return { users, crumb: 'Users' } + }, + notFoundComponent: () => UsersNotFoundComponent, + component: () => UsersLayoutComponent, +}) + +@Component({ + selector: 'app-users-layout', + standalone: true, + imports: [Outlet, Link, SpinnerComponent], + template: ` +
+
+
+
Sort By:
+ +
+
+
Filter By:
+ +
+ @for (user of filteredUsers(); track user.id) { + + } +
+ Need to see how not-found errors look? + + Try loading user 404 + +
+
+
+ +
+
+ `, +}) +class UsersLayoutComponent { + navigate = usersLayoutRoute.injectNavigate() + searchSignal = usersLayoutRoute.injectSearch() + loaderData = usersLayoutRoute.injectLoaderData() + users = computed(() => this.loaderData().users) + routerState = injectRouterState() + sortOptions = ['name', 'id', 'email'] + + search = computed(() => this.searchSignal()) + sortBy = computed(() => this.search().usersView?.sortBy ?? 'name') + filterBy = computed(() => this.search().usersView?.filterBy) + filterDraft = linkedSignal(() => this.filterBy() ?? '') + + #updateFilter = effect(() => { + const draft = this.filterDraft() + this.navigate({ + search: (old) => ({ + ...old, + usersView: { + ...old.usersView, + filterBy: draft || undefined, + }, + }), + replace: true, + }) + }) + + sortedUsers = computed(() => { + const usersList = this.users() + if (!usersList) return [] + const sort = this.sortBy() + if (!sort) return usersList + return [...usersList].sort((a, b) => { + return a[sort] > b[sort] ? 1 : -1 + }) + }) + + filteredUsers = computed(() => { + const sorted = this.sortedUsers() + const filter = this.filterBy() + if (!filter) return sorted + return sorted.filter((user) => user.name.toLowerCase().includes(filter.toLowerCase())) + }) + + setSortBy(sortBy: UsersViewSortBy) { + this.navigate({ + search: (old) => ({ + ...old, + usersView: { + ...(old.usersView ?? {}), + sortBy, + }, + }), + replace: true, + }) + } + + isActive(path: string, userId?: number): boolean { + const currentPath = this.routerState().location.pathname + const currentSearch = this.search() + if (userId !== undefined) { + return currentPath === path && (currentSearch as { userId?: number }).userId === userId + } + return currentPath === path || currentPath.startsWith(path + '/') + } + + isPending(userId: number): boolean { + const matches = this.routerState().matches + const match = matches.find( + (m) => + m.routeId === userRoute.id && + m.search && + (m.search as { userId?: number }).userId === userId, + ) + return match?.status === 'pending' || false + } +} + +const usersIndexRoute = createRoute({ + getParentRoute: () => usersLayoutRoute, + path: '/', + component: () => UsersIndexComponent, +}) + +@Component({ + selector: 'app-users-index', + standalone: true, + template: ` +
+

+ Normally, setting default search parameters would either need to be done manually in every + link to a page, or as a side-effect (not a great experience). +

+

+ Instead, we can use search filters to provide defaults or even persist + search params for links to routes (and child routes). +

+

+ A good example of this is the sorting and filtering of the users list. In a traditional + router, both would be lost while navigating around individual users or even changing each + sort/filter option unless each state was manually passed from the current route into each + new link we created (that's a lot of tedious and error-prone work). With TanStack router and + search filters, they are persisted with little effort. +

+
+ `, +}) +class UsersIndexComponent { } + +const userRoute = createRoute({ + getParentRoute: () => usersLayoutRoute, + path: 'user', + validateSearch: z.object({ + userId: z.number(), + }), + loaderDeps: ({ search: { userId } }) => ({ + userId, + }), + loader: async ({ deps: { userId }, context }) => { + const usersService = context.inject(UsersService) + const user = await usersService.fetchUserById(userId) + + if (!user) { + throw notFound({ + data: { + userId, + }, + }) + } + + return { user, crumb: user.name } + }, + component: () => UserComponent, +}) + +@Component({ + selector: 'app-user', + standalone: true, + template: ` +

{{ user().name }}

+
{{ userJson() }}
+ `, +}) +class UserComponent { + loaderData = userRoute.injectLoaderData() + user = computed(() => this.loaderData().user) + userJson = computed(() => JSON.stringify(this.user(), null, 2)) +} + +const expensiveRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'expensive', +}).lazy(() => import('./expensive.route').then((d) => d.Route)) + +const authPathlessLayoutRoute = createRoute({ + getParentRoute: () => rootRoute, + id: 'auth', + beforeLoad: ({ context, location }) => { + if (context.auth.status === 'loggedOut') { + console.log(location) + throw redirect({ + to: loginRoute.to, + search: { + redirect: location.href, + }, + }) + } + + return { + username: auth.username, + } + }, +}) + +const profileRoute = createRoute({ + getParentRoute: () => authPathlessLayoutRoute, + path: 'profile', + component: () => ProfileComponent, +}) + +@Component({ + selector: 'app-profile', + standalone: true, + template: ` +
+
+ Username:{{ username() }} +
+ +
+ `, +}) +class ProfileComponent { + router = injectRouter() + routeContext = profileRoute.injectRouteContext() + username = computed(() => this.routeContext().username) + + logout() { + auth.logout() + this.router.invalidate() + } +} + +const loginRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'login', + validateSearch: z.object({ + redirect: z.string().optional(), + }), + loaderDeps: ({ search: { redirect } }) => ({ redirect }), + loader: ({ context, deps }) => { + // This is not done in the other examples, but since in angular + // we don't have transitions, this loader can prevent double renders + // by doing an early redirect. + if (context.auth.status === 'loggedIn' && deps.redirect) { + throw redirect({ to: deps.redirect }) + } + }, +}).update({ + component: () => LoginComponent, +}) + +@Component({ + selector: 'app-login', + standalone: true, + template: ` + @if (status() === 'loggedIn') { +
+ Logged in as {{ auth().username }} +
+ +
+
+ } @else { +
+
You must log in!
+
+
+ + +
+
+ } + `, +}) +class LoginComponent { + router = injectRouter() + routeContext = loginRoute.injectRouteContext({ + select: ({ auth }) => ({ auth, status: auth.status }), + }) + search = loginRoute.injectSearch() + username = signal('') + + auth = computed(() => this.routeContext().auth) + status = computed(() => this.routeContext().status) + + #redirectIfLoggedIn = effect(() => { + if (this.status() === 'loggedIn' && this.search().redirect) { + this.router.history.push(this.search().redirect!) + } + }) + + onSubmit(event: Event) { + event.preventDefault() + this.auth().login(this.username()) + this.router.invalidate() + } + + logout() { + this.auth().logout() + this.router.invalidate() + } +} + +const pathlessLayoutRoute = createRoute({ + getParentRoute: () => rootRoute, + id: 'pathless-layout', + component: () => PathlessLayoutComponent, +}) + +@Component({ + selector: 'app-pathless-layout', + standalone: true, + imports: [Outlet], + template: ` +
+
Pathless Layout
+
+ +
+ `, +}) +class PathlessLayoutComponent { } + +const pathlessLayoutARoute = createRoute({ + getParentRoute: () => pathlessLayoutRoute, + path: 'route-a', + component: () => PathlessLayoutAComponent, +}) + +@Component({ + selector: 'app-pathless-layout-a', + standalone: true, + template: ` +
+
I'm A
+
+ `, +}) +class PathlessLayoutAComponent { } + +const pathlessLayoutBRoute = createRoute({ + getParentRoute: () => pathlessLayoutRoute, + path: 'route-b', + component: () => PathlessLayoutBComponent, +}) + +@Component({ + selector: 'app-pathless-layout-b', + standalone: true, + template: ` +
+
I'm B
+
+ `, +}) +class PathlessLayoutBComponent { } + +const routeTree = rootRoute.addChildren([ + indexRoute, + dashboardLayoutRoute.addChildren([ + dashboardIndexRoute, + invoicesLayoutRoute.addChildren([invoicesIndexRoute, invoiceRoute]), + usersLayoutRoute.addChildren([usersIndexRoute, userRoute]), + ]), + expensiveRoute, + authPathlessLayoutRoute.addChildren([profileRoute]), + loginRoute, + pathlessLayoutRoute.addChildren([pathlessLayoutARoute, pathlessLayoutBRoute]), +]) + +export const router = createRouter({ + routeTree, + defaultPendingComponent: () => SpinnerComponent, + // defaultErrorComponent: () => ErrorComponent, + context: { + auth: undefined!, + inject: undefined!, + }, + defaultPreload: 'intent', + scrollRestoration: true, +}) + +const auth: Auth = { + status: 'loggedOut', + username: undefined, + login: (username: string) => { + auth.username = username + auth.status = 'loggedIn' + }, + logout: () => { + auth.status = 'loggedOut' + auth.username = undefined + }, +} + +@Component({ + selector: 'app-root', + standalone: true, + imports: [RouterProvider], + template: ` + +
+
+
+ + + +
+
+
Loader Delay: {{ loaderDelay() }}ms
+ +
+
+
+
+ +
+
+
defaultPendingMs: {{ pendingMs() }}ms
+ +
+
+
defaultPendingMinMs: {{ pendingMinMs() }}ms
+ +
+
+
+ `, +}) +class AppComponent { + router = router + environmentInjector = inject(EnvironmentInjector) + + routerContext: RouterContextOptions['context'] = { + auth, + inject: (token: ProviderToken) => this.environmentInjector.get(token), + } + + loaderDelay = useSessionStorage('loaderDelay', 500) + pendingMs = useSessionStorage('pendingMs', 1000) + pendingMinMs = useSessionStorage('pendingMinMs', 500) + + setLoaderDelay(value: number) { + this.loaderDelay.set(value) + } + + setPendingMs(value: number) { + this.pendingMs.set(value) + } + + setPendingMinMs(value: number) { + this.pendingMinMs.set(value) + } + + resetPending() { + this.pendingMs.set(1000) + this.pendingMinMs.set(500) + } +} + +type Auth = { + login: (username: string) => void + logout: () => void + status: 'loggedOut' | 'loggedIn' + username?: string +} + +@Component({ + selector: 'app-error', + standalone: true, + imports: [JsonPipe], + template: ` +
+

Error

+
{{ error() | json }}
+ +
+ `, +}) +class ErrorComponent { + error = signal(null) + router = injectRouter() + + reset() { + this.router.invalidate() + } +} + +function useSessionStorage(key: string, initialValue: T) { + const stored = sessionStorage.getItem(key) + const value = signal(stored ? JSON.parse(stored) : initialValue) + + effect(() => { + sessionStorage.setItem(key, JSON.stringify(value())) + }) + + return value +} + +bootstrapApplication(AppComponent).catch((err) => console.error(err)) diff --git a/examples/angular/kitchen-sink/src/router-register.ts b/examples/angular/kitchen-sink/src/router-register.ts new file mode 100644 index 00000000000..3da25136c15 --- /dev/null +++ b/examples/angular/kitchen-sink/src/router-register.ts @@ -0,0 +1,9 @@ +import type { router } from './main' + +declare module '@tanstack/angular-router-experimental' { + interface Register { + router: typeof router + } +} + +export {} diff --git a/examples/angular/kitchen-sink/src/services.ts b/examples/angular/kitchen-sink/src/services.ts new file mode 100644 index 00000000000..b0b1c724653 --- /dev/null +++ b/examples/angular/kitchen-sink/src/services.ts @@ -0,0 +1,180 @@ +import { inject, Injectable } from '@angular/core' +import { HttpClient } from '@angular/common/http' +import { lastValueFrom, tap } from 'rxjs' +import { actionDelayFn, loaderDelayFn, shuffle } from './utils' + +export type Invoice = { + id: number + title: string + body: string +} + +export interface User { + id: number + name: string + username: string + email: string + address: Address + phone: string + website: string + company: Company +} + +export interface Address { + street: string + suite: string + city: string + zipcode: string + geo: Geo +} + +export interface Geo { + lat: string + lng: string +} + +export interface Company { + name: string + catchPhrase: string + bs: string +} + +@Injectable({ + providedIn: 'root', +}) +export class InvoiceService { + readonly #httpClient = inject(HttpClient) + + #invoices: Array = [] + + #invoicesPromise: Promise | undefined + + private ensureInvoices = async () => { + if (!this.#invoicesPromise) { + this.#invoicesPromise = lastValueFrom( + this.#httpClient + .get>('https://jsonplaceholder.typicode.com/posts') + .pipe(tap((data) => (this.#invoices = data.slice(0, 10)))), + ) + } + await this.#invoicesPromise + } + + fetchInvoices() { + return loaderDelayFn(() => this.ensureInvoices().then(() => this.#invoices)) + } + + fetchInvoiceById(id: number) { + return loaderDelayFn(() => + this.ensureInvoices().then(() => this.#invoices.find((invoice) => invoice.id === id)), + ) + } + + postInvoice(partialInvoice: Partial) { + return actionDelayFn(() => { + if (partialInvoice.title?.includes('error')) { + console.error('error') + throw new Error('Ouch!') + } + + const invoice = { + id: this.#invoices.length + 1, + title: partialInvoice.title ?? `New Invoice ${String(Date.now()).slice(0, 5)}`, + body: + partialInvoice.body ?? + shuffle( + `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + Fusce ac turpis quis ligula lacinia aliquet. Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed, euismod in, nibh. Quisque volutpat condimentum velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam nec ante. + Vestibulum sapien. Proin quam. Etiam ultrices. Suspendisse in justo eu magna luctus suscipit. Sed lectus. Integer euismod lacus luctus magna. Integer id quam. Morbi mi. Quisque nisl felis, venenatis tristique, dignissim in, ultrices sit amet, augue. Proin sodales libero eget ante. + `.split(' '), + ).join(' '), + } + + this.#invoices = [...this.#invoices, invoice] + return invoice + }) + } + + patchInvoice(id: number, partialInvoice: Partial) { + return actionDelayFn(() => { + if (partialInvoice.title?.includes('error')) { + console.error('error') + throw new Error('Ouch!') + } + const index = this.#invoices.findIndex((invoice) => invoice.id === id) + + if (index === -1) { + throw new Error('Invoice not found.') + } + + const newArray = [...this.#invoices] + newArray[index] = { ...this.#invoices[index], ...partialInvoice, id } + + this.#invoices = newArray + return this.#invoices[index] + }) + } +} + +type UsersSortBy = 'name' | 'id' | 'email' + +@Injectable({ + providedIn: 'root', +}) +export class UsersService { + readonly #httpClient = inject(HttpClient) + + #users: Array = [] + + #usersPromise: Promise | undefined + + private ensureUsers = async () => { + if (!this.#usersPromise) { + this.#usersPromise = lastValueFrom( + this.#httpClient + .get>('https://jsonplaceholder.typicode.com/users') + .pipe(tap((data) => (this.#users = data.slice(0, 10)))), + ) + } + await this.#usersPromise + } + + fetchUsers({ filterBy, sortBy }: { filterBy?: string; sortBy?: UsersSortBy } = {}) { + return loaderDelayFn(() => + this.ensureUsers().then(() => { + let usersDraft = this.#users + + if (filterBy) { + usersDraft = usersDraft.filter((user) => + user.name.toLowerCase().includes(filterBy.toLowerCase()), + ) + } + + if (sortBy) { + usersDraft = usersDraft.sort((a, b) => { + return a[sortBy] > b[sortBy] ? 1 : -1 + }) + } + + return usersDraft + }), + ) + } + + fetchUserById(id: number) { + return loaderDelayFn(() => + this.ensureUsers().then(() => this.#users.find((user) => user.id === id)), + ) + } +} + +@Injectable({ + providedIn: 'root', +}) +export class RandomService { + fetchRandomNumber() { + return loaderDelayFn(() => { + return Math.random() + }) + } +} diff --git a/examples/angular/kitchen-sink/src/styles.css b/examples/angular/kitchen-sink/src/styles.css new file mode 100644 index 00000000000..37a1064738a --- /dev/null +++ b/examples/angular/kitchen-sink/src/styles.css @@ -0,0 +1,21 @@ +@import 'tailwindcss'; + +@layer base { + *, + ::after, + ::before, + ::backdrop, + ::file-selector-button { + border-color: var(--color-gray-200, currentcolor); + } +} + +html { + color-scheme: light dark; +} +* { + @apply border-gray-200 dark:border-gray-800; +} +body { + @apply bg-gray-50 text-gray-950 dark:bg-gray-900 dark:text-gray-200; +} diff --git a/examples/angular/kitchen-sink/src/utils.ts b/examples/angular/kitchen-sink/src/utils.ts new file mode 100644 index 00000000000..f2e18d61f68 --- /dev/null +++ b/examples/angular/kitchen-sink/src/utils.ts @@ -0,0 +1,29 @@ +export async function loaderDelayFn(fn: (...args: Array) => Promise | T) { + const delay = Number(sessionStorage.getItem('loaderDelay') ?? 0) + const delayPromise = new Promise((r) => setTimeout(r, delay)) + + await delayPromise + const res = await fn() + + return res +} + +export async function actionDelayFn(fn: (...args: Array) => Promise | T) { + const delay = Number(sessionStorage.getItem('actionDelay') ?? 0) + await new Promise((r) => setTimeout(r, delay)) + return fn() +} + +export function shuffle(arr: Array): Array { + let i = arr.length + if (i == 0) return arr + const copy = [...arr] + while (--i) { + const j = Math.floor(Math.random() * (i + 1)) + const a = copy[i] + const b = copy[j] + copy[i] = b! + copy[j] = a! + } + return copy +} diff --git a/examples/angular/kitchen-sink/tsconfig.app.json b/examples/angular/kitchen-sink/tsconfig.app.json new file mode 100644 index 00000000000..c1e0ce8c0e1 --- /dev/null +++ b/examples/angular/kitchen-sink/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": ["src/main.ts"], + "include": ["src/**/*.d.ts", "src/**/*.ts"] +} diff --git a/examples/angular/kitchen-sink/tsconfig.json b/examples/angular/kitchen-sink/tsconfig.json new file mode 100644 index 00000000000..0641f84cf8f --- /dev/null +++ b/examples/angular/kitchen-sink/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/out-tsc", + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "esModuleInterop": true, + "sourceMap": true, + "declaration": false, + "experimentalDecorators": true, + "moduleResolution": "bundler", + "importHelpers": true, + "target": "ES2022", + "module": "ES2022", + "useDefineForClassFields": false, + "lib": ["ES2022", "dom"] + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/examples/angular/kitchen-sink/tsconfig.spec.json b/examples/angular/kitchen-sink/tsconfig.spec.json new file mode 100644 index 00000000000..de0ca57967d --- /dev/null +++ b/examples/angular/kitchen-sink/tsconfig.spec.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": ["vitest/globals", "node"] + }, + "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] +} diff --git a/packages/angular-router-devtools/README.md b/packages/angular-router-devtools/README.md new file mode 100644 index 00000000000..9c00f6cde94 --- /dev/null +++ b/packages/angular-router-devtools/README.md @@ -0,0 +1,7 @@ +# TanStack Angular Router Devtools + +![TanStack Router Header](https://github.com/tanstack/router/raw/main/media/header_router.png) + +🤖 Devtools for TanStack Angular Router! + +## Visit [tanstack.com/router](https://tanstack.com/router) for docs, guides, API and more! diff --git a/packages/angular-router-devtools/eslint.config.js b/packages/angular-router-devtools/eslint.config.js new file mode 100644 index 00000000000..62a478577a3 --- /dev/null +++ b/packages/angular-router-devtools/eslint.config.js @@ -0,0 +1,10 @@ +// @ts-check + +import rootConfig from '../../eslint.config.js' + +export default [ + ...rootConfig, + { + files: ['**/*.{ts,tsx}'], + }, +] diff --git a/packages/angular-router-devtools/ng-package.json b/packages/angular-router-devtools/ng-package.json new file mode 100644 index 00000000000..6c84af60934 --- /dev/null +++ b/packages/angular-router-devtools/ng-package.json @@ -0,0 +1,9 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "./dist", + "lib": { + "entryFile": "src/index.ts" + }, + "allowedNonPeerDependencies": ["@tanstack/router-devtools-core"] +} + diff --git a/packages/angular-router-devtools/package.json b/packages/angular-router-devtools/package.json new file mode 100644 index 00000000000..60b6cd1fa8f --- /dev/null +++ b/packages/angular-router-devtools/package.json @@ -0,0 +1,80 @@ +{ + "name": "@tanstack/angular-router-devtools", + "version": "1.142.11", + "description": "Modern and scalable routing for Angular applications", + "author": "Tanner Linsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/TanStack/router.git", + "directory": "packages/angular-router-devtools" + }, + "homepage": "https://tanstack.com/router", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "keywords": [ + "angular", + "location", + "router", + "routing", + "async", + "async router", + "typescript" + ], + "scripts": { + "clean": "rimraf ./dist && rimraf ./coverage", + "test:eslint": "eslint ./src", + "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", + "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js -p tsconfig.legacy.json", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js -p tsconfig.legacy.json", + "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js -p tsconfig.legacy.json", + "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js -p tsconfig.legacy.json", + "test:types:ts58": "node ../../node_modules/typescript58/lib/tsc.js -p tsconfig.legacy.json", + "test:types:ts59": "tsc -p tsconfig.legacy.json", + "test:build": "publint --strict && attw --ignore-rules no-resolution cjs-resolves-to-esm --pack .", + "build": "ng-packagr -p ng-package.json -c tsconfig.lib.json" + }, + "type": "module", + "sideEffects": false, + "types": "./dist/types/tanstack-angular-router-devtools.d.ts", + "exports": { + "./package.json": { + "default": "./package.json" + }, + ".": { + "types": "./dist/types/tanstack-angular-router-devtools.d.ts", + "require": null, + "default": "./dist/fesm2022/tanstack-angular-router-devtools.mjs" + } + }, + "files": [ + "dist", + "src" + ], + "engines": { + "node": ">=12" + }, + "dependencies": { + "@tanstack/router-devtools-core": "workspace:*", + "tslib": "^2.3.0" + }, + "devDependencies": { + "@analogjs/vite-plugin-angular": "^2.0.0", + "@analogjs/vitest-angular": "^2.2.1", + "@angular/compiler": "21.0.4", + "@angular/compiler-cli": "21.0.4", + "ng-packagr": "^21.0.0" + }, + "peerDependencies": { + "@angular/core": "21.0.4", + "@tanstack/angular-router-experimental": "workspace:^", + "@tanstack/router-core": "workspace:^" + }, + "peerDependenciesMeta": { + "@tanstack/router-core": { + "optional": true + } + } +} diff --git a/packages/angular-router-devtools/src/index.ts b/packages/angular-router-devtools/src/index.ts new file mode 100644 index 00000000000..80d6e6aae98 --- /dev/null +++ b/packages/angular-router-devtools/src/index.ts @@ -0,0 +1,37 @@ +import { Component } from '@angular/core' +import * as Devtools from './tanstack-router-devtools' +import * as DevtoolsPanel from './tanstack-router-devtools-panel' + +// No-op component for production +@Component({ + selector: 'router-devtools', + template: '', + standalone: true, +}) +class NoOpTanStackRouterDevtools {} + +@Component({ + selector: 'router-devtools-panel', + template: '', + standalone: true, +}) +class NoOpTanStackRouterDevtoolsPanel {} + +export const TanStackRouterDevtools: typeof Devtools.TanStackRouterDevtools = + process.env.NODE_ENV !== 'development' + ? (NoOpTanStackRouterDevtools as any) + : Devtools.TanStackRouterDevtools + +export const TanStackRouterDevtoolsInProd: typeof Devtools.TanStackRouterDevtools = + Devtools.TanStackRouterDevtools + +export const TanStackRouterDevtoolsPanel: typeof DevtoolsPanel.TanStackRouterDevtoolsPanel = + process.env.NODE_ENV !== 'development' + ? (NoOpTanStackRouterDevtoolsPanel as any) + : DevtoolsPanel.TanStackRouterDevtoolsPanel + +export const TanStackRouterDevtoolsPanelInProd: typeof DevtoolsPanel.TanStackRouterDevtoolsPanel = + DevtoolsPanel.TanStackRouterDevtoolsPanel + +export type { TanStackRouterDevtoolsOptions } from './tanstack-router-devtools' +export type { TanStackRouterDevtoolsPanelOptions } from './tanstack-router-devtools-panel' diff --git a/packages/angular-router-devtools/src/tanstack-router-devtools-panel.ts b/packages/angular-router-devtools/src/tanstack-router-devtools-panel.ts new file mode 100644 index 00000000000..62e72991518 --- /dev/null +++ b/packages/angular-router-devtools/src/tanstack-router-devtools-panel.ts @@ -0,0 +1,120 @@ +import { + Component, + DestroyRef, + ElementRef, + EnvironmentInjector, + afterNextRender, + computed, + effect, + inject, + input, + runInInjectionContext, +} from '@angular/core' +import { TanStackRouterDevtoolsPanelCore } from '@tanstack/router-devtools-core' +import { injectRouter } from '@tanstack/angular-router-experimental' +import { injectLazyRouterState } from './utils' +import type { AnyRouter } from '@tanstack/router-core' + +export interface TanStackRouterDevtoolsPanelOptions { + /** + * The standard React style object used to style a component with inline styles + */ + style?: Record + /** + * The standard React class property used to style a component with classes + */ + className?: string + /** + * A boolean variable indicating whether the panel is open or closed + */ + isOpen?: boolean + /** + * A function that toggles the open and close state of the panel + */ + setIsOpen?: (isOpen: boolean) => void + /** + * Handles the opening and closing the devtools panel + */ + handleDragStart?: (e: any) => void + /** + * The router instance to use for the devtools, infered in the injector context if no provided. + */ + router?: AnyRouter + /** + * Use this to attach the devtool's styles to specific element in the DOM. + */ + shadowDOMTarget?: ShadowRoot +} + +@Component({ + selector: 'tanstack-router-devtools-panel', + template: '', + styles: ` + :host { + display: block; + } + `, +}) +export class TanStackRouterDevtoolsPanel { + style = input() + className = input() + isOpen = input() + setIsOpen = input() + handleDragStart = + input() + inputRouter = input(undefined, { + alias: 'router', + }) + shadowDOMTarget = + input() + + private elementRef = inject(ElementRef) + + private contextRouter = injectRouter({ warn: false }) + private router = computed(() => this.inputRouter() ?? this.contextRouter) + private routerState = injectLazyRouterState(this.router) + + private injector = inject(EnvironmentInjector) + + ngOnInit() { + // Since inputs are not available before component initialization, + // we attach every effect and derived signal to the ngOnInit lifecycle hook + runInInjectionContext(this.injector, () => { + const devtoolsPanel = new TanStackRouterDevtoolsPanelCore({ + style: this.style(), + className: this.className(), + isOpen: this.isOpen(), + setIsOpen: this.setIsOpen(), + handleDragStart: this.handleDragStart(), + router: this.router(), + routerState: this.routerState(), + }) + + effect(() => { + devtoolsPanel.setRouter(this.router()) + }) + + effect(() => { + devtoolsPanel.setRouterState(this.routerState()) + }) + + effect(() => { + devtoolsPanel.setOptions({ + style: this.style(), + className: this.className(), + isOpen: this.isOpen(), + setIsOpen: this.setIsOpen(), + handleDragStart: this.handleDragStart(), + }) + }) + + afterNextRender(() => { + devtoolsPanel.mount(this.elementRef.nativeElement) + }) + + inject(DestroyRef).onDestroy(() => { + devtoolsPanel.unmount() + }) + }) + } +} diff --git a/packages/angular-router-devtools/src/tanstack-router-devtools.ts b/packages/angular-router-devtools/src/tanstack-router-devtools.ts new file mode 100644 index 00000000000..2437041e53c --- /dev/null +++ b/packages/angular-router-devtools/src/tanstack-router-devtools.ts @@ -0,0 +1,126 @@ +import { + Component, + DestroyRef, + ElementRef, + EnvironmentInjector, + OnInit, + afterNextRender, + computed, + effect, + inject, + input, runInInjectionContext +} from '@angular/core' +import { TanStackRouterDevtoolsCore } from '@tanstack/router-devtools-core' +import { injectRouter } from '@tanstack/angular-router-experimental' +import { injectLazyRouterState } from './utils' +import type { AnyRouter } from '@tanstack/router-core' + +export interface TanStackRouterDevtoolsOptions { + /** + * Set this true if you want the dev tools to default to being open + */ + initialIsOpen?: boolean + /** + * Use this to add props to the panel. For example, you can add className, style (merge and override default style), etc. + */ + panelProps?: Record + /** + * Use this to add props to the close button. For example, you can add className, style (merge and override default style), onClick (extend default handler), etc. + */ + closeButtonProps?: Record + /** + * Use this to add props to the toggle button. For example, you can add className, style (merge and override default style), onClick (extend default handler), etc. + */ + toggleButtonProps?: Record + /** + * The position of the TanStack Router logo to open and close the devtools panel. + * Defaults to 'bottom-left'. + */ + position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' + /** + * Use this to render the devtools inside a different type of container element for a11y purposes. + * Any string which corresponds to a valid intrinsic JSX element is allowed. + * Defaults to 'footer'. + */ + containerElement?: string | any + /** + * The router instance to use for the devtools, infered in the injector context if no provided. + */ + router?: AnyRouter + /** + * Use this to attach the devtool's styles to specific element in the DOM. + */ + shadowDOMTarget?: ShadowRoot +} + +@Component({ + selector: 'router-devtools', + template: '', +}) +export class TanStackRouterDevtools implements OnInit { + initialIsOpen = input() + panelProps = input() + closeButtonProps = input() + toggleButtonProps = + input() + position = input() + containerElement = input() + inputRouter = input(undefined, { + alias: 'router', + }) + shadowDOMTarget = input() + + private elementRef = inject(ElementRef) + + private contextRouter = injectRouter({ warn: false }) + private router = computed(() => this.inputRouter() ?? this.contextRouter) + private routerState = injectLazyRouterState(this.router) + + private injector = inject(EnvironmentInjector) + + ngOnInit() { + // Since inputs are not available before component initialization, + // we attach every effect and derived signal to the ngOnInit lifecycle hook + runInInjectionContext(this.injector, () => { + const devtools = new TanStackRouterDevtoolsCore({ + initialIsOpen: this.initialIsOpen(), + panelProps: this.panelProps(), + closeButtonProps: this.closeButtonProps(), + toggleButtonProps: this.toggleButtonProps(), + position: this.position(), + containerElement: this.containerElement(), + shadowDOMTarget: this.shadowDOMTarget(), + router: this.router(), + routerState: this.routerState(), + }) + + effect(() => { + devtools.setRouter(this.router()) + }) + + effect(() => { + devtools.setRouterState(this.routerState()) + }) + + effect(() => { + devtools.setOptions({ + initialIsOpen: this.initialIsOpen(), + panelProps: this.panelProps(), + closeButtonProps: this.closeButtonProps(), + toggleButtonProps: this.toggleButtonProps(), + position: this.position(), + containerElement: this.containerElement(), + shadowDOMTarget: this.shadowDOMTarget(), + }) + }) + + afterNextRender(() => { + devtools.mount(this.elementRef.nativeElement) + }) + + inject(DestroyRef).onDestroy(() => { + devtools.unmount() + }) + }) + } +} diff --git a/packages/angular-router-devtools/src/utils.ts b/packages/angular-router-devtools/src/utils.ts new file mode 100644 index 00000000000..2c2f032962d --- /dev/null +++ b/packages/angular-router-devtools/src/utils.ts @@ -0,0 +1,25 @@ +import { computed, effect, signal } from '@angular/core' +import type { Signal } from '@angular/core'; +import type { AnyRouter, RouterState } from '@tanstack/router-core' + +/** + * Subscribe to a signal state where the router is a + * signal that can't be read before initialization + * @param routerSignal - The signal that contains the router + * @returns - A signal that contains the router state + */ +export function injectLazyRouterState( + routerSignal: Signal, +): Signal { + const routerState = signal(undefined) + + effect((onCleanup) => { + const router = routerSignal() + const unsubscribe = router.__store.subscribe((state) => { + routerState.set(state.currentVal) + }) + onCleanup(() => unsubscribe()) + }) + + return computed(() => routerState() ?? routerSignal().__store.state) +} diff --git a/packages/angular-router-devtools/tsconfig.json b/packages/angular-router-devtools/tsconfig.json new file mode 100644 index 00000000000..8c6dc36cd86 --- /dev/null +++ b/packages/angular-router-devtools/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "target": "ES2022", + "useDefineForClassFields": false + }, + "include": ["src", "tests", "vitest.config.ts", "eslint.config.js"] +} diff --git a/packages/angular-router-devtools/tsconfig.legacy.json b/packages/angular-router-devtools/tsconfig.legacy.json new file mode 100644 index 00000000000..b90fc83e04c --- /dev/null +++ b/packages/angular-router-devtools/tsconfig.legacy.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["src"] +} diff --git a/packages/angular-router-devtools/tsconfig.lib.json b/packages/angular-router-devtools/tsconfig.lib.json new file mode 100644 index 00000000000..c879a0eb2f9 --- /dev/null +++ b/packages/angular-router-devtools/tsconfig.lib.json @@ -0,0 +1,24 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./dist/out-tsc", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": ["node"], + "noEmit": false, + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "bundler" + }, + "angularCompilerOptions": { + "compilationMode": "partial", + "strictInjectionParameters": true, + "strictInputAccessModifiers": false, + "strictTemplates": true, + "skipMetadataEmit": false + }, + "exclude": ["**/*.spec.ts", "tests/**/*", "**/*.test.ts"], + "include": ["src/**/*.ts"] +} + diff --git a/packages/angular-router-devtools/vitest.config.ts b/packages/angular-router-devtools/vitest.config.ts new file mode 100644 index 00000000000..acafa9d65f9 --- /dev/null +++ b/packages/angular-router-devtools/vitest.config.ts @@ -0,0 +1,18 @@ +/// + +import angular from '@analogjs/vite-plugin-angular' +import { defineConfig } from 'vite' +import packageJson from './package.json' + +export default defineConfig({ + plugins: [angular()], + test: { + name: packageJson.name, + dir: './tests', + watch: false, + environment: 'jsdom', + typecheck: { enabled: true }, + passWithNoTests: true, + }, +}) + diff --git a/packages/angular-router-experimental/README.md b/packages/angular-router-experimental/README.md new file mode 100644 index 00000000000..a4fef86dd0a --- /dev/null +++ b/packages/angular-router-experimental/README.md @@ -0,0 +1,15 @@ +# TanStack Angular Router + +![TanStack Router Header](https://github.com/tanstack/router/raw/main/media/header_router.png) + +🤖 Type-safe router w/ built-in caching & URL state management for Angular! + +> ⚠️ Warning: +> This Angular Router is experimental! +> It is subject to breaking changes. + +This Angular adapter has the following limitations: +- No bubling up the loading state or suspense-like features. Configurations like `defaultPendingMs` will not work. +- No integration with Angular's pending tasks for SSR. + +## Visit [tanstack.com/router](https://tanstack.com/router) for docs, guides, API and more! diff --git a/packages/angular-router-experimental/angular.json b/packages/angular-router-experimental/angular.json new file mode 100644 index 00000000000..f7695c975d7 --- /dev/null +++ b/packages/angular-router-experimental/angular.json @@ -0,0 +1,42 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "angular-router-experimental": { + "projectType": "library", + "root": ".", + "sourceRoot": "src", + "prefix": "", + "architect": { + "test": { + "builder": "@angular/build:unit-test", + "options": { + "tsConfig": "tsconfig.spec.json", + "runner": "vitest" + } + }, + "build": { + "builder": "@angular-devkit/build-angular:ng-packagr", + "options": { + "project": "ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "tsconfig.lib.prod.json" + }, + "development": { + "tsConfig": "tsconfig.lib.json" + } + }, + "defaultConfiguration": "production" + } + } + } + }, + "cli": { + "analytics": false, + "cache": { "enabled": false } + } +} + diff --git a/packages/angular-router-experimental/eslint.config.js b/packages/angular-router-experimental/eslint.config.js new file mode 100644 index 00000000000..62a478577a3 --- /dev/null +++ b/packages/angular-router-experimental/eslint.config.js @@ -0,0 +1,10 @@ +// @ts-check + +import rootConfig from '../../eslint.config.js' + +export default [ + ...rootConfig, + { + files: ['**/*.{ts,tsx}'], + }, +] diff --git a/packages/angular-router-experimental/experimental/injectRouteErrorHandler.ts b/packages/angular-router-experimental/experimental/injectRouteErrorHandler.ts new file mode 100644 index 00000000000..ad2a7849b3c --- /dev/null +++ b/packages/angular-router-experimental/experimental/injectRouteErrorHandler.ts @@ -0,0 +1,51 @@ +import { DestroyRef, inject, untracked } from '@angular/core' +import { injectMatch, injectRouter } from '@tanstack/angular-router-experimental' +import type { AnyRouter, FromPathOption, RegisteredRouter } from '@tanstack/router-core' + +/** + * EXPERIMENTAL + * + * While in other adapters you can use build-in error boundaries, + * Angular does not provide any. As an workarraound, we export a function + * to simulate an error boundary by changing the router state to show + * the error component. + * + * Note that an equivalent for suspense can't exist since we can't restore + * the component state when the promise is resolved as is with other adapters. + */ +export function injectRouteErrorHandler< + TRouter extends AnyRouter = RegisteredRouter, + TDefaultFrom extends string = string, +>(options: { from?: FromPathOption }) { + const router = injectRouter() + const match = injectMatch({ from: options.from }) + + let destroyed = false + + inject(DestroyRef).onDestroy(() => { + destroyed = true + }) + + return { + throw: (error: Error) => { + if (destroyed) { + console.warn( + 'Attempted to throw error to route after it has been destroyed', + ) + return + } + + const matchId = untracked(match).id + + router.updateMatch(matchId, (match) => { + return { + ...match, + error, + status: 'error', + isFetching: false, + updatedAt: Date.now(), + } + }) + }, + } +} diff --git a/packages/angular-router-experimental/experimental/ng-package.json b/packages/angular-router-experimental/experimental/ng-package.json new file mode 100644 index 00000000000..5cb8e1e46dc --- /dev/null +++ b/packages/angular-router-experimental/experimental/ng-package.json @@ -0,0 +1,5 @@ +{ + "lib": { + "entryFile": "public_api.ts" + } +} diff --git a/packages/angular-router-experimental/experimental/public_api.ts b/packages/angular-router-experimental/experimental/public_api.ts new file mode 100644 index 00000000000..90973d5fefd --- /dev/null +++ b/packages/angular-router-experimental/experimental/public_api.ts @@ -0,0 +1,8 @@ +/** + * @experimental + * + * This entrypoint contains experimental APIs that may change or be removed + * in future versions. Use with caution. + */ + +export { injectRouteErrorHandler } from './injectRouteErrorHandler' diff --git a/packages/angular-router-experimental/ng-package.json b/packages/angular-router-experimental/ng-package.json new file mode 100644 index 00000000000..3d5f571fbdb --- /dev/null +++ b/packages/angular-router-experimental/ng-package.json @@ -0,0 +1,16 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "./dist", + "lib": { + "entryFile": "src/index.ts" + }, + "allowedNonPeerDependencies": [ + "@tanstack/angular-store", + "@tanstack/history", + "@tanstack/router-core", + "tiny-invariant", + "tiny-warning", + "isbot" + ] +} + diff --git a/packages/angular-router-experimental/package.json b/packages/angular-router-experimental/package.json new file mode 100644 index 00000000000..d4a1120b9b8 --- /dev/null +++ b/packages/angular-router-experimental/package.json @@ -0,0 +1,95 @@ +{ + "name": "@tanstack/angular-router-experimental", + "version": "1.142.11", + "description": "Modern and scalable routing for Angular applications", + "author": "Tanner Linsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/TanStack/router.git", + "directory": "packages/angular-router-experimental" + }, + "homepage": "https://tanstack.com/router", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "keywords": [ + "angular", + "location", + "router", + "routing", + "async", + "async router", + "typescript" + ], + "scripts": { + "clean": "rimraf ./dist && rimraf ./coverage", + "test:eslint": "eslint", + "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", + "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js -p tsconfig.legacy.json", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js -p tsconfig.legacy.json", + "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js -p tsconfig.legacy.json", + "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js -p tsconfig.legacy.json", + "test:types:ts58": "node ../../node_modules/typescript58/lib/tsc.js -p tsconfig.legacy.json", + "test:types:ts59": "tsc -p tsconfig.legacy.json", + "test:unit": "vitest", + "test:unit:dev": "pnpm run test:unit --watch --hideSkippedTests", + "test:perf": "vitest bench", + "test:perf:dev": "pnpm run test:perf --watch --hideSkippedTests", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", + "build": "ng-packagr -p ng-package.json -c tsconfig.lib.json" + }, + "type": "module", + "sideEffects": false, + "types": "./dist/types/tanstack-angular-router-experimental.d.ts", + "exports": { + "./package.json": { + "default": "./package.json" + }, + ".": { + "types": "./dist/types/tanstack-angular-router-experimental.d.ts", + "require": null, + "default": "./dist/fesm2022/tanstack-angular-router-experimental.mjs" + }, + "./experimental": { + "types": "./dist/types/tanstack-angular-router-experimental-experimental.d.ts", + "require": null, + "default": "./dist/fesm2022/tanstack-angular-router-experimental-experimental.mjs" + } + }, + "files": [ + "dist", + "src", + "experimental" + ], + "engines": { + "node": ">=12" + }, + "dependencies": { + "@tanstack/angular-store": "^0.8.0", + "@tanstack/history": "workspace:*", + "@tanstack/router-core": "workspace:*", + "isbot": "^5.1.22", + "tiny-invariant": "^1.3.3", + "tiny-warning": "^1.0.3", + "tslib": "^2.3.0" + }, + "devDependencies": { + "@analogjs/vite-plugin-angular": "^2.2.1", + "@analogjs/vitest-angular": "^2.2.1", + "@angular/compiler": "^21.0.0", + "@angular/compiler-cli": "^21.0.0", + "@angular/platform-browser": "^21.0.0", + "@testing-library/angular": "^19.0.0", + "@testing-library/jest-dom": "^6.6.3", + "combinate": "^1.1.11", + "jsdom": "^27.4.0", + "ng-packagr": "^21.0.0", + "vibe-rules": "^0.2.57", + "zod": "^3.24.2" + }, + "peerDependencies": { + "@angular/core": "^21.0.0" + } +} diff --git a/packages/angular-router-experimental/src/DefaultNotFound.ts b/packages/angular-router-experimental/src/DefaultNotFound.ts new file mode 100644 index 00000000000..5741e9c3ab9 --- /dev/null +++ b/packages/angular-router-experimental/src/DefaultNotFound.ts @@ -0,0 +1,8 @@ +import * as Angular from '@angular/core' + +@Angular.Component({ + template: `

Not found

`, + changeDetection: Angular.ChangeDetectionStrategy.OnPush, + host: { style: 'display: contents;' }, +}) +export class DefaultNotFoundComponent {} diff --git a/packages/angular-router-experimental/src/Link.ts b/packages/angular-router-experimental/src/Link.ts new file mode 100644 index 00000000000..d7d9cf5a69f --- /dev/null +++ b/packages/angular-router-experimental/src/Link.ts @@ -0,0 +1,342 @@ +import * as Angular from '@angular/core' +import { + AnyRouter, + LinkOptions as CoreLinkOptions, + LinkCurrentTargetElement, + RegisteredRouter, + RoutePaths, + deepEqual, + exactPathTest, + preloadWarning, + removeTrailingSlash, +} from '@tanstack/router-core' +import { injectRouterState } from './injectRouterState' +import { injectRouter } from './injectRouter' +import { injectIntersectionObserver } from './injectIntersectionObserver' + +@Angular.Directive({ + selector: 'a[link]', + exportAs: 'link', + standalone: true, + host: { + '[href]': 'hrefOption()?.href', + '(click)': 'handleClick($event)', + '(focus)': 'handleFocus()', + '(mouseenter)': 'handleEnter($event)', + '(mouseover)': 'handleEnter($event)', + '(mouseleave)': 'handleLeave($event)', + '[attr.target]': 'target()', + '[attr.role]': 'disabled() ? "link" : undefined', + '[attr.aria-disabled]': 'disabled()', + '[attr.data-status]': 'isActive() ? "active" : undefined', + '[attr.aria-current]': 'isActive() ? "page" : undefined', + '[attr.data-transitioning]': + 'isTransitioning() ? "transitioning" : undefined', + '[class]': 'isActiveProps()?.class', + '[style]': 'isActiveProps()?.style', + }, +}) +export class Link< + TRouter extends AnyRouter = RegisteredRouter, + TFrom extends RoutePaths | string = string, + TTo extends string | undefined = '.', + TMaskFrom extends RoutePaths | string = TFrom, + TMaskTo extends string = '.', +> { + passiveEvents = injectPasiveEvents(() => ({ + touchstart: this.handleTouchStart, + })) + + options = Angular.input.required< + LinkOptions + >({ alias: 'link' }) + + protected router = injectRouter() + protected isTransitioning = Angular.signal(false) + + protected currentSearch = injectRouterState({ + select: (s) => s.location.searchStr, + }) + + protected from = Angular.computed(() => + Angular.untracked(() => this.options().from), + ) + + protected disabled = Angular.computed(() => this._options().disabled ?? false) + protected target = Angular.computed(() => this._options().target) + + protected _options = Angular.computed< + LinkOptions + >(() => { + return { + ...this.options(), + from: this.from(), + } + }) + + protected nextLocation = Angular.computed(() => { + this.currentSearch() + return this.router.buildLocation(this._options() as any) + }) + + protected hrefOption = Angular.computed(() => { + if (this._options().disabled) { + return undefined + } + + let href + const maskedLocation = this.nextLocation().maskedLocation + if (maskedLocation) { + href = maskedLocation.url.href + } else { + href = this.nextLocation().url.href + } + let external = false + if (this.router.origin) { + if (href.startsWith(this.router.origin)) { + href = this.router.history.createHref( + href.replace(this.router.origin, ''), + ) + } else { + external = true + } + } + return { href, external } + }) + + protected externalLink = Angular.computed(() => { + const hrefOption = this.hrefOption() + if (hrefOption?.external) { + return hrefOption.href + } + try { + new URL(this.options()['to'] as any) + return this.options()['to'] + } catch { } + return undefined + }) + + protected preload = Angular.computed(() => { + if (this.options()['reloadDocument']) { + return false + } + return this.options()['preload'] ?? this.router.options.defaultPreload + }) + + protected preloadDelay = Angular.computed(() => { + return ( + this.options()['preloadDelay'] ?? + this.router.options.defaultPreloadDelay ?? + 0 + ) + }) + + protected location = injectRouterState({ + select: (s) => s.location, + }) + + + protected isActiveProps = Angular.computed(() => { + const opts = this.options() + const isActive = this.isActive() + const props = isActive ? opts.activeProps : opts.inactiveProps + if (!props || typeof props !== 'object') return undefined + return props + }) + + protected isActive = Angular.computed(() => { + if (this.externalLink()) return false + + const options = this.options() + + if (options.activeOptions?.exact) { + const testExact = exactPathTest( + this.location().pathname, + this.nextLocation().pathname, + this.router.basepath, + ) + if (!testExact) { + return false + } + } else { + const currentPathSplit = removeTrailingSlash( + this.location().pathname, + this.router.basepath, + ) + const nextPathSplit = removeTrailingSlash( + this.nextLocation().pathname, + this.router.basepath, + ) + + const pathIsFuzzyEqual = + currentPathSplit.startsWith(nextPathSplit) && + (currentPathSplit.length === nextPathSplit.length || + currentPathSplit[nextPathSplit.length] === '/') + + if (!pathIsFuzzyEqual) { + return false + } + } + + if (options.activeOptions?.includeSearch ?? true) { + const searchTest = deepEqual( + this.location().search, + this.nextLocation().search, + { + partial: !options.activeOptions?.exact, + ignoreUndefined: !options.activeOptions?.explicitUndefined, + }, + ) + if (!searchTest) { + return false + } + } + + if (options.activeOptions?.includeHash) { + return this.location().hash === this.nextLocation().hash + } + return true + }) + + protected doPreload = () => { + this.router.preloadRoute(this.options() as any).catch((err: any) => { + console.warn(err) + console.warn(preloadWarning) + }) + } + + protected preloadViewportIoCallback = ( + entry: IntersectionObserverEntry | undefined, + ) => { + if (entry?.isIntersecting) { + this.doPreload() + } + } + + private viewportPreloader = injectIntersectionObserver( + this.preloadViewportIoCallback, + { rootMargin: '100px' }, + () => !!this._options().disabled || !(this.preload() === 'viewport'), + ) + + private hasRenderFetched = false + private rendererPreloader = Angular.effect(() => { + if (this.hasRenderFetched) return + + if (!this._options().disabled && this.preload() === 'render') { + this.doPreload() + this.hasRenderFetched = true + } + }) + + protected handleClick = (event: MouseEvent) => { + const elementTarget = ( + event.currentTarget as HTMLAnchorElement | SVGAElement + ).getAttribute('target') + const target = this._options().target + const effectiveTarget = target !== undefined ? target : elementTarget + + if ( + !this._options().disabled && + !isCtrlEvent(event) && + !event.defaultPrevented && + (!effectiveTarget || effectiveTarget === '_self') && + event.button === 0 + ) { + event.preventDefault() + + this.isTransitioning.set(true) + + const unsub = this.router.subscribe('onResolved', () => { + unsub() + this.isTransitioning.set(false) + }) + + this.router.navigate(this._options()) + } + } + + protected handleFocus = () => { + if (this._options().disabled) return + if (this.preload()) { + this.doPreload() + } + } + + protected handleTouchStart = () => { + if (this._options().disabled) return + if (this.preload()) { + this.doPreload() + } + } + + protected handleEnter = (event: MouseEvent) => { + if (this._options().disabled) return + const eventTarget = (event.currentTarget || {}) as LinkCurrentTargetElement + + if (this.preload()) { + if (eventTarget.preloadTimeout) { + return + } + + eventTarget.preloadTimeout = setTimeout(() => { + eventTarget.preloadTimeout = null + this.doPreload() + }, this.preloadDelay()) + } + } + + protected handleLeave = (event: MouseEvent) => { + if (this._options().disabled) return + const eventTarget = (event.currentTarget || {}) as LinkCurrentTargetElement + + if (eventTarget.preloadTimeout) { + clearTimeout(eventTarget.preloadTimeout) + eventTarget.preloadTimeout = null + } + } +} + +interface ActiveLinkProps { + class?: string + style?: string +} + +interface ActiveLinkOptionProps { + activeProps?: ActiveLinkProps + inactiveProps?: ActiveLinkProps +} + +export type LinkOptions< + TRouter extends AnyRouter = RegisteredRouter, + TFrom extends RoutePaths | string = string, + TTo extends string | undefined = '.', + TMaskFrom extends RoutePaths | string = TFrom, + TMaskTo extends string = '.', +> = CoreLinkOptions & + ActiveLinkOptionProps + +function isCtrlEvent(e: MouseEvent) { + return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) +} + +// Angular does not provide by default passive events listeners +// to some events like React, and does not support a pasive options +// in the template, so we attach the pasive events manually here + +type PassiveEvents = { + touchstart: (event: TouchEvent) => void +} + +function injectPasiveEvents(passiveEvents: () => PassiveEvents) { + const element = Angular.inject(Angular.ElementRef).nativeElement + const renderer = Angular.inject(Angular.Renderer2) + + Angular.afterNextRender(() => { + for (const [event, handler] of Object.entries(passiveEvents())) { + renderer.listen(element, event, handler, { + passive: true, + }) + } + }) +} diff --git a/packages/angular-router-experimental/src/Match.ts b/packages/angular-router-experimental/src/Match.ts new file mode 100644 index 00000000000..d972b904f08 --- /dev/null +++ b/packages/angular-router-experimental/src/Match.ts @@ -0,0 +1,278 @@ +import * as Angular from '@angular/core' +import { + AnyRoute, + AnyRouter, + getLocationChangeInfo, + rootRouteId, +} from '@tanstack/router-core' +import warning from 'tiny-warning' +import { injectRouter } from './injectRouter' +import { injectRouterState } from './injectRouterState' +import { DefaultNotFoundComponent } from './DefaultNotFound' +import { MATCH_ID_INJECTOR_TOKEN } from './matchInjectorToken' +import { injectRender } from './renderer/injectRender' +import { ERROR_STATE_INJECTOR_TOKEN } from './injectErrorState' +import { injectIsCatchingError } from './renderer/injectIsCatchingError' + +// In Angular, there is not concept of suspense or error boundaries, +// so we dont' need to wrap the inner content of the match. +// So in this adapter, we use derived state instead of state boundaries. + +// Equivalent to the OnRendered component. +function injectOnRendered({ + parentRouteIsRoot, +}: { + parentRouteIsRoot: Angular.Signal +}) { + const router = injectRouter({ warn: false }) + + const location = injectRouterState({ + select: (s) => s.resolvedLocation?.state.key, + }) + + Angular.effect(() => { + if (!parentRouteIsRoot()) return + location() // Track location + + router.emit({ + type: 'onRendered', + ...getLocationChangeInfo(router.state), + }) + }) +} + +@Angular.Component({ + selector: 'router-match', + template: '', + standalone: true, + host: { + '[attr.data-matchId]': 'matchId()', + }, +}) +export class RouteMatch { + matchId = Angular.input.required() + + router = injectRouter() + + matches = injectRouterState({ + select: (s) => s.matches, + }) + + matchData = Angular.computed(() => { + const matchIndex = this.matches().findIndex((d) => d.id === this.matchId()) + if (matchIndex === -1) return null + + const match = this.matches()[matchIndex]! + const parentRouteId = + matchIndex > 0 ? this.matches()[matchIndex - 1]?.routeId : null + + const routeId = match.routeId + const route = this.router.routesById[routeId] as AnyRoute + const remountFn = + route.options.remountDeps ?? this.router.options.defaultRemountDeps + + const remountDeps = remountFn?.({ + routeId, + loaderDeps: match.loaderDeps, + params: match._strictParams, + search: match._strictSearch, + }) + const key = remountDeps ? JSON.stringify(remountDeps) : undefined + + return { + key, + route, + match, + parentRouteId, + } + }) + + isFistRouteInRouteTree = Angular.computed( + () => this.matchData()?.parentRouteId === rootRouteId, + ) + + resolvedNoSsr = Angular.computed(() => { + const match = this.matchData()?.match + if (!match) return true + return match.ssr === false || match.ssr === 'data-only' + }) + + shouldClientOnly = Angular.computed(() => { + const match = this.matchData()?.match + if (!match) return true + return this.resolvedNoSsr() || !!match._displayPending + }) + + + parentRouteIdSignal = Angular.computed( + () => this.matchData()?.parentRouteId ?? '', + ) + rootRouteIdSignal = Angular.computed(() => rootRouteId) + + onRendered = injectOnRendered({ + parentRouteIsRoot: Angular.computed( + () => this.parentRouteIdSignal() === rootRouteId, + ), + }) + + isCatchingError = injectIsCatchingError({ + matchId: this.matchId, + }) + + render = injectRender(() => { + const matchData = this.matchData() + if (!matchData) return null + + if (this.shouldClientOnly() && this.router.isServer) { + return null + } + + const { match, route } = matchData + + if (match.status === 'notFound') { + const NotFoundComponent = getNotFoundComponent(this.router, route) + + return { + component: NotFoundComponent, + } + } else if (match.status === 'error' || this.isCatchingError()) { + const RouteErrorComponent = + getComponent(route.options.errorComponent) ?? + getComponent(this.router.options.defaultErrorComponent) + + return { + component: RouteErrorComponent || null, + providers: [ + { + provide: ERROR_STATE_INJECTOR_TOKEN, + useValue: { + error: match.error, + reset: () => { + this.router.invalidate() + }, + info: { componentStack: '' }, + }, + }, + ], + } + } else if ( + match.status === 'redirected' || + match.status === 'pending' + ) { + const PendingComponent = + getComponent(route.options.pendingComponent) ?? + getComponent(this.router.options.defaultPendingComponent) + + return { + component: PendingComponent, + } + } else { + const Component = + getComponent(route.options.component) ?? + getComponent(this.router.options.defaultComponent) ?? + Outlet + + const key = matchData.key + + return { + key, + component: Component, + providers: [ + { + provide: MATCH_ID_INJECTOR_TOKEN, + useValue: this.matchId as Angular.Signal, + }, + ], + } + } + + }) +} + +@Angular.Component({ + selector: 'outlet', + template: '', + standalone: true, +}) +export class Outlet { + router = injectRouter() + matchId = Angular.inject(MATCH_ID_INJECTOR_TOKEN) + + routeId = injectRouterState({ + select: (s) => + s.matches.find((d) => d.id === this.matchId())?.routeId as string, + }) + + route = Angular.computed( + () => this.router.routesById[this.routeId()] as AnyRoute, + ) + + parentGlobalNotFound = injectRouterState({ + select: (s) => { + const matches = s.matches + const parentMatch = matches.find((d) => d.id === this.matchId()) + if (!parentMatch) return false + return parentMatch.globalNotFound + }, + }) + + childMatchId = injectRouterState({ + select: (s) => { + const matches = s.matches + const index = matches.findIndex((d) => d.id === this.matchId()) + const child = matches[index + 1] + if (!child) return null + + return child.id + }, + }) + + render = injectRender(() => { + if (this.parentGlobalNotFound()) { + // Render not found with warning + const NotFoundComponent = getNotFoundComponent(this.router, this.route()) + return { component: NotFoundComponent } + } + const childMatchId = this.childMatchId() + + if (!childMatchId) { + // Do not render anything + return null + } + + return { + component: RouteMatch, + inputs: { + matchId: () => this.childMatchId(), + }, + } + }) +} + +function getNotFoundComponent(router: AnyRouter, route: AnyRoute) { + const NotFoundComponent = + getComponent(route.options.notFoundComponent) ?? + getComponent(router.options.defaultNotFoundComponent) + + if (NotFoundComponent) { + return NotFoundComponent + } + + if (process.env.NODE_ENV === 'development') { + warning( + route.options.notFoundComponent, + `A notFoundError was encountered on the route with ID "${route.id}", but a notFoundComponent option was not configured, nor was a router level defaultNotFoundComponent configured. Consider configuring at least one of these to avoid TanStack Router's overly generic defaultNotFoundComponent (

Page not found

)`, + ) + } + + return DefaultNotFoundComponent +} + +type CalledIfFunction = T extends (...args: Array) => any ? ReturnType : T + +function getComponent(routeComponent: T): CalledIfFunction { + if (typeof routeComponent === 'function') { + return routeComponent() + } + return routeComponent as any +} diff --git a/packages/angular-router-experimental/src/Matches.ts b/packages/angular-router-experimental/src/Matches.ts new file mode 100644 index 00000000000..2c783f8e39e --- /dev/null +++ b/packages/angular-router-experimental/src/Matches.ts @@ -0,0 +1,33 @@ +import * as Angular from '@angular/core' +import { injectRouterState } from './injectRouterState' +import { injectRender } from './renderer/injectRender' +import { RouteMatch } from './Match' +import { injectTransitionerSetup } from './transitioner' + +@Angular.Component({ + selector: 'router-matches', + template: '', + standalone: true, +}) +export class Matches { + private matchId = injectRouterState({ + select: (s) => s.matches[0]?.id, + }) + + transitioner = injectTransitionerSetup() + + render = injectRender(() => { + const matchId = this.matchId() + + if (!matchId) { + return null + } + + return { + component: RouteMatch, + inputs: { + matchId: () => matchId, + }, + } + }) +} diff --git a/packages/angular-router-experimental/src/RouterProvider.ts b/packages/angular-router-experimental/src/RouterProvider.ts new file mode 100644 index 00000000000..8263c2049be --- /dev/null +++ b/packages/angular-router-experimental/src/RouterProvider.ts @@ -0,0 +1,75 @@ +import * as Angular from '@angular/core' +import { + AnyRouter, + RegisteredRouter, + RouterOptions, +} from '@tanstack/router-core' +import { injectRender } from './renderer/injectRender' +import { Matches } from './Matches' +import { getRouterInjectionKey } from './routerInjectionToken' + +@Angular.Component({ + selector: 'router-provider', + template: '', + standalone: true, +}) +export class RouterProvider { + context: Angular.InputSignal['context']> = + Angular.input['context']>({}) + + options: Angular.InputSignal< + Omit, 'router' | 'context'> + > = Angular.input, 'router' | 'context'>>({}) + + router = Angular.input.required() + + updateRouter = Angular.effect(() => { + // This effect will run before we render + this.router().update({ + ...this.router().options, + ...this.options(), + context: { + ...this.router().options.context, + ...this.context(), + }, + }) + }) + + render = injectRender(() => { + const router = Angular.untracked(this.router) + return { + component: Matches, + providers: [ + { + provide: getRouterInjectionKey(), + useValue: router, + }, + ], + } + }) +} + +type RouterInputs< + TRouter extends AnyRouter = RegisteredRouter, + TDehydrated extends Record = Record, +> = Omit< + RouterOptions< + TRouter['routeTree'], + NonNullable, + false, + TRouter['history'], + TDehydrated + >, + 'context' +> & { + router: TRouter + context?: Partial< + RouterOptions< + TRouter['routeTree'], + NonNullable, + false, + TRouter['history'], + TDehydrated + >['context'] + > +} diff --git a/packages/angular-router-experimental/src/fileRoute.ts b/packages/angular-router-experimental/src/fileRoute.ts new file mode 100644 index 00000000000..9bf5388a4ba --- /dev/null +++ b/packages/angular-router-experimental/src/fileRoute.ts @@ -0,0 +1,246 @@ + +import { createRoute } from './route' +import { injectLoaderData } from './injectLoaderData' +import { injectLoaderDeps } from './injectLoaderDeps' +import { injectMatch } from './injectMatch' +import { injectNavigate } from './injectNavigate' +import { injectParams } from './injectParams' +import { injectRouter } from './injectRouter' +import { injectSearch } from './injectSearch' +import type { + AnyContext, + AnyRoute, + AnyRouter, + ConstrainLiteral, + FileBaseRouteOptions, + FileRoutesByPath, + LazyRouteOptions, + Register, + RegisteredRouter, + ResolveParams, + Route, + RouteById, + RouteConstraints, + RouteIds, + UpdatableRouteOptions, +} from '@tanstack/router-core' +import type { InjectLoaderDataRoute } from './injectLoaderData' +import type { InjectLoaderDepsRoute } from './injectLoaderDeps' +import type { InjectMatchRoute } from './injectMatch' +import type { InjectNavigateResult } from './injectNavigate' +import type { InjectParamsRoute } from './injectParams' +import type { InjectRouteContextRoute } from './injectRouteContext' +import type { InjectSearchRoute } from './injectSearch' + +export function createFileRoute< + TFilePath extends keyof FileRoutesByPath, + TParentRoute extends AnyRoute = FileRoutesByPath[TFilePath]['parentRoute'], + TId extends RouteConstraints['TId'] = FileRoutesByPath[TFilePath]['id'], + TPath extends RouteConstraints['TPath'] = FileRoutesByPath[TFilePath]['path'], + TFullPath extends + RouteConstraints['TFullPath'] = FileRoutesByPath[TFilePath]['fullPath'], +>( + path?: TFilePath, +): InternalFileRouteFactory< + TFilePath, + TParentRoute, + TId, + TPath, + TFullPath +>['createRoute'] { + if (typeof path === 'object') { + return new InternalFileRouteFactory< + TFilePath, + TParentRoute, + TId, + TPath, + TFullPath + >().createRoute(path) as any + } + return new InternalFileRouteFactory< + TFilePath, + TParentRoute, + TId, + TPath, + TFullPath + >().createRoute +} + +class InternalFileRouteFactory< + TFilePath extends keyof FileRoutesByPath, + TParentRoute extends AnyRoute = FileRoutesByPath[TFilePath]['parentRoute'], + TId extends RouteConstraints['TId'] = FileRoutesByPath[TFilePath]['id'], + TPath extends RouteConstraints['TPath'] = FileRoutesByPath[TFilePath]['path'], + TFullPath extends + RouteConstraints['TFullPath'] = FileRoutesByPath[TFilePath]['fullPath'], +> { + createRoute = < + TRegister = Register, + TSearchValidator = undefined, + TParams = ResolveParams, + TRouteContextFn = AnyContext, + TBeforeLoadFn = AnyContext, + TLoaderDeps extends Record = {}, + TLoaderFn = undefined, + TChildren = unknown, + TSSR = unknown, + TMiddlewares = unknown, + THandlers = undefined, + >( + options?: FileBaseRouteOptions< + TRegister, + TParentRoute, + TId, + TPath, + TSearchValidator, + TParams, + TLoaderDeps, + TLoaderFn, + AnyContext, + TRouteContextFn, + TBeforeLoadFn, + AnyContext, + TSSR, + TMiddlewares, + THandlers + > & + UpdatableRouteOptions< + TParentRoute, + TId, + TFullPath, + TParams, + TSearchValidator, + TLoaderFn, + TLoaderDeps, + AnyContext, + TRouteContextFn, + TBeforeLoadFn + >, + ): Route< + TRegister, + TParentRoute, + TPath, + TFullPath, + TFilePath, + TId, + TSearchValidator, + TParams, + AnyContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TChildren, + unknown, + TSSR, + TMiddlewares, + THandlers + > => { + const route = createRoute(options as any) + ; (route as any).isRoot = false + return route as any + } +} + +declare module '@tanstack/router-core' { + export interface LazyRoute { + injectMatch: InjectMatchRoute + injectRouteContext: InjectRouteContextRoute + injectSearch: InjectSearchRoute + injectParams: InjectParamsRoute + injectLoaderDeps: InjectLoaderDepsRoute + injectLoaderData: InjectLoaderDataRoute + injectNavigate: () => InjectNavigateResult + } +} + +export class LazyRoute { + options: { + id: string + } & LazyRouteOptions + + constructor( + opts: { + id: string + } & LazyRouteOptions, + ) { + this.options = opts + } + + injectMatch: InjectMatchRoute = (opts) => { + return injectMatch({ + select: opts?.select, + from: this.options.id, + } as any) as any + } + + injectRouteContext: InjectRouteContextRoute = (opts) => { + return injectMatch({ + from: this.options.id, + select: (d: any) => (opts?.select ? opts.select(d.context) : d.context), + }) as any + } + + injectSearch: InjectSearchRoute = (opts) => { + return injectSearch({ + select: opts?.select, + from: this.options.id, + } as any) as any + } + + injectParams: InjectParamsRoute = (opts) => { + return injectParams({ + select: opts?.select, + from: this.options.id, + } as any) as any + } + + injectLoaderDeps: InjectLoaderDepsRoute = (opts) => { + return injectLoaderDeps({ ...opts, from: this.options.id } as any) + } + + injectLoaderData: InjectLoaderDataRoute = (opts) => { + return injectLoaderData({ ...opts, from: this.options.id } as any) + } + + injectNavigate = (): InjectNavigateResult => { + const router = injectRouter() + return injectNavigate({ from: router.routesById[this.options.id].fullPath }) + } +} + +/** + * Creates a lazily-configurable code-based route stub by ID. + * + * Use this for code-splitting with code-based routes. The returned function + * accepts only non-critical route options like `component`, `pendingComponent`, + * `errorComponent`, and `notFoundComponent` which are applied when the route + * is matched. + * + * @param id Route ID string literal to associate with the lazy route. + * @returns A function that accepts lazy route options and returns a `LazyRoute`. + * @link https://tanstack.com/router/latest/docs/framework/react/api/router/createLazyRouteFunction + */ +export function createLazyRoute< + TRouter extends AnyRouter = RegisteredRouter, + TId extends string = string, + TRoute extends AnyRoute = RouteById, +>(id: ConstrainLiteral>) { + return (opts: LazyRouteOptions) => { + return new LazyRoute({ + id: id, + ...opts, + }) + } +} + +export function createLazyFileRoute< + TFilePath extends keyof FileRoutesByPath, + TRoute extends FileRoutesByPath[TFilePath]['preLoaderRoute'], +>(id: TFilePath): (opts: LazyRouteOptions) => LazyRoute { + if (typeof id === 'object') { + return new LazyRoute(id) as any + } + + return (opts: LazyRouteOptions) => new LazyRoute({ id, ...opts }) +} diff --git a/packages/angular-router-experimental/src/index.ts b/packages/angular-router-experimental/src/index.ts new file mode 100644 index 00000000000..c8372ea28bc --- /dev/null +++ b/packages/angular-router-experimental/src/index.ts @@ -0,0 +1,146 @@ +// Router +export { createRouter, Router } from './router' + +// Route creation +export { + createRoute, + createRootRoute, + createRootRouteWithContext, + createRouteMask, + getRouteApi, + Route, + RootRoute, + NotFoundRoute, + RouteApi, + type AnyRootRoute, + type RouteComponent, + type ErrorRouteComponent, + type NotFoundRouteComponent, +} from './route' + +export { + createFileRoute, + LazyRoute, + createLazyRoute, + createLazyFileRoute, +} from './fileRoute' + +// Router Provider +export { RouterProvider } from './RouterProvider' + +// Components +export { Outlet, RouteMatch } from './Match' +export { Matches } from './Matches' + +// Injection functions +export { injectRouter, type InjectRouterResult } from './injectRouter' + +export { + injectRouterState, + type InjectRouterStateOptions, + type InjectRouterStateResult, +} from './injectRouterState' + +export { injectNavigate, type InjectNavigateResult } from './injectNavigate' + +export { + injectMatch, + type InjectMatchOptions, + type InjectMatchResult, + type InjectMatchRoute, + type InjectMatchBaseOptions, +} from './injectMatch' + +export { + injectParams, + type InjectParamsOptions, + type InjectParamsRoute, + type InjectParamsBaseOptions, +} from './injectParams' + +export { + injectSearch, + type InjectSearchOptions, + type InjectSearchRoute, + type InjectSearchBaseOptions, +} from './injectSearch' + +export { + injectLoaderData, + type InjectLoaderDataOptions, + type InjectLoaderDataRoute, + type InjectLoaderDataBaseOptions, +} from './injectLoaderData' + +export { + injectLoaderDeps, + type InjectLoaderDepsOptions, + type InjectLoaderDepsRoute, + type InjectLoaderDepsBaseOptions, +} from './injectLoaderDeps' + +export { + injectRouterContext, + type InjectRouteContextRoute, +} from './injectRouteContext' + +export { + injectLocation, + type InjectLocationOptions, + type InjectLocationResult, +} from './injectLocationResult' + +export { + injectBlocker, + type InjectBlockerOpts, + type UseBlockerOpts, + type ShouldBlockFn, +} from './injectBlocker' + +export { injectCanGoBack } from './injectCanGoBack' + +export { injectErrorState } from './injectErrorState' + +// Link +export { type LinkOptions as LinkInputOptions, Link } from './Link' + +// Core re-exports +export { + notFound, + redirect, + isRedirect, + retainSearchParams, + createRouterConfig, +} from '@tanstack/router-core' + +// History utilities +export { + createHistory, + createBrowserHistory, + createHashHistory, + createMemoryHistory, +} from '@tanstack/history' + +export type { + BlockerFn, + HistoryLocation, + RouterHistory, + ParsedPath, + HistoryState, +} from '@tanstack/history' + +// Re-export types from router-core that are commonly used (FileRoutesByPath augmented by routeTree.gen.ts via declare module '@tanstack/router-core') +export type { + AnyRouter, + RegisteredRouter, + RouterState, + LinkOptions, + NavigateOptions, + RouteOptions, + RootRouteOptions, + Register, + RouterContextOptions, + FileRoutesByPath, + CreateFileRoute, + CreateLazyFileRoute, +} from '@tanstack/router-core' diff --git a/packages/angular-router-experimental/src/injectBlocker.ts b/packages/angular-router-experimental/src/injectBlocker.ts new file mode 100644 index 00000000000..4c4f1be0b1b --- /dev/null +++ b/packages/angular-router-experimental/src/injectBlocker.ts @@ -0,0 +1,199 @@ +import * as Angular from '@angular/core' +import { injectRouter } from './injectRouter' +import type { + BlockerFnArgs, + HistoryAction, + HistoryLocation, +} from '@tanstack/history' +import type { + AnyRoute, + AnyRouter, + ParseRoute, + RegisteredRouter, +} from '@tanstack/router-core' + +interface ShouldBlockFnLocation< + out TRouteId, + out TFullPath, + out TAllParams, + out TFullSearchSchema, +> { + routeId: TRouteId + fullPath: TFullPath + pathname: string + params: TAllParams + search: TFullSearchSchema +} + +type AnyShouldBlockFnLocation = ShouldBlockFnLocation + +type MakeShouldBlockFnLocationUnion< + TRouter extends AnyRouter = RegisteredRouter, + TRoute extends AnyRoute = ParseRoute, +> = TRoute extends any + ? ShouldBlockFnLocation< + TRoute['id'], + TRoute['fullPath'], + TRoute['types']['allParams'], + TRoute['types']['fullSearchSchema'] + > + : never + +type BlockerResolver = + | { + status: 'blocked' + current: MakeShouldBlockFnLocationUnion + next: MakeShouldBlockFnLocationUnion + action: HistoryAction + proceed: () => void + reset: () => void + } + | { + status: 'idle' + current: undefined + next: undefined + action: undefined + proceed: undefined + reset: undefined + } + +type ShouldBlockFnArgs = { + current: MakeShouldBlockFnLocationUnion + next: MakeShouldBlockFnLocationUnion + action: HistoryAction +} + +export type ShouldBlockFn = ( + args: ShouldBlockFnArgs, +) => boolean | Promise + +export type UseBlockerOpts< + TRouter extends AnyRouter = RegisteredRouter, + TWithResolver extends boolean = boolean, +> = { + shouldBlockFn: ShouldBlockFn + enableBeforeUnload?: boolean | (() => boolean) + disabled?: boolean | (() => boolean) + withResolver?: TWithResolver +} + +export type InjectBlockerOpts< + TRouter extends AnyRouter = RegisteredRouter, + TWithResolver extends boolean = boolean, +> = { + shouldBlockFn: ShouldBlockFn + enableBeforeUnload?: boolean | (() => boolean) + disabled?: boolean | (() => boolean) + withResolver?: TWithResolver +} + +export function injectBlocker< + TRouter extends AnyRouter = RegisteredRouter, + TWithResolver extends boolean = boolean, +>( + opts: InjectBlockerOpts, +): TWithResolver extends true + ? Angular.Signal> + : void { + const shouldBlockFn = opts.shouldBlockFn as ShouldBlockFn + const router = injectRouter() + + const isDisabled = Angular.computed(() => { + return typeof opts.disabled === 'function' + ? opts.disabled() + : (opts.disabled ?? false) + }) + + const resolver = Angular.signal({ + status: 'idle', + current: undefined, + next: undefined, + action: undefined, + proceed: undefined, + reset: undefined, + }) + + Angular.effect((onCleanup) => { + const blockerFnComposed = async (blockerFnArgs: BlockerFnArgs) => { + function getLocation( + location: HistoryLocation, + ): AnyShouldBlockFnLocation { + const parsedLocation = router.parseLocation(location) + const matchedRoutes = router.getMatchedRoutes(parsedLocation.pathname) + if (matchedRoutes.foundRoute === undefined) { + return { + routeId: '__notFound__', + fullPath: parsedLocation.pathname, + pathname: parsedLocation.pathname, + params: matchedRoutes.routeParams, + search: parsedLocation.search, + } + } + return { + routeId: matchedRoutes.foundRoute.id, + fullPath: matchedRoutes.foundRoute.fullPath, + pathname: parsedLocation.pathname, + params: matchedRoutes.routeParams, + search: parsedLocation.search, + } + } + + const current = getLocation(blockerFnArgs.currentLocation) + const next = getLocation(blockerFnArgs.nextLocation) + + if ( + current.routeId === '__notFound__' && + next.routeId !== '__notFound__' + ) { + return false + } + + const shouldBlock = await shouldBlockFn({ + action: blockerFnArgs.action, + current, + next, + }) + if (!opts.withResolver) { + return shouldBlock + } + + if (!shouldBlock) { + return false + } + + const promise = new Promise((resolve) => { + resolver.set({ + status: 'blocked', + current, + next, + action: blockerFnArgs.action, + proceed: () => resolve(false), + reset: () => resolve(true), + }) + }) + + const canNavigateAsync = await promise + resolver.set({ + status: 'idle', + current: undefined, + next: undefined, + action: undefined, + proceed: undefined, + reset: undefined, + }) + + return canNavigateAsync + } + + const disposeBlock = isDisabled() + ? undefined + : router.history.block({ + blockerFn: blockerFnComposed, + enableBeforeUnload: opts.enableBeforeUnload, + }) + + onCleanup(() => disposeBlock?.()) + }) + + return resolver.asReadonly() as any +} diff --git a/packages/angular-router-experimental/src/injectCanGoBack.ts b/packages/angular-router-experimental/src/injectCanGoBack.ts new file mode 100644 index 00000000000..23560a145d3 --- /dev/null +++ b/packages/angular-router-experimental/src/injectCanGoBack.ts @@ -0,0 +1,7 @@ +import { injectRouterState } from './injectRouterState' + +export function injectCanGoBack() { + return injectRouterState({ + select: (s) => s.location.state.__TSR_index !== 0, + }) +} diff --git a/packages/angular-router-experimental/src/injectErrorState.ts b/packages/angular-router-experimental/src/injectErrorState.ts new file mode 100644 index 00000000000..b015f5d7957 --- /dev/null +++ b/packages/angular-router-experimental/src/injectErrorState.ts @@ -0,0 +1,21 @@ +import * as Angular from '@angular/core' + +export const ERROR_STATE_INJECTOR_TOKEN = new Angular.InjectionToken<{ + error: Error + reset: () => void + info: { componentStack: string } +}>('ERROR_STATE_INJECTOR_TOKEN') + +/** + * Injects the error state to the error componenet. + */ + +export function injectErrorState() { + const errorState = Angular.inject(ERROR_STATE_INJECTOR_TOKEN, { + optional: true, + }) + if (!errorState) { + throw new Error('injectErrorState was called outside of an error component') + } + return errorState +} diff --git a/packages/angular-router-experimental/src/injectIntersectionObserver.ts b/packages/angular-router-experimental/src/injectIntersectionObserver.ts new file mode 100644 index 00000000000..0fe01983214 --- /dev/null +++ b/packages/angular-router-experimental/src/injectIntersectionObserver.ts @@ -0,0 +1,28 @@ +import * as Angular from '@angular/core' + +export function injectIntersectionObserver( + callback: (entry: IntersectionObserverEntry | undefined) => void, + intersectionObserverOptions: IntersectionObserverInit, + disabled: () => boolean, +) { + const elementRef = Angular.inject(Angular.ElementRef) + + Angular.afterRenderEffect((onCleanup) => { + const isIntersectionObserverAvailable = + typeof IntersectionObserver === 'function' + + const element = elementRef.nativeElement as HTMLElement | null + if (!element || !isIntersectionObserverAvailable || disabled()) return + + const observer = new IntersectionObserver( + ([entry]) => callback(entry), + intersectionObserverOptions, + ) + + observer.observe(element) + + onCleanup(() => { + observer.disconnect() + }) + }) +} diff --git a/packages/angular-router-experimental/src/injectLoaderData.ts b/packages/angular-router-experimental/src/injectLoaderData.ts new file mode 100644 index 00000000000..6ca327a83af --- /dev/null +++ b/packages/angular-router-experimental/src/injectLoaderData.ts @@ -0,0 +1,49 @@ +import { injectMatch } from './injectMatch' +import type * as Angular from '@angular/core' +import type { + AnyRouter, + RegisteredRouter, + ResolveUseLoaderData, + StrictOrFrom, + UseLoaderDataResult, +} from '@tanstack/router-core' + +export interface InjectLoaderDataBaseOptions< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TSelected, +> { + select?: (match: ResolveUseLoaderData) => TSelected +} + +export type InjectLoaderDataOptions< + TRouter extends AnyRouter, + TFrom extends string | undefined, + TStrict extends boolean, + TSelected, +> = StrictOrFrom & + InjectLoaderDataBaseOptions + +export type InjectLoaderDataRoute = < + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, +>( + opts?: InjectLoaderDataBaseOptions, +) => Angular.Signal> + +export function injectLoaderData< + TRouter extends AnyRouter = RegisteredRouter, + const TFrom extends string | undefined = undefined, + TStrict extends boolean = true, + TSelected = unknown, +>( + opts: InjectLoaderDataOptions, +): Angular.Signal> { + return injectMatch({ + from: opts.from!, + strict: opts.strict as true | undefined, + select: (s: any) => + opts.select ? opts.select(s.loaderData) : s.loaderData, + } as any) as any +} diff --git a/packages/angular-router-experimental/src/injectLoaderDeps.ts b/packages/angular-router-experimental/src/injectLoaderDeps.ts new file mode 100644 index 00000000000..7185fc4408d --- /dev/null +++ b/packages/angular-router-experimental/src/injectLoaderDeps.ts @@ -0,0 +1,45 @@ +import { injectMatch } from './injectMatch' +import type * as Angular from '@angular/core' +import type { + AnyRouter, + RegisteredRouter, + ResolveUseLoaderDeps, + StrictOrFrom, + UseLoaderDepsResult, +} from '@tanstack/router-core' + +export interface InjectLoaderDepsBaseOptions< + TRouter extends AnyRouter, + TFrom, + TSelected, +> { + select?: (deps: ResolveUseLoaderDeps) => TSelected +} + +export type InjectLoaderDepsOptions< + TRouter extends AnyRouter, + TFrom extends string | undefined, + TSelected, +> = StrictOrFrom & + InjectLoaderDepsBaseOptions + +export type InjectLoaderDepsRoute = < + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, +>( + opts?: InjectLoaderDepsBaseOptions, +) => Angular.Signal> + +export function injectLoaderDeps< + TRouter extends AnyRouter = RegisteredRouter, + const TFrom extends string | undefined = undefined, + TSelected = unknown, +>( + opts: InjectLoaderDepsOptions, +): Angular.Signal> { + const { select, ...rest } = opts + return injectMatch({ + ...rest, + select: (s) => (select ? select(s.loaderDeps) : s.loaderDeps), + }) as any +} diff --git a/packages/angular-router-experimental/src/injectLocationResult.ts b/packages/angular-router-experimental/src/injectLocationResult.ts new file mode 100644 index 00000000000..e5bc1d09cea --- /dev/null +++ b/packages/angular-router-experimental/src/injectLocationResult.ts @@ -0,0 +1,27 @@ +import { injectRouterState } from './injectRouterState' +import type * as Angular from '@angular/core' +import type { AnyRouter, RegisteredRouter, RouterState } from '@tanstack/router-core' + +export interface InjectLocationOptions { + select?: ( + location: RouterState['location'], + ) => TSelected +} + +export type InjectLocationResult< + TRouter extends AnyRouter, + TSelected, +> = unknown extends TSelected + ? RouterState['location'] + : TSelected + +export function injectLocation< + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, +>( + opts?: InjectLocationOptions, +): Angular.Signal> { + return injectRouterState({ + select: (s) => (opts?.select ? opts.select(s.location) : s.location), + }) as any +} diff --git a/packages/angular-router-experimental/src/injectMatch.ts b/packages/angular-router-experimental/src/injectMatch.ts new file mode 100644 index 00000000000..3f675524d61 --- /dev/null +++ b/packages/angular-router-experimental/src/injectMatch.ts @@ -0,0 +1,120 @@ +import * as Angular from '@angular/core' +import invariant from 'tiny-invariant' +import { injectRouterState } from './injectRouterState' +import { + DUMMY_MATCH_ID_INJECTOR_TOKEN, + MATCH_ID_INJECTOR_TOKEN, +} from './matchInjectorToken' +import type { + AnyRouter, + MakeRouteMatch, + MakeRouteMatchUnion, + RegisteredRouter, + StrictOrFrom, + ThrowConstraint, + ThrowOrOptional, +} from '@tanstack/router-core' + +export interface InjectMatchBaseOptions< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TThrow extends boolean, + TSelected, +> { + select?: ( + match: MakeRouteMatch, + ) => TSelected + shouldThrow?: TThrow +} + +export type InjectMatchRoute = < + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, +>( + opts?: InjectMatchBaseOptions, +) => Angular.Signal> + +export type InjectMatchOptions< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TThrow extends boolean, + TSelected, +> = StrictOrFrom & + InjectMatchBaseOptions + +export type InjectMatchResult< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TSelected, +> = unknown extends TSelected + ? TStrict extends true + ? MakeRouteMatch + : MakeRouteMatchUnion + : TSelected + +export function injectMatch< + TRouter extends AnyRouter = RegisteredRouter, + const TFrom extends string | undefined = undefined, + TStrict extends boolean = true, + TThrow extends boolean = true, + TSelected = unknown, +>( + opts: InjectMatchOptions< + TRouter, + TFrom, + TStrict, + ThrowConstraint, + TSelected + >, +): Angular.Signal< + ThrowOrOptional, TThrow> +> { + const nearestMatchId = Angular.inject( + opts.from ? DUMMY_MATCH_ID_INJECTOR_TOKEN : MATCH_ID_INJECTOR_TOKEN, + ) + + const matchState = injectRouterState({ + select: (state) => { + const match = state.matches.find((d) => + opts.from ? opts.from === d.routeId : d.id === nearestMatchId(), + ) + + if (match === undefined) { + // During navigation transitions, check if the match exists in pendingMatches + const pendingMatch = state.pendingMatches?.find((d) => + opts.from ? opts.from === d.routeId : d.id === nearestMatchId(), + ) + + // Determine if we should throw an error + const shouldThrowError = + !pendingMatch && !state.isTransitioning && (opts.shouldThrow ?? true) + + return { + match: undefined, + shouldThrowError, + } as const + } + + return { + match: opts.select ? opts.select(match) : match, + shouldThrowError: false, + } as const + }, + }) + + // Throw the error if we have one - this happens after the selector runs + // Using a computed so the error is thrown when the return value is accessed + return Angular.computed(() => { + const state = matchState() + if (state.shouldThrowError) { + invariant( + false, + `Could not find ${opts.from ? `an active match from "${opts.from}"` : 'a nearest match!'}`, + ) + } + return state.match as any + }) +} diff --git a/packages/angular-router-experimental/src/injectNavigate.ts b/packages/angular-router-experimental/src/injectNavigate.ts new file mode 100644 index 00000000000..99467c8e73f --- /dev/null +++ b/packages/angular-router-experimental/src/injectNavigate.ts @@ -0,0 +1,30 @@ +import { injectRouter } from './injectRouter' +import type { + AnyRouter, + FromPathOption, + NavigateOptions, + RegisteredRouter, + UseNavigateResult, +} from '@tanstack/router-core' + +export function injectNavigate< + TRouter extends AnyRouter = RegisteredRouter, + TDefaultFrom extends string = string, +>(_defaultOpts?: { + from?: FromPathOption +}): UseNavigateResult { + const router = injectRouter() + + return ((options: NavigateOptions) => { + return router.navigate({ + ...options, + from: options.from ?? _defaultOpts?.from, + }) + }) as UseNavigateResult +} + +export type InjectNavigateResult< + TRouter extends AnyRouter = RegisteredRouter, + TDefaultFrom extends string = string, +> = UseNavigateResult & + (TRouter extends AnyRouter ? unknown : never) diff --git a/packages/angular-router-experimental/src/injectParams.ts b/packages/angular-router-experimental/src/injectParams.ts new file mode 100644 index 00000000000..a1d2a1c1e4a --- /dev/null +++ b/packages/angular-router-experimental/src/injectParams.ts @@ -0,0 +1,73 @@ +import { injectMatch } from './injectMatch' +import type * as Angular from '@angular/core' +import type { + AnyRouter, + RegisteredRouter, + ResolveUseParams, + StrictOrFrom, + ThrowConstraint, + ThrowOrOptional, + UseParamsResult, +} from '@tanstack/router-core' + +export interface InjectParamsBaseOptions< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TThrow extends boolean, + TSelected, +> { + select?: (params: ResolveUseParams) => TSelected + shouldThrow?: TThrow +} + +export type InjectParamsOptions< + TRouter extends AnyRouter, + TFrom extends string | undefined, + TStrict extends boolean, + TThrow extends boolean, + TSelected, +> = StrictOrFrom & + InjectParamsBaseOptions + +export type InjectParamsRoute = < + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, +>( + opts?: InjectParamsBaseOptions< + TRouter, + TFrom, + /* TStrict */ true, + /* TThrow */ true, + TSelected + >, +) => Angular.Signal> + +export function injectParams< + TRouter extends AnyRouter = RegisteredRouter, + const TFrom extends string | undefined = undefined, + TStrict extends boolean = true, + TThrow extends boolean = true, + TSelected = unknown, +>( + opts: InjectParamsOptions< + TRouter, + TFrom, + TStrict, + ThrowConstraint, + TSelected + >, +): Angular.Signal< + ThrowOrOptional, TThrow> +> { + return injectMatch({ + from: opts.from!, + strict: opts.strict as true | undefined, + shouldThrow: opts.shouldThrow, + select: (match: any) => { + const params = opts.strict === false ? match.params : match._strictParams + + return opts.select ? opts.select(params) : params + }, + } as any) as Angular.Signal +} diff --git a/packages/angular-router-experimental/src/injectRouteContext.ts b/packages/angular-router-experimental/src/injectRouteContext.ts new file mode 100644 index 00000000000..f458c60cc38 --- /dev/null +++ b/packages/angular-router-experimental/src/injectRouteContext.ts @@ -0,0 +1,31 @@ +import { injectMatch } from './injectMatch' +import type * as Angular from '@angular/core' +import type { + AnyRouter, + RegisteredRouter, + UseRouteContextBaseOptions, + UseRouteContextOptions, + UseRouteContextResult, +} from '@tanstack/router-core' + +export type InjectRouteContextRoute = < + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, +>( + opts?: UseRouteContextBaseOptions, +) => Angular.Signal> + +export function injectRouterContext< + TRouter extends AnyRouter = RegisteredRouter, + const TFrom extends string | undefined = undefined, + TStrict extends boolean = true, + TSelected = unknown, +>( + opts: UseRouteContextOptions, +): Angular.Signal> { + return injectMatch({ + ...opts, + select: (match) => + opts.select ? opts.select(match.context) : match.context, + }) as any +} diff --git a/packages/angular-router-experimental/src/injectRouter.ts b/packages/angular-router-experimental/src/injectRouter.ts new file mode 100644 index 00000000000..a9d0fd1fcb7 --- /dev/null +++ b/packages/angular-router-experimental/src/injectRouter.ts @@ -0,0 +1,18 @@ +import * as Angular from '@angular/core' +import warning from 'tiny-warning' +import { getRouterInjectionKey } from './routerInjectionToken' +import type { AnyRouter, RegisteredRouter } from '@tanstack/router-core' + +export function injectRouter< + TRouter extends AnyRouter = RegisteredRouter, +>(opts?: { warn?: boolean }): TRouter { + const router = Angular.inject(getRouterInjectionKey(), { optional: true }) + warning( + !((opts?.warn ?? true) && !router), + 'injectRouter must be used inside a component!', + ) + return router as any +} + +export type InjectRouterResult = + TRouter diff --git a/packages/angular-router-experimental/src/injectRouterState.ts b/packages/angular-router-experimental/src/injectRouterState.ts new file mode 100644 index 00000000000..af425f607c4 --- /dev/null +++ b/packages/angular-router-experimental/src/injectRouterState.ts @@ -0,0 +1,37 @@ +import { injectStore } from '@tanstack/angular-store' +import { injectRouter } from './injectRouter' +import type * as Angular from '@angular/core' +import type { + AnyRouter, + RegisteredRouter, + RouterState, +} from '@tanstack/router-core' + +export type InjectRouterStateOptions = { + router?: TRouter + select?: (state: RouterState) => TSelected +} + +export type InjectRouterStateResult< + TRouter extends AnyRouter, + TSelected, +> = unknown extends TSelected ? RouterState : TSelected + +export function injectRouterState< + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, +>( + opts?: InjectRouterStateOptions, +): Angular.Signal> { + const contextRouter = injectRouter({ + warn: opts?.router === undefined, + }) + + const router = opts?.router ?? contextRouter + + return injectStore(router.__store, (state) => { + if (opts?.select) return opts.select(state) + + return state + }) as Angular.Signal> +} diff --git a/packages/angular-router-experimental/src/injectSearch.ts b/packages/angular-router-experimental/src/injectSearch.ts new file mode 100644 index 00000000000..608a3656252 --- /dev/null +++ b/packages/angular-router-experimental/src/injectSearch.ts @@ -0,0 +1,71 @@ +import { injectMatch } from './injectMatch' +import type * as Angular from '@angular/core' +import type { + AnyRouter, + RegisteredRouter, + ResolveUseSearch, + StrictOrFrom, + ThrowConstraint, + ThrowOrOptional, + UseSearchResult, +} from '@tanstack/router-core' + +export interface InjectSearchBaseOptions< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TThrow extends boolean, + TSelected, +> { + select?: (state: ResolveUseSearch) => TSelected + shouldThrow?: TThrow +} + +export type InjectSearchOptions< + TRouter extends AnyRouter, + TFrom, + TStrict extends boolean, + TThrow extends boolean, + TSelected, +> = StrictOrFrom & + InjectSearchBaseOptions + +export type InjectSearchRoute = < + TRouter extends AnyRouter = RegisteredRouter, + TSelected = unknown, +>( + opts?: InjectSearchBaseOptions< + TRouter, + TFrom, + /* TStrict */ true, + /* TThrow */ true, + TSelected + >, +) => Angular.Signal> + +export function injectSearch< + TRouter extends AnyRouter = RegisteredRouter, + const TFrom extends string | undefined = undefined, + TStrict extends boolean = true, + TThrow extends boolean = true, + TSelected = unknown, +>( + opts: InjectSearchOptions< + TRouter, + TFrom, + TStrict, + ThrowConstraint, + TSelected + >, +): Angular.Signal< + ThrowOrOptional, TThrow> +> { + return injectMatch({ + from: opts.from!, + strict: opts.strict, + shouldThrow: opts.shouldThrow, + select: (match: any) => { + return opts.select ? opts.select(match.search) : match.search + }, + } as any) as any +} diff --git a/packages/angular-router-experimental/src/matchInjectorToken.ts b/packages/angular-router-experimental/src/matchInjectorToken.ts new file mode 100644 index 00000000000..e3bcadbc4e8 --- /dev/null +++ b/packages/angular-router-experimental/src/matchInjectorToken.ts @@ -0,0 +1,14 @@ +import * as Angular from '@angular/core' + +export const MATCH_ID_INJECTOR_TOKEN = new Angular.InjectionToken< + Angular.Signal +>('MATCH_ID_INJECTOR', { + factory: () => Angular.signal(undefined), +}) + +// N.B. this only exists so we can conditionally inject a value when we are not interested in the nearest match +export const DUMMY_MATCH_ID_INJECTOR_TOKEN = new Angular.InjectionToken< + Angular.Signal +>('DUMMY_MATCH_ID_INJECTOR', { + factory: () => Angular.signal(undefined), +}) diff --git a/packages/angular-router-experimental/src/renderer/injectIsCatchingError.ts b/packages/angular-router-experimental/src/renderer/injectIsCatchingError.ts new file mode 100644 index 00000000000..d5a3b41a1a6 --- /dev/null +++ b/packages/angular-router-experimental/src/renderer/injectIsCatchingError.ts @@ -0,0 +1,40 @@ +import * as Angular from '@angular/core' +import { injectRouter } from '../injectRouter' +import { injectRouterState } from '../injectRouterState' +import type { AnyRoute } from '@tanstack/router-core' + +export function injectIsCatchingError({ + matchId, +}: { + matchId: Angular.Signal +}): Angular.Signal { + const router = injectRouter() + + const matches = injectRouterState({ + select: (s) => s.matches, + }) + + const matchIndex = Angular.computed(() => { + return matches().findIndex((m) => m.id === matchId()) + }) + + return Angular.computed(() => { + // The child route will handle the error with the default error component. + if (router.options.defaultErrorComponent != null) return false; + + const startingIndex = matchIndex() + if (startingIndex === -1) return false + const matchesList = matches() + + for (let i = startingIndex + 1; i < matchesList.length; i++) { + const descendant = matchesList[i] + const route = router.routesById[descendant?.routeId] as AnyRoute + // Is catched by a child route with an error component. + if (route.options.errorComponent != null) return false + + // Found error status without error component in between. + if (descendant?.status === "error") return true + } + return false + }) +} diff --git a/packages/angular-router-experimental/src/renderer/injectRender.ts b/packages/angular-router-experimental/src/renderer/injectRender.ts new file mode 100644 index 00000000000..052d83a0ca1 --- /dev/null +++ b/packages/angular-router-experimental/src/renderer/injectRender.ts @@ -0,0 +1,59 @@ +import * as Angular from '@angular/core' + +export type RenderValue = { + key?: string + component: Angular.Type | null | undefined + inputs?: Record unknown> + providers?: Array +} | null | undefined + +export function injectRender(renderValueFn: () => RenderValue): void { + const vcr = Angular.inject(Angular.ViewContainerRef) + const parent = Angular.inject(Angular.Injector) + + Angular.inject(Angular.DestroyRef).onDestroy(() => { + vcr.clear() + }) + + let lastKey: Array = []; + + Angular.effect(() => { + const renderValue = renderValueFn() + + const newKey = resolvedKey(renderValue) + if (keysAreEqual(lastKey, newKey)) return + + // Clear if there was a previous value + if (lastKey.length > 0) vcr.clear() + + // Update component + lastKey = newKey + + // No value, do not render + const component = renderValue?.component + if (!component) return + + // Angular renderer code + const providers = renderValue.providers ?? [] + const injector = Angular.Injector.create({ providers, parent }) + const bindings = Object.entries(renderValue.inputs ?? {}).map(([name, value]) => + Angular.inputBinding(name, value), + ) + const cmpRef = vcr.createComponent(component, { injector, bindings }) + cmpRef.changeDetectorRef.markForCheck() + }) +} + +function resolvedKey(value: RenderValue) { + const component = value?.component + if (!value || !component) return [] + return [component, value.key] +} + +function keysAreEqual(a: Array, b: Array) { + if (a.length !== b.length) return false + for (let i = 0; i < a.length; i++) { + if (a[i] !== b[i]) return false + } + return true +} diff --git a/packages/angular-router-experimental/src/route.ts b/packages/angular-router-experimental/src/route.ts new file mode 100644 index 00000000000..3c97bf9713c --- /dev/null +++ b/packages/angular-router-experimental/src/route.ts @@ -0,0 +1,643 @@ +import { + BaseRootRoute, + BaseRoute, + BaseRouteApi, + notFound, +} from '@tanstack/router-core' +import { injectLoaderData } from './injectLoaderData' +import { injectLoaderDeps } from './injectLoaderDeps' +import { injectMatch } from './injectMatch' +import { injectNavigate } from './injectNavigate' +import { injectParams } from './injectParams' +import { injectRouter } from './injectRouter' +import { injectSearch } from './injectSearch' +import type { InjectParamsRoute } from './injectParams' +import type { InjectRouteContextRoute } from './injectRouteContext' +import type { InjectMatchRoute } from './injectMatch' +import type { InjectLoaderDepsRoute } from './injectLoaderDeps' +import type { InjectLoaderDataRoute } from './injectLoaderData' +import type * as Angular from '@angular/core' +import type { + AnyContext, + AnyRoute, + AnyRouter, + ConstrainLiteral, + NotFoundError, + Register, + RegisteredRouter, + ResolveFullPath, + ResolveId, + ResolveParams, + RootRoute as RootRouteCore, + RootRouteId, + RootRouteOptions, + RouteConstraints, + Route as RouteCore, + RouteIds, + RouteMask, + RouteOptions, + RouteTypesById, + RouterCore, + ToMaskOptions, + UseNavigateResult, +} from '@tanstack/router-core' +import type { InjectSearchRoute } from './injectSearch' + +declare module '@tanstack/router-core' { + export interface UpdatableRouteOptionsExtensions { + component?: RouteComponent + errorComponent?: false | null | undefined | ErrorRouteComponent + notFoundComponent?: NotFoundRouteComponent + pendingComponent?: RouteComponent + } + + export interface RootRouteOptionsExtensions { + shellComponent?: Angular.Type<{ + children: any + }> + } + + export interface RouteExtensions< + in out TId extends string, + in out TFullPath extends string, + > { + injectMatch: InjectMatchRoute + injectRouteContext: InjectRouteContextRoute + injectSearch: InjectSearchRoute + injectParams: InjectParamsRoute + injectLoaderDeps: InjectLoaderDepsRoute + injectLoaderData: InjectLoaderDataRoute + injectNavigate: () => UseNavigateResult + } +} + +export function getRouteApi< + const TId, + TRouter extends AnyRouter = RegisteredRouter, +>(id: ConstrainLiteral>) { + return new RouteApi({ id }) +} + +export class RouteApi< + TId, + TRouter extends AnyRouter = RegisteredRouter, +> extends BaseRouteApi { + /** + * @deprecated Use the `getRouteApi` function instead. + */ + constructor({ id }: { id: TId }) { + super({ id }) + } + + injectMatch: InjectMatchRoute = (opts) => { + return injectMatch({ + select: opts?.select, + from: this.id, + } as any) as any + } + + injectRouteContext: InjectRouteContextRoute = (opts) => { + return injectMatch({ + from: this.id as any, + select: (d) => (opts?.select ? opts.select(d.context) : d.context), + }) as any + } + + injectSearch: InjectSearchRoute = (opts) => { + return injectSearch({ + select: opts?.select, + from: this.id, + } as any) as any + } + + injectParams: InjectParamsRoute = (opts) => { + return injectParams({ + select: opts?.select, + from: this.id, + } as any) as any + } + + injectLoaderDeps: InjectLoaderDepsRoute = (opts) => { + return injectLoaderDeps({ ...opts, from: this.id, strict: false } as any) + } + + injectLoaderData: InjectLoaderDataRoute = (opts) => { + return injectLoaderData({ ...opts, from: this.id, strict: false } as any) + } + + injectNavigate = (): UseNavigateResult< + RouteTypesById['fullPath'] + > => { + const router = injectRouter() + return injectNavigate({ + from: router.routesById[this.id as string].fullPath, + }) + } + + notFound = (opts?: NotFoundError) => { + return notFound({ routeId: this.id as string, ...opts }) + } +} + +export class Route< + in out TRegister = unknown, + in out TParentRoute extends RouteConstraints['TParentRoute'] = AnyRoute, + in out TPath extends RouteConstraints['TPath'] = '/', + in out TFullPath extends RouteConstraints['TFullPath'] = ResolveFullPath< + TParentRoute, + TPath + >, + in out TCustomId extends RouteConstraints['TCustomId'] = string, + in out TId extends RouteConstraints['TId'] = ResolveId< + TParentRoute, + TCustomId, + TPath + >, + in out TSearchValidator = undefined, + in out TParams = ResolveParams, + in out TRouterContext = AnyContext, + in out TRouteContextFn = AnyContext, + in out TBeforeLoadFn = AnyContext, + in out TLoaderDeps extends Record = {}, + in out TLoaderFn = undefined, + in out TChildren = unknown, + in out TFileRouteTypes = unknown, + in out TSSR = unknown, + in out TMiddlewares = unknown, + in out THandlers = undefined, + > + extends BaseRoute< + TRegister, + TParentRoute, + TPath, + TFullPath, + TCustomId, + TId, + TSearchValidator, + TParams, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TChildren, + TFileRouteTypes, + TSSR, + TMiddlewares, + THandlers + > + implements + RouteCore< + TRegister, + TParentRoute, + TPath, + TFullPath, + TCustomId, + TId, + TSearchValidator, + TParams, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TChildren, + TFileRouteTypes, + TSSR, + TMiddlewares, + THandlers + > +{ + /** + * @deprecated Use the `createRoute` function instead. + */ + constructor( + options?: RouteOptions< + TRegister, + TParentRoute, + TId, + TCustomId, + TFullPath, + TPath, + TSearchValidator, + TParams, + TLoaderDeps, + TLoaderFn, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TSSR, + TMiddlewares, + THandlers + >, + ) { + super(options) + } + + injectMatch: InjectMatchRoute = (opts?: any) => { + return injectMatch({ + select: opts?.select, + from: this.id, + } as any) as any + } + + injectRouteContext: InjectRouteContextRoute = (opts?: any) => { + return injectMatch({ + ...opts, + from: this.id, + select: (d) => (opts?.select ? opts.select(d.context) : d.context), + }) as any + } + + injectSearch: InjectSearchRoute = (opts) => { + return injectSearch({ + select: opts?.select, + from: this.id, + } as any) as any + } + + injectParams: InjectParamsRoute = (opts) => { + return injectParams({ + select: opts?.select, + from: this.id, + } as any) as any + } + + injectLoaderDeps: InjectLoaderDepsRoute = (opts) => { + return injectLoaderDeps({ ...opts, from: this.id } as any) + } + + injectLoaderData: InjectLoaderDataRoute = (opts) => { + return injectLoaderData({ ...opts, from: this.id } as any) + } + + injectNavigate = (): UseNavigateResult => { + return injectNavigate({ from: this.fullPath }) + } +} + +export function createRoute< + TRegister = unknown, + TParentRoute extends RouteConstraints['TParentRoute'] = AnyRoute, + TPath extends RouteConstraints['TPath'] = '/', + TFullPath extends RouteConstraints['TFullPath'] = ResolveFullPath< + TParentRoute, + TPath + >, + TCustomId extends RouteConstraints['TCustomId'] = string, + TId extends RouteConstraints['TId'] = ResolveId< + TParentRoute, + TCustomId, + TPath + >, + TSearchValidator = undefined, + TParams = ResolveParams, + TRouteContextFn = AnyContext, + TBeforeLoadFn = AnyContext, + TLoaderDeps extends Record = {}, + TLoaderFn = undefined, + TChildren = unknown, + TSSR = unknown, + THandlers = undefined, +>( + options: RouteOptions< + TRegister, + TParentRoute, + TId, + TCustomId, + TFullPath, + TPath, + TSearchValidator, + TParams, + TLoaderDeps, + TLoaderFn, + AnyContext, + TRouteContextFn, + TBeforeLoadFn, + TSSR, + THandlers + >, +): Route< + TRegister, + TParentRoute, + TPath, + TFullPath, + TCustomId, + TId, + TSearchValidator, + TParams, + AnyContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TChildren, + unknown, + TSSR, + THandlers +> { + return new Route< + TRegister, + TParentRoute, + TPath, + TFullPath, + TCustomId, + TId, + TSearchValidator, + TParams, + AnyContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TChildren, + unknown, + TSSR, + THandlers + >(options) +} + +export type AnyRootRoute = RootRoute< + any, + any, + any, + any, + any, + any, + any, + any, + any, + any +> + +export function createRootRouteWithContext() { + return < + TRegister = Register, + TRouteContextFn = AnyContext, + TBeforeLoadFn = AnyContext, + TSearchValidator = undefined, + TLoaderDeps extends Record = {}, + TLoaderFn = undefined, + TSSR = unknown, + THandlers = undefined, + >( + options?: RootRouteOptions< + TRegister, + TSearchValidator, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TSSR, + THandlers + >, + ) => { + return createRootRoute< + TRegister, + TSearchValidator, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TSSR, + THandlers + >(options as any) + } +} + +export class RootRoute< + in out TRegister = Register, + in out TSearchValidator = undefined, + in out TRouterContext = {}, + in out TRouteContextFn = AnyContext, + in out TBeforeLoadFn = AnyContext, + in out TLoaderDeps extends Record = {}, + in out TLoaderFn = undefined, + in out TChildren = unknown, + in out TFileRouteTypes = unknown, + in out TSSR = unknown, + in out THandlers = undefined, + > + extends BaseRootRoute< + TRegister, + TSearchValidator, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TChildren, + TFileRouteTypes, + TSSR, + THandlers + > + implements + RootRouteCore< + TRegister, + TSearchValidator, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TChildren, + TFileRouteTypes, + TSSR, + THandlers + > +{ + /** + * @deprecated `RootRoute` is now an internal implementation detail. Use `createRootRoute()` instead. + */ + constructor( + options?: RootRouteOptions< + TRegister, + TSearchValidator, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TSSR, + THandlers + >, + ) { + super(options) + } + + injectMatch: InjectMatchRoute = (opts?: any) => { + return injectMatch({ + select: opts?.select, + from: this.id, + } as any) as any + } + + injectRouteContext: InjectRouteContextRoute = (opts) => { + return injectMatch({ + ...opts, + from: this.id, + select: (d) => (opts?.select ? opts.select(d.context) : d.context), + }) as any + } + + injectSearch: InjectSearchRoute = (opts) => { + return injectSearch({ + select: opts?.select, + from: this.id, + } as any) as any + } + + injectParams: InjectParamsRoute = (opts) => { + return injectParams({ + select: opts?.select, + from: this.id, + } as any) as any + } + + injectLoaderDeps: InjectLoaderDepsRoute = (opts) => { + return injectLoaderDeps({ ...opts, from: this.id } as any) + } + + injectLoaderData: InjectLoaderDataRoute = (opts) => { + return injectLoaderData({ ...opts, from: this.id } as any) + } + + injectNavigate = (): UseNavigateResult<'/'> => { + return injectNavigate({ from: this.fullPath }) + } +} + +export function createRouteMask< + TRouteTree extends AnyRoute, + TFrom extends string, + TTo extends string, +>( + opts: { + routeTree: TRouteTree + } & ToMaskOptions, TFrom, TTo>, +): RouteMask { + return opts as any +} + +// Use a function becasue class definitions are not hoisted + +export type RouteComponent = + () => Angular.Type +export type ErrorRouteComponent = () => Angular.Type +export type NotFoundRouteComponent = () => Angular.Type + +export class NotFoundRoute< + TRegister, + TParentRoute extends AnyRootRoute, + TRouterContext = AnyContext, + TRouteContextFn = AnyContext, + TBeforeLoadFn = AnyContext, + TSearchValidator = undefined, + TLoaderDeps extends Record = {}, + TLoaderFn = undefined, + TChildren = unknown, + TSSR = unknown, + THandlers = undefined, +> extends Route< + TRegister, + TParentRoute, + '/404', + '/404', + '404', + '404', + TSearchValidator, + {}, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TChildren, + TSSR, + THandlers +> { + constructor( + options: Omit< + RouteOptions< + TRegister, + TParentRoute, + string, + string, + string, + string, + TSearchValidator, + {}, + TLoaderDeps, + TLoaderFn, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TSSR, + THandlers + >, + | 'caseSensitive' + | 'parseParams' + | 'stringifyParams' + | 'path' + | 'id' + | 'params' + >, + ) { + super({ + ...(options as any), + id: '404', + }) + } +} + +export function createRootRoute< + TRegister = Register, + TSearchValidator = undefined, + TRouterContext = {}, + TRouteContextFn = AnyContext, + TBeforeLoadFn = AnyContext, + TLoaderDeps extends Record = {}, + TLoaderFn = undefined, + TSSR = unknown, + THandlers = undefined, +>( + options?: RootRouteOptions< + TRegister, + TSearchValidator, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + TSSR, + THandlers + >, +): RootRoute< + TRegister, + TSearchValidator, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + unknown, + unknown, + TSSR, + THandlers +> { + return new RootRoute< + TRegister, + TSearchValidator, + TRouterContext, + TRouteContextFn, + TBeforeLoadFn, + TLoaderDeps, + TLoaderFn, + unknown, + unknown, + TSSR, + THandlers + >(options) +} diff --git a/packages/angular-router-experimental/src/router.ts b/packages/angular-router-experimental/src/router.ts new file mode 100644 index 00000000000..87ed302bcfc --- /dev/null +++ b/packages/angular-router-experimental/src/router.ts @@ -0,0 +1,75 @@ +import { + RouterCore +} from '@tanstack/router-core' +import type { RouterHistory } from '@tanstack/history' +import type { ErrorRouteComponent, RouteComponent } from './route' +import type { + AnyRoute, + CreateRouterFn, + RouterConstructorOptions, + TrailingSlashOption} from '@tanstack/router-core'; + +declare module '@tanstack/router-core' { + export interface RouterOptionsExtensions { + /** + * The default `component` a route should use if no component is provided. + * + * @default Outlet + * @link [API Docs](https://tanstack.com/router/latest/docs/framework/solid/api/router/RouterOptionsType#defaultcomponent-property) + */ + defaultComponent?: RouteComponent + /** + * The default `errorComponent` a route should use if no error component is provided. + * + * @default ErrorComponent + * @link [API Docs](https://tanstack.com/router/latest/docs/framework/solid/api/router/RouterOptionsType#defaulterrorcomponent-property) + * @link [Guide](https://tanstack.com/router/latest/docs/framework/solid/guide/data-loading#handling-errors-with-routeoptionserrorcomponent) + */ + defaultErrorComponent?: ErrorRouteComponent + /** + * The default `pendingComponent` a route should use if no pending component is provided. + * + * @link [API Docs](https://tanstack.com/router/latest/docs/framework/solid/api/router/RouterOptionsType#defaultpendingcomponent-property) + * @link [Guide](https://tanstack.com/router/latest/docs/framework/solid/guide/data-loading#showing-a-pending-component) + */ + defaultPendingComponent?: RouteComponent + /** + * The default `notFoundComponent` a route should use if no notFound component is provided. + * + * @default NotFound + * @link [API Docs](https://tanstack.com/router/latest/docs/framework/solid/api/router/RouterOptionsType#defaultnotfoundcomponent-property) + * @link [Guide](https://tanstack.com/router/latest/docs/framework/solid/guide/not-found-errors#default-router-wide-not-found-handling) + */ + defaultNotFoundComponent?: RouteComponent + } +} + +export const createRouter: CreateRouterFn = (options: any) => { + return new Router(options) +} + +export class Router< + in out TRouteTree extends AnyRoute, + in out TTrailingSlashOption extends TrailingSlashOption = 'never', + in out TDefaultStructuralSharingOption extends boolean = false, + in out TRouterHistory extends RouterHistory = RouterHistory, + in out TDehydrated extends Record = Record, +> extends RouterCore< + TRouteTree, + TTrailingSlashOption, + TDefaultStructuralSharingOption, + TRouterHistory, + TDehydrated +> { + constructor( + options: RouterConstructorOptions< + TRouteTree, + TTrailingSlashOption, + TDefaultStructuralSharingOption, + TRouterHistory, + TDehydrated + >, + ) { + super(options) + } +} diff --git a/packages/angular-router-experimental/src/routerInjectionToken.ts b/packages/angular-router-experimental/src/routerInjectionToken.ts new file mode 100644 index 00000000000..cff5f44be0a --- /dev/null +++ b/packages/angular-router-experimental/src/routerInjectionToken.ts @@ -0,0 +1,24 @@ +import * as Angular from '@angular/core' +import type { AnyRouter } from '@tanstack/router-core' + +declare global { + interface Window { + __TSR_ROUTER_INJECTION_KEY__?: Angular.InjectionToken + } +} + +const routerInjectionKey = new Angular.InjectionToken('ROUTER') + +export function getRouterInjectionKey() { + if (typeof document === 'undefined') { + return routerInjectionKey + } + + if (window.__TSR_ROUTER_INJECTION_KEY__) { + return window.__TSR_ROUTER_INJECTION_KEY__ + } + + window.__TSR_ROUTER_INJECTION_KEY__ = routerInjectionKey as any + + return routerInjectionKey +} diff --git a/packages/angular-router-experimental/src/transitioner.ts b/packages/angular-router-experimental/src/transitioner.ts new file mode 100644 index 00000000000..4289856d4c3 --- /dev/null +++ b/packages/angular-router-experimental/src/transitioner.ts @@ -0,0 +1,249 @@ +import * as Angular from '@angular/core' +import { + getLocationChangeInfo, + handleHashScroll, + trimPathRight, +} from '@tanstack/router-core' +import { injectRouter } from './injectRouter' +import { injectRouterState } from './injectRouterState' +import type { AnyRouter } from '@tanstack/router-core' + +// Track mount state per router to avoid double-loading +let mountLoadForRouter: { router: AnyRouter | null; mounted: boolean } = { + router: null, + mounted: false, +} + +/** + * Helper function that sets up router transition logic. + * This should be called from Matches component to set up: + * - router.startTransition + * - router.startViewTransition + * - History subscription + * - Router event watchers + * + * Must be called during component initialization. + * + * This is more complicated than the other adapters, since Angular + * does not have transition support and a mechanism to wait for the next tick. + */ +export function injectTransitionerSetup() { + const router = injectRouter() + const environmentInjector = Angular.inject(Angular.EnvironmentInjector) + + // Skip on server - no transitions needed + if (router.isServer) return + + const destroyRef = Angular.inject(Angular.DestroyRef) + let destroyed = false + const isLoading = injectRouterState({ + select: (s) => s.isLoading, + }) + + // Track if we're in a transition + const isTransitioning = Angular.signal(false) + + // Track pending state changes + const hasPendingMatches = injectRouterState({ + select: (s) => s.matches.some((d) => d.status === 'pending'), + }) + + const isAnyPending = Angular.computed( + () => isLoading() || isTransitioning() || hasPendingMatches(), + ) + + const isPagePending = Angular.computed( + () => isLoading() || hasPendingMatches(), + ) + + // Track previous values for comparison using proper previous value tracking + const prevIsLoading = injectPrevious(() => isLoading()) + const prevIsAnyPending = injectPrevious(() => isAnyPending()) + const prevIsPagePending = injectPrevious(() => isPagePending()) + + // Implement startTransition similar to React/Solid + // Angular doesn't have a native startTransition like React 18, so we simulate it + router.startTransition = (fn: () => void | Promise) => { + isTransitioning.set(true) + // Also update the router state so useMatch can check it + try { + router.__store.setState((s) => ({ ...s, isTransitioning: true })) + } catch { + // Ignore errors if component is unmounted + } + + // Helper to end the transition + const endTransition = () => { + if (destroyed) return + + // Use afterNextRender to ensure Angular has processed all change detection + // This is similar to Vue's nextTick approach + Angular.afterNextRender( + { + read: () => { + try { + isTransitioning.set(false) + router.__store.setState((s) => ({ ...s, isTransitioning: false })) + } catch { + // Ignore errors if component is unmounted + } + }, + }, + { injector: environmentInjector }, + ) + } + + const result = fn() + + if (result instanceof Promise) { + result.finally(() => endTransition()) + } else { + endTransition() + } + } + + // Subscribe to location changes and try to load the new location + let unsubscribe: (() => void) | undefined + + Angular.afterNextRender(() => { + unsubscribe = router.history.subscribe(router.load) + + const nextLocation = router.buildLocation({ + to: router.latestLocation.pathname, + search: true, + params: true, + hash: true, + state: true, + _includeValidateSearch: true, + }) + + if ( + trimPathRight(router.latestLocation.href) !== + trimPathRight(nextLocation.href) + ) { + router.commitLocation({ ...nextLocation, replace: true }) + } + }) + + // Track if component is mounted to prevent updates after unmount + const isMounted = Angular.signal(false) + + Angular.afterNextRender(() => { + isMounted.set(true) + if (!isAnyPending()) { + router.__store.setState((s) => + s.status === 'pending' + ? { ...s, status: 'idle', resolvedLocation: s.location } + : s, + ) + } + }) + + destroyRef.onDestroy(() => { + isMounted.set(false) + destroyed = true + if (unsubscribe) { + unsubscribe() + } + }) + + // Try to load the initial location + Angular.afterNextRender(() => { + if ( + (typeof window !== 'undefined' && router.ssr) || + (mountLoadForRouter.router === router && mountLoadForRouter.mounted) + ) { + return + } + mountLoadForRouter = { router, mounted: true } + const tryLoad = async () => { + try { + await router.load() + } catch (err) { + console.error(err) + } + } + tryLoad() + }) + + // Setup effects for emitting events + // All effects check isMounted to prevent updates after unmount + + // Watch for onLoad event + Angular.effect(() => { + if (!isMounted()) return + try { + if (prevIsLoading() && !isLoading()) { + router.emit({ + type: 'onLoad', + ...getLocationChangeInfo(router.state), + }) + } + } catch { + // Ignore errors if component is unmounted + } + }) + + // Watch for onBeforeRouteMount event + Angular.effect(() => { + if (!isMounted()) return + try { + if (prevIsPagePending() && !isPagePending()) { + router.emit({ + type: 'onBeforeRouteMount', + ...getLocationChangeInfo(router.state), + }) + } + } catch { + // Ignore errors if component is unmounted + } + }) + + // Watch for onResolved event + Angular.effect(() => { + if (!isMounted()) return + try { + if ( + prevIsAnyPending() && + !isAnyPending() && + router.__store.state.status === 'pending' + ) { + router.__store.setState((s) => ({ + ...s, + status: 'idle', + resolvedLocation: s.location, + })) + } + + // The router was pending and now it's not + if (prevIsAnyPending() && !isAnyPending()) { + const changeInfo = getLocationChangeInfo(router.state) + router.emit({ + type: 'onResolved', + ...changeInfo, + }) + + if (changeInfo.hrefChanged) { + handleHashScroll(router) + } + } + } catch { + // Ignore errors if component is unmounted + } + }) +} + +export function injectPrevious( + fn: () => NonNullable, +): Angular.Signal { + const value = Angular.computed(fn) + let previousValue: T | null = null + + return Angular.computed(() => { + // We known value is different that the previous one, + // thanks to signal memoization. + const lastPreviousValue = previousValue + previousValue = value() + return lastPreviousValue + }) +} diff --git a/packages/angular-router-experimental/tests/Matches.test.ts b/packages/angular-router-experimental/tests/Matches.test.ts new file mode 100644 index 00000000000..321b8387432 --- /dev/null +++ b/packages/angular-router-experimental/tests/Matches.test.ts @@ -0,0 +1,188 @@ +import * as Angular from '@angular/core' +import { fireEvent, render, screen } from '@testing-library/angular' +import { afterEach, expect, test, vi } from 'vitest' +import { + Link, + Outlet, + RouterProvider, + createMemoryHistory, + createRootRoute, + createRoute, + createRouter, + injectErrorState, +} from '../src' +import { sleep } from './utils' + +afterEach(() => { + vi.clearAllMocks() + vi.resetAllMocks() + window.history.replaceState(null, 'root', '/') +}) + +@Angular.Component({ + template: '

Home

', + standalone: true, +}) +class HomeComponent {} + +@Angular.Component({ + template: '

Pending

', + standalone: true, +}) +class PendingComponent {} + +@Angular.Component({ + template: '

Not Found

', + standalone: true, +}) +class NotFoundComponent {} + +@Angular.Component({ + template: '

Error: {{ state.error?.message }}

', + standalone: true, +}) +class ErrorComponent { + state = injectErrorState() +} + +@Angular.Component({ + imports: [Link, Outlet], + template: ` + Home + Slow + Bad + Settings + Missing + + `, +}) +class RootComponent {} + +@Angular.Component({ + template: '

Slow Route

', + standalone: true, +}) +class SlowComponent {} + +@Angular.Component({ + imports: [Outlet], + template: '

Settings Layout

', +}) +class SettingsLayoutComponent {} + +@Angular.Component({ + template: '

Settings Index

', + standalone: true, +}) +class SettingsIndexComponent {} + +function makeRouter() { + const rootRoute = createRootRoute({ + component: () => RootComponent, + notFoundComponent: () => NotFoundComponent, + }) + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => HomeComponent, + }) + + const slowRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/slow', + pendingComponent: () => PendingComponent, + loader: async () => { + await sleep(1200) + return { ok: true } + }, + component: () => SlowComponent, + }) + + const badRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/bad', + loader: () => { + throw new Error('boom') + }, + errorComponent: () => ErrorComponent, + component: () => HomeComponent, + }) + + const settingsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/settings', + notFoundComponent: () => NotFoundComponent, + component: () => SettingsLayoutComponent, + }) + + const settingsIndexRoute = createRoute({ + getParentRoute: () => settingsRoute, + path: '/', + component: () => SettingsIndexComponent, + }) + + return createRouter({ + routeTree: rootRoute.addChildren([ + indexRoute, + slowRoute, + badRoute, + settingsRoute.addChildren([settingsIndexRoute]), + ]), + history: createMemoryHistory({ initialEntries: ['/'] }), + notFoundMode: 'fuzzy', + }) +} + +test('renders success route', async () => { + const router = makeRouter() + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + await expect(screen.findByTestId('home')).resolves.toBeTruthy() +}) + +// Skipped: deferred/pending UI during route load is n/a for Angular per PARITY_MATRIX. +// Pending component may not reliably render before success state due to timing/rendering. +test.skip('renders pending state and then success state', async () => { + const router = makeRouter() + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const slowLink = await screen.findByTestId('slow-link') + fireEvent.click(slowLink) + + await expect(screen.findByTestId('pending', undefined, { timeout: 2000 })) + .resolves.toBeTruthy() + await expect(screen.findByTestId('slow')).resolves.toBeTruthy() +}) + +test('renders error and notFound states', async () => { + const router = makeRouter() + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const badLink = await screen.findByTestId('bad-link') + fireEvent.click(badLink) + + await expect(screen.findByTestId('error')).resolves.toBeTruthy() + + const homeLink = await screen.findByTestId('home-link') + fireEvent.click(homeLink) + await expect(screen.findByTestId('home')).resolves.toBeTruthy() + + const settingsLink = await screen.findByTestId('settings-link') + fireEvent.click(settingsLink) + await expect(screen.findByTestId('settings-index')).resolves.toBeTruthy() + + const missingLink = await screen.findByTestId('settings-missing-link') + fireEvent.click(missingLink) + + await expect(screen.findByTestId('not-found')).resolves.toBeTruthy() +}) diff --git a/packages/angular-router-experimental/tests/RouterProvider.test.ts b/packages/angular-router-experimental/tests/RouterProvider.test.ts new file mode 100644 index 00000000000..57e51b462ee --- /dev/null +++ b/packages/angular-router-experimental/tests/RouterProvider.test.ts @@ -0,0 +1,85 @@ +import * as Angular from '@angular/core' +import { render, waitFor } from '@testing-library/angular' +import { afterEach, expect, test, vi } from 'vitest' +import { + RouterProvider, + createMemoryHistory, + createRootRoute, + createRoute, + createRouter, +} from '../src' + +afterEach(() => { + vi.clearAllMocks() + vi.resetAllMocks() +}) + +test('RouterProvider merges router options context and input context/options', async () => { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute]), + history: createMemoryHistory({ initialEntries: ['/'] }), + context: { + appName: 'router', + }, + }) + + await render(RouterProvider, { + bindings: [ + Angular.inputBinding('router', () => router), + Angular.inputBinding('context', () => ({ feature: 'angular' })), + Angular.inputBinding('options', () => ({ defaultPreloadDelay: 123 })), + ], + }) + + await waitFor(() => { + expect(router.options.defaultPreloadDelay).toBe(123) + expect(router.options.context).toMatchObject({ + appName: 'router', + feature: 'angular', + }) + }) +}) + +test('RouterProvider reacts to context and options signal updates', async () => { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute]), + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + const contextSig = Angular.signal({ env: 'dev' }) + const optionsSig = Angular.signal({ defaultPreloadDelay: 10 }) + + const rendered = await render(RouterProvider, { + bindings: [ + Angular.inputBinding('router', () => router), + Angular.inputBinding('context', () => contextSig()), + Angular.inputBinding('options', () => optionsSig()), + ], + }) + + await waitFor(() => { + expect(router.options.defaultPreloadDelay).toBe(10) + expect(router.options.context).toMatchObject({ env: 'dev' }) + }) + + contextSig.set({ env: 'test' }) + optionsSig.set({ defaultPreloadDelay: 250 }) + rendered.fixture.detectChanges() + + await waitFor(() => { + expect(router.options.defaultPreloadDelay).toBe(250) + expect(router.options.context).toMatchObject({ env: 'test' }) + }) +}) diff --git a/packages/angular-router-experimental/tests/blocker.test.ts b/packages/angular-router-experimental/tests/blocker.test.ts new file mode 100644 index 00000000000..8df2fb28741 --- /dev/null +++ b/packages/angular-router-experimental/tests/blocker.test.ts @@ -0,0 +1,221 @@ +import * as Angular from '@angular/core' +import { fireEvent, render, screen, waitFor } from '@testing-library/angular' +import { afterEach, describe, expect, test, vi } from 'vitest' +import combinate from 'combinate' +import { + Link, + RouterProvider, + createRootRoute, + createRoute, + createRouter, + injectBlocker, + injectNavigate, + redirect, +} from '../src' +import type { InjectBlockerOpts, ShouldBlockFn } from '../src' + +afterEach(() => { + window.history.replaceState(null, 'root', '/') + vi.resetAllMocks() +}) + +interface BlockerTestOpts { + blockerFn: ShouldBlockFn + disabled?: boolean + ignoreBlocker?: boolean +} + +const BLOCKER_OPTIONS_TOKEN = new Angular.InjectionToken( + 'BLOCKER_OPTIONS', +) +const IGNORE_BLOCKER_TOKEN = new Angular.InjectionToken( + 'IGNORE_BLOCKER', +) +const SHOULD_NOT_NAVIGATE_TIMEOUT_MS = 120 + +@Angular.Component({ + selector: 'blocker-index', + imports: [Link], + template: ` +

Index

+ link to posts + link to foo + + `, +}) +class IndexComponent { + navigate = injectNavigate() + blocker = injectBlocker(Angular.inject(BLOCKER_OPTIONS_TOKEN)) + ignoreBlocker = Angular.inject(IGNORE_BLOCKER_TOKEN) +} + +@Angular.Component({ + selector: 'blocker-posts', + template: '

Posts

', +}) +class PostsComponent { } + +@Angular.Component({ + selector: 'blocker-foo', + template: '

Foo

', +}) +class FooComponent { } + +@Angular.Component({ + selector: 'blocker-bar', + template: '

Bar

', +}) +class BarComponent { } + +async function setup({ blockerFn, disabled, ignoreBlocker }: BlockerTestOpts) { + const _mockBlockerFn = vi.fn(blockerFn) + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + component: () => PostsComponent, + }) + + const fooRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/foo', + beforeLoad: () => { + throw redirect({ to: '/bar' }) + }, + component: () => FooComponent, + }) + const barRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/bar', + component: () => BarComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([ + indexRoute, + postsRoute, + fooRoute, + barRoute, + ]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + providers: [ + { + provide: BLOCKER_OPTIONS_TOKEN, + useValue: { + shouldBlockFn: _mockBlockerFn, + disabled, + } as InjectBlockerOpts, + }, + { + provide: IGNORE_BLOCKER_TOKEN, + useValue: ignoreBlocker, + }, + ], + }) + + expect(window.location.pathname).toBe('/') + + 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: { postsLink, fooLink, button }, + blockerFn: _mockBlockerFn, + } +} + +const clickTarget = ['postsLink' as const, 'button' as const] + +describe('Blocker', () => { + const doesNotBlockTextMatrix = combinate({ + opts: [ + { + blockerFn: () => false, + disabled: false, + ignoreBlocker: undefined, + }, + { + blockerFn: async () => + await new Promise((resolve) => resolve(false)), + disabled: false, + ignoreBlocker: false, + }, + { + blockerFn: () => true, + disabled: true, + ignoreBlocker: false, + }, + { + blockerFn: () => true, + disabled: false, + ignoreBlocker: true, + }, + ], + clickTarget, + }) + test.each(doesNotBlockTextMatrix)( + 'does not block navigation with blockerFn = $flags.blockerFn, ignoreBlocker = $flags.ignoreBlocker, clickTarget = $clickTarget', + async ({ opts, clickTarget }) => { + const { clickable, blockerFn } = await setup(opts) + + fireEvent.click(clickable[clickTarget]) + expect(await screen.findByRole('heading', { name: 'Posts' })).toBeTruthy() + expect(window.location.pathname).toBe('/posts') + if (opts.ignoreBlocker || opts.disabled) + expect(blockerFn).not.toHaveBeenCalled() + }, + ) + + const blocksTextMatrix = combinate({ + opts: [ + { + blockerFn: () => true, + disabled: false, + ignoreBlocker: undefined, + }, + { + blockerFn: async () => + await new Promise((resolve) => resolve(true)), + disabled: false, + ignoreBlocker: false, + }, + ], + clickTarget, + }) + test.each(blocksTextMatrix)( + 'blocks navigation with condition = $flags.blockerFn, ignoreBlocker = $flags.ignoreBlocker, clickTarget = $clickTarget', + async ({ opts, clickTarget }) => { + const { clickable } = await setup(opts) + + fireEvent.click(clickable[clickTarget]) + await waitFor( + () => { + expect(screen.queryByRole('heading', { name: 'Posts' })).toBeNull() + }, + { timeout: SHOULD_NOT_NAVIGATE_TIMEOUT_MS }, + ) + expect(window.location.pathname).toBe('/') + }, + ) + + test('blocker function is only called once when navigating to a route that redirects', async () => { + const { clickable, blockerFn } = await setup({ + blockerFn: () => false, + ignoreBlocker: false, + }) + fireEvent.click(clickable.fooLink) + expect(await screen.findByRole('heading', { name: 'Bar' })).toBeTruthy() + expect(window.location.pathname).toBe('/bar') + expect(blockerFn).toHaveBeenCalledTimes(1) + }) +}) diff --git a/packages/angular-router-experimental/tests/createLazyRoute.test.ts b/packages/angular-router-experimental/tests/createLazyRoute.test.ts new file mode 100644 index 00000000000..e577405803b --- /dev/null +++ b/packages/angular-router-experimental/tests/createLazyRoute.test.ts @@ -0,0 +1,109 @@ +import * as Angular from '@angular/core' +import { fireEvent, render, screen } from '@testing-library/angular' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { + Link, + RouterProvider, + createBrowserHistory, + createMemoryHistory, + createRootRoute, + createRoute, + createRouter, +} from '../src' +import type { RouterHistory } from '@tanstack/history' + +beforeEach(() => { + vi.useFakeTimers({ shouldAdvanceTime: true }) +}) + +afterEach(() => { + window.history.replaceState(null, 'root', '/') + vi.resetAllMocks() + vi.useRealTimers() +}) + +function createTestRouter(initialHistory?: RouterHistory) { + const history = + initialHistory ?? createMemoryHistory({ initialEntries: ['/'] }) + + const rootRoute = createRootRoute({}) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + const heavyRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/heavy', + }).lazy(() => import('./lazy/heavy').then((d) => d.default('/heavy'))) + + const routeTree = rootRoute.addChildren([indexRoute, heavyRoute]) + + const router = createRouter({ routeTree, history }) + + return { + router, + routes: { indexRoute, heavyRoute }, + } +} + +@Angular.Component({ + imports: [Link], + template: ` +
+

Index Route

+ Link to heavy +
+ `, +}) +class IndexComponent {} + +describe('preload: matched routes', { timeout: 20000 }, () => { + it('should wait for lazy options to be streamed in before', async () => { + const { router } = createTestRouter( + createMemoryHistory({ initialEntries: ['/'] }), + ) + + await router.load() + + // Preload the route and navigate to it + router.preloadRoute({ to: '/heavy' }) + await router.navigate({ to: '/heavy' }) + + await router.invalidate() + + expect(router.state.location.pathname).toBe('/heavy') + + const lazyRoute = router.routesByPath['/heavy'] + + expect(lazyRoute.options.component).toBeDefined() + }) + + it('should render the heavy/lazy component', async () => { + const { router } = createTestRouter(createBrowserHistory()) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const linkToHeavy = await screen.findByText('Link to heavy') + expect(linkToHeavy).toBeTruthy() + + expect(router.state.location.pathname).toBe('/') + expect(window.location.pathname).toBe('/') + + // Click the link to navigate to the heavy route + fireEvent.click(linkToHeavy) + + const heavyElement = await screen.findByText('I am sooo heavy') + + expect(heavyElement).toBeTruthy() + + expect(router.state.location.pathname).toBe('/heavy') + expect(window.location.pathname).toBe('/heavy') + + const lazyRoute = router.routesByPath['/heavy'] + expect(lazyRoute.options.component).toBeDefined() + }) +}) diff --git a/packages/angular-router-experimental/tests/errorComponent.test.ts b/packages/angular-router-experimental/tests/errorComponent.test.ts new file mode 100644 index 00000000000..81207081114 --- /dev/null +++ b/packages/angular-router-experimental/tests/errorComponent.test.ts @@ -0,0 +1,184 @@ +import * as Angular from '@angular/core' +import { fireEvent, render, screen, waitFor } from '@testing-library/angular' +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' +import { + Link, + RouterProvider, + createBrowserHistory, + createRootRoute, + createRoute, + createRouter, + injectErrorState, +} from '../src' +import type { RouterHistory } from '@tanstack/history' + +@Angular.Component({ + selector: 'error-component-host', + template: '
Error: {{ errorState.error.message }}
', + standalone: true, +}) +class MyErrorComponent { + errorState = injectErrorState() +} + +const ASYNC_THROW_DELAY_MS = 50 +const ERROR_RENDER_TIMEOUT_MS = 2500 +const SHOULD_NOT_RENDER_TIMEOUT_MS = 500 + +async function asyncToThrowFn() { + await new Promise((resolve) => setTimeout(resolve, ASYNC_THROW_DELAY_MS)) + throw new Error('error thrown') +} + +function throwFn() { + throw new Error('error thrown') +} + +let history: RouterHistory + +beforeEach(() => { + history = createBrowserHistory() + expect(window.location.pathname).toBe('/') +}) + +afterEach(() => { + history.destroy() + vi.resetAllMocks() + window.history.replaceState(null, 'root', '/') +}) + +@Angular.Component({ + selector: 'error-home', + imports: [Link], + template: ` + + `, + standalone: true, +}) +class HomeComponent { } + +@Angular.Component({ + selector: 'error-about', + template: '
About route content
', + standalone: true, +}) +class AboutComponent { } + +@Angular.Component({ + selector: 'error-index', + template: '
Index route content
', + standalone: true, +}) +class IndexComponent { } + +describe.each([{ preload: false }, { preload: 'intent' }] as const)( + 'errorComponent is rendered when the preload=$preload', + (options) => { + describe.each([true, false])('with async=%s', (isAsync) => { + const throwableFn = isAsync ? asyncToThrowFn : throwFn + + const callers = [ + { caller: 'beforeLoad', testFn: throwableFn }, + { caller: 'loader', testFn: throwableFn }, + ] + + test.each(callers)( + 'an Error is thrown on navigate in the route $caller function', + async ({ caller, testFn }) => { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => HomeComponent, + }) + const aboutRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/about', + beforeLoad: caller === 'beforeLoad' ? testFn : undefined, + loader: caller === 'loader' ? testFn : undefined, + component: () => AboutComponent, + errorComponent: () => MyErrorComponent, + }) + + const routeTree = rootRoute.addChildren([indexRoute, aboutRoute]) + + const router = createRouter({ + routeTree, + defaultPreload: options.preload, + history, + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const linkToAbout = await screen.findByRole('link', { + name: 'link to about', + }) + + expect(linkToAbout).toBeTruthy() + fireEvent.mouseOver(linkToAbout) + fireEvent.focus(linkToAbout) + fireEvent.click(linkToAbout) + + const errorComponent = await screen.findByText( + `Error: error thrown`, + undefined, + { timeout: ERROR_RENDER_TIMEOUT_MS }, + ) + await waitFor( + () => { + expect(screen.queryByText('About route content')).toBeNull() + }, + { timeout: SHOULD_NOT_RENDER_TIMEOUT_MS }, + ) + expect(errorComponent).toBeTruthy() + }, + ) + + test.each(callers)( + 'an Error is thrown on first load in the route $caller function', + async ({ caller, testFn }) => { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + beforeLoad: caller === 'beforeLoad' ? testFn : undefined, + loader: caller === 'loader' ? testFn : undefined, + component: () => IndexComponent, + errorComponent: () => MyErrorComponent, + }) + + const routeTree = rootRoute.addChildren([indexRoute]) + + const router = createRouter({ + routeTree, + defaultPreload: options.preload, + history, + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const errorComponent = await screen.findByText( + `Error: error thrown`, + undefined, + { timeout: ERROR_RENDER_TIMEOUT_MS }, + ) + await waitFor( + () => { + expect(screen.queryByText('Index route content')).toBeNull() + }, + { timeout: SHOULD_NOT_RENDER_TIMEOUT_MS }, + ) + expect(errorComponent).toBeTruthy() + }, + ) + }) + }, +) diff --git a/packages/angular-router-experimental/tests/fileRoute.test-d.ts b/packages/angular-router-experimental/tests/fileRoute.test-d.ts new file mode 100644 index 00000000000..795c1ff1d83 --- /dev/null +++ b/packages/angular-router-experimental/tests/fileRoute.test-d.ts @@ -0,0 +1,102 @@ +import { expectTypeOf, test } from 'vitest' +import { createFileRoute, createLazyFileRoute, createRootRoute } from '../src' + +const _rootRoute = createRootRoute() + +const _indexRoute = createFileRoute('/')() +const invoicesRoute = createFileRoute('/invoices')() +const invoiceRoute = createFileRoute('/invoices/$invoiceId')() +const _postLayoutRoute = createFileRoute('/_postLayout')() +const postsRoute = createFileRoute('/_postLayout/posts')() +const postRoute = createFileRoute('/_postLayout/posts/$postId_')() +const protectedRoute = createFileRoute('/(auth)/protected')() + +declare module '@tanstack/router-core' { + interface FileRoutesByPath { + '/': { + preLoaderRoute: typeof _indexRoute + parentRoute: typeof _rootRoute + id: string + fullPath: string + path: string + } + '/(auth)/protected': { + preLoaderRoute: typeof protectedRoute + parentRoute: typeof _rootRoute + id: '/protected' + fullPath: '/protected' + path: '(auth)/protected' + } + '/invoices': { + preLoaderRoute: typeof invoicesRoute + parentRoute: typeof _indexRoute + id: '/invoices' + fullPath: '/invoices' + path: 'invoices' + } + '/invoices/$invoiceId': { + preLoaderRoute: typeof invoiceRoute + parentRoute: typeof invoicesRoute + id: '/invoices/$invoiceId' + fullPath: '/invoices/$invoiceId' + path: '/$invoiceId' + } + '/_postLayout': { + preLoaderRoute: typeof _postLayoutRoute + parentRoute: typeof _rootRoute + id: string + fullPath: string + path: string + } + '/_postLayout/posts': { + preLoaderRoute: typeof postsRoute + parentRoute: typeof _postLayoutRoute + id: '/_postLayout/posts' + fullPath: '/posts' + path: '/posts' + } + '/_postLayout/posts/$postId_': { + preLoaderRoute: typeof postRoute + parentRoute: typeof postsRoute + id: '/_postLayout/posts/$postId_' + fullPath: '/posts/$postId' + path: '/$postId_' + } + } +} + +test('when creating a file route with a static route', () => { + expectTypeOf<'/invoices'>(invoicesRoute.fullPath) + expectTypeOf<'/invoices'>(invoicesRoute.id) + expectTypeOf<'invoices'>(invoicesRoute.path) +}) + +test('when creating a file route with params', () => { + expectTypeOf<'/invoices/$invoiceId'>(invoiceRoute.fullPath) + expectTypeOf<'/invoices/$invoiceId'>(invoiceRoute.id) + expectTypeOf<'/$invoiceId'>(invoiceRoute.path) +}) + +test('when creating a layout route', () => { + expectTypeOf<'/posts'>(postsRoute.fullPath) + expectTypeOf<'/_postLayout/posts'>(postsRoute.id) + expectTypeOf<'/posts'>(postsRoute.path) +}) + +test('when creating a _ suffix route', () => { + expectTypeOf<'/posts/$postId'>(postRoute.fullPath) + expectTypeOf<'/$postId_'>(postRoute.path) + expectTypeOf<'/_postLayout/posts/$postId_'>(postRoute.id) +}) + +test('when creating a folder group', () => { + expectTypeOf<'/protected'>(protectedRoute.fullPath) + expectTypeOf<'(auth)/protected'>(protectedRoute.path) + expectTypeOf<'/protected'>(protectedRoute.id) +}) + +test('createLazyFileRoute supports typed lazy route for file id', () => { + const lazyInvoiceRoute = createLazyFileRoute('/invoices/$invoiceId')({}) + expectTypeOf(lazyInvoiceRoute.injectParams).toBeFunction() + expectTypeOf(lazyInvoiceRoute.injectNavigate).toBeFunction() +}) diff --git a/packages/angular-router-experimental/tests/fileRoute.test.ts b/packages/angular-router-experimental/tests/fileRoute.test.ts new file mode 100644 index 00000000000..b50b6404991 --- /dev/null +++ b/packages/angular-router-experimental/tests/fileRoute.test.ts @@ -0,0 +1,57 @@ +import { describe, expect, it } from 'vitest' +import { + createFileRoute, + createLazyFileRoute, + createLazyRoute, + getRouteApi, +} from '../src' +import type { LazyRoute } from '../src' + +describe('createFileRoute has the same inject methods as getRouteApi', () => { + const routeApi = getRouteApi('foo') + const methodNames = Object.keys(routeApi).filter((key) => + key.startsWith('inject'), + ) + + // @ts-expect-error test factory shape only + const route = createFileRoute('')({}) + + it.each(methodNames.map((name) => [name]))( + 'should have the "%s" method defined', + (methodName) => { + expect(route[methodName as keyof LazyRoute]).toBeDefined() + }, + ) +}) + +describe('createLazyFileRoute has the same inject methods as getRouteApi', () => { + const routeApi = getRouteApi('foo') + const methodNames = Object.keys(routeApi).filter((key) => + key.startsWith('inject'), + ) + + // @ts-expect-error test factory shape only + const route = createLazyFileRoute('')({}) + + it.each(methodNames.map((name) => [name]))( + 'should have the "%s" method defined', + (methodName) => { + expect(route[methodName as keyof LazyRoute]).toBeDefined() + }, + ) +}) + +describe('createLazyRoute has the same inject methods as getRouteApi', () => { + const routeApi = getRouteApi('foo') + const route = createLazyRoute({})({}) + const methodNames = Object.keys(routeApi).filter((key) => + key.startsWith('inject'), + ) + + it.each(methodNames.map((name) => [name]))( + 'should have the "%s" method defined', + (methodName) => { + expect(route[methodName as keyof LazyRoute]).toBeDefined() + }, + ) +}) diff --git a/packages/angular-router-experimental/tests/injectBlocker.test-d.ts b/packages/angular-router-experimental/tests/injectBlocker.test-d.ts new file mode 100644 index 00000000000..c7fc52cb81a --- /dev/null +++ b/packages/angular-router-experimental/tests/injectBlocker.test-d.ts @@ -0,0 +1,126 @@ +import { expectTypeOf, test } from 'vitest' +import { + createRootRoute, + createRoute, + createRouter, + injectBlocker, +} from '../src' + +test('blocker without resolver', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectBlocker).returns.toBeVoid() +}) + +test('blocker with resolver', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectBlocker).returns.toBeObject() +}) + +test('shouldBlockFn has corrent action', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectBlocker) + .parameter(0) + .toHaveProperty('shouldBlockFn') + .parameter(0) + .toHaveProperty('action') + .toEqualTypeOf<'PUSH' | 'REPLACE' | 'FORWARD' | 'BACK' | 'GO'>() + + expectTypeOf(injectBlocker) + .parameter(0) + .toHaveProperty('shouldBlockFn') + .parameter(0) + .toHaveProperty('current') + .toHaveProperty('routeId') + .toEqualTypeOf<'__root__' | '/' | '/invoices' | '/invoices/'>() + + expectTypeOf(injectBlocker) + .parameter(0) + .toHaveProperty('shouldBlockFn') + .parameter(0) + .toHaveProperty('next') + .toHaveProperty('routeId') + .toEqualTypeOf<'__root__' | '/' | '/invoices' | '/invoices/'>() +}) + + diff --git a/packages/angular-router-experimental/tests/injectBlocker.test.ts b/packages/angular-router-experimental/tests/injectBlocker.test.ts new file mode 100644 index 00000000000..bf7d5cc0077 --- /dev/null +++ b/packages/angular-router-experimental/tests/injectBlocker.test.ts @@ -0,0 +1,304 @@ +import * as Angular from '@angular/core' +import { fireEvent, render, screen } from '@testing-library/angular' +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' +import { + RouterProvider, + createBrowserHistory, + createRootRoute, + createRoute, + createRouter, + injectBlocker, + injectNavigate, +} from '../src' + +beforeEach(() => { + expect(window.location.pathname).toBe('/') +}) + +afterEach(() => { + window.history.replaceState(null, 'root', '/') + vi.clearAllMocks() + vi.resetAllMocks() +}) + +describe('injectBlocker', () => { + test('does not block navigation when not enabled', async () => { + const rootRoute = createRootRoute() + + @Angular.Component({ + template: ` +

Index

+ + + `, + standalone: true, + }) + class IndexComponent { + navigate = injectNavigate() + blocker = injectBlocker({ shouldBlockFn: () => false }) + } + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + @Angular.Component({ + template: '

Posts

', + standalone: true, + }) + class PostsComponent {} + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + component: () => PostsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsButton = await screen.findByRole('button', { name: 'Posts' }) + + fireEvent.click(postsButton) + + expect(await screen.findByRole('heading', { name: 'Posts' })).toBeTruthy() + + expect(window.location.pathname).toBe('/posts') + }) + + test('does not block navigation when disabled', async () => { + const rootRoute = createRootRoute() + + @Angular.Component({ + template: ` +

Index

+ + + `, + standalone: true, + }) + class IndexComponent { + navigate = injectNavigate() + blocker = injectBlocker({ shouldBlockFn: () => true, disabled: true }) + } + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + @Angular.Component({ + template: '

Posts

', + standalone: true, + }) + class PostsComponent {} + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + component: () => PostsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsButton = await screen.findByRole('button', { name: 'Posts' }) + + fireEvent.click(postsButton) + + expect(await screen.findByRole('heading', { name: 'Posts' })).toBeTruthy() + + expect(window.location.pathname).toBe('/posts') + }) + + test('blocks navigation when enabled', async () => { + const rootRoute = createRootRoute() + + @Angular.Component({ + template: ` +

Index

+ + + `, + standalone: true, + }) + class IndexComponent { + navigate = injectNavigate() + blocker = injectBlocker({ shouldBlockFn: () => true }) + } + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + @Angular.Component({ + template: '

Posts

', + standalone: true, + }) + class PostsComponent {} + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + component: () => PostsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsButton = await screen.findByRole('button', { name: 'Posts' }) + + fireEvent.click(postsButton) + + expect(await screen.findByRole('heading', { name: 'Index' })).toBeTruthy() + + expect(window.location.pathname).toBe('/') + }) + + test('gives correct arguments to shouldBlockFn', async () => { + const rootRoute = createRootRoute() + + const shouldBlockFn = vi.fn().mockReturnValue(true) + + @Angular.Component({ + template: ` +

Index

+ + + `, + standalone: true, + }) + class IndexComponent { + navigate = injectNavigate() + blocker = injectBlocker({ shouldBlockFn }) + } + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + @Angular.Component({ + template: '

Posts

', + standalone: true, + }) + class PostsComponent {} + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + component: () => PostsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsButton = await screen.findByRole('button', { name: 'Posts' }) + + fireEvent.click(postsButton) + + expect(await screen.findByRole('heading', { name: 'Index' })).toBeTruthy() + + expect(window.location.pathname).toBe('/') + + expect(shouldBlockFn).toHaveBeenCalledWith({ + action: 'REPLACE', + current: { + routeId: indexRoute.id, + fullPath: indexRoute.fullPath, + pathname: '/', + params: {}, + search: {}, + }, + next: { + routeId: postsRoute.id, + fullPath: postsRoute.fullPath, + pathname: '/posts', + params: {}, + search: {}, + }, + }) + }) +}) + +test('gives parsed path/search params to shouldBlockFn on param+search navigation', async () => { + const rootRoute = createRootRoute() + const shouldBlockFn = vi.fn().mockReturnValue(false) + + @Angular.Component({ + template: ` +

Posts

+ + `, + standalone: true, + }) + class PostComponent { + navigate = injectNavigate() + blocker = injectBlocker({ shouldBlockFn }) + } + + const postRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts/$postId', + validateSearch: (search) => ({ page: Number(search.page ?? 1) }), + component: () => PostComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([postRoute]), + history: createBrowserHistory(), + }) + + window.history.replaceState(null, '', '/posts/1?page=1') + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const button = await screen.findByRole('button', { name: 'Go to post 2' }) + fireEvent.click(button) + + await expect(screen.findByRole('heading', { name: 'Posts' })).resolves + .toBeTruthy() + + expect(shouldBlockFn).toHaveBeenCalledWith({ + action: 'PUSH', + current: expect.objectContaining({ + pathname: '/posts/1', + params: { postId: '1' }, + search: { page: 1 }, + }), + next: expect.objectContaining({ + pathname: '/posts/2', + params: { postId: '2' }, + search: { page: 2 }, + }), + }) +}) + diff --git a/packages/angular-router-experimental/tests/injectCanGoBack.test.ts b/packages/angular-router-experimental/tests/injectCanGoBack.test.ts new file mode 100644 index 00000000000..55efdc8a364 --- /dev/null +++ b/packages/angular-router-experimental/tests/injectCanGoBack.test.ts @@ -0,0 +1,113 @@ +import * as Angular from '@angular/core' +import { fireEvent, render, screen } from '@testing-library/angular' +import { beforeEach, describe, expect, test } from 'vitest' +import { + Link, + Outlet, + RouterProvider, + createMemoryHistory, + createRootRoute, + createRoute, + createRouter, + injectCanGoBack, + injectLocation, + injectRouter, +} from '../src' + +beforeEach(() => { + window.history.replaceState(null, 'root', '/') +}) + +describe('injectCanGoBack', () => { + @Angular.Component({ + imports: [Link, Outlet], + template: ` + + Home + About + + `, + }) + class RootComponent { + router = injectRouter() + location = injectLocation() + canGoBack = injectCanGoBack() + + goBack() { + this.router.history.back() + } + } + + @Angular.Component({ + selector: 'can-go-back-index', + template: '

IndexTitle

', + standalone: true, + }) + class IndexComponent {} + + @Angular.Component({ + selector: 'can-go-back-about', + template: '

AboutTitle

', + standalone: true, + }) + class AboutComponent {} + + function setup({ + initialEntries = ['/'], + }: { + initialEntries?: Array + } = {}) { + const rootRoute = createRootRoute({ + component: () => RootComponent, + }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + const aboutRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/about', + component: () => AboutComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, aboutRoute]), + history: createMemoryHistory({ initialEntries }), + defaultPendingMinMs: 0, + }) + + const result = render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + return { ...result, router } + } + + test('when no location behind', async () => { + setup() + + const indexTitle = await screen.findByText('IndexTitle') + expect(indexTitle).toBeTruthy() + + const aboutLink = await screen.findByText('About') + fireEvent.click(aboutLink) + + const aboutTitle = await screen.findByText('AboutTitle') + expect(aboutTitle).toBeTruthy() + }) + + test('when location behind', async () => { + setup({ + initialEntries: ['/', '/about'], + }) + + const aboutTitle = await screen.findByText('AboutTitle') + expect(aboutTitle).toBeTruthy() + + const backButton = await screen.findByText('Back') + fireEvent.click(backButton) + + const indexTitle = await screen.findByText('IndexTitle') + expect(indexTitle).toBeTruthy() + }) +}) diff --git a/packages/angular-router-experimental/tests/injectLoaderData.test-d.ts b/packages/angular-router-experimental/tests/injectLoaderData.test-d.ts new file mode 100644 index 00000000000..c0518491f80 --- /dev/null +++ b/packages/angular-router-experimental/tests/injectLoaderData.test-d.ts @@ -0,0 +1,381 @@ +import { expectTypeOf, test } from 'vitest' +import { + createRootRoute, + createRoute, + createRouter, + injectLoaderData, +} from '../src' +import type * as Angular from '@angular/core' + +test('when there is no loaders', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectLoaderData) + .parameter(0) + .toHaveProperty('from') + .toExtend<'/invoices' | '__root__' | '/invoices/' | '/' | undefined>() + + expectTypeOf(injectLoaderData) + .parameter(0) + .toHaveProperty('strict') + .toEqualTypeOf() + + expectTypeOf(injectLoaderData) + .parameter(0) + .toHaveProperty('select') + .parameter(0) + .toMatchTypeOf() + + expectTypeOf(injectLoaderData) + .parameter(0) + .toHaveProperty('select') + .returns.toEqualTypeOf() + + expectTypeOf(injectLoaderData).returns.toEqualTypeOf< + Angular.Signal + >() + + expectTypeOf(injectLoaderData({ strict: false })) + .toEqualTypeOf>() +}) + +test('when there is one loader', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + loader: () => ({ data: ['element1', 'element2'] }), + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const invoiceRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '$invoiceId', + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute, invoiceRoute]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + context: { userId: 'userId' }, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectLoaderData).returns.toEqualTypeOf< + Angular.Signal<{ data: Array }> + >() + + expectTypeOf(injectLoaderData).returns.toEqualTypeOf< + Angular.Signal<{ data: Array }> + >() + + expectTypeOf(injectLoaderData) + .parameter(0) + .toHaveProperty('select') + .returns.toEqualTypeOf() + + expectTypeOf( + injectLoaderData, + ).returns.toEqualTypeOf } | undefined>>() + + expectTypeOf(injectLoaderData) + .parameter(0) + .toHaveProperty('select') + .returns.toEqualTypeOf() + + expectTypeOf( + injectLoaderData, + ).returns.toEqualTypeOf>() +}) + +test('when there is one loader that is async', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + loader: () => Promise.resolve({ data: ['element1', 'element2'] }), + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const invoiceRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '$invoiceId', + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute, invoiceRoute]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + context: { userId: 'userId' }, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectLoaderData).returns.toEqualTypeOf< + Angular.Signal<{ data: Array }> + >() + + expectTypeOf(injectLoaderData).returns.toEqualTypeOf< + Angular.Signal<{ data: Array }> + >() + + expectTypeOf(injectLoaderData) + .parameter(0) + .toHaveProperty('select') + .returns.toEqualTypeOf() + + expectTypeOf( + injectLoaderData, + ).returns.toEqualTypeOf } | undefined>>() + + expectTypeOf(injectLoaderData) + .parameter(0) + .toHaveProperty('select') + .returns.toEqualTypeOf() + + expectTypeOf( + injectLoaderData, + ).returns.toEqualTypeOf>() +}) + +test('when there are multiple loaders', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + loader: () => ({ data: ['invoice1', 'invoice2'] }) as const, + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + loader: () => ({ data: ['post1', 'post2'] }) as const, + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute]), + postsRoute, + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectLoaderData).returns.toEqualTypeOf< + Angular.Signal + >() + + expectTypeOf(injectLoaderData).returns.toEqualTypeOf< + Angular.Signal<{ + readonly data: readonly ['invoice1', 'invoice2'] + }> + >() + + expectTypeOf(injectLoaderData) + .parameter(0) + .toHaveProperty('select') + .returns.toEqualTypeOf() + + expectTypeOf( + injectLoaderData, + ).returns.toEqualTypeOf< + Angular.Signal< + | { + data?: + | readonly ['invoice1', 'invoice2'] + | readonly ['post1', 'post2'] + | undefined + } + | undefined + > + >() + + expectTypeOf(injectLoaderData) + .parameter(0) + .toHaveProperty('select') + .returns.toEqualTypeOf() + + expectTypeOf(injectLoaderData) + .parameter(0) + .toHaveProperty('select') + .parameter(0) + .toEqualTypeOf< + | { + data?: + | readonly ['invoice1', 'invoice2'] + | readonly ['post1', 'post2'] + | undefined + } + | undefined + >() + + expectTypeOf( + injectLoaderData void }>, + ) + .parameter(0) + .exclude() + .toHaveProperty('select') + .exclude() + .returns.toEqualTypeOf<{ func: () => void }>() +}) + +test('when there are multiple loaders of objects and primtives', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + loader: () => ['invoice1', 'invoice2'] as const, + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + loader: () => ({ invoice: { id: 1 } }) as const, + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + loader: () => ['post1', 'post2'] as const, + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute]), + indexRoute, + postsRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectLoaderData).returns.toEqualTypeOf< + Angular.Signal + >() + + expectTypeOf(injectLoaderData).returns.toEqualTypeOf< + Angular.Signal + >() + + expectTypeOf(injectLoaderData) + .parameter(0) + .toHaveProperty('select') + .returns.toEqualTypeOf() + + expectTypeOf(injectLoaderData) + .parameter(0) + .toHaveProperty('select') + .parameter(0) + .toEqualTypeOf() + + expectTypeOf( + injectLoaderData, + ).returns.toEqualTypeOf< + Angular.Signal< + | readonly ['invoice1', 'invoice2'] + | readonly ['post1', 'post2'] + | { + invoice?: + | { + readonly id: 1 + } + | undefined + } + | undefined + > + >() + + expectTypeOf(injectLoaderData) + .parameter(0) + .toHaveProperty('select') + .parameter(0) + .toEqualTypeOf< + | readonly ['invoice1', 'invoice2'] + | readonly ['post1', 'post2'] + | { + invoice?: + | { + readonly id: 1 + } + | undefined + } + | undefined + >() +}) + + diff --git a/packages/angular-router-experimental/tests/injectLocation.test-d.ts b/packages/angular-router-experimental/tests/injectLocation.test-d.ts new file mode 100644 index 00000000000..e0c5462dcfb --- /dev/null +++ b/packages/angular-router-experimental/tests/injectLocation.test-d.ts @@ -0,0 +1,47 @@ +import { expectTypeOf, test } from 'vitest' +import { + createRootRoute, + createRoute, + createRouter, + injectLocation, +} from '../src' +import type * as Angular from '@angular/core' +import type { ParsedLocation } from '@tanstack/router-core' + +const rootRoute = createRootRoute() + +const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', +}) + +const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', +}) + +const routeTree = rootRoute.addChildren([invoicesRoute, indexRoute]) + +const _defaultRouter = createRouter({ routeTree }) + +type DefaultRouter = typeof _defaultRouter + +test('should have the types for a ParsedLocation in injectLocation', () => { + const location = injectLocation() + + expectTypeOf(location).toEqualTypeOf>() + expectTypeOf(location()) + .toHaveProperty('pathname') + .toEqualTypeOf() +}) + +test('should have the type of string for selecting the pathname in injectLocation', () => { + const pathname = injectLocation({ + select: (state) => state.pathname, + }) + + expectTypeOf(pathname).toEqualTypeOf>() + expectTypeOf(pathname()).toMatchTypeOf() +}) + + diff --git a/packages/angular-router-experimental/tests/injectMatch.test-d.ts b/packages/angular-router-experimental/tests/injectMatch.test-d.ts new file mode 100644 index 00000000000..f1c9ca74ad3 --- /dev/null +++ b/packages/angular-router-experimental/tests/injectMatch.test-d.ts @@ -0,0 +1,90 @@ +import { describe, expectTypeOf, test } from 'vitest' +import { + createRootRoute, + createRoute, + createRouter, + injectMatch, +} from '../src' +import type * as Angular from '@angular/core' +import type { MakeRouteMatch, MakeRouteMatchUnion } from '@tanstack/router-core' + +const rootRoute = createRootRoute() + +const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', +}) + +const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', +}) + +const routeTree = rootRoute.addChildren([invoicesRoute, indexRoute]) + +const _defaultRouter = createRouter({ routeTree }) + +type DefaultRouter = typeof _defaultRouter + +type TRouteMatch = MakeRouteMatch + +describe('injectMatch', () => { + describe('shouldThrow', () => { + const from = '/invoices' + test('return type is `RouteMatch` when shouldThrow = true', () => { + const shouldThrow = true + const match = injectMatch< + DefaultRouter, + typeof from, + true, // TStrict + typeof shouldThrow, + TRouteMatch + >({ from, shouldThrow }) + + expectTypeOf(match).toEqualTypeOf>() + }) + + test('return type is `RouteMatch | undefined` when shouldThrow = false', () => { + const shouldThrow = false + const match = injectMatch< + DefaultRouter, + typeof from, + true, // TStrict + typeof shouldThrow, + TRouteMatch + >({ from, shouldThrow }) + + expectTypeOf(match).toEqualTypeOf< + Angular.Signal + >() + }) + }) + + test('return type is union of matches when strict = false', () => { + const strict = false as const + const match = injectMatch({ + strict, + }) + + expectTypeOf(match).toEqualTypeOf< + Angular.Signal> + >() + }) + + test('shouldThrow must be false when strict is false', () => { + const strict = false as const + const shouldThrow = true as const + injectMatch< + DefaultRouter, + typeof undefined, + typeof strict, + typeof shouldThrow + >({ + strict, + // @ts-expect-error shouldThrow must be false when strict is false + shouldThrow, + }) + }) +}) + + diff --git a/packages/angular-router-experimental/tests/injectMatch.test.ts b/packages/angular-router-experimental/tests/injectMatch.test.ts new file mode 100644 index 00000000000..123c409948d --- /dev/null +++ b/packages/angular-router-experimental/tests/injectMatch.test.ts @@ -0,0 +1,175 @@ +import * as Angular from '@angular/core' +import { render, screen, waitFor } from '@testing-library/angular' +import { afterEach, describe, expect, test, vi } from 'vitest' +import { + Link, + Outlet, + RouterProvider, + createMemoryHistory, + createRootRoute, + createRoute, + createRouter, + injectMatch, +} from '../src' +import type { RouterHistory } from '@tanstack/history' + +afterEach(() => { + window.history.replaceState(null, 'root', '/') + vi.resetAllMocks() +}) + +describe('injectMatch', () => { + @Angular.Component({ + imports: [Link], + template: ` +

IndexTitle

+ Posts + `, + standalone: true, + }) + class IndexComponent {} + + @Angular.Component({ + template: '

PostsTitle

', + standalone: true, + }) + class PostsComponent {} + + function setup({ + RootComponent, + history, + }: { + RootComponent: () => Angular.Type + history?: RouterHistory + }) { + const rootRoute = createRootRoute({ + component: RootComponent, + }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + history = history || createMemoryHistory({ initialEntries: ['/'] }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + component: () => PostsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + history, + defaultPendingMinMs: 0, + }) + + return render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + } + + describe('when match is found', () => { + test.each([true, false, undefined])( + 'returns the match if shouldThrow = %s', + async (shouldThrow) => { + @Angular.Component({ + imports: [Outlet], + template: '', + }) + class RootComponent { + match = injectMatch({ from: '/posts', shouldThrow }) + matchId = Angular.computed(() => { + const m = this.match() + expect(m).toBeDefined() + expect(m!.routeId).toBe('/posts') + return m?.routeId + }) + } + + setup({ + RootComponent: () => RootComponent, + history: createMemoryHistory({ initialEntries: ['/posts'] }), + }) + const postsTitle = await screen.findByText('PostsTitle') + expect(postsTitle).toBeTruthy() + }, + ) + }) + + describe('when match is not found', () => { + test.each([undefined, true])( + 'throws if shouldThrow = %s', + async (shouldThrow) => { + @Angular.Component({ + imports: [Outlet], + template: '', + }) + class RootComponent { + match = injectMatch({ from: '/posts', shouldThrow }) + // Accessing the match will throw if shouldThrow is true/undefined + matchValue = Angular.computed(() => { + try { + return this.match() + } catch (error: any) { + // Error will be caught by Angular's error handling + return error?.message + } + }) + } + + setup({ RootComponent: () => RootComponent }) + // The error should be displayed in the error boundary or console + // For now, we just verify the component renders without crashing + await waitFor(() => { + expect(screen.queryByText('IndexTitle')).toBeTruthy() + }) + }, + ) + + describe('returns undefined if shouldThrow = false', () => { + test('without select function', async () => { + @Angular.Component({ + imports: [Outlet], + template: '', + }) + class RootComponent { + match = injectMatch({ from: 'posts', shouldThrow: false }) + matchValue = Angular.computed(() => { + expect(this.match()).toBeUndefined() + return this.match() + }) + } + + setup({ RootComponent: () => RootComponent }) + await waitFor(() => { + expect(screen.queryByText('PostsTitle')).toBeFalsy() + }) + }) + + test('with select function', async () => { + @Angular.Component({ + imports: [Outlet], + template: '', + }) + class RootComponent { + match = injectMatch({ + from: 'posts', + shouldThrow: false, + select: (match) => match.routeId, + }) + matchValue = Angular.computed(() => { + expect(this.match()).toBeUndefined() + return this.match() + }) + } + + setup({ RootComponent: () => RootComponent }) + await waitFor(() => { + expect(screen.queryByText('PostsTitle')).toBeFalsy() + }) + }) + }) + }) +}) diff --git a/packages/angular-router-experimental/tests/injectNavigate.test-d.ts b/packages/angular-router-experimental/tests/injectNavigate.test-d.ts new file mode 100644 index 00000000000..20d07309148 --- /dev/null +++ b/packages/angular-router-experimental/tests/injectNavigate.test-d.ts @@ -0,0 +1,72 @@ +import { expectTypeOf, test } from 'vitest' +import { + createRootRoute, + createRoute, + createRouter, + injectNavigate, +} from '../src' + +const rootRoute = createRootRoute() + +const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', +}) + +const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', +}) + +const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', +}) + +const invoiceRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '$invoiceId', + validateSearch: () => ({ page: 0 }), +}) + +const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute, invoiceRoute]), + indexRoute, +]) + +const _defaultRouter = createRouter({ + routeTree, +}) + +type DefaultRouter = typeof _defaultRouter + +test('when navigating to a route', () => { + const navigate = injectNavigate() + + expectTypeOf(navigate) + .parameter(0) + .toHaveProperty('to') + .toEqualTypeOf<'/' | '/invoices' | '/invoices/$invoiceId' | '.' | '..'>() +}) + +test('when setting a default from', () => { + expectTypeOf(injectNavigate) + .parameter(0) + .exclude() + .toHaveProperty('from') + .toEqualTypeOf< + '/invoices' | '/' | '/invoices/$invoiceId' | '/invoices/' | undefined + >() +}) + +test('when setting an invalid default from', () => { + expectTypeOf(injectNavigate) + .parameter(0) + .exclude() + .toHaveProperty('from') + .toEqualTypeOf< + '/invoices' | '/' | '/invoices/$invoiceId' | '/invoices/' | undefined + >() +}) + + diff --git a/packages/angular-router-experimental/tests/injectNavigate.test.ts b/packages/angular-router-experimental/tests/injectNavigate.test.ts new file mode 100644 index 00000000000..a4185a11bf9 --- /dev/null +++ b/packages/angular-router-experimental/tests/injectNavigate.test.ts @@ -0,0 +1,365 @@ +import * as Angular from '@angular/core' +import { fireEvent, render, screen, waitFor } from '@testing-library/angular' +import { afterEach, beforeEach, describe, expect, test } from 'vitest' +import { + Outlet, + RouterProvider, + createBrowserHistory, + createRootRoute, + createRoute, + createRouter, + injectNavigate, + injectParams, +} from '../src' +import type { RouterHistory } from '@tanstack/history' + +let history: RouterHistory + +beforeEach(() => { + history = createBrowserHistory() + expect(window.location.pathname).toBe('/') +}) + +afterEach(() => { + history.destroy() + window.history.replaceState(null, 'root', '/') +}) + +describe('injectNavigate', () => { + test('when navigating to /posts', async () => { + const rootRoute = createRootRoute() + + @Angular.Component({ + template: ` +

Index

+ + + `, + standalone: true, + }) + class IndexComponent { + navigate = injectNavigate() + } + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + @Angular.Component({ + template: '

Posts

', + standalone: true, + }) + class PostsComponent {} + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + component: () => PostsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + history, + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsButton = await screen.findByRole('button', { name: 'Posts' }) + + fireEvent.click(postsButton) + + expect(await screen.findByRole('heading', { name: 'Posts' })).toBeTruthy() + + expect(window.location.pathname).toBe('/posts') + }) + + test('when navigating from /posts to ./$postId', async () => { + const rootRoute = createRootRoute() + + @Angular.Component({ + template: ` +

Index

+ + + `, + standalone: true, + }) + class IndexComponent { + navigate = injectNavigate() + } + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + @Angular.Component({ + imports: [Outlet], + template: '

Posts

', + }) + class PostsComponent {} + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + component: () => PostsComponent, + }) + + @Angular.Component({ + template: ` +

Posts Index

+ + `, + standalone: true, + }) + class PostsIndexComponent { + navigate = injectNavigate() + } + + const postsIndexRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '/', + component: () => PostsIndexComponent, + }) + + @Angular.Component({ + template: ` + Params: {{ params().postId }} + + `, + standalone: true, + }) + class PostComponent { + params = injectParams({ strict: false }) + navigate = injectNavigate() + } + + const postRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '$postId', + component: () => PostComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([ + indexRoute, + postsRoute.addChildren([postsIndexRoute, postRoute]), + ]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsButton = await screen.findByRole('button', { name: 'Posts' }) + + fireEvent.click(postsButton) + + expect(await screen.findByText('Posts Index')).toBeTruthy() + + const postButton = await screen.findByRole('button', { + name: 'To the first post', + }) + + fireEvent.click(postButton) + + expect(await screen.findByText('Params: id1')).toBeTruthy() + + expect(window.location.pathname).toBe('/posts/id1') + }) + + test('should navigate to the parent route and keep params', async () => { + const rootRoute = createRootRoute() + + @Angular.Component({ + template: ` +

Leaf

+ + `, + standalone: true, + }) + class LeafComponent { + navigate = injectNavigate() + } + + @Angular.Component({ + imports: [Outlet], + template: '

Layout A

', + }) + class AComponent {} + + const paramRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/param/$id', + }) + const aRoute = createRoute({ + getParentRoute: () => paramRoute, + path: '/a', + component: () => AComponent, + }) + const bRoute = createRoute({ + getParentRoute: () => aRoute, + path: '/b', + component: () => LeafComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([ + paramRoute.addChildren([aRoute.addChildren([bRoute])]), + ]), + history, + defaultPendingMinMs: 0, + }) + + window.history.replaceState(null, 'root', '/param/foo/a/b') + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const button = await screen.findByRole('button', { + name: 'Parent Keep Params', + }) + fireEvent.click(button) + + await waitFor(() => { + expect(window.location.pathname).toBe('/param/foo/a') + }) + }) + + test('should navigate to the parent route and change params', async () => { + const rootRoute = createRootRoute() + + @Angular.Component({ + template: ` +

Leaf

+ + `, + standalone: true, + }) + class LeafComponent { + navigate = injectNavigate() + + navigateWithChangedParams() { + this.navigate({ + to: '/param/$id/a', + from: '/param/$id/a/b', + params: (prev: any) => ({ ...prev, id: 'bar' }), + }) + } + } + + @Angular.Component({ + imports: [Outlet], + template: '

Layout A

', + }) + class AComponent {} + + const paramRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/param/$id', + }) + const aRoute = createRoute({ + getParentRoute: () => paramRoute, + path: '/a', + component: () => AComponent, + }) + const bRoute = createRoute({ + getParentRoute: () => aRoute, + path: '/b', + component: () => LeafComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([ + paramRoute.addChildren([aRoute.addChildren([bRoute])]), + ]), + history, + defaultPendingMinMs: 0, + }) + + window.history.replaceState(null, 'root', '/param/foo/a/b') + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const button = await screen.findByRole('button', { + name: 'Parent Change Params', + }) + fireEvent.click(button) + + await waitFor(() => { + expect(window.location.pathname).toBe('/param/bar/a') + }) + }) + + test('should navigate to same route with different params', async () => { + const rootRoute = createRootRoute() + + @Angular.Component({ + template: ` +

Leaf

+ + `, + standalone: true, + }) + class LeafComponent { + navigate = injectNavigate() + params = injectParams({ strict: false }) + } + + const paramRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/param/$id', + }) + const aRoute = createRoute({ + getParentRoute: () => paramRoute, + path: '/a', + }) + const bRoute = createRoute({ + getParentRoute: () => aRoute, + path: '/b', + component: () => LeafComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([ + paramRoute.addChildren([aRoute.addChildren([bRoute])]), + ]), + history, + defaultPendingMinMs: 0, + }) + + window.history.replaceState(null, 'root', '/param/foo/a/b') + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const button = await screen.findByRole('button', { + name: 'Same Route Different Params', + }) + fireEvent.click(button) + + await waitFor(() => { + expect(window.location.pathname).toBe('/param/bar/a/b') + }) + }) +}) diff --git a/packages/angular-router-experimental/tests/injectParams.test-d.ts b/packages/angular-router-experimental/tests/injectParams.test-d.ts new file mode 100644 index 00000000000..4c7f9948e89 --- /dev/null +++ b/packages/angular-router-experimental/tests/injectParams.test-d.ts @@ -0,0 +1,290 @@ +import { describe, expectTypeOf, test } from 'vitest' +import { + createRootRoute, + createRoute, + createRouter, + injectParams, +} from '../src' +import type * as Angular from '@angular/core' + +describe('injectParams', () => { + test('when there are no params', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectParams) + .parameter(0) + .toHaveProperty('from') + .toMatchTypeOf<'/invoices' | '__root__' | '/invoices/' | '/' | undefined>() + + expectTypeOf(injectParams) + .parameter(0) + .toHaveProperty('strict') + .toEqualTypeOf() + + expectTypeOf(injectParams) + .parameter(0) + .toHaveProperty('select') + .parameter(0) + .toEqualTypeOf<{}>() + + expectTypeOf(injectParams) + .parameter(0) + .toHaveProperty('select') + .returns.toEqualTypeOf() + + expectTypeOf(injectParams).returns.toEqualTypeOf< + Angular.Signal<{}> + >() + + expectTypeOf( + injectParams({ + strict: false, + }), + ).toEqualTypeOf>() + }) + + test('when there is one param', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const invoiceRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '$invoiceId', + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute, invoiceRoute]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectParams).returns.toEqualTypeOf< + Angular.Signal<{}> + >() + + expectTypeOf( + injectParams, + ).returns.toEqualTypeOf>() + + expectTypeOf(injectParams) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf<((search: { invoiceId: string }) => unknown) | undefined>() + + expectTypeOf( + injectParams, + ).returns.toExtend>() + + expectTypeOf(injectParams) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf< + ((search: { invoiceId?: string }) => unknown) | undefined + >() + + expectTypeOf( + injectParams< + DefaultRouter, + '/invoices', + /* strict */ false, + /* shouldThrow */ true, + number + >, + ).returns.toEqualTypeOf>() + }) + + test('when there are multiple params', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const invoiceRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '$invoiceId', + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + }) + + const postRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '$postId', + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([ + invoicesIndexRoute, + invoiceRoute, + postsRoute.addChildren([postRoute]), + ]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectParams).returns.toEqualTypeOf< + Angular.Signal<{}> + >() + + expectTypeOf( + injectParams, + ).returns.toEqualTypeOf>() + + expectTypeOf(injectParams) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf<((search: { invoiceId: string }) => unknown) | undefined>() + + expectTypeOf( + injectParams, + ).returns.toExtend< + Angular.Signal<{ invoiceId?: string; postId?: string }> + >() + + expectTypeOf(injectParams) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf< + | ((search: { invoiceId?: string; postId?: string }) => unknown) + | undefined + >() + + expectTypeOf( + injectParams< + DefaultRouter, + '/invoices', + /* strict */ true, + /* shouldThrow */ true, + { func: () => void } + >, + ) + .parameter(0) + .exclude() + .toHaveProperty('select') + .toEqualTypeOf< + | ((search: {}) => { + func: () => void + }) + | undefined + >() + }) + + describe('shouldThrow', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + validateSearch: () => ({ page: 0 }), + }) + const invoiceRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '$id', + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoiceRoute]), + indexRoute, + ]) + + const _router = createRouter({ routeTree }) + + const from = '/invoices/$id' + test('return type is `{ id: string }` when shouldThrow = true', () => { + const shouldThrow = true + const params = injectParams< + typeof _router, + typeof from, + /* strict */ true, + typeof shouldThrow + >({ from, shouldThrow }) + + expectTypeOf(params).toEqualTypeOf>() + }) + + test('return type is `{id: string} | undefined` when shouldThrow = false', () => { + const shouldThrow = false + const params = injectParams< + typeof _router, + typeof from, + /* strict */ true, + typeof shouldThrow + >({ from, shouldThrow }) + + expectTypeOf(params).toEqualTypeOf< + Angular.Signal<{ id: string } | undefined> + >() + }) + }) +}) + + diff --git a/packages/angular-router-experimental/tests/injectParams.test.ts b/packages/angular-router-experimental/tests/injectParams.test.ts new file mode 100644 index 00000000000..51a2a4e2000 --- /dev/null +++ b/packages/angular-router-experimental/tests/injectParams.test.ts @@ -0,0 +1,272 @@ +import * as Angular from '@angular/core' +import { fireEvent, render, screen } from '@testing-library/angular' +import { afterEach, expect, test, vi } from 'vitest' +import { + Link, + Outlet, + RouterProvider, + createRootRoute, + createRoute, + createRouter, + injectParams, +} from '../src' + +afterEach(() => { + window.history.replaceState(null, 'root', '/') + vi.clearAllMocks() +}) + +const POST_CATEGORY_ROUTE_TOKEN = new Angular.InjectionToken( + 'POST_CATEGORY_ROUTE', +) +const POST_ROUTE_TOKEN = new Angular.InjectionToken('POST_ROUTE') + +@Angular.Component({ + imports: [Link, Outlet], + template: ` +
+

Posts

+ All Categories + First Category + +
+ `, +}) +class PostsComponent { + postCategoryRoute = Angular.inject(POST_CATEGORY_ROUTE_TOKEN) +} + +@Angular.Component({ + imports: [Link, Outlet], + template: ` +
+

Post Categories

+ @for (post of posts(); track post.id) { + {{ post.title }} + } + +
+ `, +}) +class PostCategoryComponent { + postCategoryRoute = Angular.inject(POST_CATEGORY_ROUTE_TOKEN) + loaderData = this.postCategoryRoute.injectLoaderData() + posts = Angular.computed(() => this.loaderData().posts) +} + +@Angular.Component({ + template: ` +
+

Post Route

+
+ Category_Param: {{ params().category }} +
+
+ PostId_Param: {{ params().postId }} +
+
+ PostId: {{ loaderData().post.id }} +
+
+ Title: {{ loaderData().post.title }} +
+
+ Category: {{ loaderData().post.category }} +
+
+ `, + standalone: true, +}) +class PostComponent { + postRoute = Angular.inject(POST_ROUTE_TOKEN) + params = injectParams({ from: this.postRoute.fullPath }) + loaderData = this.postRoute.injectLoaderData() +} + +test('injectParams must return parsed result if applicable.', async () => { + const posts = [ + { + id: 1, + title: 'First Post', + category: 'one', + }, + { + id: 2, + title: 'Second Post', + category: 'two', + }, + ] + + const mockedfn = vi.fn() + const rootRoute = createRootRoute() + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + component: () => PostsComponent, + }) + + const postCategoryRoute = createRoute({ + getParentRoute: () => postsRoute, + path: 'category_{$category}', + component: () => PostCategoryComponent, + params: { + parse: (params) => { + return { + ...params, + category: + params.category === 'first' + ? 'one' + : params.category === 'second' + ? 'two' + : params.category, + } + }, + stringify: (params) => { + return { + category: + params.category === 'one' + ? 'first' + : params.category === 'two' + ? 'second' + : params.category, + } + }, + }, + loader: ({ params }) => ({ + posts: + params.category === 'all' + ? posts + : posts.filter((post) => post.category === params.category), + }), + }) + + const postRoute = createRoute({ + getParentRoute: () => postCategoryRoute, + path: '$postId', + component: () => PostComponent, + loader: ({ params }) => { + return { post: posts.find((post) => post.id === parseInt(params.postId)) } + }, + params: { + parse: (params) => { + mockedfn() + return { + ...params, + postId: params.postId === 'one' ? '1' : '2', + } + }, + }, + }) + + window.history.replaceState({}, '', '/posts') + + const router = createRouter({ + routeTree: rootRoute.addChildren([ + postsRoute.addChildren([postCategoryRoute.addChildren([postRoute])]), + ]), + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + providers: [ + { + provide: POST_CATEGORY_ROUTE_TOKEN, + useValue: postCategoryRoute, + }, + { + provide: POST_ROUTE_TOKEN, + useValue: postRoute, + }, + ], + }) + + await router.load() + + expect(await screen.findByTestId('posts-heading')).toBeTruthy() + + const firstCategoryLink = await screen.findByTestId('first-category-link') + + expect(firstCategoryLink).toBeTruthy() + + mockedfn.mockClear() + fireEvent.click(firstCategoryLink) + + const firstPostLink = await screen.findByTestId('post-one-link') + + expect(window.location.pathname).toBe('/posts/category_first') + expect(await screen.findByTestId('post-category-heading')).toBeTruthy() + // Called by + // 1. Link with postId: 'one' + expect(mockedfn).toHaveBeenCalledTimes(1) + + mockedfn.mockClear() + fireEvent.click(firstPostLink) + // 1. Called on navigate to category one + // 2. Called on navigate to category one + + const allCategoryLink = await screen.findByTestId('all-category-link') + let paramCategoryValue = await screen.findByTestId('param_category_value') + let paramPostIdValue = await screen.findByTestId('param_postId_value') + let postCategory = await screen.findByTestId('post_category_value') + let postTitleValue = await screen.findByTestId('post_title_value') + let postIdValue = await screen.findByTestId('post_id_value') + let renderedPost = { + id: Number(postIdValue.textContent), + title: postTitleValue.textContent, + category: postCategory.textContent, + } + + expect(window.location.pathname).toBe('/posts/category_first/one') + expect(await screen.findByTestId('post-heading')).toBeTruthy() + expect(renderedPost).toEqual(posts[0]) + expect(renderedPost.category).toBe('one') + expect(paramCategoryValue.textContent).toBe('one') + expect(paramPostIdValue.textContent).toBe('1') + expect(mockedfn).toHaveBeenCalledTimes(2) + expect(allCategoryLink).toBeTruthy() + + mockedfn.mockClear() + fireEvent.click(allCategoryLink) + // 1. Link with postId: 'two' + + const secondPostLink = await screen.findByTestId('post-two-link') + + expect(window.location.pathname).toBe('/posts/category_all') + expect(await screen.findByTestId('post-category-heading')).toBeTruthy() + expect(secondPostLink).toBeTruthy() + // The params.parse function is called on 2 places: + // 1. When rendering a link + // 2. When navigating to a post + // When going back from a post to the category page with all links, + // it only needs to update the links. Angular inputs objects are stable, + // so the computed signals will detect that the object is the same and + // don't recalculate the signal graph of the first link. + expect(mockedfn).toHaveBeenCalledTimes(1) + + mockedfn.mockClear() + + fireEvent.click(secondPostLink) + // 1. Called on navigate to category two + // 2. Called on navigate to category two + + paramCategoryValue = await screen.findByTestId('param_category_value') + paramPostIdValue = await screen.findByTestId('param_postId_value') + postCategory = await screen.findByTestId('post_category_value') + postTitleValue = await screen.findByTestId('post_title_value') + postIdValue = await screen.findByTestId('post_id_value') + renderedPost = { + id: Number(postIdValue.textContent), + title: postTitleValue.textContent, + category: postCategory.textContent, + } + + expect(window.location.pathname).toBe('/posts/category_all/two') + expect(await screen.findByTestId('post-heading')).toBeTruthy() + expect(renderedPost).toEqual(posts[1]) + expect(renderedPost.category).toBe('two') + expect(paramCategoryValue.textContent).toBe('all') + expect(paramPostIdValue.textContent).toBe('2') + expect(mockedfn).toHaveBeenCalledTimes(2) +}) diff --git a/packages/angular-router-experimental/tests/injectRouterContext.test-d.ts b/packages/angular-router-experimental/tests/injectRouterContext.test-d.ts new file mode 100644 index 00000000000..f77dc0a6540 --- /dev/null +++ b/packages/angular-router-experimental/tests/injectRouterContext.test-d.ts @@ -0,0 +1,326 @@ +import { expectTypeOf, test } from 'vitest' +import { + createRootRoute, + createRootRouteWithContext, + createRoute, + createRouter, + injectRouterContext, +} from '../src' +import type * as Angular from '@angular/core' + +test('when there is no context', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectRouterContext) + .parameter(0) + .toHaveProperty('from') + .toExtend<'/invoices' | '__root__' | '/invoices/' | '/' | undefined>() + + expectTypeOf(injectRouterContext) + .parameter(0) + .toHaveProperty('strict') + .toEqualTypeOf() + + expectTypeOf(injectRouterContext) + .parameter(0) + .toHaveProperty('select') + .parameter(0) + .toEqualTypeOf<{}>() + + expectTypeOf(injectRouterContext) + .parameter(0) + .toHaveProperty('select') + .returns.toEqualTypeOf() + + expectTypeOf(injectRouterContext).returns.toEqualTypeOf< + Angular.Signal<{}> + >() + + expectTypeOf( + injectRouterContext({ + strict: false, + }), + ).toEqualTypeOf>() +}) + +test('when there is the root context', () => { + interface Context { + userId: string + } + + const rootRoute = createRootRouteWithContext()() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const invoiceRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '$invoiceId', + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute, invoiceRoute]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + context: { userId: 'userId' }, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectRouterContext).returns.toEqualTypeOf< + Angular.Signal<{ + userId: string + }> + >() + + expectTypeOf( + injectRouterContext, + ).returns.toEqualTypeOf>() + + expectTypeOf(injectRouterContext) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf<((search: { userId: string }) => unknown) | undefined>() + + expectTypeOf( + injectRouterContext, + ).returns.toEqualTypeOf>() + + expectTypeOf(injectRouterContext) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf<((search: { userId?: string }) => unknown) | undefined>() + + expectTypeOf( + injectRouterContext, + ).returns.toEqualTypeOf>() +}) + +test('when there are multiple contexts', () => { + interface Context { + userId: string + } + + const rootRoute = createRootRouteWithContext()() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const invoiceRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '$invoiceId', + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + }) + + const postRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '$postId', + beforeLoad: () => ({ username: 'username' }), + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([ + invoicesIndexRoute, + invoiceRoute, + postsRoute.addChildren([postRoute]), + ]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + context: { userId: 'userId' }, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectRouterContext).returns.toEqualTypeOf< + Angular.Signal<{ + userId: string + }> + >() + + expectTypeOf( + injectRouterContext, + ).returns.toEqualTypeOf>() + + expectTypeOf(injectRouterContext) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf<((search: { userId: string }) => unknown) | undefined>() + + expectTypeOf( + injectRouterContext, + ).returns.toEqualTypeOf< + Angular.Signal<{ userId?: string; username?: string }> + >() + + expectTypeOf(injectRouterContext) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf< + ((search: { userId?: string; username?: string }) => unknown) | undefined + >() +}) + +test('when there are overlapping contexts', () => { + interface Context { + userId: string + } + + const rootRoute = createRootRouteWithContext()() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + validateSearch: () => ({ page: 0 }), + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const invoiceRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '$invoiceId', + beforeLoad: () => ({ username: 'username2' }) as const, + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + }) + + const postRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '$postId', + beforeLoad: () => ({ username: 'username1' }) as const, + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([ + invoicesIndexRoute, + invoiceRoute, + postsRoute.addChildren([postRoute]), + ]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + context: { userId: 'userId' }, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectRouterContext).returns.toEqualTypeOf< + Angular.Signal<{ + userId: string + }> + > + + expectTypeOf( + injectRouterContext, + ).returns.toEqualTypeOf< + Angular.Signal<{ + userId: string + readonly username: 'username2' + }> + >() + + expectTypeOf(injectRouterContext) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf< + | ((search: { + userId: string + readonly username: 'username2' + }) => unknown) + | undefined + >() + + expectTypeOf( + injectRouterContext, + ).returns.toEqualTypeOf< + Angular.Signal<{ + userId?: string + username?: 'username1' | 'username2' + }> + >() + + expectTypeOf(injectRouterContext) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf< + | ((search: { + userId?: string + username?: 'username2' | 'username1' + }) => unknown) + | undefined + >() +}) + + diff --git a/packages/angular-router-experimental/tests/injectRouterState.test-d.ts b/packages/angular-router-experimental/tests/injectRouterState.test-d.ts new file mode 100644 index 00000000000..67ef92b14bf --- /dev/null +++ b/packages/angular-router-experimental/tests/injectRouterState.test-d.ts @@ -0,0 +1,67 @@ +import { expectTypeOf, test } from 'vitest' +import { + createRootRoute, + createRoute, + createRouter, + injectRouterState, +} from '../src' +import type { RouterState } from '@tanstack/router-core' + +const rootRoute = createRootRoute({ + validateSearch: () => ({ + page: 0, + }), +}) + +const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', +}) + +const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', +}) + +const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', +}) + +const invoiceRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '$invoiceId', + validateSearch: () => ({ page: 0 }), +}) + +const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute, invoiceRoute]), + indexRoute, +]) + +const _defaultRouter = createRouter({ + routeTree, +}) + +type DefaultRouter = typeof _defaultRouter + +test('can select router state', () => { + expectTypeOf(injectRouterState) + .returns.returns.toHaveProperty('location') + .toExtend<{ + search: { page?: number | undefined } + }>() + + expectTypeOf(injectRouterState void }>) + .parameter(0) + .exclude() + .toHaveProperty('select') + .toEqualTypeOf< + | ((search: RouterState) => { + func: () => void + }) + | undefined + >() +}) + + diff --git a/packages/angular-router-experimental/tests/injectSearch.test-d.ts b/packages/angular-router-experimental/tests/injectSearch.test-d.ts new file mode 100644 index 00000000000..7f9c98fef9e --- /dev/null +++ b/packages/angular-router-experimental/tests/injectSearch.test-d.ts @@ -0,0 +1,605 @@ +import { describe, expectTypeOf, test } from 'vitest' +import { + createRootRoute, + createRoute, + createRouter, + injectSearch, +} from '../src' +import type * as Angular from '@angular/core' +import type { SearchSchemaInput } from '@tanstack/router-core' + +describe('injectSearch', () => { + test('when there are no search params', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const invoiceRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '$invoiceId', + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute, invoiceRoute]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectSearch) + .parameter(0) + .toHaveProperty('from') + .toEqualTypeOf< + '/invoices' | '__root__' | '/invoices/$invoiceId' | '/invoices/' | '/' + >() + + expectTypeOf(injectSearch) + .parameter(0) + .toHaveProperty('strict') + .toEqualTypeOf() + + expectTypeOf(injectSearch) + .parameter(0) + .toHaveProperty('select') + .parameter(0) + .toEqualTypeOf<{}>() + + expectTypeOf(injectSearch) + .parameter(0) + .toHaveProperty('select') + .returns.toEqualTypeOf() + + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal<{}> + >() + + expectTypeOf( + injectSearch({ + strict: false, + }), + ).toEqualTypeOf>() + }) + + test('when there is one search params', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + validateSearch: () => ({ page: 0 }), + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const invoiceRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '$invoiceId', + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute, invoiceRoute]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal<{}> + >() + + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal<{ + page: number + }> + >() + + expectTypeOf(injectSearch) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf<((search: { page: number }) => unknown) | undefined>() + + expectTypeOf( + injectSearch, + ).returns.toEqualTypeOf>() + + expectTypeOf(injectSearch) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf<((search: { page?: number }) => unknown) | undefined>() + + expectTypeOf( + injectSearch< + DefaultRouter, + '/invoices', + /* strict */ false, + /* shouldThrow */ true, + number + >, + ).returns.toEqualTypeOf>() + + expectTypeOf( + injectSearch< + DefaultRouter, + '/invoices', + /* strict */ false, + /* shouldThrow */ true, + { func: () => void } + >, + ) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf< + ((search: { page?: number }) => { func: () => void }) | undefined + >() + }) + + test('when there are multiple search params', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + validateSearch: () => ({ page: 0 }), + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const invoiceRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '$invoiceId', + validateSearch: () => ({ detail: 'detail' }), + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute, invoiceRoute]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal<{}> + >() + + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal<{ + page: number + }> + >() + + expectTypeOf(injectSearch) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf<((search: { page: number }) => unknown) | undefined>() + + expectTypeOf( + injectSearch, + ).returns.toEqualTypeOf>() + + expectTypeOf(injectSearch) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf< + ((search: { page?: number; detail?: string }) => unknown) | undefined + >() + }) + + test('when there are overlapping search params', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + validateSearch: () => ({ page: 0 }), + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + validateSearch: () => ({ detail: 50 }) as const, + }) + + const invoiceRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '$invoiceId', + validateSearch: () => ({ detail: 'detail' }) as const, + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute, invoiceRoute]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal<{}> + >() + + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal<{ + page: number + }> + >() + + expectTypeOf(injectSearch) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf<((search: { page: number }) => unknown) | undefined>() + + expectTypeOf( + injectSearch, + ).returns.toEqualTypeOf< + Angular.Signal<{ page?: number; detail?: 'detail' | 50 }> + >() + + expectTypeOf(injectSearch) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf< + | ((search: { page?: number; detail?: 'detail' | 50 }) => unknown) + | undefined + >() + }) + + test('when the root has no search params but the index route does', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + validateSearch: () => ({ indexPage: 0 }), + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const invoiceRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '$invoiceId', + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute, invoiceRoute]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal<{ + indexPage: number + }> + >() + + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal<{}> + >() + + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal<{}> + >() + + expectTypeOf(injectSearch) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf<((search: {}) => unknown) | undefined>() + + expectTypeOf( + injectSearch, + ).returns.toEqualTypeOf>() + + expectTypeOf(injectSearch) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf< + ((search: { indexPage?: number }) => unknown) | undefined + >() + }) + + test('when the root has search params but the index route does not', () => { + const rootRoute = createRootRoute({ + validateSearch: () => ({ rootPage: 0 }), + }) + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const invoiceRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '$invoiceId', + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute, invoiceRoute]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal<{ + rootPage: number + }> + >() + + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal<{ + rootPage: number + }> + >() + + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal<{ + rootPage: number + }> + >() + + expectTypeOf(injectSearch) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf<((search: { rootPage: number }) => unknown) | undefined>() + + expectTypeOf( + injectSearch, + ).returns.toEqualTypeOf>() + + expectTypeOf(injectSearch) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf<((search: { rootPage?: number }) => unknown) | undefined>() + }) + + test('when the root has search params but the index does', () => { + const rootRoute = createRootRoute({ + validateSearch: () => ({ rootPage: 0 }), + }) + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + validateSearch: () => ({ indexPage: 0 }), + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + }) + + const invoicesIndexRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '/', + }) + + const invoiceRoute = createRoute({ + getParentRoute: () => invoicesRoute, + path: '$invoiceId', + }) + + const routeTree = rootRoute.addChildren([ + invoicesRoute.addChildren([invoicesIndexRoute, invoiceRoute]), + indexRoute, + ]) + + const _defaultRouter = createRouter({ + routeTree, + }) + + type DefaultRouter = typeof _defaultRouter + + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal<{ + rootPage: number + indexPage: number + }> + >() + + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal<{ + rootPage: number + }> + >() + + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal<{ + rootPage: number + }> + >() + + expectTypeOf(injectSearch) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf<((search: { rootPage: number }) => unknown) | undefined>() + + expectTypeOf( + injectSearch, + ).returns.toEqualTypeOf< + Angular.Signal<{ indexPage?: number; rootPage?: number }> + >() + + expectTypeOf(injectSearch) + .parameter(0) + .toHaveProperty('select') + .toEqualTypeOf< + | ((search: { indexPage?: number; rootPage?: number }) => unknown) + | undefined + >() + }) + + test('when a route has search params using SearchSchemaInput', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + validateSearch: (input: { page?: number } & SearchSchemaInput) => { + return { page: input.page ?? 0 } + }, + }) + + const routeTree = rootRoute.addChildren([indexRoute]) + + const _router = createRouter({ routeTree }) + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal<{ + page: number + }> + > + }) + + test('when route has a union of search params', () => { + const rootRoute = createRootRoute() + + const postRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + validateSearch: (): { status: 'in' } | { status: 'out' } => { + return { status: 'in' } + }, + }) + + const indexRoute = createRoute({ + getParentRoute: () => postRoute, + path: '/', + validateSearch: (): { detail: string } => { + return { detail: 'detail' } + }, + }) + + const routeTree = rootRoute.addChildren([ + indexRoute.addChildren([indexRoute]), + ]) + + const _router = createRouter({ routeTree }) + expectTypeOf(injectSearch).returns.toEqualTypeOf< + Angular.Signal< + { status: 'in'; detail: string } | { status: 'out'; detail: string } + > + > + }) + + describe('shouldThrow', () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + validateSearch: () => ({ page: 0 }), + }) + + const routeTree = rootRoute.addChildren([invoicesRoute, indexRoute]) + + const _router = createRouter({ routeTree }) + + const from = '/invoices' + test('return type is `{ page: number }` when shouldThrow = true', () => { + const shouldThrow = true + const search = injectSearch< + typeof _router, + typeof from, + /* strict */ true, + typeof shouldThrow + >({ from, shouldThrow }) + + expectTypeOf(search).toEqualTypeOf>() + }) + + test('return type is `{page: number} | undefined` when shouldThrow = false', () => { + const shouldThrow = false + const search = injectSearch< + typeof _router, + typeof from, + /* strict */ true, + typeof shouldThrow + >({ from, shouldThrow }) + + expectTypeOf(search).toEqualTypeOf< + Angular.Signal<{ page: number } | undefined> + >() + }) + }) +}) + + diff --git a/packages/angular-router-experimental/tests/lazy/heavy.ts b/packages/angular-router-experimental/tests/lazy/heavy.ts new file mode 100644 index 00000000000..ac855780c8a --- /dev/null +++ b/packages/angular-router-experimental/tests/lazy/heavy.ts @@ -0,0 +1,9 @@ +import { createLazyRoute } from '../../src' +import HeavyComponent from './mockHeavyDependenciesRoute' + +export default function Route(id: string) { + return createLazyRoute(id)({ + component: () => HeavyComponent, + }) +} + diff --git a/packages/angular-router-experimental/tests/lazy/mockHeavyDependenciesRoute.ts b/packages/angular-router-experimental/tests/lazy/mockHeavyDependenciesRoute.ts new file mode 100644 index 00000000000..3d0923284f1 --- /dev/null +++ b/packages/angular-router-experimental/tests/lazy/mockHeavyDependenciesRoute.ts @@ -0,0 +1,12 @@ +import * as Angular from '@angular/core' + +// Mimics heavy dependencies that need to be streamed in before the component is available. +await new Promise((resolve) => setTimeout(resolve, 50)) + +@Angular.Component({ + template: '

I am sooo heavy

', + standalone: true, +}) +class HeavyComponent { } + +export default HeavyComponent diff --git a/packages/angular-router-experimental/tests/link.test-d.ts b/packages/angular-router-experimental/tests/link.test-d.ts new file mode 100644 index 00000000000..2f1a045bd24 --- /dev/null +++ b/packages/angular-router-experimental/tests/link.test-d.ts @@ -0,0 +1,34 @@ +import { expectTypeOf, test } from 'vitest' +import { + createRootRoute, + createRoute, + createRouter, +} from '../src' +import type { LinkInputOptions } from '../src' + +const rootRoute = createRootRoute() +const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', +}) +const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts/$postId', + validateSearch: () => ({ page: 0 }), +}) + +const _router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), +}) + +test('LinkInputOptions accepts route/search/params object model', () => { + const options: LinkInputOptions = { + to: '.', + params: { postId: '1' }, + search: { page: 1 }, + } + + expectTypeOf(options.to).toMatchTypeOf() + expectTypeOf(options.params).toMatchTypeOf() + expectTypeOf(options.search).toMatchTypeOf() +}) diff --git a/packages/angular-router-experimental/tests/link.test.ts b/packages/angular-router-experimental/tests/link.test.ts new file mode 100644 index 00000000000..b55a0d84903 --- /dev/null +++ b/packages/angular-router-experimental/tests/link.test.ts @@ -0,0 +1,2979 @@ +import * as Angular from '@angular/core' +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' +import { fireEvent, render, screen, waitFor } from '@testing-library/angular' + + +import { trailingSlashOptions } from '@tanstack/router-core' +import { + Link, + Outlet, + RouterProvider, + createBrowserHistory, + createMemoryHistory, + createRootRoute, + createRootRouteWithContext, + createRoute, + createRouter, + injectErrorState, + injectLoaderData, + injectMatch, + injectParams, + injectRouterContext, + injectSearch, + redirect, + retainSearchParams, +} from '../src' +import { + getIntersectionObserverMock, + getSearchParamsFromURI, +} from './utils' +import type { RouterHistory } from '../src' + +const ioObserveMock = vi.fn() +const ioDisconnectMock = vi.fn() +let history: RouterHistory + +beforeEach(() => { + const io = getIntersectionObserverMock({ + observe: ioObserveMock, + disconnect: ioDisconnectMock, + }) + vi.stubGlobal('IntersectionObserver', io) + history = createBrowserHistory() + expect(window.location.pathname).toBe('/') +}) + +afterEach(() => { + history.destroy() + window.history.replaceState(null, 'root', '/') + vi.resetAllMocks() +}) + +@Angular.Component({ + selector: 'link-disabled-index', + imports: [Link], + template: ` +

Index

+ Posts + `, + standalone: true, +}) +class LinkDisabledIndexComponent {} + +@Angular.Component({ + selector: 'link-children-index', + imports: [Link], + template: ` +

Index

+ + + + `, + standalone: true, +}) +class LinkChildrenIndexComponent {} + +@Angular.Component({ + selector: 'link-basic-posts', + template: '

Posts

', + standalone: true, +}) +class LinkBasicPostsComponent {} + +function createBasicPostsRouter(indexComponent: Angular.Type) { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => indexComponent, + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + component: () => LinkBasicPostsComponent, + }) + + return createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + }) +} + +describe('Link', () => { + test('when a Link is disabled', async () => { + const router = createBasicPostsRouter(LinkDisabledIndexComponent) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsLink = await screen.findByRole('link', { name: 'Posts' }) + + expect(window.location.pathname).toBe('/') + + expect(postsLink.hasAttribute('disabled')).toBe(false) + expect(postsLink.getAttribute('aria-disabled')).toBe('true') + + fireEvent.click(postsLink) + + await waitFor( + () => { + expect(screen.queryByRole('heading', { name: 'Posts' })).toBeNull() + } + ) + }) + + test('when a Link has children', async () => { + const router = createBasicPostsRouter(LinkChildrenIndexComponent) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsLink = await screen.findByRole('link', { name: 'Posts' }) + + fireEvent.click(postsLink) + + const postsHeading = await screen.findByRole('heading', { name: 'Posts' }) + expect(postsHeading).toBeTruthy() + }) + + describe('when the current route has a search fields with undefined values', () => { + @Angular.Component({ + imports: [Link], + template: ` +

Index

+ Index exact + Index foo=undefined + Index foo=undefined-exact + Index foo=bar + `, + standalone: true, + }) + class SearchUndefinedIndexExplicitFalseComponent {} + + @Angular.Component({ + imports: [Link], + template: ` +

Index

+ Index exact + Index foo=undefined + Index foo=undefined-exact + Index foo=bar + `, + standalone: true, + }) + class SearchUndefinedIndexExplicitTrueComponent {} + + async function runTest(opts: { explicitUndefined: boolean | undefined }) { + const IndexComponent = + opts.explicitUndefined === true + ? SearchUndefinedIndexExplicitTrueComponent + : SearchUndefinedIndexExplicitFalseComponent + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + // round 1 + const indexExactLink = await screen.findByRole('link', { + name: 'Index exact', + }) + + const indexFooUndefinedLink = await screen.findByRole('link', { + name: 'Index foo=undefined', + }) + + const indexFooUndefinedExactLink = await screen.findByRole('link', { + name: 'Index foo=undefined-exact', + }) + + const indexFooBarLink = await screen.findByRole('link', { + name: 'Index foo=bar', + }) + + expect(window.location.pathname).toBe('/') + + expect(indexExactLink.getAttribute('href')).toBe('/') + expect(indexExactLink.getAttribute('aria-current')).toBe('page') + expect(indexExactLink.getAttribute('data-status')).toBe('active') + + if (opts.explicitUndefined) { + expect(indexFooUndefinedLink.getAttribute('aria-current')).toBe('page') + expect(indexFooUndefinedLink.getAttribute('data-status')).toBe('active') + } else { + expect(indexFooUndefinedLink.getAttribute('aria-current')).toBe('page') + expect(indexFooUndefinedLink.getAttribute('data-status')).toBe('active') + } + + expect(indexFooUndefinedLink.getAttribute('href')).toBe('/') + + if (opts.explicitUndefined) { + expect( + indexFooUndefinedExactLink.getAttribute('aria-current'), + ).toBeNull() + expect( + indexFooUndefinedExactLink.getAttribute('data-status'), + ).toBeNull() + } else { + expect(indexFooUndefinedExactLink.getAttribute('aria-current')).toBe( + 'page', + ) + expect(indexFooUndefinedExactLink.getAttribute('data-status')).toBe( + 'active', + ) + } + + expect(indexFooUndefinedExactLink.getAttribute('href')).toBe('/') + + expect(indexFooBarLink.getAttribute('href')).toBe('/?foo=bar') + expect(indexFooBarLink.getAttribute('aria-current')).toBeNull() + expect(indexFooBarLink.getAttribute('data-status')).toBeNull() + + // navigate to /?foo=bar + fireEvent.click(indexFooBarLink) + + await waitFor(() => { + expect(window.location.search).toBe('?foo=bar') + }) + + expect(indexExactLink.getAttribute('href')).toBe('/') + expect(indexExactLink.getAttribute('aria-current')).toBeNull() + expect(indexExactLink.getAttribute('data-status')).toBeNull() + + if (opts.explicitUndefined) { + expect(indexFooUndefinedLink.getAttribute('aria-current')).toBeNull() + expect(indexFooUndefinedLink.getAttribute('data-status')).toBeNull() + } else { + expect(indexFooUndefinedLink.getAttribute('aria-current')).toBe('page') + expect(indexFooUndefinedLink.getAttribute('data-status')).toBe('active') + } + + expect(indexFooUndefinedLink.getAttribute('href')).toBe('/') + + expect(indexFooUndefinedExactLink.getAttribute('href')).toBe('/') + expect(indexFooUndefinedExactLink.getAttribute('aria-current')).toBeNull() + expect(indexFooUndefinedExactLink.getAttribute('data-status')).toBeNull() + + expect(indexFooBarLink.getAttribute('href')).toBe('/?foo=bar') + expect(indexFooBarLink.getAttribute('aria-current')).toBe('page') + expect(indexFooBarLink.getAttribute('data-status')).toBe('active') + } + + test.each([undefined, false])( + 'activeOptions.explicitUndefined=%s', + async (explicitUndefined) => { + await runTest({ explicitUndefined }) + }, + ) + + test('activeOptions.explicitUndefined=true', async () => { + await runTest({ explicitUndefined: true }) + }) + }) + + test('when navigating to /posts with search', async () => { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => { + @Angular.Component({ + imports: [Link], + template: ` +

Index

+ Posts + `, + standalone: true, + }) + class IndexComponent {} + return IndexComponent + }, + }) + + const PostsComponent = () => { + @Angular.Component({ + template: ` +

Posts

+ Page: {{ search().page }} + `, + standalone: true, + }) + class PostsComponentClass { + search = injectSearch({ strict: false }) + } + return PostsComponentClass + } + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + validateSearch: (input: Record) => { + return { + page: input.page, + } + }, + component: PostsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsLink = await screen.findByRole('link', { name: 'Posts' }) + + expect(postsLink.getAttribute('href')).toBe('/posts?page=0') + + fireEvent.click(postsLink) + + const postsHeading = await screen.findByRole('heading', { name: 'Posts' }) + expect(postsHeading).toBeTruthy() + + expect(window.location.pathname).toBe('/posts') + expect(window.location.search).toBe('?page=0') + + const pageZero = await screen.findByText('Page: 0') + expect(pageZero).toBeTruthy() + }) + + test('when navigation to . from /posts while updating search from /', async () => { + @Angular.Component({ + selector: 'nav-from-posts-root', + imports: [Link, Outlet], + template: ` + + + `, + standalone: true, + }) + class NavFromPostsRootComponent {} + + @Angular.Component({ + selector: 'nav-from-posts-index', + imports: [Link], + template: ` +

Index

+ + Go to Posts + + `, + standalone: true, + }) + class NavFromPostsIndexComponent {} + + @Angular.Component({ + selector: 'nav-from-posts-posts', + template: ` +

Posts

+ Page: {{ search().page }} + Filter: {{ search().filter }} + `, + standalone: true, + }) + class NavFromPostsPostsComponent { + search = injectSearch({ strict: false }) + } + + const rootRoute = createRootRoute({ + component: () => NavFromPostsRootComponent, + }) + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => NavFromPostsIndexComponent, + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + validateSearch: (input: Record) => { + return { + page: input.page ? Number(input.page) : 1, + filter: (input.filter as string) || 'all', + } + }, + component: () => NavFromPostsPostsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + history, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + // Start at index page + const toPostsLink = await screen.findByTestId('to-posts') + expect(toPostsLink.getAttribute('href')).toBe('/posts?page=1&filter=active') + + // Navigate to posts with initial search params + fireEvent.click(toPostsLink) + + // Verify we're on posts with initial search + const postsHeading = await screen.findByRole('heading', { name: 'Posts' }) + expect(postsHeading).toBeTruthy() + expect(window.location.pathname).toBe('/posts') + expect(window.location.search).toBe('?page=1&filter=active') + + const currentPage = await screen.findByTestId('current-page') + const currentFilter = await screen.findByTestId('current-filter') + expect(currentPage.textContent).toBe('Page: 1') + expect(currentFilter.textContent).toBe('Filter: active') + + // Navigate to current route (.) with updated search + const updateSearchLink = await screen.findByTestId('update-search') + expect(updateSearchLink.getAttribute('href')).toBe( + '/posts?page=2&filter=inactive', + ) + + await fireEvent.click(updateSearchLink) + + // Wait for navigation to complete and search params to update + await waitFor(() => { + expect(window.location.search).toBe('?page=2&filter=inactive') + }) + + // Wait for the component to re-render with updated search params + await waitFor(() => { + const updatedPage = screen.getByTestId('current-page') + const updatedFilter = screen.getByTestId('current-filter') + expect(updatedPage.textContent).toBe('Page: 2') + expect(updatedFilter.textContent).toBe('Filter: inactive') + }) + + // Verify search was updated + expect(window.location.pathname).toBe('/posts') + expect(window.location.search).toBe('?page=2&filter=inactive') + }) + + test('when navigating to /posts with params', async () => { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => { + @Angular.Component({ + imports: [Link], + template: ` +

Index

+ + To first post + + `, + standalone: true, + }) + class IndexComponent {} + return IndexComponent + }, + }) + + const PostsComponent = () => { + @Angular.Component({ + imports: [Link, Outlet], + template: ` +

Posts

+ Index + + `, + standalone: true, + }) + class PostsComponentClass {} + return PostsComponentClass + } + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + component: PostsComponent, + }) + + const PostComponent = () => { + @Angular.Component({ + template: 'Params: {{ params().postId }}', + standalone: true, + }) + class PostComponentClass { + params = injectParams({ strict: false }) + } + return PostComponentClass + } + + const postRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '$postId', + component: PostComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([ + indexRoute, + postsRoute.addChildren([postRoute]), + ]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postLink = await screen.findByRole('link', { + name: 'To first post', + }) + + expect(postLink.getAttribute('href')).toBe('/posts/id1') + + fireEvent.click(postLink) + + const paramText = await screen.findByText('Params: id1') + expect(paramText).toBeTruthy() + }) + + test('when navigating to /posts with a loader', async () => { + const loader = vi.fn((opts) => { + return Promise.resolve({ pageDoubled: opts.deps.page.page * 2 }) + }) + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => { + @Angular.Component({ + imports: [Link], + template: ` +

Index

+ Posts + `, + standalone: true, + }) + class IndexComponent {} + return IndexComponent + }, + }) + + const PostsComponent = () => { + @Angular.Component({ + template: ` +

Posts

+ Page: {{ data().pageDoubled }} + `, + standalone: true, + }) + class PostsComponentClass { + data = injectLoaderData({ strict: false }) + } + return PostsComponentClass + } + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + validateSearch: (input: Record) => { + const page = Number(input.page) + + if (isNaN(page)) throw Error('Not a number!') + + return { + page, + } + }, + loaderDeps: (opts) => ({ page: opts.search }), + loader: loader, + component: PostsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsLink = await screen.findByRole('link', { name: 'Posts' }) + + expect(postsLink.getAttribute('href')).toBe('/posts?page=2') + + fireEvent.click(postsLink) + + const pageFour = await screen.findByText('Page: 4') + expect(pageFour).toBeTruthy() + + expect(loader).toHaveBeenCalledOnce() + }) + + test('when navigating to /posts with invalid search', async () => { + const rootRoute = createRootRoute() + const onError = vi.fn() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => { + @Angular.Component({ + imports: [Link], + template: ` +

Index

+ Posts + `, + standalone: true, + }) + class IndexComponent {} + return IndexComponent + }, + }) + + const PostsComponent = () => { + @Angular.Component({ + template: ` +

Posts

+ Page: {{ search().page }} + `, + standalone: true, + }) + class PostsComponentClass { + search = injectSearch({ strict: false }) + } + return PostsComponentClass + } + + const ErrorComponent = () => { + @Angular.Component({ + template: '

Oops, something went wrong

', + standalone: true, + }) + class ErrorComponentClass {} + return ErrorComponentClass + } + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + errorComponent: ErrorComponent, + onError, + validateSearch: (input: Record) => { + const page = Number(input.page) + + if (isNaN(page)) throw Error('Not a number!') + + return { + page, + } + }, + component: PostsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsLink = await screen.findByRole('link', { name: 'Posts' }) + + expect(postsLink.getAttribute('href')).toBe('/posts?page=invalid') + + fireEvent.click(postsLink) + + await waitFor(() => expect(onError).toHaveBeenCalledOnce()) + + const errorHeading = await screen.findByRole('heading', { + name: 'Oops, something went wrong', + }) + expect(errorHeading).toBeTruthy() + }) + + test('when navigating to /posts with a loader that errors', async () => { + const onError = vi.fn() + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => { + @Angular.Component({ + imports: [Link], + template: ` +

Index

+ Posts + `, + standalone: true, + }) + class IndexComponent {} + return IndexComponent + }, + }) + + const PostsComponent = () => { + @Angular.Component({ + template: ` +

Posts

+ Page: {{ loader().pageDoubled }} + `, + standalone: true, + }) + class PostsComponentClass { + loader = injectLoaderData({ strict: false }) + } + return PostsComponentClass + } + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + validateSearch: (input: Record) => { + const page = Number(input.page) + + if (isNaN(page)) throw Error('Not a number!') + + return { + page, + } + }, + loaderDeps: (opts) => ({ page: opts.search }), + onError, + errorComponent: () => { + @Angular.Component({ + template: 'Something went wrong!', + standalone: true, + }) + class ErrorComponent {} + return ErrorComponent + }, + loader: () => { + throw new Error() + }, + component: PostsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsLink = await screen.findByRole('link', { name: 'Posts' }) + + expect(postsLink.getAttribute('href')).toBe('/posts?page=2') + + fireEvent.click(postsLink) + + const errorText = await screen.findByText('Something went wrong!') + expect(errorText).toBeTruthy() + + expect(onError).toHaveBeenCalledOnce() + }) + + test('when navigating away from a route with a loader that errors', async () => { + @Angular.Component({ + selector: 'loader-error-root', + imports: [Link, Outlet], + template: ` +
+ Index Posts +
+
+ + `, + standalone: true, + }) + class LoaderErrorRootComponent {} + + @Angular.Component({ + selector: 'loader-error-index', + template: '

Index

', + standalone: true, + }) + class LoaderErrorIndexComponent {} + + @Angular.Component({ + selector: 'loader-error-index-error', + template: 'IndexError', + standalone: true, + }) + class LoaderErrorIndexErrorComponent {} + + @Angular.Component({ + selector: 'loader-error-posts-error', + template: 'PostsError', + standalone: true, + }) + class LoaderErrorPostsErrorComponent {} + + @Angular.Component({ + selector: 'loader-error-posts', + template: '

Posts

', + standalone: true, + }) + class LoaderErrorPostsComponent {} + + const postsOnError = vi.fn() + const indexOnError = vi.fn() + const rootRoute = createRootRoute({ + component: () => LoaderErrorRootComponent, + }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => LoaderErrorIndexComponent, + onError: indexOnError, + errorComponent: () => LoaderErrorIndexErrorComponent, + }) + + 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: () => LoaderErrorPostsErrorComponent, + component: () => LoaderErrorPostsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsLink = await screen.findByRole('link', { name: 'Posts' }) + + fireEvent.click(postsLink) + + const postsErrorText = await screen.findByText('PostsError') + expect(postsErrorText).toBeTruthy() + + expect(postsOnError).toHaveBeenCalledOnce() + expect(postsOnError).toHaveBeenCalledWith(error) + + const indexLink = await screen.findByRole('link', { name: 'Index' }) + fireEvent.click(indexLink) + await waitFor( + () => { + expect(screen.queryByText('IndexError')).toBeNull() + }, + { timeout: 200 }, + ) + expect(indexOnError).not.toHaveBeenCalledOnce() + }) + + test('when navigating to /posts with a beforeLoad that redirects', async () => { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => { + @Angular.Component({ + imports: [Link], + template: ` +

Index

+ Posts + `, + standalone: true, + }) + class IndexComponent {} + return IndexComponent + }, + }) + + const PostsComponent = () => { + @Angular.Component({ + template: '

Posts

', + standalone: true, + }) + class PostsComponentClass {} + return PostsComponentClass + } + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + beforeLoad: () => { + throw redirect({ + to: '/login', + }) + }, + component: PostsComponent, + }) + + const authRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'login', + component: () => { + @Angular.Component({ + template: '

Auth!

', + standalone: true, + }) + class AuthComponent {} + return AuthComponent + }, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute, authRoute]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsLink = await screen.findByRole('link', { name: 'Posts' }) + + fireEvent.click(postsLink) + + const authText = await screen.findByText('Auth!') + expect(authText).toBeTruthy() + }) + + test('when navigating to /posts with a beforeLoad that returns context', async () => { + const rootRoute = createRootRouteWithContext<{ + userId: string + }>()() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => { + @Angular.Component({ + imports: [Link], + template: ` +

Index

+ Posts + `, + standalone: true, + }) + class IndexComponent {} + return IndexComponent + }, + }) + + const PostsComponent = () => { + @Angular.Component({ + template: ` +

Posts

+ UserId: {{ context().userId }} + Username: {{ context().username }} + `, + standalone: true, + }) + class PostsComponentClass { + context = injectRouterContext({ strict: false }) + } + return PostsComponentClass + } + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + beforeLoad: () => { + return Promise.resolve({ + username: 'username', + }) + }, + component: PostsComponent, + }) + + const router = createRouter({ + context: { userId: 'userId' }, + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsLink = await screen.findByRole('link', { name: 'Posts' }) + + fireEvent.click(postsLink) + + const userId = await screen.findByText('UserId: userId') + expect(userId).toBeTruthy() + }) + + test('when navigating to /posts with a beforeLoad that throws an error', async () => { + const onError = vi.fn() + const rootRoute = createRootRoute() + @Angular.Component({ + imports: [Link], + template: ` +

Index

+ Posts + `, + standalone: true, + }) + class IndexComponent {} + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + @Angular.Component({ + template: '

Posts

', + standalone: true, + }) + class PostsComponentClass {} + + @Angular.Component({ + template: 'Oops! Something went wrong!', + standalone: true, + }) + class ErrorComponent {} + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + beforeLoad: () => { + throw new Error('Oops. Something went wrong!') + }, + onError, + errorComponent: () => ErrorComponent, + component: () => PostsComponentClass, + }) + + const router = createRouter({ + context: { userId: 'userId' }, + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsLink = await screen.findByRole('link', { name: 'Posts' }) + + fireEvent.click(postsLink) + + const errorText = await screen.findByText('Oops! Something went wrong!') + expect(errorText).toBeTruthy() + + expect(onError).toHaveBeenCalledOnce() + }) + + test('when navigating to /posts with a beforeLoad that throws an error bubbles to the root', async () => { + @Angular.Component({ + template: 'Oops! Something went wrong!', + standalone: true, + }) + class ErrorComponent {} + + const rootRoute = createRootRoute({ + errorComponent: () => ErrorComponent, + }) + + @Angular.Component({ + imports: [Link], + template: ` +

Index

+ Posts + `, + standalone: true, + }) + class IndexComponent {} + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + @Angular.Component({ + template: '

Posts

', + standalone: true, + }) + class PostsComponentClass {} + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + beforeLoad: () => { + throw new Error('Oops. Something went wrong!') + }, + component: () => PostsComponentClass, + }) + + const router = createRouter({ + context: { userId: 'userId' }, + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsLink = await screen.findByRole('link', { name: 'Posts' }) + + fireEvent.click(postsLink) + + // Wait for the error to be processed and error component to render + const errorText = await screen.findByText( + 'Oops! Something went wrong!', + {}, + { timeout: 2000 }, + ) + expect(errorText).toBeTruthy() + }) + + test('when navigating to /posts with a beforeLoad that throws an error bubbles to the nearest parent', async () => { + @Angular.Component({ + template: 'Root error', + standalone: true, + }) + class ErrorComponent {} + const rootRoute = createRootRoute({ + errorComponent: () => ErrorComponent, + }) + + @Angular.Component({ + imports: [Link], + template: ` +

Index

+ Post + `, + standalone: true, + }) + class IndexComponent {} + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + @Angular.Component({ + imports: [Outlet], + template: ` +

Posts

+ + `, + standalone: true, + }) + class PostsComponentClass {} + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + errorComponent: () => { + @Angular.Component({ + template: 'Oops! Something went wrong!', + standalone: true, + }) + class ErrorComponent {} + return ErrorComponent + }, + component: () => PostsComponentClass, + }) + + const postRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '$postId', + beforeLoad: () => { + throw new Error('Oops. Something went wrong!') + }, + }) + + const router = createRouter({ + context: { userId: 'userId' }, + routeTree: rootRoute.addChildren([ + indexRoute, + postsRoute.addChildren([postRoute]), + ]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postLink = await screen.findByRole('link', { name: 'Post' }) + + fireEvent.click(postLink) + + // Wait for the error to be processed and error component to render + const errorText = await screen.findByText( + 'Oops! Something went wrong!', + {}, + { timeout: 2000 }, + ) + expect(errorText).toBeTruthy() + }) + + test('when navigating from /posts to ./$postId', async () => { + @Angular.Component({ + selector: 'posts-to-postid-index', + imports: [Link], + template: ` +

Index

+ Posts + To first post + `, + standalone: true, + }) + class PostsToPostIdIndexComponent {} + + @Angular.Component({ + selector: 'posts-to-postid-posts', + imports: [Outlet], + template: ` +

Posts

+ + `, + standalone: true, + }) + class PostsToPostIdPostsComponent {} + + @Angular.Component({ + selector: 'posts-to-postid-posts-index', + imports: [Link], + template: ` +

Posts Index

+ To the first post + `, + standalone: true, + }) + class PostsToPostIdPostsIndexComponent {} + + @Angular.Component({ + selector: 'posts-to-postid-post', + imports: [Link], + template: ` + Params: {{ params().postId }} + Index + `, + standalone: true, + }) + class PostsToPostIdPostComponent { + params = injectParams({ strict: false }) + } + + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => PostsToPostIdIndexComponent, + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + component: () => PostsToPostIdPostsComponent, + }) + + const postsIndexRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '/', + component: () => PostsToPostIdPostsIndexComponent, + }) + + const postRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '$postId', + component: () => PostsToPostIdPostComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([ + indexRoute, + postsRoute.addChildren([postsIndexRoute, postRoute]), + ]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsLink = await screen.findByRole('link', { name: 'Posts' }) + + expect(postsLink.getAttribute('href')).toBe('/posts') + + fireEvent.click(postsLink) + + const postsText = await screen.findByText('Posts Index') + expect(postsText).toBeTruthy() + + const postLink = await screen.findByRole('link', { + name: 'To the first post', + }) + + expect(postLink.getAttribute('href')).toBe('/posts/id1') + + fireEvent.click(postLink) + + const paramText = await screen.findByText('Params: id1') + expect(paramText).toBeTruthy() + + expect(window.location.pathname).toBe('/posts/id1') + }) + + test('when navigating from /posts/$postId to "/"', async () => { + @Angular.Component({ + imports: [Link, Outlet], + template: ` + Home + Posts + + `, + standalone: true, + }) + class RootComponent {} + const rootRoute = createRootRoute({ + component: () => RootComponent, + }) + + @Angular.Component({ + template: '

Index

', + standalone: true, + }) + class IndexComponent {} + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + @Angular.Component({ + imports: [Link, Outlet], + template: ` +

Posts

+ + To first post + + + `, + standalone: true, + }) + class PostsComponentClass {} + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + component: () => PostsComponentClass, + }) + + const PostsIndexComponent = () => { + @Angular.Component({ + template: '

Posts Index

', + standalone: true, + }) + class PostsIndexComponentClass {} + return PostsIndexComponentClass + } + + const postsIndexRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '/', + component: PostsIndexComponent, + }) + + const PostComponent = () => { + @Angular.Component({ + template: + 'Params: {{ params().postId }}', + standalone: true, + }) + class PostComponentClass { + params = injectParams({ strict: false }) + } + return PostComponentClass + } + + const postRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '$postId', + component: PostComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([ + indexRoute, + postsRoute.addChildren([postsIndexRoute, postRoute]), + ]), + history, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsLink = await screen.findByTestId('posts-link') + + expect(postsLink.getAttribute('href')).toBe('/posts') + + fireEvent.click(postsLink) + + const postsText = await screen.findByTestId('posts-index-heading') + expect(postsText).toBeTruthy() + + const postLink = await screen.findByTestId('post1-link') + + expect(postLink.getAttribute('href')).toBe('/posts/id1') + + fireEvent.click(postLink) + + const paramText = await screen.findByTestId('post-param') + expect(paramText).toBeTruthy() + + expect(window.location.pathname).toBe('/posts/id1') + + const homeLink = await screen.findByTestId('home-link') + + const consoleWarnSpy = vi.spyOn(console, 'warn') + + fireEvent.click(homeLink) + + const homeHeading = await screen.findByTestId('home-heading') + + expect(window.location.pathname).toBe('/') + expect(homeHeading).toBeTruthy() + + expect(consoleWarnSpy).not.toHaveBeenCalled() + + consoleWarnSpy.mockRestore() + }) + + test('when navigating from /posts to ../posts/$postId', async () => { + @Angular.Component({ + selector: 'posts-to-parent-postid-index', + imports: [Link], + template: ` +

Index

+ Posts + To first post + `, + standalone: true, + }) + class PostsToParentPostIdIndexComponent {} + + @Angular.Component({ + selector: 'posts-to-parent-postid-posts', + imports: [Outlet], + template: ` +

Posts

+ + `, + standalone: true, + }) + class PostsToParentPostIdPostsComponent {} + + @Angular.Component({ + selector: 'posts-to-parent-postid-posts-index', + imports: [Link], + template: ` +

Posts Index

+ To the first post + `, + standalone: true, + }) + class PostsToParentPostIdPostsIndexComponent {} + + @Angular.Component({ + selector: 'posts-to-parent-postid-post', + imports: [Link], + template: ` + Params: {{ params().postId }} + Index + `, + standalone: true, + }) + class PostsToParentPostIdPostComponent { + params = injectParams({ strict: false }) + } + + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => PostsToParentPostIdIndexComponent, + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + component: () => PostsToParentPostIdPostsComponent, + }) + + const postsIndexRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '/', + component: () => PostsToParentPostIdPostsIndexComponent, + }) + + const postRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '$postId', + component: () => PostsToParentPostIdPostComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([ + indexRoute, + postsRoute.addChildren([postsIndexRoute, postRoute]), + ]), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsLink = await screen.findByRole('link', { name: 'Posts' }) + + expect(postsLink.getAttribute('href')).toBe('/posts') + + fireEvent.click(postsLink) + + const postsIndexText = await screen.findByText('Posts Index') + expect(postsIndexText).toBeTruthy() + + const postLink = await screen.findByRole('link', { + name: 'To the first post', + }) + + expect(postLink.getAttribute('href')).toBe('/posts/id1') + + fireEvent.click(postLink) + + const paramText = await screen.findByText('Params: id1') + expect(paramText).toBeTruthy() + }) + + test('when navigating from /posts to /invoices with conditionally rendering Link on the root', async () => { + @Angular.Component({ + template: '
Something went wrong!
', + standalone: true, + }) + class ConditionalLinksErrorComponent {} + + const ErrorComponent = vi.fn(() => ConditionalLinksErrorComponent) + + @Angular.Component({ + selector: 'root-component-conditional-links', + imports: [Link, Outlet], + template: ` + @if (matchPosts()) { + From posts + } + @if (matchInvoices()) { + From invoices + } + + `, + standalone: true, + }) + class ConditionalLinksRootComponent { + matchPosts = injectMatch({ from: '/posts', shouldThrow: false }) + matchInvoices = injectMatch({ from: '/invoices', shouldThrow: false }) + } + + @Angular.Component({ + selector: 'index-component-conditional', + imports: [Link], + template: ` +

Index Route

+ Go to posts + `, + standalone: true, + }) + class ConditionalLinksIndexComponent {} + + @Angular.Component({ + selector: 'posts-component-conditional', + imports: [Link], + template: ` +

On Posts

+ To invoices + `, + standalone: true, + }) + class ConditionalLinksPostsComponent {} + + @Angular.Component({ + selector: 'invoices-component-conditional', + imports: [Link], + template: ` +

On Invoices

+ To posts + `, + standalone: true, + }) + class ConditionalLinksInvoicesComponent {} + + const rootRoute = createRootRoute({ + component: () => ConditionalLinksRootComponent, + errorComponent: ErrorComponent as any, + }) + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => ConditionalLinksIndexComponent, + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + component: () => ConditionalLinksPostsComponent, + }) + + const invoicesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'invoices', + component: () => ConditionalLinksInvoicesComponent, + }) + + const routeTree = rootRoute.addChildren([ + indexRoute, + postsRoute, + invoicesRoute, + ]) + + const router = createRouter({ + routeTree, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsLink = await screen.findByRole('link', { name: 'Go to posts' }) + + fireEvent.click(postsLink) + + const fromPostsLink = await screen.findByRole('link', { + name: 'From posts', + }) + + expect(fromPostsLink).toBeTruthy() + + const toInvoicesLink = await screen.findByRole('link', { + name: 'To invoices', + }) + + fireEvent.click(toInvoicesLink) + + const fromInvoicesLink = await screen.findByRole('link', { + name: 'From invoices', + }) + + expect(fromInvoicesLink).toBeTruthy() + + // Query for 'From posts' link again after navigation - it should not exist + expect(screen.queryByRole('link', { name: 'From posts' })).toBeNull() + + const toPostsLink = await screen.findByRole('link', { + name: 'To posts', + }) + + fireEvent.click(toPostsLink) + + const onPostsText = await screen.findByText('On Posts') + expect(onPostsText).toBeTruthy() + + // Query for 'From invoices' link again after navigation - it should not exist + expect(screen.queryByRole('link', { name: 'From invoices' })).toBeNull() + + expect(ErrorComponent).not.toHaveBeenCalled() + }) + + test('when linking to self with from prop set and param containing a slash', async () => { + const ErrorComponent = vi.fn(() => { + @Angular.Component({ + template: '

Something went wrong!

', + standalone: true, + }) + class ErrorComponentClass {} + return ErrorComponentClass + }) + + const rootRoute = createRootRoute({ + errorComponent: ErrorComponent as any, + }) + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => { + @Angular.Component({ + imports: [Link], + template: ` + Go to post + `, + standalone: true, + }) + class IndexComponent {} + return IndexComponent + }, + }) + + const postRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/$postId', + component: () => { + @Angular.Component({ + imports: [Link], + template: ` + Link to self with from prop set + `, + standalone: true, + }) + class PostComponent {} + return PostComponent + }, + }) + + const routeTree = rootRoute.addChildren([indexRoute, postRoute]) + const router = createRouter({ routeTree }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postLink = await screen.findByRole('link', { + name: 'Go to post', + }) + + expect(postLink.getAttribute('href')).toBe('/id%2Fwith-slash') + + fireEvent.click(postLink) + + const selfLink = await screen.findByRole('link', { + name: 'Link to self with from prop set', + }) + + expect(selfLink).toBeTruthy() + expect(ErrorComponent).not.toHaveBeenCalled() + }) + + test('when navigating to /$postId with parseParams and stringifyParams', async () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => { + @Angular.Component({ + imports: [Link], + template: ` + Go to post + `, + standalone: true, + }) + class IndexComponent {} + return IndexComponent + }, + }) + + let parseParams: any + let stringifyParams: any + + const PostComponent = () => { + @Angular.Component({ + template: '
Post: {{ params().postId }}
', + standalone: true, + }) + class PostComponentClass { + params = injectParams({ strict: false }) + } + return PostComponentClass + } + + const postRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '$postId', + parseParams: (params) => { + parseParams = structuredClone(params) // clone object, because source will get mutated + return { + status: 'parsed', + postId: params.postId, + } + }, + stringifyParams: (params) => { + stringifyParams = structuredClone(params) // clone object, because source will get mutated + return { + status: 'stringified', + postId: params.postId, + } + }, + component: PostComponent, + }) + + const routeTree = rootRoute.addChildren([indexRoute, postRoute]) + const router = createRouter({ routeTree }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postLink = await screen.findByRole('link', { + name: 'Go to post', + }) + + expect(stringifyParams).toEqual({ postId: 2 }) + + expect(postLink.getAttribute('href')).toBe('/2') + + fireEvent.click(postLink) + + const posts2Text = await screen.findByText('Post: 2') + expect(posts2Text).toBeTruthy() + + expect(parseParams).toEqual({ postId: '2' }) + }) + + test('when navigating to /$postId with params.parse and params.stringify', async () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => { + @Angular.Component({ + imports: [Link], + template: ` + Go to post + `, + standalone: true, + }) + class IndexComponent {} + return IndexComponent + }, + }) + + let parseParams: any + let stringifyParams: any + + const PostComponent = () => { + @Angular.Component({ + template: '
Post: {{ params().postId }}
', + standalone: true, + }) + class PostComponentClass { + params = injectParams({ strict: false }) + } + return PostComponentClass + } + + const postRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '$postId', + params: { + parse: (params) => { + parseParams = structuredClone(params) // clone object, because source will get mutated + return { + status: 'parsed', + postId: params.postId, + } + }, + stringify: (params) => { + stringifyParams = structuredClone(params) // clone object, because source will get mutated + return { + status: 'stringified', + postId: params.postId, + } + }, + }, + component: PostComponent, + }) + + const routeTree = rootRoute.addChildren([indexRoute, postRoute]) + const router = createRouter({ routeTree }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postLink = await screen.findByRole('link', { + name: 'Go to post', + }) + + expect(stringifyParams).toEqual({ postId: 2 }) + + expect(postLink.getAttribute('href')).toBe('/2') + + fireEvent.click(postLink) + + const posts2Text = await screen.findByText('Post: 2') + expect(posts2Text).toBeTruthy() + + expect(parseParams).toEqual({ postId: '2' }) + }) + + test('when navigating to /$postId with params.parse and params.stringify handles falsey inputs', async () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => { + @Angular.Component({ + imports: [Link], + template: ` + Go to post 2 + Go to post 0 + `, + standalone: true, + }) + class IndexComponent {} + return IndexComponent + }, + }) + + const stringifyParamsMock = vi.fn() + + const parseParams = ({ postId }: { postId: string }) => { + return { + postId: parseInt(postId), + } + } + + const stringifyParams = ({ postId }: { postId: number }) => { + stringifyParamsMock({ postId }) + return { + postId: postId.toString(), + } + } + + const PostComponent = () => { + @Angular.Component({ + template: '
Post: {{ params().postId }}
', + standalone: true, + }) + class PostComponentClass { + params = injectParams({ strict: false }) + } + return PostComponentClass + } + + const postRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '$postId', + params: { + parse: parseParams, + stringify: stringifyParams, + }, + component: PostComponent, + }) + + const routeTree = rootRoute.addChildren([indexRoute, postRoute]) + const router = createRouter({ routeTree }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postLink2 = await screen.findByRole('link', { + name: 'Go to post 2', + }) + const postLink0 = await screen.findByRole('link', { + name: 'Go to post 0', + }) + + expect(postLink2.getAttribute('href')).toBe('/2') + expect(postLink0.getAttribute('href')).toBe('/0') + + expect(stringifyParamsMock).toHaveBeenCalledWith({ postId: 2 }) + expect(stringifyParamsMock).toHaveBeenCalledWith({ postId: 0 }) + }) + + test.each([false, 'intent', 'render'] as const)( + 'Router.preload="%s", should not trigger the IntersectionObserver\'s observe and disconnect methods', + async (preload) => { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => { + @Angular.Component({ + imports: [Link], + template: ` +

Index Heading

+ Index Link + `, + standalone: true, + }) + class IndexComponent {} + return IndexComponent + }, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute]), + defaultPreload: preload, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const indexLink = await screen.findByRole('link', { name: 'Index Link' }) + expect(indexLink).toBeTruthy() + + expect(ioObserveMock).not.toBeCalled() + expect(ioDisconnectMock).not.toBeCalled() + }, + ) + + test.each([false, 'intent', 'viewport', 'render'] as const)( + 'Router.preload="%s" with Link.preload="false", should not trigger the IntersectionObserver\'s observe method', + async (preload) => { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => { + @Angular.Component({ + imports: [Link], + template: ` +

Index Heading

+ Index Link + `, + standalone: true, + }) + class IndexComponent {} + return IndexComponent + }, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute]), + defaultPreload: preload, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const indexLink = await screen.findByRole('link', { name: 'Index Link' }) + expect(indexLink).toBeTruthy() + + expect(ioObserveMock).not.toBeCalled() + }, + ) + + test('Router.preload="viewport", should trigger the IntersectionObserver\'s observe and disconnect methods', async () => { + const rootRoute = createRootRoute() + const RouteComponent = () => { + @Angular.Component({ + imports: [Link], + template: ` +

Index Heading

+ {{ count() }} + + Index Link + `, + standalone: true, + }) + class RouteComponentClass { + count = Angular.signal(0) + increment() { + this.count.set(this.count() + 1) + } + } + return RouteComponentClass + } + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: RouteComponent as any, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute]), + defaultPreload: 'viewport', + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const indexLink = await screen.findByRole('link', { name: 'Index Link' }) + expect(indexLink).toBeTruthy() + + expect(ioObserveMock).toHaveBeenCalledOnce() + expect(ioDisconnectMock).not.toHaveBeenCalled() + + const output = screen.getByRole('status') + expect(output.textContent).toBe('0') + + const button = screen.getByRole('button', { name: 'Render' }) + fireEvent.click(button) + await waitFor(() => { + expect(output.textContent).toBe('1') + }) + expect(ioObserveMock).toHaveBeenCalledOnce() // it should not observe again + expect(ioDisconnectMock).not.toHaveBeenCalled() // it should not disconnect again + }) + + test("Router.preload='render', should trigger the route loader on render", async () => { + const mock = vi.fn() + + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + loader: () => { + mock() + }, + component: () => { + @Angular.Component({ + imports: [Link], + template: ` +

Index Heading

+ About Link + `, + standalone: true, + }) + class IndexComponent {} + return IndexComponent + }, + }) + const aboutRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/about', + component: () => { + @Angular.Component({ + template: '

About Heading

', + standalone: true, + }) + class AboutComponent {} + return AboutComponent + }, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([aboutRoute, indexRoute]), + defaultPreload: 'render', + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const aboutLink = await screen.findByRole('link', { name: 'About Link' }) + expect(aboutLink).toBeTruthy() + + expect(mock).toHaveBeenCalledTimes(1) + }) + + describe('when preloading a link, `preload` should be', () => { + @Angular.Component({ + imports: [Link, Outlet], + template: ` + + To first post + + + To second post + + + `, + standalone: true, + }) + class PreloadRootComponent {} + + @Angular.Component({ + template: '

Index

', + standalone: true, + }) + class PreloadIndexComponent {} + + @Angular.Component({ + imports: [Outlet], + template: ` +

Posts

+ + `, + standalone: true, + }) + class PreloadPostsComponent {} + + @Angular.Component({ + template: 'Params: {{ params().postId }}', + standalone: true, + }) + class PreloadPostComponent { + params = injectParams({ strict: false }) + } + + async function runTest({ + expectedPreload, + testIdToHover, + }: { + expectedPreload: boolean + testIdToHover: string + }) { + const rootRoute = createRootRoute({ + component: () => PreloadRootComponent, + }) + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => PreloadIndexComponent, + }) + + const postsBeforeLoadFn = vi.fn() + const postsLoaderFn = vi.fn() + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + component: () => PreloadPostsComponent, + beforeLoad: postsBeforeLoadFn, + loader: postsLoaderFn, + }) + + const postBeforeLoadFn = vi.fn() + const postLoaderFn = vi.fn() + + const postRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '$postId', + component: () => PreloadPostComponent, + beforeLoad: postBeforeLoadFn, + loader: postLoaderFn, + }) + + const routeTree = rootRoute.addChildren([ + indexRoute, + postsRoute.addChildren([postRoute]), + ]) + + const router = createRouter({ + routeTree, + defaultPreload: 'intent', + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + const link = await screen.findByTestId(testIdToHover) + fireEvent.mouseOver(link) + + const expected = expect.objectContaining({ preload: expectedPreload }) + await waitFor(() => + expect(postsBeforeLoadFn).toHaveBeenCalledWith(expected), + ) + await waitFor(() => expect(postsLoaderFn).toHaveBeenCalledWith(expected)) + + await waitFor(() => + expect(postBeforeLoadFn).toHaveBeenCalledWith(expected), + ) + await waitFor(() => expect(postLoaderFn).toHaveBeenCalledWith(expected)) + } + test('`true` when on / and hovering `/posts/id1` ', async () => { + await runTest({ expectedPreload: true, testIdToHover: 'link-1' }) + }) + + test('`false` when on `/posts/id1` and hovering `/posts/id1`', async () => { + window.history.replaceState(null, 'root', '/posts/id1') + await runTest({ expectedPreload: false, testIdToHover: 'link-1' }) + }) + + test('`true` when on `/posts/id1` and hovering `/posts/id2`', async () => { + window.history.replaceState(null, 'root', '/posts/id1') + await runTest({ expectedPreload: false, testIdToHover: 'link-2' }) + }) + }) + + describe('relative links with basepath', () => { + @Angular.Component({ + template: '

Index Route

', + standalone: true, + }) + class RelativeLinksIndexComponent {} + + @Angular.Component({ + imports: [Outlet], + template: ` +

A Route

+ + `, + standalone: true, + }) + class RelativeLinksARouteComponent {} + + @Angular.Component({ + imports: [Link], + template: ` +

B Route

+ Link to Parent + `, + standalone: true, + }) + class RelativeLinksBRouteComponent {} + + @Angular.Component({ + imports: [Link, Outlet], + template: ` +

Param Route

+ Link to ./a + Link to c + Link to ../c + + `, + standalone: true, + }) + class RelativeLinksParamRouteComponent {} + + @Angular.Component({ + imports: [Link, Outlet], + template: ` +

Param A Route

+ Link to .. from /param/foo/a + Link to .. from current active route + + `, + standalone: true, + }) + class RelativeLinksParamARouteComponent {} + + @Angular.Component({ + imports: [Link], + template: ` +

Param B Route

+ Link to Parent + Link to . with param:bar + Link to Parent with param:bar + `, + standalone: true, + }) + class RelativeLinksParamBRouteComponent {} + + @Angular.Component({ + template: '

Param C Route

', + standalone: true, + }) + class RelativeLinksParamCRouteComponent {} + + const setupRouter = (basepath: string = '') => { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => RelativeLinksIndexComponent, + }) + const aRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'a', + component: () => RelativeLinksARouteComponent, + }) + + const bRoute = createRoute({ + getParentRoute: () => aRoute, + path: 'b', + component: () => RelativeLinksBRouteComponent, + }) + + const paramRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'param/$param', + component: () => RelativeLinksParamRouteComponent, + }) + + const paramARoute = createRoute({ + getParentRoute: () => paramRoute, + path: 'a', + component: () => RelativeLinksParamARouteComponent, + }) + + const paramBRoute = createRoute({ + getParentRoute: () => paramARoute, + path: 'b', + component: () => RelativeLinksParamBRouteComponent, + }) + + const paramCRoute = createRoute({ + getParentRoute: () => paramARoute, + path: 'c', + component: () => RelativeLinksParamCRouteComponent, + }) + + return createRouter({ + routeTree: rootRoute.addChildren([ + indexRoute, + aRoute.addChildren([bRoute]), + paramRoute.addChildren([ + paramARoute.addChildren([paramBRoute, paramCRoute]), + ]), + ]), + basepath: basepath === '' ? undefined : basepath, + }) + } + + test('should navigate to the parent route', async () => { + const router = setupRouter() + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + // Navigate to /a/b + window.history.replaceState(null, 'root', '/a/b') + + // Inspect the link to go up a parent + const parentLink = await screen.findByText('Link to Parent') + expect(parentLink.getAttribute('href')).toBe('/a') + + // Click the link and ensure the new location + fireEvent.click(parentLink) + + await waitFor(() => expect(window.location.pathname).toBe('/a')) + }) + + test('should navigate to the parent route and keep params', async () => { + const router = setupRouter() + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + // Navigate to /param/oldParamValue/a/b + window.history.replaceState(null, 'root', '/param/foo/a/b') + + // Inspect the link to go up a parent and keep the params + const parentLink = await screen.findByText('Link to Parent') + expect(parentLink.getAttribute('href')).toBe('/param/foo/a') + + // Click the link and ensure the new location + fireEvent.click(parentLink) + + await waitFor(() => expect(window.location.pathname).toBe('/param/foo/a')) + }) + + test('should navigate to the parent route and change params', async () => { + const router = setupRouter() + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + // Navigate to /param/oldParamValue/a/b + window.history.replaceState(null, 'root', '/param/foo/a/b') + + // Inspect the link to go up a parent and keep the params + const parentLink = await screen.findByText( + 'Link to Parent with param:bar', + ) + expect(parentLink.getAttribute('href')).toBe('/param/bar/a') + + // Click the link and ensure the new location + fireEvent.click(parentLink) + + await waitFor(() => expect(window.location.pathname).toBe('/param/bar/a')) + }) + + test('should navigate to a relative link based on render location', async () => { + const router = setupRouter() + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + window.history.replaceState(null, 'root', '/param/foo/a/b') + + // Inspect the relative link to ./a + const relativeLink = await screen.findByText('Link to ./a') + expect(relativeLink.getAttribute('href')).toBe('/param/foo/a') + + // Click the link and ensure the new location + fireEvent.click(relativeLink) + + await waitFor(() => expect(window.location.pathname).toBe('/param/foo/a')) + }) + + test('should navigate to a parent link based on render location', async () => { + const router = setupRouter() + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + window.history.replaceState(null, 'root', '/param/foo/a/b') + + // Inspect the relative link to ./a + const relativeLink = await screen.findByText( + 'Link to .. from /param/foo/a', + ) + expect(relativeLink.getAttribute('href')).toBe('/param/foo') + + // Click the link and ensure the new location + fireEvent.click(relativeLink) + + await waitFor(() => expect(window.location.pathname).toBe('/param/foo')) + }) + + test('should navigate to a parent link based on active location', async () => { + const router = setupRouter() + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + window.history.replaceState(null, 'root', '/param/foo/a/b') + + const relativeLink = await screen.findByTestId('link-to-previous') + + expect(relativeLink.getAttribute('href')).toBe('/param/foo/a') + + // Click the link and ensure the new location + fireEvent.click(relativeLink) + + await waitFor(() => expect(window.location.pathname).toBe('/param/foo/a')) + }) + + test('should navigate to a child link based on pathname', async () => { + const router = setupRouter() + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + window.history.replaceState(null, 'root', '/param/foo/a/b') + + // Inspect the relative link to ./a + const relativeLink = await screen.findByText('Link to c') + expect(relativeLink.getAttribute('href')).toBe('/param/foo/a/b/c') + + // Click the link and ensure the new location + fireEvent.click(relativeLink) + + await waitFor(() => + expect(window.location.pathname).toBe('/param/foo/a/b/c'), + ) + }) + + test('should navigate to a relative link based on pathname', async () => { + const router = setupRouter() + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + window.history.replaceState(null, 'root', '/param/foo/a/b') + + // Inspect the relative link to ./a + const relativeLink = await screen.findByText('Link to ../c') + expect(relativeLink.getAttribute('href')).toBe('/param/foo/a/c') + + // Click the link and ensure the new location + fireEvent.click(relativeLink) + await waitFor(() => + expect(window.location.pathname).toBe('/param/foo/a/c'), + ) + }) + + test('should navigate to same route with different params', async () => { + const router = setupRouter() + + window.history.replaceState(null, 'root', '/param/foo/a/b') + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const parentLink = await screen.findByText('Link to . with param:bar') + + fireEvent.click(parentLink) + + await waitFor(() => + expect(window.location.pathname).toBe('/param/bar/a/b'), + ) + }) + }) + + describe('search middleware', () => { + @Angular.Component({ + selector: 'search-middleware-error', + template: '
{{ errorState().error.stack }}
', + standalone: true, + }) + class SearchMiddlewareErrorComponent { + errorState = injectErrorState() + } + + @Angular.Component({ + selector: 'search-middleware-index', + imports: [Link], + template: ` +

Index

+
{{ search().root ?? '$undefined' }}
+ update search + Posts + `, + standalone: true, + }) + class SearchMiddlewareIndexComponent { + search = injectSearch({ strict: false }) + } + + @Angular.Component({ + selector: 'search-middleware-posts', + template: '

Posts

', + standalone: true, + }) + class SearchMiddlewarePostsComponent {} + + test('search middlewares work', async () => { + const rootRoute = createRootRoute({ + errorComponent: () => SearchMiddlewareErrorComponent, + validateSearch: (input) => { + return { + root: input.root as string | undefined, + foo: input.foo as string | undefined, + } + }, + search: { + middlewares: [ + ({ search, next }) => { + return next({ ...search, foo: 'foo' }) + }, + ({ search, next }) => { + expect(search.foo).toBe('foo') + const { root, ...result } = next({ ...search, foo: 'hello' }) + return { ...result, root: root ?? search.root } + }, + ], + }, + }) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => SearchMiddlewareIndexComponent, + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + validateSearch: (input: Record) => { + const page = Number(input.page) + return { + page, + } + }, + component: () => SearchMiddlewarePostsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + history: createMemoryHistory({ initialEntries: ['/?root=abc'] }), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + async function checkSearchValue(value: string) { + await waitFor(() => { + const searchValue = screen.getByTestId('search') + expect(searchValue.textContent).toBe(value) + }) + } + async function checkPostsLink(root: string) { + const postsLink = await screen.findByRole('link', { name: 'Posts' }) + expect(postsLink.getAttribute('href')).toBeTruthy() + const href = postsLink.getAttribute('href') + const search = getSearchParamsFromURI(href!) + expect(search.size).toBe(2) + expect(search.get('page')).toBe('123') + expect(search.get('root')).toBe(root) + } + await checkSearchValue('abc') + await checkPostsLink('abc') + + const updateSearchLink = await screen.findByTestId('update-search') + fireEvent.click(updateSearchLink) + await checkSearchValue('newValue') + await checkPostsLink('newValue') + expect(router.state.location.search).toEqual({ root: 'newValue' }) + }) + }) + + describe('relative links to current route', () => { + @Angular.Component({ + imports: [Link], + template: ` + Post + Search + Search2 + `, + standalone: true, + }) + class TrailingSlashIndexComponent {} + + @Angular.Component({ + template: '

Post Route

', + standalone: true, + }) + class TrailingSlashPostComponent {} + + test.each(Object.values(trailingSlashOptions))( + 'should navigate to current route when using "." in nested route structure from Index Route with trailingSlash: %s', + async (trailingSlash) => { + const tail = trailingSlash === 'always' ? '/' : '' + + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => TrailingSlashIndexComponent, + }) + + const postRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'post', + component: () => TrailingSlashPostComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postRoute]), + history, + trailingSlash, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const searchLink = await screen.findByTestId('search-link') + // When trailingSlash is 'always', root path becomes '//' which is normalized to '/' + const expectedHref = + trailingSlash === 'always' + ? '/?param1=value1' + : `/${tail}?param1=value1` + expect(searchLink.getAttribute('href')).toBe(expectedHref) + + fireEvent.click(searchLink) + + await waitFor(() => { + // When trailingSlash is 'always', root path becomes '//' which is normalized to '/' + const expectedPath = trailingSlash === 'always' ? '/' : `/${tail}` + expect(window.location.pathname).toBe(expectedPath) + expect(window.location.search).toBe('?param1=value1') + }) + + const search2Link = await screen.findByTestId('search2-link') + const expectedHref2 = + trailingSlash === 'always' + ? '/?param1=value2' + : `/${tail}?param1=value2` + expect(search2Link.getAttribute('href')).toBe(expectedHref2) + + fireEvent.click(search2Link) + + await waitFor(() => { + // When trailingSlash is 'always', root path becomes '//' which is normalized to '/' + const expectedPath = trailingSlash === 'always' ? '/' : `/${tail}` + expect(window.location.pathname).toBe(expectedPath) + expect(window.location.search).toBe('?param1=value2') + }) + }, + ) + }) +}) + +describe('search middleware with redirect parity', () => { + test('middleware-derived search is retained after redirect', async () => { + const rootRoute = createRootRoute({ + validateSearch: (input) => ({ value: String(input.value ?? 'none') }), + search: { + middlewares: [retainSearchParams(['value']) as any], + }, + }) + + @Angular.Component({ + imports: [Link], + template: 'Source', + standalone: true, + }) + class IndexComponent {} + + @Angular.Component({ + template: '

Target

', + standalone: true, + }) + class TargetComponent {} + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + const sourceRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/source', + beforeLoad: () => { + throw redirect({ to: '/target' }) + }, + component: () => IndexComponent, + }) + + const targetRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/target', + component: () => TargetComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, sourceRoute, targetRoute]), + history, + defaultPendingMinMs: 0, + }) + + window.history.replaceState(null, '', '/?value=from-root') + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const sourceLink = await screen.findByRole('link', { name: 'Source' }) + fireEvent.click(sourceLink) + + await expect(screen.findByTestId('target')).resolves.toBeTruthy() + expect(router.state.location.pathname).toBe('/target') + expect(router.state.location.search).toEqual({ value: 'none' }) + }) +}) + +describe('Link parity smoke (framework-agnostic)', () => { + test('navigates to /posts from root', async () => { + const rootRoute = createRootRoute() + + @Angular.Component({ + imports: [Link], + template: 'Posts', + standalone: true, + }) + class IndexComponent {} + + @Angular.Component({ + template: '

Posts

', + standalone: true, + }) + class PostsComponent {} + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + component: () => PostsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + history, + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const link = await screen.findByRole('link', { name: 'Posts' }) + expect(link.getAttribute('href')).toBe('/posts') + + fireEvent.click(link) + + await expect(screen.findByRole('heading', { name: 'Posts' })).resolves + .toBeTruthy() + expect(window.location.pathname).toBe('/posts') + }) + + test('resolves links correctly when router has basepath', async () => { + const rootRoute = createRootRoute() + + @Angular.Component({ + imports: [Link], + template: 'Posts', + standalone: true, + }) + class IndexComponent {} + + @Angular.Component({ + template: '

Posts

', + standalone: true, + }) + class PostsComponent {} + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + component: () => PostsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + history, + basepath: '/basepath', + defaultPendingMinMs: 0, + }) + + window.history.replaceState(null, 'root', '/basepath/') + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const link = await screen.findByRole('link', { name: 'Posts' }) + expect(link.getAttribute('href')).toBe('/basepath/posts') + + fireEvent.click(link) + + await expect(screen.findByRole('heading', { name: 'Posts' })).resolves + .toBeTruthy() + expect(window.location.pathname).toBe('/basepath/posts') + }) +}) diff --git a/packages/angular-router-experimental/tests/loaders.test.ts b/packages/angular-router-experimental/tests/loaders.test.ts new file mode 100644 index 00000000000..320c46d01a6 --- /dev/null +++ b/packages/angular-router-experimental/tests/loaders.test.ts @@ -0,0 +1,427 @@ +import * as Angular from '@angular/core' +import { fireEvent, render, screen } from '@testing-library/angular' +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' +import { z } from 'zod' +import { + Link, + Outlet, + RouterProvider, + createBrowserHistory, + createRootRoute, + createRoute, + createRouter, +} from '../src' +import { sleep } from './utils' +import type { RouterHistory } from '@tanstack/history' + +let history: RouterHistory + +beforeEach(() => { + history = createBrowserHistory() + expect(window.location.pathname).toBe('/') +}) + +afterEach(() => { + history.destroy() + vi.resetAllMocks() + window.history.replaceState(null, 'root', '/') +}) + +const WAIT_TIME = 100 + +@Angular.Component({ + template: '
Index page
', + standalone: true, +}) +class IndexPageComponent { } + +@Angular.Component({ + imports: [Link], + template: ` +
+

Index page

+ link to foo +
+ `, +}) +class IndexWithLinkComponent { } + +@Angular.Component({ + template: '
Nested Foo page
', + standalone: true, +}) +class NestedFooComponent { } + +@Angular.Component({ + imports: [Outlet], + template: '', +}) +class NestedLayoutComponent { } + +describe('loaders are being called', () => { + test('called on /', async () => { + const indexLoaderMock = vi.fn() + + const rootRoute = createRootRoute({}) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + loader: async () => { + await sleep(WAIT_TIME) + indexLoaderMock('foo') + }, + component: () => IndexPageComponent, + }) + const routeTree = rootRoute.addChildren([indexRoute]) + const router = createRouter({ + routeTree, + history, + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const indexElement = await screen.findByText('Index page') + expect(indexElement).toBeTruthy() + + expect(router.state.location.href).toBe('/') + expect(window.location.pathname).toBe('/') + + expect(indexLoaderMock).toHaveBeenCalled() + }) + + test('both are called on /nested/foo', async () => { + const nestedLoaderMock = vi.fn() + const nestedFooLoaderMock = vi.fn() + + const rootRoute = createRootRoute({}) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexWithLinkComponent, + }) + const nestedRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/nested', + loader: async () => { + await sleep(WAIT_TIME) + nestedLoaderMock('nested') + }, + }) + const fooRoute = createRoute({ + getParentRoute: () => nestedRoute, + path: '/foo', + loader: async () => { + await sleep(WAIT_TIME) + nestedFooLoaderMock('foo') + }, + component: () => NestedFooComponent, + }) + const routeTree = rootRoute.addChildren([ + nestedRoute.addChildren([fooRoute]), + indexRoute, + ]) + const router = createRouter({ + routeTree, + history, + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const linkToAbout = await screen.findByText('link to foo') + fireEvent.click(linkToAbout) + + const fooElement = await screen.findByText('Nested Foo page') + expect(fooElement).toBeTruthy() + + expect(router.state.location.href).toBe('/nested/foo') + expect(window.location.pathname).toBe('/nested/foo') + + expect(nestedLoaderMock).toHaveBeenCalled() + expect(nestedFooLoaderMock).toHaveBeenCalled() + }) +}) + +describe('loaders parentMatchPromise', () => { + test('parentMatchPromise is defined in a child route', async () => { + const nestedLoaderMock = vi.fn() + + const rootRoute = createRootRoute({}) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexWithLinkComponent, + }) + const nestedRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/nested', + loader: async () => { + await sleep(WAIT_TIME) + return 'nested' + }, + component: () => NestedLayoutComponent, + }) + const fooRoute = createRoute({ + getParentRoute: () => nestedRoute, + path: '/foo', + loader: async ({ parentMatchPromise }) => { + nestedLoaderMock(parentMatchPromise) + const parentMatch = await parentMatchPromise + expect(parentMatch.loaderData).toBe('nested') + }, + component: () => NestedFooComponent, + }) + const routeTree = rootRoute.addChildren([ + nestedRoute.addChildren([fooRoute]), + indexRoute, + ]) + const router = createRouter({ + routeTree, + history, + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const linkToFoo = await screen.findByRole('link', { name: 'link to foo' }) + + expect(linkToFoo).toBeTruthy() + + fireEvent.click(linkToFoo) + + const fooElement = await screen.findByText('Nested Foo page') + expect(fooElement).toBeTruthy() + + expect(nestedLoaderMock).toHaveBeenCalled() + expect(nestedLoaderMock.mock.calls[0]?.[0]).toBeInstanceOf(Promise) + }) +}) + +test('reproducer for #2031', async () => { + const rootRoute = createRootRoute() + + const searchSchema = z.object({ + data: z.string().array().default([]), + }) + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexPageComponent, + validateSearch: searchSchema, + }) + + const routeTree = rootRoute.addChildren([indexRoute]) + const router = createRouter({ routeTree, history, defaultPendingMinMs: 0 }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const indexElement = await screen.findByText('Index page') + expect(indexElement).toBeTruthy() +}) + +test('reproducer for #2053', async () => { + const rootRoute = createRootRoute() + + const fooRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/foo/$fooId', + component: () => { + @Angular.Component({ + template: '
fooId: {{ params().fooId }}
', + standalone: true, + }) + class FooComponent { + params = fooRoute.injectParams() + } + return FooComponent + }, + }) + + window.history.replaceState(null, 'root', '/foo/3ΚΑΠΠΑ') + + const routeTree = rootRoute.addChildren([fooRoute]) + + const router = createRouter({ + routeTree, + history, + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const fooElement = await screen.findByText('fooId: 3ΚΑΠΠΑ') + expect(fooElement).toBeTruthy() +}) + +test('reproducer for #2198 - throw error from beforeLoad upon initial load', async () => { + const rootRoute = createRootRoute({}) + + @Angular.Component({ + template: '
indexErrorComponent
', + standalone: true, + }) + class IndexErrorComponent { } + + @Angular.Component({ + template: '
defaultErrorComponent
', + standalone: true, + }) + class DefaultErrorComponent { } + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexPageComponent, + beforeLoad: () => { + throw new Error('Test!') + }, + errorComponent: () => IndexErrorComponent, + }) + + const routeTree = rootRoute.addChildren([indexRoute]) + const router = createRouter({ + routeTree, + history, + defaultErrorComponent: () => DefaultErrorComponent, + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const errorElement = await screen.findByText('indexErrorComponent') + expect(errorElement).toBeTruthy() +}) + +test('throw error from loader upon initial load', async () => { + const rootRoute = createRootRoute({}) + + @Angular.Component({ + template: '
indexErrorComponent
', + standalone: true, + }) + class IndexErrorComponent { } + + @Angular.Component({ + template: '
defaultErrorComponent
', + standalone: true, + }) + class DefaultErrorComponent { } + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexPageComponent, + loader: () => { + throw new Error('Test!') + }, + errorComponent: () => IndexErrorComponent, + }) + + const routeTree = rootRoute.addChildren([indexRoute]) + const router = createRouter({ + routeTree, + history, + defaultErrorComponent: () => DefaultErrorComponent, + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const errorElement = await screen.findByText('indexErrorComponent') + expect(errorElement).toBeTruthy() +}) + +test('throw error from beforeLoad when navigating to route', async () => { + const rootRoute = createRootRoute({}) + + @Angular.Component({ + imports: [Link], + template: ` +
+

Index page

+ link to foo +
+ `, + }) + class IndexWithLinkComponent2 { } + + @Angular.Component({ + template: '
Foo page
', + standalone: true, + }) + class FooPageComponent { } + + @Angular.Component({ + template: '
indexErrorComponent
', + standalone: true, + }) + class IndexErrorComponent2 { } + + @Angular.Component({ + template: '
fooErrorComponent
', + standalone: true, + }) + class FooErrorComponent { } + + @Angular.Component({ + template: '
defaultErrorComponent
', + standalone: true, + }) + class DefaultErrorComponent2 { } + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexWithLinkComponent2, + errorComponent: () => IndexErrorComponent2, + }) + + const fooRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/foo', + component: () => FooPageComponent, + beforeLoad: () => { + throw new Error('Test!') + }, + errorComponent: () => FooErrorComponent, + }) + + const routeTree = rootRoute.addChildren([indexRoute, fooRoute]) + const router = createRouter({ + routeTree, + history, + defaultErrorComponent: () => DefaultErrorComponent2, + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const linkToFoo = await screen.findByRole('link', { name: 'link to foo' }) + + expect(linkToFoo).toBeTruthy() + + fireEvent.click(linkToFoo) + + const indexElement = await screen.findByText('fooErrorComponent') + expect(indexElement).toBeTruthy() +}) + +// TODO: missing tests diff --git a/packages/angular-router-experimental/tests/navigate.test.ts b/packages/angular-router-experimental/tests/navigate.test.ts new file mode 100644 index 00000000000..c7ea0687c65 --- /dev/null +++ b/packages/angular-router-experimental/tests/navigate.test.ts @@ -0,0 +1,231 @@ +import { afterEach, describe, expect, it } from 'vitest' +import { + createMemoryHistory, + createRootRoute, + createRoute, + createRouter, +} from '../src' + +afterEach(() => { + window.history.replaceState(null, 'root', '/') +}) + +function createTestRouter(initialEntries: Array) { + const history = createMemoryHistory({ initialEntries }) + + const rootRoute = createRootRoute({}) + const indexRoute = createRoute({ getParentRoute: () => rootRoute, path: '/' }) + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + }) + const postIdRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '/$slug', + }) + + const projectRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/p/$projectId/$version/$framework', + }) + + const uRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/u', + }) + const uLayoutRoute = createRoute({ + getParentRoute: () => uRoute, + id: '_layout', + }) + const uUsernameRoute = createRoute({ + getParentRoute: () => uLayoutRoute, + path: '$username', + }) + + const gRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/g', + }) + const gLayoutRoute = createRoute({ + getParentRoute: () => gRoute, + id: 'layout', + }) + const gUsernameRoute = createRoute({ + getParentRoute: () => gLayoutRoute, + path: '$username', + }) + + const searchRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/search', + validateSearch: (search: Record) => ({ + 'foo=bar': Number(search['foo=bar'] ?? 1), + }), + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([ + indexRoute, + postsRoute.addChildren([postIdRoute]), + projectRoute, + uRoute.addChildren([uLayoutRoute.addChildren([uUsernameRoute])]), + gRoute.addChildren([gLayoutRoute.addChildren([gUsernameRoute])]), + searchRoute, + ]), + history, + }) + + return { router } +} + +describe('router.navigate path params', () => { + it('supports object syntax and inferred current route fallback', async () => { + const { router } = createTestRouter(['/posts/tanner']) + + await router.load() + + await router.navigate({ + to: '/posts/$slug', + params: { slug: 'tkdodo' }, + }) + await router.invalidate() + + expect(router.state.location.pathname).toBe('/posts/tkdodo') + + await router.navigate({ + params: { slug: 'ryan' }, + } as any) + await router.invalidate() + + expect(router.state.location.pathname).toBe('/posts/ryan') + }) + + it('supports function syntax across multiple params', async () => { + const { router } = createTestRouter(['/p/router/v1/react']) + + await router.load() + + await router.navigate({ + to: '/p/$projectId/$version/$framework', + params: (prev: any) => ({ + ...prev, + projectId: 'query', + framework: 'vue', + }), + }) + + await router.invalidate() + + expect(router.state.location.pathname).toBe('/p/query/v1/vue') + }) + + it('supports object syntax updates without `to` for multi-param routes', async () => { + const { router } = createTestRouter(['/p/router/v1/react']) + + await router.load() + + await router.navigate({ + params: { + projectId: 'query', + }, + } as any) + await router.invalidate() + expect(router.state.location.pathname).toBe('/p/query/v1/react') + + await router.navigate({ + params: { + version: 'v3', + framework: 'vue', + }, + } as any) + await router.invalidate() + expect(router.state.location.pathname).toBe('/p/query/v3/vue') + }) + + it('supports function syntax updates without `to` for single-param routes', async () => { + const { router } = createTestRouter(['/posts/tanner']) + + await router.load() + + await router.navigate({ + params: (prev: any) => ({ ...prev, slug: 'tkdodo' }), + } as any) + await router.invalidate() + + expect(router.state.location.pathname).toBe('/posts/tkdodo') + }) + + it('supports relative parent navigation', async () => { + const { router } = createTestRouter(['/posts/tanner']) + + await router.load() + + await router.navigate({ + to: '..', + from: '/posts/$slug', + params: true, + }) + + await router.invalidate() + + expect(router.state.location.pathname).toBe('/posts') + }) + + it('supports relative child navigation', async () => { + const { router } = createTestRouter(['/posts']) + + await router.load() + + await router.navigate({ + to: './$slug', + from: '/posts', + params: { slug: 'tkdodo' }, + }) + await router.invalidate() + + expect(router.state.location.pathname).toBe('/posts/tkdodo') + }) + + it('resolves pathless layout route params via layout route id target', async () => { + const { router } = createTestRouter(['/u/tanner']) + + await router.load() + + await router.navigate({ + to: '/u/_layout/$username', + params: { username: 'tkdodo' }, + }) + await router.invalidate() + + expect(router.state.location.pathname).toBe('/u/_layout/tkdodo') + }) + + it('resolves non-pathless layout route params via layout route id target', async () => { + const { router } = createTestRouter(['/g/tanner']) + + await router.load() + + await router.navigate({ + to: '/g/layout/$username', + params: { username: 'tkdodo' }, + }) + await router.invalidate() + + expect(router.state.location.pathname).toBe('/g/layout/tkdodo') + }) + + it('supports search params with special characters in keys', async () => { + const { router } = createTestRouter(['/']) + + await router.load() + + await router.navigate({ + to: '/search', + search: { 'foo=bar': 2 }, + }) + await router.invalidate() + + expect(router.state.location.pathname).toBe('/search') + expect(router.state.location.search).toEqual({ 'foo=bar': 2 }) + }) +}) diff --git a/packages/angular-router-experimental/tests/not-found.test.ts b/packages/angular-router-experimental/tests/not-found.test.ts new file mode 100644 index 00000000000..c1ac1ec514c --- /dev/null +++ b/packages/angular-router-experimental/tests/not-found.test.ts @@ -0,0 +1,150 @@ +import * as Angular from '@angular/core' +import { render, screen } from '@testing-library/angular' +import { afterEach, beforeEach, expect, test, vi } from 'vitest' +import { + Link, + Outlet, + RouterProvider, + createBrowserHistory, + createRootRoute, + createRoute, + createRouter, +} from '../src' +import type { RouterHistory } from '@tanstack/history' + +let history: RouterHistory + +beforeEach(() => { + history = createBrowserHistory() + expect(window.location.pathname).toBe('/') +}) + +afterEach(() => { + history.destroy() + window.history.replaceState(null, 'root', '/') + vi.resetAllMocks() +}) + +@Angular.Component({ + imports: [Link, Outlet], + template: ` +
+

Root Component

+ + +
+ `, +}) +class RootComponent { } + +@Angular.Component({ + template: + 'Root Not Found Component', + standalone: true, +}) +class RootNotFoundComponent { } + +@Angular.Component({ + template: '

Index Page

', + standalone: true, +}) +class IndexComponent { } + +@Angular.Component({ + imports: [Outlet], + template: ` +
+

Settings Page Layout

+ +
+ `, +}) +class SettingsLayoutComponent { } + +@Angular.Component({ + template: + 'Settings Not Found Component', + standalone: true, +}) +class SettingsNotFoundComponent { } + +@Angular.Component({ + template: '
Settings Page
', + standalone: true, +}) +class SettingsIndexComponent { } + +test.each([ + { + notFoundMode: 'fuzzy' as const, + expectedNotFoundComponent: 'settings-not-found', + }, + { + notFoundMode: 'root' as const, + expectedNotFoundComponent: 'root-not-found', + }, +])( + 'correct notFoundComponent is rendered for mode=%s', + async ({ notFoundMode, expectedNotFoundComponent }) => { + const rootRoute = createRootRoute({ + component: () => RootComponent, + notFoundComponent: () => RootNotFoundComponent, + }) + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + const settingsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/settings', + notFoundComponent: () => SettingsNotFoundComponent, + component: () => SettingsLayoutComponent, + }) + + const settingsIndexRoute = createRoute({ + getParentRoute: () => settingsRoute, + path: '/', + component: () => SettingsIndexComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([ + indexRoute, + settingsRoute.addChildren([settingsIndexRoute]), + ]), + history, + notFoundMode, + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + await router.load() + await screen.findByTestId('root-component') + + const settingsLink = screen.getByTestId('settings-link') + settingsLink.click() + + const settingsIndexComponent = await screen.findByTestId( + 'settings-index-component', + ) + expect(settingsIndexComponent).toBeTruthy() + + const nonExistingLink = screen.getByTestId('non-existing-link') + nonExistingLink.click() + + const notFoundComponent = await screen.findByTestId( + expectedNotFoundComponent, + undefined, + { timeout: 1000 }, + ) + expect(notFoundComponent).toBeTruthy() + }, +) diff --git a/packages/angular-router-experimental/tests/optional-path-params.test-d.ts b/packages/angular-router-experimental/tests/optional-path-params.test-d.ts new file mode 100644 index 00000000000..5f047c18e17 --- /dev/null +++ b/packages/angular-router-experimental/tests/optional-path-params.test-d.ts @@ -0,0 +1,32 @@ +import { expectTypeOf, test } from 'vitest' +import { + createRootRoute, + createRoute, + createRouter, + injectNavigate, + injectParams, +} from '../src' +import type * as Angular from '@angular/core' + +const rootRoute = createRootRoute() +const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts/{-$category}/{-$slug}', +}) + +const _router = createRouter({ + routeTree: rootRoute.addChildren([postsRoute]), +}) + +test('optional params route can be consumed via injectParams in non-strict mode', () => { + const params = injectParams({ + strict: false, + }) + + expectTypeOf(params).toMatchTypeOf>>() +}) + +test('injectNavigate is available for routers with optional param routes', () => { + const navigate = injectNavigate() + expectTypeOf(navigate).toBeFunction() +}) diff --git a/packages/angular-router-experimental/tests/optional-path-params.test.ts b/packages/angular-router-experimental/tests/optional-path-params.test.ts new file mode 100644 index 00000000000..96c8b5c05d8 --- /dev/null +++ b/packages/angular-router-experimental/tests/optional-path-params.test.ts @@ -0,0 +1,466 @@ +import * as Angular from '@angular/core' +import { fireEvent, render, screen, waitFor } from '@testing-library/angular' +import { afterEach, describe, expect, it, vi } from 'vitest' +import { + Link, + Outlet, + RouterProvider, + createRootRoute, + createRoute, + createRouter, + injectNavigate, + injectParams, +} from '../src' + +describe('Angular Router - Optional Path Parameters', () => { + afterEach(() => { + vi.clearAllMocks() + window.history.replaceState(null, 'root', '/') + }) + + describe('Route matching with optional parameters', () => { + @Angular.Component({ + template: ` +
+

Posts

+
{{ paramsJson() }}
+
+ `, + standalone: true, + }) + class OptionalParamsPostsComponent { + params = injectParams({ from: '/posts/{-$category}/{-$slug}' }) + paramsJson = Angular.computed(() => JSON.stringify(this.params())) + } + + it('should match route with no optional parameters', async () => { + const rootRoute = createRootRoute() + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts/{-$category}/{-$slug}', + component: () => OptionalParamsPostsComponent, + }) + window.history.replaceState({}, '', '/posts') + + const router = createRouter({ + routeTree: rootRoute.addChildren([postsRoute]), + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + await router.load() + + const paramsElement = await screen.findByTestId('params') + expect(JSON.parse(String(paramsElement.textContent))).toEqual({}) + }) + + it('should match route with one optional parameter', async () => { + const rootRoute = createRootRoute() + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts/{-$category}/{-$slug}', + component: () => OptionalParamsPostsComponent, + }) + window.history.replaceState({}, '', '/posts/tech') + + const router = createRouter({ + routeTree: rootRoute.addChildren([postsRoute]), + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + await router.load() + + const paramsElement = await screen.findByTestId('params') + expect(JSON.parse(String(paramsElement.textContent))).toEqual({ + category: 'tech', + }) + }) + + it('should match route with all optional parameters', async () => { + const rootRoute = createRootRoute() + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts/{-$category}/{-$slug}', + component: () => OptionalParamsPostsComponent, + }) + window.history.replaceState({}, '', '/posts/tech/hello-world') + + const router = createRouter({ + routeTree: rootRoute.addChildren([postsRoute]), + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + await router.load() + + const paramsElement = await screen.findByTestId('params') + expect(JSON.parse(String(paramsElement.textContent))).toEqual({ + category: 'tech', + slug: 'hello-world', + }) + }) + + @Angular.Component({ + template: ` +
+

User Profile

+
{{ paramsJson() }}
+
+ `, + standalone: true, + }) + class UserProfileComponent { + params = injectParams({ from: '/users/$id/{-$tab}' }) + paramsJson = Angular.computed(() => JSON.stringify(this.params())) + } + + it.each([ + { path: '/users/123', expectedParams: { id: '123' } }, + { + path: '/users/123/settings', + expectedParams: { id: '123', tab: 'settings' }, + }, + ])( + 'should handle mixed required and optional parameters: $path', + async ({ path, expectedParams }) => { + const rootRoute = createRootRoute() + + const usersRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/users/$id/{-$tab}', + component: () => UserProfileComponent, + }) + window.history.replaceState({}, '', path) + + const router = createRouter({ + routeTree: rootRoute.addChildren([usersRoute]), + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + await router.load() + + const paramsElement = await screen.findByTestId('params') + expect(JSON.parse(String(paramsElement.textContent))).toEqual(expectedParams) + }, + ) + }) + + describe('Link component with optional parameters', () => { + @Angular.Component({ + imports: [Link], + template: ` + All Posts + Tech Posts + Specific Post + Empty Params + `, + }) + class OptionalPathLinksIndexComponent {} + + @Angular.Component({ + template: '
Posts
', + standalone: true, + }) + class OptionalPathLinksPostsSimpleComponent {} + + it('should generate correct href for optional parameters', async () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => OptionalPathLinksIndexComponent, + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts/{-$category}/{-$slug}', + component: () => OptionalPathLinksPostsSimpleComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsLink = await screen.findByTestId('posts-link') + const techLink = await screen.findByTestId('tech-link') + const specificLink = await screen.findByTestId('specific-link') + const emptyParamsLink = await screen.findByTestId('empty-params-link') + + expect(postsLink.getAttribute('href')).toBe('/posts') + expect(techLink.getAttribute('href')).toBe('/posts/tech') + expect(specificLink.getAttribute('href')).toBe('/posts/tech/hello-world') + expect(emptyParamsLink.getAttribute('href')).toBe('/posts') + }) + + @Angular.Component({ + imports: [Link, Outlet], + template: ` +
+

Root Layout

+ Home + +
+ `, + }) + class OptionalPathLinksRootLayoutComponent {} + + @Angular.Component({ + imports: [Link], + template: ` +

Home

+ All Posts + Tech Posts + `, + }) + class OptionalPathLinksHomeComponent {} + + @Angular.Component({ + template: ` +
+

Posts

+
{{ paramsJson() }}
+
+ `, + standalone: true, + }) + class OptionalPathLinksPostsWithParamsComponent { + params = injectParams({ from: '/posts/{-$category}/{-$slug}' }) + paramsJson = Angular.computed(() => JSON.stringify(this.params())) + } + + it('should navigate correctly with optional parameters', async () => { + const rootRoute = createRootRoute({ + component: () => OptionalPathLinksRootLayoutComponent, + }) + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => OptionalPathLinksHomeComponent, + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts/{-$category}/{-$slug}', + component: () => OptionalPathLinksPostsWithParamsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + await router.load() + + { + await expect(screen.findByTestId('home-heading')).resolves.toBeTruthy() + const postsLink = await screen.findByTestId('posts-link') + fireEvent.click(postsLink) + + await expect(screen.findByText('Posts')).resolves.toBeTruthy() + const paramsElement = await screen.findByTestId('params') + expect(JSON.parse(String(paramsElement.textContent))).toEqual({}) + expect(router.state.location.pathname).toBe('/posts') + } + + { + const homeLink = await screen.findByTestId('home-link') + fireEvent.click(homeLink) + await expect(screen.findByTestId('home-heading')).resolves.toBeTruthy() + } + + { + const techLink = await screen.findByTestId('tech-link') + fireEvent.click(techLink) + + await expect(screen.findByText('Posts')).resolves.toBeTruthy() + const updatedParamsElement = await screen.findByTestId('params') + expect(JSON.parse(String(updatedParamsElement.textContent))).toEqual({ + category: 'tech', + }) + expect(router.state.location.pathname).toBe('/posts/tech') + } + }) + }) + + describe('injectNavigate with optional parameters', () => { + it('should navigate with optional parameters programmatically', async () => { + const rootRoute = createRootRoute() + + @Angular.Component({ + template: ` +
+
{{ paramsJson() }}
+ + + +
+ `, + standalone: true, + }) + class PostsComponent { + navigate = injectNavigate() + params = injectParams({ from: '/posts/{-$category}/{-$slug}' }) + paramsJson = Angular.computed(() => JSON.stringify(this.params())) + + navigateAll() { + this.navigate({ + to: '/posts/{-$category}/{-$slug}', + params: false, + }) + } + + navigateTech() { + this.navigate({ + to: '/posts/{-$category}/{-$slug}', + params: { category: 'tech', slug: undefined }, + }) + } + + navigateSpecific() { + this.navigate({ + to: '/posts/{-$category}/{-$slug}', + params: { category: 'tech', slug: 'hello-world' }, + }) + } + } + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts/{-$category}/{-$slug}', + component: () => PostsComponent, + }) + + window.history.replaceState({}, '', '/posts/tech/hello-world') + + const router = createRouter({ + routeTree: rootRoute.addChildren([postsRoute]), + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const navigateAll = await screen.findByTestId('navigate-all') + await fireEvent.click(navigateAll) + await waitFor(() => { + expect(router.state.location.pathname).toBe('/posts') + }) + + const navigateTech = await screen.findByTestId('navigate-tech') + await fireEvent.click(navigateTech) + await waitFor(() => { + expect(router.state.location.pathname).toBe('/posts/tech') + }) + + const navigateSpecific = await screen.findByTestId('navigate-specific') + await fireEvent.click(navigateSpecific) + await waitFor(() => { + expect(router.state.location.pathname).toBe('/posts/tech/hello-world') + }) + }) + }) +}) + +describe('Additional Optional Path Parameter Cases', () => { + afterEach(() => { + vi.clearAllMocks() + window.history.replaceState(null, 'root', '/') + }) + + it('supports optional params with prefix and suffix', async () => { + const rootRoute = createRootRoute() + + @Angular.Component({ + template: '
{{ paramsJson() }}
', + standalone: true, + }) + class PrefixedComponent { + params = injectParams({ from: '/docs/prefix{-$id}.md' }) + paramsJson = Angular.computed(() => JSON.stringify(this.params())) + } + + const docsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/docs/prefix{-$id}.md', + component: () => PrefixedComponent, + }) + + window.history.replaceState({}, '', '/docs/prefix123.md') + + const router = createRouter({ + routeTree: rootRoute.addChildren([docsRoute]), + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const paramsElement = await screen.findByTestId('params') + expect(JSON.parse(String(paramsElement.textContent))).toEqual({ id: '123' }) + }) + + it('passes optional params to beforeLoad and loader', async () => { + const rootRoute = createRootRoute() + + const beforeLoadSpy = vi.fn() + const loaderSpy = vi.fn() + + @Angular.Component({ + template: '

Loaded

', + standalone: true, + }) + class LoadedComponent {} + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts/{-$category}', + beforeLoad: ({ params }) => { + beforeLoadSpy(params) + }, + loader: ({ params }) => { + loaderSpy(params) + }, + component: () => LoadedComponent, + }) + + window.history.replaceState({}, '', '/posts/tech') + + const router = createRouter({ + routeTree: rootRoute.addChildren([postsRoute]), + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + await expect(screen.findByTestId('loaded')).resolves.toBeTruthy() + expect(beforeLoadSpy).toHaveBeenCalledWith({ category: 'tech' }) + expect(loaderSpy).toHaveBeenCalledWith({ category: 'tech' }) + }) +}) diff --git a/packages/angular-router-experimental/tests/redirect.test.ts b/packages/angular-router-experimental/tests/redirect.test.ts new file mode 100644 index 00000000000..d8076ea8164 --- /dev/null +++ b/packages/angular-router-experimental/tests/redirect.test.ts @@ -0,0 +1,409 @@ +import * as Angular from '@angular/core' +import { fireEvent, render, screen } from '@testing-library/angular' +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' +import invariant from 'tiny-invariant' +import { + Link, + RouterProvider, + createBrowserHistory, + createMemoryHistory, + createRootRoute, + createRoute, + createRouter, + injectRouter, + redirect, +} from '../src' +import { sleep } from './utils' +import type { RouterHistory } from '@tanstack/history' + +let history: RouterHistory + +beforeEach(() => { + history = createBrowserHistory() + expect(window.location.pathname).toBe('/') +}) + +afterEach(() => { + history.destroy() + vi.clearAllMocks() + vi.resetAllMocks() + window.history.replaceState(null, 'root', '/') +}) + +const WAIT_TIME = 100 + +@Angular.Component({ + imports: [Link], + template: ` +
+

Index page

+ link to about +
+ `, +}) +class IndexComponent {} + +@Angular.Component({ + imports: [Link], + template: ` +
+

Index page

+ link to about +
+ `, +}) +class IndexWithTestIdComponent {} + +@Angular.Component({ + template: '
Nested Foo page
', + standalone: true, +}) +class NestedFooComponent {} + +@Angular.Component({ + template: '
Final
', + standalone: true, +}) +class FinalComponent {} + + +describe('redirect', () => { + describe('SPA', () => { + test('when `redirect` is thrown in `beforeLoad`', async () => { + const nestedLoaderMock = vi.fn() + const nestedFooLoaderMock = vi.fn() + + const rootRoute = createRootRoute({}) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + const aboutRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/about', + beforeLoad: async () => { + await sleep(WAIT_TIME) + throw redirect({ to: '/nested/foo' }) + }, + }) + const nestedRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/nested', + loader: async () => { + await sleep(WAIT_TIME) + nestedLoaderMock('nested') + }, + }) + const fooRoute = createRoute({ + getParentRoute: () => nestedRoute, + path: '/foo', + loader: async () => { + await sleep(WAIT_TIME) + nestedFooLoaderMock('foo') + }, + component: () => NestedFooComponent, + }) + const routeTree = rootRoute.addChildren([ + nestedRoute.addChildren([fooRoute]), + aboutRoute, + indexRoute, + ]) + const router = createRouter({ + routeTree, + history, + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const linkToAbout = await screen.findByText('link to about') + + expect(linkToAbout).toBeTruthy() + + fireEvent.click(linkToAbout) + + const fooElement = await screen.findByText('Nested Foo page') + + expect(fooElement).toBeTruthy() + + expect(router.state.location.href).toBe('/nested/foo') + expect(window.location.pathname).toBe('/nested/foo') + + expect(nestedLoaderMock).toHaveBeenCalled() + expect(nestedFooLoaderMock).toHaveBeenCalled() + }) + + test('when `redirect` is thrown in `loader`', async () => { + const nestedLoaderMock = vi.fn() + const nestedFooLoaderMock = vi.fn() + + const rootRoute = createRootRoute({}) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + const aboutRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/about', + loader: async () => { + await sleep(WAIT_TIME) + throw redirect({ + to: '/nested/foo', + hash: 'some-hash', + search: { someSearch: 'hello123' }, + }) + }, + }) + const nestedRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/nested', + loader: async () => { + await sleep(WAIT_TIME) + nestedLoaderMock('nested') + }, + }) + const fooRoute = createRoute({ + validateSearch: (search) => { + return { + someSearch: search.someSearch as string, + } + }, + getParentRoute: () => nestedRoute, + path: '/foo', + loader: async () => { + await sleep(WAIT_TIME) + nestedFooLoaderMock('foo') + }, + component: () => NestedFooComponent, + }) + const routeTree = rootRoute.addChildren([ + nestedRoute.addChildren([fooRoute]), + aboutRoute, + indexRoute, + ]) + const router = createRouter({ + routeTree, + history, + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const linkToAbout = await screen.findByText('link to about') + + expect(linkToAbout).toBeTruthy() + + fireEvent.click(linkToAbout) + + const fooElement = await screen.findByText('Nested Foo page') + + expect(fooElement).toBeTruthy() + + expect(router.state.location.href).toBe( + '/nested/foo?someSearch=hello123#some-hash', + ) + expect(window.location.pathname).toBe('/nested/foo') + + expect(nestedLoaderMock).toHaveBeenCalled() + expect(nestedFooLoaderMock).toHaveBeenCalled() + }) + + test('when `redirect` is thrown in `loader` after `router.invalidate()`', async () => { + let shouldRedirect = false + + const rootRoute = createRootRoute({}) + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexWithTestIdComponent, + }) + + @Angular.Component({ + template: '', + standalone: true, + }) + class AboutComponentWithInvalidate { + router = injectRouter() + + invalidate() { + shouldRedirect = true + this.router.invalidate() + } + } + + const aboutRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/about', + loader: async () => { + await sleep(WAIT_TIME) + if (shouldRedirect) { + throw redirect({ + to: '/final', + }) + } + }, + component: () => AboutComponentWithInvalidate, + }) + const finalRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/final', + component: () => FinalComponent, + }) + + const routeTree = rootRoute.addChildren([ + aboutRoute, + indexRoute, + finalRoute, + ]) + const router = createRouter({ + routeTree, + history, + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const linkToAbout = await screen.findByTestId('link-to-about') + expect(linkToAbout).toBeTruthy() + + fireEvent.click(linkToAbout) + + const invalidateButton = await screen.findByTestId('button-invalidate') + expect(invalidateButton).toBeTruthy() + + fireEvent.click(invalidateButton) + + expect(await screen.findByText('Final')).toBeTruthy() + expect(window.location.pathname).toBe('/final') + }) + }) + + describe('SSR', () => { + test('when `redirect` is thrown in `beforeLoad`', async () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + path: '/', + getParentRoute: () => rootRoute, + beforeLoad: () => { + throw redirect({ + to: '/about', + }) + }, + }) + + @Angular.Component({ + template: 'About', + standalone: true, + }) + class AboutComponent {} + + const aboutRoute = createRoute({ + path: '/about', + getParentRoute: () => rootRoute, + component: () => AboutComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, aboutRoute]), + // Mock server mode + isServer: true, + history: createMemoryHistory({ + initialEntries: ['/'], + }), + }) + + await router.load() + + expect(router.state.redirect).toBeDefined() + expect(router.state.redirect).toBeInstanceOf(Response) + invariant(router.state.redirect) + + expect(router.state.redirect.options).toEqual({ + _fromLocation: expect.objectContaining({ + hash: '', + href: '/', + pathname: '/', + search: {}, + searchStr: '', + }), + to: '/about', + href: '/about', + statusCode: 307, + }) + }) + + test('when `redirect` is thrown in `loader`', async () => { + const rootRoute = createRootRoute() + + const indexRoute = createRoute({ + path: '/', + getParentRoute: () => rootRoute, + loader: () => { + throw redirect({ + to: '/about', + }) + }, + }) + + @Angular.Component({ + template: 'About', + standalone: true, + }) + class AboutComponent {} + + const aboutRoute = createRoute({ + path: '/about', + getParentRoute: () => rootRoute, + component: () => AboutComponent, + }) + + const router = createRouter({ + history: createMemoryHistory({ + initialEntries: ['/'], + }), + routeTree: rootRoute.addChildren([indexRoute, aboutRoute]), + // Mock server mode + isServer: true, + }) + + await router.load() + + const currentRedirect = router.state.redirect + + expect(currentRedirect).toBeDefined() + expect(currentRedirect).toBeInstanceOf(Response) + invariant(currentRedirect) + expect(currentRedirect.status).toEqual(307) + expect(currentRedirect.headers.get('Location')).toEqual('/about') + expect(currentRedirect.options).toEqual({ + _fromLocation: { + hash: '', + href: '/', + publicHref: '/', + pathname: '/', + search: {}, + searchStr: '', + state: { + __TSR_index: 0, + __TSR_key: currentRedirect.options._fromLocation!.state.__TSR_key, + key: currentRedirect.options._fromLocation!.state.key, + }, + url: new URL('http://localhost/'), + }, + href: '/about', + to: '/about', + statusCode: 307, + }) + }) + }) +}) + diff --git a/packages/angular-router-experimental/tests/redirects.test-d.ts b/packages/angular-router-experimental/tests/redirects.test-d.ts new file mode 100644 index 00000000000..7a7d44449ee --- /dev/null +++ b/packages/angular-router-experimental/tests/redirects.test-d.ts @@ -0,0 +1,30 @@ +import { expectTypeOf, test } from 'vitest' +import { + createRootRoute, + createRoute, + createRouter, + redirect, +} from '../src' + +const rootRoute = createRootRoute() +const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', +}) +const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts/$postId', +}) + +const _router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), +}) + +test('redirect options stay aligned with router route ids/paths', () => { + const redir = redirect({ + to: '/posts/$postId', + params: { postId: '123' }, + }) + + expectTypeOf(redir).toBeObject() +}) diff --git a/packages/angular-router-experimental/tests/route.test-d.ts b/packages/angular-router-experimental/tests/route.test-d.ts new file mode 100644 index 00000000000..96cdfc18a88 --- /dev/null +++ b/packages/angular-router-experimental/tests/route.test-d.ts @@ -0,0 +1,28 @@ +import { expectTypeOf, test } from 'vitest' +import { + createRootRouteWithContext, + createRoute, +} from '../src' + +test('createRootRouteWithContext infers context into child beforeLoad/loader', () => { + const rootRoute = createRootRouteWithContext<{ session: string }>()({ + beforeLoad: ({ context }) => { + expectTypeOf(context.session).toEqualTypeOf() + return { rootValue: true as const } + }, + }) + + createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + beforeLoad: ({ context }) => { + expectTypeOf(context.session).toEqualTypeOf() + expectTypeOf(context.rootValue).toEqualTypeOf() + return { childValue: 123 as const } + }, + loader: ({ context }) => { + expectTypeOf(context.childValue).toEqualTypeOf<123>() + return { ok: true as const } + }, + }) +}) diff --git a/packages/angular-router-experimental/tests/route.test.ts b/packages/angular-router-experimental/tests/route.test.ts new file mode 100644 index 00000000000..845c575f231 --- /dev/null +++ b/packages/angular-router-experimental/tests/route.test.ts @@ -0,0 +1,58 @@ +import { describe, expect, it } from 'vitest' +import { createRootRoute, createRoute, getRouteApi } from '../src' + +describe('getRouteApi', () => { + it('should have the injectMatch method', () => { + const api = getRouteApi('foo') + expect(api.injectMatch).toBeDefined() + }) + + it('should have the injectRouteContext method', () => { + const api = getRouteApi('foo') + expect(api.injectRouteContext).toBeDefined() + }) + + it('should have the injectSearch method', () => { + const api = getRouteApi('foo') + expect(api.injectSearch).toBeDefined() + }) + + it('should have the injectParams method', () => { + const api = getRouteApi('foo') + expect(api.injectParams).toBeDefined() + }) + + it('should have the injectLoaderData method', () => { + const api = getRouteApi('foo') + expect(api.injectLoaderData).toBeDefined() + }) + + it('should have the injectLoaderDeps method', () => { + const api = getRouteApi('foo') + expect(api.injectLoaderDeps).toBeDefined() + }) + + it('should have the injectNavigate method', () => { + const api = getRouteApi('foo') + expect(api.injectNavigate).toBeDefined() + }) +}) + +describe('createRoute has the same methods as getRouteApi', () => { + const routeApi = getRouteApi('foo') + const methodNames = Object.keys(routeApi).filter((key) => + key.startsWith('inject'), + ) + const route = createRoute({ + id: 'foo', + getParentRoute: () => createRootRoute(), + }) + + it.each(methodNames.map((name) => [name]))( + 'should have the "%s" method defined', + (methodName) => { + expect(route[methodName as keyof typeof route]).toBeDefined() + }, + ) +}) + diff --git a/packages/angular-router-experimental/tests/routeApi.test-d.ts b/packages/angular-router-experimental/tests/routeApi.test-d.ts new file mode 100644 index 00000000000..3874324ad0d --- /dev/null +++ b/packages/angular-router-experimental/tests/routeApi.test-d.ts @@ -0,0 +1,34 @@ +import { expectTypeOf, test } from 'vitest' +import { createRootRoute, createRoute, getRouteApi } from '../src' + +const rootRoute = createRootRoute() +const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts/$postId', + validateSearch: () => ({ page: 0 }), +}) + +const routeTree = rootRoute.addChildren([postsRoute]) +void routeTree + +test('getRouteApi exposes angular inject methods', () => { + const api = getRouteApi('/posts/$postId') + + expectTypeOf(api.injectMatch).toBeFunction() + expectTypeOf(api.injectRouteContext).toBeFunction() + expectTypeOf(api.injectSearch).toBeFunction() + expectTypeOf(api.injectParams).toBeFunction() + expectTypeOf(api.injectLoaderData).toBeFunction() + expectTypeOf(api.injectLoaderDeps).toBeFunction() + expectTypeOf(api.injectNavigate).toBeFunction() +}) + +test('route instances expose same inject methods as getRouteApi', () => { + expectTypeOf(postsRoute.injectMatch).toBeFunction() + expectTypeOf(postsRoute.injectRouteContext).toBeFunction() + expectTypeOf(postsRoute.injectSearch).toBeFunction() + expectTypeOf(postsRoute.injectParams).toBeFunction() + expectTypeOf(postsRoute.injectLoaderData).toBeFunction() + expectTypeOf(postsRoute.injectLoaderDeps).toBeFunction() + expectTypeOf(postsRoute.injectNavigate).toBeFunction() +}) diff --git a/packages/angular-router-experimental/tests/routeContext.test.ts b/packages/angular-router-experimental/tests/routeContext.test.ts new file mode 100644 index 00000000000..432608b40f5 --- /dev/null +++ b/packages/angular-router-experimental/tests/routeContext.test.ts @@ -0,0 +1,168 @@ +import * as Angular from '@angular/core' +import { fireEvent, render, screen, waitFor } from '@testing-library/angular' +import { afterEach, describe, expect, test } from 'vitest' +import { + Link, + Outlet, + RouterProvider, + createRootRouteWithContext, + createRoute, + createRouter, + injectRouterContext, + redirect, +} from '../src' + +afterEach(() => { + window.history.replaceState(null, 'root', '/') +}) + +describe('route context runtime behavior', () => { + test('reads root router context from route components', async () => { + interface AppContext { + userId: string + } + + const rootRoute = createRootRouteWithContext()() + + @Angular.Component({ + template: '
{{ ctx().userId }}
', + standalone: true, + }) + class IndexComponent { + ctx = injectRouterContext({ from: '/' }) + } + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute]), + context: { userId: 'u-1' }, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + expect((await screen.findByTestId('ctx')).textContent).toContain('u-1') + }) + + test('merges beforeLoad route context into child route context', async () => { + interface AppContext { + userId: string + } + + const rootRoute = createRootRouteWithContext()() + + @Angular.Component({ + imports: [Outlet], + template: '', + standalone: true, + }) + class PostsLayout {} + + @Angular.Component({ + template: + '
{{ ctx().userId }}:{{ ctx().username }}
', + standalone: true, + }) + class PostComponent { + ctx = injectRouterContext({ from: '/posts/$postId' }) + } + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + component: () => PostsLayout, + }) + + const postRoute = createRoute({ + getParentRoute: () => postsRoute, + path: '/$postId', + beforeLoad: ({ params }) => ({ username: params.postId }), + component: () => PostComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([ + postsRoute.addChildren([postRoute]), + ]), + context: { userId: 'u-1' }, + }) + + window.history.replaceState(null, 'root', '/posts/tanner') + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + expect((await screen.findByTestId('ctx')).textContent).toContain( + 'u-1:tanner', + ) + }) + + test('preserves root context through redirect from beforeLoad', async () => { + interface AppContext { + userId: string + } + + const rootRoute = createRootRouteWithContext()() + + @Angular.Component({ + imports: [Link], + template: 'Source', + standalone: true, + }) + class IndexComponent {} + + @Angular.Component({ + template: '
{{ ctx().userId }}
', + standalone: true, + }) + class TargetComponent { + ctx = injectRouterContext({ from: '/target' }) + } + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + const sourceRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/source', + beforeLoad: () => { + throw redirect({ to: '/target' }) + }, + component: () => IndexComponent, + }) + + const targetRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/target', + component: () => TargetComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, sourceRoute, targetRoute]), + context: { userId: 'u-1' }, + defaultPendingMinMs: 0, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const link = await screen.findByRole('link', { name: 'Source' }) + fireEvent.click(link) + + await waitFor(() => { + expect(router.state.location.pathname).toBe('/target') + }) + expect((await screen.findByTestId('ctx')).textContent).toContain('u-1') + }) +}) diff --git a/packages/angular-router-experimental/tests/router.test-d.ts b/packages/angular-router-experimental/tests/router.test-d.ts new file mode 100644 index 00000000000..79e5a75e627 --- /dev/null +++ b/packages/angular-router-experimental/tests/router.test-d.ts @@ -0,0 +1,37 @@ +import { expectTypeOf, test } from 'vitest' +import { + createMemoryHistory, + createRootRouteWithContext, + createRoute, + createRouter, +} from '../src' + +const rootRoute = createRootRouteWithContext<{ auth: string }>()() +const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', +}) +const postRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts/$postId', + validateSearch: () => ({ page: 0 }), +}) + +const _router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postRoute]), + history: createMemoryHistory({ initialEntries: ['/'] }), + context: { auth: 'token' }, +}) + +test('router exposes typed navigate/buildLocation methods', () => { + expectTypeOf(_router.navigate).toBeFunction() + + const loc = _router.buildLocation({ + to: '/posts/$postId', + params: { postId: '1' }, + search: { page: 2 }, + }) + + expectTypeOf(loc.pathname).toEqualTypeOf() + expectTypeOf(loc.href).toEqualTypeOf() +}) diff --git a/packages/angular-router-experimental/tests/router.test.ts b/packages/angular-router-experimental/tests/router.test.ts new file mode 100644 index 00000000000..a37b280bd21 --- /dev/null +++ b/packages/angular-router-experimental/tests/router.test.ts @@ -0,0 +1,166 @@ +import * as Angular from '@angular/core' +import { render, waitFor } from '@testing-library/angular' +import { afterEach, describe, expect, it, vi } from 'vitest' +import { + RouterProvider, + createMemoryHistory, + createRootRoute, + createRoute, + createRouter, +} from '../src' + +afterEach(() => { + vi.clearAllMocks() + vi.resetAllMocks() + window.history.replaceState(null, 'root', '/') +}) + +function createTestRouter(initialEntries: Array = ['/']) { + const history = createMemoryHistory({ initialEntries }) + const rootRoute = createRootRoute() + const indexRoute = createRoute({ getParentRoute: () => rootRoute, path: '/' }) + const postRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts/$slug', + }) + const filesRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/files/$', + }) + const splatRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/$', + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([ + indexRoute, + postRoute, + filesRoute, + splatRoute, + ]), + history, + }) + + return { router } +} + +describe('router integration behavior', () => { + it('emits onBeforeRouteMount before onResolved', async () => { + const beforeMount = vi.fn() + const resolved = vi.fn() + + const { router } = createTestRouter(['/']) + + const unsubBefore = router.subscribe('onBeforeRouteMount', beforeMount) + const unsubResolved = router.subscribe('onResolved', resolved) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + await waitFor(() => { + expect(beforeMount).toHaveBeenCalled() + expect(resolved).toHaveBeenCalled() + }) + + const beforeOrder = beforeMount.mock.invocationCallOrder[0] + const resolvedOrder = resolved.mock.invocationCallOrder[0] + + if (beforeOrder === undefined || resolvedOrder === undefined) { + throw new Error('Expected event call order for onBeforeRouteMount/onResolved') + } + + expect(beforeOrder).toBeLessThan(resolvedOrder) + + unsubBefore() + unsubResolved() + }) + + it('commits same-location navigations deterministically', async () => { + const { router } = createTestRouter(['/']) + + await router.load() + + const commitSpy = vi.spyOn(router, 'commitLocation') + const sharedState = { same: true } as any + + await router.navigate({ to: '/', state: sharedState }) + await router.navigate({ to: '/', state: sharedState }) + + const commitCalls = commitSpy.mock.calls.filter( + ([opts]) => (opts as any)?.replace !== true, + ) + + expect(commitCalls.length).toBeGreaterThanOrEqual(1) + expect(commitCalls.length).toBeLessThanOrEqual(2) + }) + + it('decodes pathname but preserves href encoding for unicode params', async () => { + const input = '/%F0%9F%9A%80' + const { router } = createTestRouter([input]) + + await router.load() + + expect(router.state.location.pathname).toBe('/🚀') + expect(router.state.location.href).toBe(input) + }) + + it('decodes encoded unicode route params for matched routes', async () => { + const { router } = createTestRouter(['/posts/%F0%9F%9A%80']) + + await router.load() + + expect(router.state.location.pathname).toBe('/posts/🚀') + expect(router.state.matches.at(-1)?.params.slug).toBe('🚀') + }) + + it('encodes unicode route params in href when navigating', async () => { + const { router } = createTestRouter(['/']) + + await router.load() + + await router.navigate({ + to: '/posts/$slug', + params: { slug: '🚀' }, + }) + + expect(router.state.location.pathname).toBe('/posts/🚀') + expect(router.state.location.href).toBe('/posts/%F0%9F%9A%80') + }) + + it('preserves `/` characters for splat params when navigating', async () => { + const { router } = createTestRouter(['/']) + + await router.load() + + await router.navigate({ + to: '/files/$', + params: { _splat: 'framework/react/guide/file-based-routing' }, + }) + + expect(router.state.location.pathname).toBe( + '/files/framework/react/guide/file-based-routing', + ) + expect(router.state.matches.at(-1)?.params._splat).toBe( + 'framework/react/guide/file-based-routing', + ) + }) + + it('emits onResolved on initial load and subsequent navigation', async () => { + const resolved = vi.fn() + const { router } = createTestRouter(['/']) + const unsub = router.subscribe('onResolved', resolved) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + await router.navigate({ to: '/posts/$slug', params: { slug: 'tanner' } }) + await waitFor(() => { + expect(resolved).toHaveBeenCalled() + }) + + expect(resolved.mock.calls.length).toBeGreaterThanOrEqual(1) + unsub() + }) +}) diff --git a/packages/angular-router-experimental/tests/searchMiddleware.test.ts b/packages/angular-router-experimental/tests/searchMiddleware.test.ts new file mode 100644 index 00000000000..e3b57b73055 --- /dev/null +++ b/packages/angular-router-experimental/tests/searchMiddleware.test.ts @@ -0,0 +1,167 @@ +import * as Angular from '@angular/core' +import { fireEvent, render, screen } from '@testing-library/angular' +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' +import { stripSearchParams } from '@tanstack/router-core' +import { + Link, + RouterProvider, + createBrowserHistory, + createRootRoute, + createRoute, + createRouter, + retainSearchParams, +} from '../src' +import { getSearchParamsFromURI } from './utils' +import type { RouterHistory } from '../src' + +let history: RouterHistory + +beforeEach(() => { + history = createBrowserHistory() + expect(window.location.pathname).toBe('/') +}) + +afterEach(() => { + history.destroy() + window.history.replaceState(null, 'root', '/') + vi.clearAllMocks() + vi.resetAllMocks() +}) + +function setupTest(opts: { + initial: { route: string; search?: { value?: string } } + middlewares: Array + linkSearch?: { value?: string } +}) { + const rootRoute = createRootRoute({ + validateSearch: (input) => { + if (input.value !== undefined) { + return { value: input.value as string } + } + return {} + }, + search: { + middlewares: opts.middlewares, + }, + }) + + @Angular.Component({ + imports: [Link], + template: ` +

Index

+ Posts + `, + standalone: true, + }) + class IndexComponent { + linkSearch = opts.linkSearch + } + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + @Angular.Component({ + template: ` +

Posts

+
{{ searchText() }}
+ `, + standalone: true, + }) + class PostsComponent { + search = postsRoute.injectSearch() + searchText = Angular.computed(() => this.search().value ?? '$undefined') + } + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: 'posts', + component: () => PostsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute]), + history, + }) + + window.history.replaceState( + null, + '', + `${opts.initial.route}?${new URLSearchParams(opts.initial.search).toString()}`, + ) + + return router +} + +async function runTest( + router: any, + expectedSearch: { root: { value?: string }; posts: { value?: string } }, +) { + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const postsLink = await screen.findByTestId('posts-link') + const href = postsLink.getAttribute('href') + const linkSearchOnRoot = getSearchParamsFromURI(href!) + + fireEvent.click(postsLink) + + await expect(screen.findByTestId('posts-heading')).resolves.toBeTruthy() + const searchNode = await screen.findByTestId('search') + expect(searchNode.textContent).toContain( + expectedSearch.posts.value ?? '$undefined', + ) + expect(router.state.location.search).toEqual(expectedSearch.posts) + return linkSearchOnRoot +} + +describe('retainSearchParams', () => { + test('retains value on link generation and navigation', async () => { + const router = setupTest({ + initial: { route: '/', search: { value: 'abc' } }, + middlewares: [retainSearchParams(['value'])], + }) + + const linkSearch = await runTest(router, { + root: { value: 'abc' }, + posts: { value: 'abc' }, + }) + + expect(linkSearch.get('value')).toBe('abc') + }) +}) + +describe('stripSearchParams', () => { + test('strips by key', async () => { + const router = setupTest({ + initial: { route: '/', search: { value: 'abc' } }, + middlewares: [stripSearchParams(['value'])], + linkSearch: { value: 'xyz' }, + }) + + const linkSearch = await runTest(router, { + root: {}, + posts: {}, + }) + + expect(linkSearch.size).toBe(0) + }) + + test('strips by object default but preserves differing explicit value', async () => { + const router = setupTest({ + initial: { route: '/', search: { value: 'abc' } }, + middlewares: [stripSearchParams({ value: 'abc' })], + linkSearch: { value: 'xyz' }, + }) + + const linkSearch = await runTest(router, { + root: {}, + posts: { value: 'xyz' }, + }) + + expect(linkSearch.get('value')).toBe('xyz') + }) +}) diff --git a/packages/angular-router-experimental/tests/setupTests.ts b/packages/angular-router-experimental/tests/setupTests.ts new file mode 100644 index 00000000000..78e619287c5 --- /dev/null +++ b/packages/angular-router-experimental/tests/setupTests.ts @@ -0,0 +1,14 @@ +import '@angular/compiler' +import '@testing-library/jest-dom/vitest' +import { TestBed } from '@angular/core/testing' +import { afterEach, vi } from 'vitest' +import { setupTestBed } from '@analogjs/vitest-angular/setup-testbed' + +setupTestBed() + +afterEach(() => { + TestBed.resetTestingModule() +}) + +// Mock window.scrollTo to silence errors in tests +window.scrollTo = vi.fn() diff --git a/packages/angular-router-experimental/tests/store-updates-during-navigation.test.ts b/packages/angular-router-experimental/tests/store-updates-during-navigation.test.ts new file mode 100644 index 00000000000..bd11c1945ba --- /dev/null +++ b/packages/angular-router-experimental/tests/store-updates-during-navigation.test.ts @@ -0,0 +1,239 @@ +import * as Angular from '@angular/core' +import { fireEvent, render, screen, waitFor } from '@testing-library/angular' +import { afterEach, describe, expect, test, vi } from 'vitest' +import { + Link, + Outlet, + RouterProvider, + createRootRoute, + createRoute, + createRouter, + injectRouterState, + notFound, + redirect, +} from '../src' +import { sleep } from './utils' + +afterEach(() => { + window.history.replaceState(null, 'root', '/') +}) + +function setup(opts?: { + beforeLoad?: () => any + loader?: () => any + staleTime?: number +}) { + const selectSpy = vi.fn() + + @Angular.Component({ + imports: [Link, Outlet], + template: ` + Back + Posts + + `, + standalone: true, + }) + class RootComponent { + state = injectRouterState({ + select: (s) => { + selectSpy(s.status) + return s.status + }, + }) + } + + const rootRoute = createRootRoute({ + component: () => RootComponent, + }) + + @Angular.Component({ + selector: 'store-updates-index', + template: '

Index

', + standalone: true, + }) + class IndexComponent {} + + @Angular.Component({ + selector: 'store-updates-posts', + template: '

Posts Title

', + standalone: true, + }) + class PostsComponent {} + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => IndexComponent, + }) + + const postsRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/posts', + beforeLoad: opts?.beforeLoad, + loader: opts?.loader, + component: () => PostsComponent, + }) + + const otherRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/other', + component: () => PostsComponent, + }) + + const router = createRouter({ + routeTree: rootRoute.addChildren([indexRoute, postsRoute, otherRoute]), + defaultPreload: 'intent', + defaultStaleTime: opts?.staleTime, + defaultGcTime: opts?.staleTime, + }) + + return { router, selectSpy } +} + +async function navigateToPosts() { + const link = await screen.findByRole('link', { name: 'Posts' }) + fireEvent.click(link) + await expect(screen.findByRole('heading', { name: 'Posts Title' })).resolves + .toBeTruthy() +} + +describe('store update sanity during navigation', () => { + test('updates stay within a bounded range for async beforeLoad + loader', async () => { + const { router, selectSpy } = setup({ + beforeLoad: async () => { + await sleep(30) + return { ok: true } + }, + loader: async () => { + await sleep(30) + return { ok: true } + }, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const before = selectSpy.mock.calls.length + await navigateToPosts() + const after = selectSpy.mock.calls.length + + const updates = after - before + expect(updates).toBeGreaterThanOrEqual(4) + expect(updates).toBeLessThanOrEqual(40) + }) + + test('preload redirect has bounded update count', async () => { + const { router, selectSpy } = setup({ + loader: () => { + throw redirect({ to: '/other' }) + }, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const before = selectSpy.mock.calls.length + await router.preloadRoute({ to: '/posts' }) + const after = selectSpy.mock.calls.length + + expect(after - before).toBeLessThan(20) + }) + + test('preloading an already preloaded route causes minimal churn', async () => { + const { router, selectSpy } = setup({ + loader: async () => { + await sleep(20) + return { ok: true } + }, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + await router.preloadRoute({ to: '/posts' }) + await waitFor(() => expect(selectSpy).toHaveBeenCalled()) + + const before = selectSpy.mock.calls.length + await router.preloadRoute({ to: '/posts' }) + const after = selectSpy.mock.calls.length + + expect(after - before).toBeLessThanOrEqual(4) + }) + + test('sync beforeLoad keeps updates bounded', async () => { + const { router, selectSpy } = setup({ + beforeLoad: () => ({ ok: true }), + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const before = selectSpy.mock.calls.length + await navigateToPosts() + const after = selectSpy.mock.calls.length + + expect(after - before).toBeGreaterThanOrEqual(2) + expect(after - before).toBeLessThanOrEqual(50) + }) + + test('navigating without async work has low update churn', async () => { + const { router, selectSpy } = setup({ + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const before = selectSpy.mock.calls.length + await navigateToPosts() + const after = selectSpy.mock.calls.length + + expect(after - before).toBeGreaterThanOrEqual(2) + expect(after - before).toBeLessThanOrEqual(50) + }) + + test('notFound in beforeLoad has bounded updates', async () => { + const { router, selectSpy } = setup({ + beforeLoad: () => { + throw notFound() + }, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const before = selectSpy.mock.calls.length + await router.navigate({ to: '/posts' }).catch(() => undefined) + const after = selectSpy.mock.calls.length + + expect(after - before).toBeGreaterThanOrEqual(0) + expect(after - before).toBeLessThanOrEqual(30) + }) + + test('hover preload then navigate with async loader stays bounded', async () => { + const { router, selectSpy } = setup({ + loader: async () => { + await sleep(30) + return { ok: true } + }, + }) + + await render(RouterProvider, { + bindings: [Angular.inputBinding('router', () => router)], + }) + + const before = selectSpy.mock.calls.length + await router.preloadRoute({ to: '/posts' }) + await navigateToPosts() + const after = selectSpy.mock.calls.length + + expect(after - before).toBeGreaterThanOrEqual(3) + expect(after - before).toBeLessThanOrEqual(60) + }) +}) diff --git a/packages/angular-router-experimental/tests/utils.ts b/packages/angular-router-experimental/tests/utils.ts new file mode 100644 index 00000000000..cdc7ff82bd0 --- /dev/null +++ b/packages/angular-router-experimental/tests/utils.ts @@ -0,0 +1,56 @@ +import type { Mock } from 'vitest' + +export function sleep(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)) +} + +export function createTimer() { + let time = Date.now() + + return { + start: () => { + time = Date.now() + }, + getTime: () => { + return Date.now() - time + }, + } +} + +export const getIntersectionObserverMock = ({ + observe, + disconnect, +}: { + observe: Mock + disconnect: Mock +}) => { + return class IO implements IntersectionObserver { + root: Document | Element | null + rootMargin: string + thresholds: Array + constructor( + _cb: IntersectionObserverCallback, + options?: IntersectionObserverInit, + ) { + this.root = options?.root ?? null + this.rootMargin = options?.rootMargin ?? '0px' + this.thresholds = options?.threshold ?? ([0] as any) + } + + takeRecords(): Array { + return [] + } + unobserve(): void {} + observe(): void { + observe() + } + disconnect(): void { + disconnect() + } + } +} + +export function getSearchParamsFromURI(uri: string) { + const [, paramString] = uri.split('?') + return new URLSearchParams(paramString) +} diff --git a/packages/angular-router-experimental/tsconfig.json b/packages/angular-router-experimental/tsconfig.json new file mode 100644 index 00000000000..cda8b4b80a3 --- /dev/null +++ b/packages/angular-router-experimental/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "target": "ES2022", + "useDefineForClassFields": false + }, + "include": ["src", "experimental", "tests", "vitest.config.ts", "eslint.config.js"] +} diff --git a/packages/angular-router-experimental/tsconfig.legacy.json b/packages/angular-router-experimental/tsconfig.legacy.json new file mode 100644 index 00000000000..02ad7c3c4bb --- /dev/null +++ b/packages/angular-router-experimental/tsconfig.legacy.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "include": ["src", "src/experimental", "tests"] +} + + diff --git a/packages/angular-router-experimental/tsconfig.lib.json b/packages/angular-router-experimental/tsconfig.lib.json new file mode 100644 index 00000000000..553320c246b --- /dev/null +++ b/packages/angular-router-experimental/tsconfig.lib.json @@ -0,0 +1,23 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./dist/out-tsc", + "declaration": true, + "declarationMap": true, + "noEmit": false, + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "bundler", + "strict": true, + "useDefineForClassFields": false + }, + "angularCompilerOptions": { + "compilationMode": "partial", + "strictInjectionParameters": true, + "strictInputAccessModifiers": false, + "strictTemplates": true, + "skipMetadataEmit": false + }, + "include": ["src/**/*.ts"], + "exclude": ["**/*.spec.ts", "tests/**/*", "**/*.test.ts"] +} diff --git a/packages/angular-router-experimental/tsconfig.spec.json b/packages/angular-router-experimental/tsconfig.spec.json new file mode 100644 index 00000000000..8a5c6740d86 --- /dev/null +++ b/packages/angular-router-experimental/tsconfig.spec.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "target": "ES2022", + "noEmit": false, + "types": ["node", "vitest/globals"], + "isolatedModules": true + }, + "files": ["tests/setupTests.ts"], + "include": ["tests/**/*.test.ts", "tests/**/*.spec.ts", "**/*.d.ts"] +} + diff --git a/packages/angular-router-experimental/vitest.config.ts b/packages/angular-router-experimental/vitest.config.ts new file mode 100644 index 00000000000..aa35d3a334f --- /dev/null +++ b/packages/angular-router-experimental/vitest.config.ts @@ -0,0 +1,14 @@ +import angular from '@analogjs/vite-plugin-angular' +import { defineConfig } from 'vite' +import packageJson from './package.json' + +export default defineConfig({ + plugins: [angular()], + test: { + name: packageJson.name, + dir: './tests', + watch: false, + environment: 'jsdom', + setupFiles: ['tests/setupTests.ts'], + }, +}) diff --git a/packages/router-core/src/searchMiddleware.ts b/packages/router-core/src/searchMiddleware.ts index e90d453350f..7f6086d05c2 100644 --- a/packages/router-core/src/searchMiddleware.ts +++ b/packages/router-core/src/searchMiddleware.ts @@ -22,12 +22,13 @@ export function retainSearchParams( return { ...search, ...result } } // add missing keys from search to result + const newResult = { ...result } keys.forEach((key) => { - if (!(key in result)) { - result[key] = search[key] + if (!(key in newResult)) { + newResult[key] = search[key] } }) - return result + return newResult } } @@ -56,19 +57,20 @@ export function stripSearchParams< return {} } const result = next(search) as Record + const newResult = { ...result } if (Array.isArray(input)) { input.forEach((key) => { - delete result[key] + delete newResult[key] }) } else { Object.entries(input as Record).forEach( ([key, value]) => { if (deepEqual(result[key], value)) { - delete result[key] + delete newResult[key] } }, ) } - return result as any + return newResult as any } } diff --git a/packages/router-generator/src/config.ts b/packages/router-generator/src/config.ts index 0d1ae473391..13746aed5d6 100644 --- a/packages/router-generator/src/config.ts +++ b/packages/router-generator/src/config.ts @@ -5,7 +5,7 @@ import { virtualRootRouteSchema } from './filesystem/virtual/config' import type { GeneratorPlugin } from './plugin/types' export const baseConfigSchema = z.object({ - target: z.enum(['react', 'solid', 'vue']).optional().default('react'), + target: z.enum(['react', 'solid', 'vue', 'angular']).optional().default('react'), virtualRouteConfig: virtualRootRouteSchema.or(z.string()).optional(), routeFilePrefix: z.string().optional(), routeFileIgnorePrefix: z.string().optional().default('-'), diff --git a/packages/router-generator/src/generator.ts b/packages/router-generator/src/generator.ts index 01f485581f8..805bb0ad759 100644 --- a/packages/router-generator/src/generator.ts +++ b/packages/router-generator/src/generator.ts @@ -343,7 +343,13 @@ export class Generator { if (rootRouteNode === undefined) { let errorMessage = `rootRouteNode must not be undefined. Make sure you've added your root route into the route-tree.` if (!this.config.virtualRouteConfig) { - errorMessage += `\nMake sure that you add a "${rootPathId}.${this.config.disableTypes ? 'js' : 'tsx'}" file to your routes directory.\nAdd the file in: "${this.config.routesDirectory}/${rootPathId}.${this.config.disableTypes ? 'js' : 'tsx'}"` + const ext = + this.config.target === 'angular' + ? 'ts' + : this.config.disableTypes + ? 'js' + : 'tsx' + errorMessage += `\nMake sure that you add a "${rootPathId}.${ext}" file to your routes directory.\nAdd the file in: "${this.config.routesDirectory}/${rootPathId}.${ext}"` } throw new Error(errorMessage) } diff --git a/packages/router-generator/src/template.ts b/packages/router-generator/src/template.ts index 69031f689cb..98141164b38 100644 --- a/packages/router-generator/src/template.ts +++ b/packages/router-generator/src/template.ts @@ -171,6 +171,69 @@ export function getTargetTemplate(config: Config): TargetTemplate { }, }, } + case 'angular': + return { + fullPkg: '@tanstack/angular-router-experimental', + subPkg: 'angular-router-experimental', + rootRoute: { + template: () => + [ + "import { Component } from '@angular/core'\n", + '%%tsrImports%%', + '\n\n', + '%%tsrExportStart%%{\n component: () => RootComponent\n }%%tsrExportEnd%%\n\n', + "@Component({\n selector: 'root-route',\n standalone: true,\n template: `
Hello \"%%tsrPath%%\"!
`,\n imports: [Outlet],\n})\nclass RootComponent {}\n", + ].join(''), + imports: { + tsrImports: () => + "import { Outlet, createRootRoute } from '@tanstack/angular-router-experimental';", + tsrExportStart: () => 'export const Route = createRootRoute(', + tsrExportEnd: () => ');', + }, + }, + route: { + template: () => + [ + "import { Component } from '@angular/core'\n", + '%%tsrImports%%', + '\n\n', + '%%tsrExportStart%%{\n component: () => RouteComponent\n }%%tsrExportEnd%%\n\n', + "@Component({\n selector: 'route-component',\n standalone: true,\n template: `
Hello \"%%tsrPath%%\"!
`,\n})\nclass RouteComponent {}\n", + ].join(''), + imports: { + tsrImports: () => + config.verboseFileRoutes === false + ? '' + : "import { createFileRoute } from '@tanstack/angular-router-experimental';", + tsrExportStart: (routePath) => + config.verboseFileRoutes === false + ? 'export const Route = createFileRoute(' + : `export const Route = createFileRoute('${routePath}')(`, + tsrExportEnd: () => ');', + }, + }, + lazyRoute: { + template: () => + [ + "import { Component } from '@angular/core'\n", + '%%tsrImports%%', + '\n\n', + '%%tsrExportStart%%{\n component: () => RouteComponent\n }%%tsrExportEnd%%\n\n', + "@Component({\n selector: 'route-component',\n standalone: true,\n template: `
Hello \"%%tsrPath%%\"!
`,\n})\nclass RouteComponent {}\n", + ].join(''), + imports: { + tsrImports: () => + config.verboseFileRoutes === false + ? '' + : "import { createLazyFileRoute } from '@tanstack/angular-router-experimental';", + tsrExportStart: (routePath) => + config.verboseFileRoutes === false + ? 'export const Route = createLazyFileRoute(' + : `export const Route = createLazyFileRoute('${routePath}')(`, + tsrExportEnd: () => ');', + }, + }, + } case 'vue': return { fullPkg: '@tanstack/vue-router', diff --git a/packages/router-generator/src/transform/transform.ts b/packages/router-generator/src/transform/transform.ts index 7b3fddb9f21..da482383764 100644 --- a/packages/router-generator/src/transform/transform.ts +++ b/packages/router-generator/src/transform/transform.ts @@ -171,7 +171,10 @@ export async function transform({ banned: [], } - const targetModule = `@tanstack/${ctx.target}-router` + const targetModule = + ctx.target === 'angular' + ? '@tanstack/angular-router-experimental' + : `@tanstack/${ctx.target}-router` if (ctx.verboseFileRoutes === false) { imports.banned = [ { diff --git a/packages/router-plugin/src/core/route-autoimport-plugin.ts b/packages/router-plugin/src/core/route-autoimport-plugin.ts index 75b2b5f562a..21925b072f9 100644 --- a/packages/router-plugin/src/core/route-autoimport-plugin.ts +++ b/packages/router-plugin/src/core/route-autoimport-plugin.ts @@ -45,7 +45,10 @@ export const unpluginRouteAutoImportFactory: UnpluginFactory< return null } - const routerImportPath = `@tanstack/${userConfig.target}-router` + const routerImportPath = + userConfig.target === 'angular' + ? '@tanstack/angular-router-experimental' + : `@tanstack/${userConfig.target}-router` const ast = parseAst({ code }) diff --git a/packages/router-utils/src/ast.ts b/packages/router-utils/src/ast.ts index 812824a1217..966576650fe 100644 --- a/packages/router-utils/src/ast.ts +++ b/packages/router-utils/src/ast.ts @@ -11,7 +11,12 @@ export type ParseAstOptions = ParserOptions & { export type ParseAstResult = ParseResult<_babel_types.File> export function parseAst({ code, ...opts }: ParseAstOptions): ParseAstResult { return parse(code, { - plugins: ['jsx', 'typescript', 'explicitResourceManagement'], + plugins: [ + 'jsx', + 'typescript', + 'explicitResourceManagement', + 'decorators', // required for Angular and other decorator-based code + ], sourceType: 'module', ...opts, }) diff --git a/packages/solid-router/src/Match.tsx b/packages/solid-router/src/Match.tsx index 0e6afc46715..a13576ffbaf 100644 --- a/packages/solid-router/src/Match.tsx +++ b/packages/solid-router/src/Match.tsx @@ -82,12 +82,8 @@ export const Match = (props: { matchId: string }) => { }, }) - const ShellComponent = route().isRoot - ? ((route().options as RootRouteOptions).shellComponent ?? SafeFragment) - : SafeFragment - return ( - + <> props.matchId}> { ) : null} - + ) } diff --git a/packages/solid-router/src/link.tsx b/packages/solid-router/src/link.tsx index dc9a6c478b9..aa8c3dddbd9 100644 --- a/packages/solid-router/src/link.tsx +++ b/packages/solid-router/src/link.tsx @@ -222,38 +222,41 @@ export function useLinkProps< }, }) + const [ref, setRef] = Solid.createSignal(null) + const doPreload = () => router.preloadRoute(_options() as any).catch((err: any) => { console.warn(err) console.warn(preloadWarning) }) - const preloadViewportIoCallback = ( - entry: IntersectionObserverEntry | undefined, - ) => { - if (entry?.isIntersecting) { - doPreload() + // Only set up preloaders for internal links + if (!externalLink()) { + const preloadViewportIoCallback = ( + entry: IntersectionObserverEntry | undefined, + ) => { + if (entry?.isIntersecting) { + doPreload() + } } - } - - const [ref, setRef] = Solid.createSignal(null) - useIntersectionObserver( - ref, - preloadViewportIoCallback, - { rootMargin: '100px' }, - { disabled: !!local.disabled || !(preload() === 'viewport') }, - ) + useIntersectionObserver( + ref, + preloadViewportIoCallback, + { rootMargin: '100px' }, + { disabled: !!local.disabled || !(preload() === 'viewport') }, + ) - Solid.createEffect(() => { - if (hasRenderFetched) { - return - } - if (!local.disabled && preload() === 'render') { - doPreload() - hasRenderFetched = true - } - }) + Solid.createEffect(() => { + if (hasRenderFetched) { + return + } + if (!local.disabled && preload() === 'render') { + doPreload() + hasRenderFetched = true + } + }) + } if (externalLink()) { return Solid.mergeProps( diff --git a/packages/solid-router/src/utils.ts b/packages/solid-router/src/utils.ts index 0049cf3fa41..3358652dc19 100644 --- a/packages/solid-router/src/utils.ts +++ b/packages/solid-router/src/utils.ts @@ -52,6 +52,7 @@ export function useIntersectionObserver( ref: Solid.Accessor, callback: (entry: IntersectionObserverEntry | undefined) => void, intersectionObserverOptions: IntersectionObserverInit = {}, + // Should accept signals!!! options: { disabled?: boolean } = {}, ): Solid.Accessor { const isIntersectionObserverAvailable = diff --git a/packages/vue-router/src/Match.tsx b/packages/vue-router/src/Match.tsx index c737f446b9c..04f5d8c2464 100644 --- a/packages/vue-router/src/Match.tsx +++ b/packages/vue-router/src/Match.tsx @@ -514,20 +514,6 @@ export const Outlet = Vue.defineComponent({ key: childMatchData.value.paramsKey, }) - if (safeMatchId.value === rootRouteId) { - return Vue.h( - Vue.Suspense, - { - fallback: router.options.defaultPendingComponent - ? Vue.h(router.options.defaultPendingComponent) - : null, - }, - { - default: () => nextMatch, - }, - ) - } - return nextMatch } }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3ab9c9061b6..9280fe2724a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -72,7 +72,7 @@ importers: version: 1.56.1 '@tanstack/config': specifier: 0.22.0 - version: 0.22.0(@types/node@22.10.2)(eslint@9.22.0(jiti@2.6.1))(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 0.22.0(@types/node@22.10.2)(eslint@9.22.0(jiti@2.6.1))(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/query-core': specifier: ^5.90.7 version: 5.90.7 @@ -90,7 +90,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitest/browser': specifier: ^3.0.6 - version: 3.0.6(@types/node@22.10.2)(playwright@1.56.1)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4) + version: 3.0.6(@types/node@22.10.2)(playwright@1.56.1)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4) '@vitest/ui': specifier: ^3.0.6 version: 3.0.6(vitest@3.2.4) @@ -153,10 +153,65 @@ importers: version: typescript@5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@25.0.1)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + + e2e/angular-router-experimental/basic: + dependencies: + '@angular/common': + specifier: ^21.0.4 + version: 21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': + specifier: ^21.0.4 + version: 21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': + specifier: ^21.0.4 + version: 21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)) + '@tanstack/angular-router-devtools': + specifier: workspace:^ + version: link:../../../packages/angular-router-devtools + '@tanstack/angular-router-experimental': + specifier: workspace:^ + version: link:../../../packages/angular-router-experimental + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + zod: + specifier: ^3.24.2 + version: 3.25.57 + devDependencies: + '@angular/build': + specifier: ^21.0.4 + version: 21.0.4(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(@angular/compiler@21.0.4)(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.10.2)(chokidar@4.0.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(ng-packagr@21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)(vitest@4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1) + '@angular/cli': + specifier: ^21.0.4 + version: 21.0.4(@types/node@22.10.2)(chokidar@4.0.3) + '@angular/compiler-cli': + specifier: ^21.0.4 + version: 21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2) + '@playwright/test': + specifier: ^1.56.1 + version: 1.56.1 + '@tailwindcss/postcss': + specifier: ^4.1.18 + version: 4.1.18 + '@tanstack/router-e2e-utils': + specifier: workspace:^ + version: link:../../e2e-utils + '@types/node': + specifier: 22.10.2 + version: 22.10.2 + postcss: + specifier: ^8.5.6 + version: 8.5.6 + tailwindcss: + specifier: ^4.1.18 + version: 4.1.18 + typescript: + specifier: ~5.9.2 + version: 5.9.2 e2e/e2e-utils: devDependencies: @@ -165,7 +220,7 @@ importers: version: 3.2.0 vite-plugin-dts: specifier: 4.0.3 - version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/react-router/basepath-file-based: dependencies: @@ -199,16 +254,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) e2e/react-router/basic: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -242,10 +297,10 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) e2e/react-router/basic-esbuild-file-based: dependencies: @@ -294,7 +349,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -337,19 +392,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) combinate: specifier: ^1.1.11 version: 1.1.11 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) e2e/react-router/basic-file-based-code-splitting: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -386,16 +441,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) e2e/react-router/basic-react-query: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-query': specifier: ^5.90.7 version: 5.90.7(react@19.2.0) @@ -435,16 +490,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) e2e/react-router/basic-react-query-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-query': specifier: ^5.90.7 version: 5.90.7(react@19.2.0) @@ -490,16 +545,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) e2e/react-router/basic-scroll-restoration: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -536,16 +591,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) e2e/react-router/basic-virtual-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -588,16 +643,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) e2e/react-router/basic-virtual-named-export-config-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -640,10 +695,10 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) e2e/react-router/escaped-special-strings: dependencies: @@ -674,16 +729,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) e2e/react-router/generator-cli-only: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -720,16 +775,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) e2e/react-router/i18n-paraglide: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -766,19 +821,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) e2e/react-router/js-only-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -815,10 +870,10 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) e2e/react-router/rspack-basic-file-based: dependencies: @@ -931,7 +986,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -974,10 +1029,10 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) e2e/react-router/sentry-integration: dependencies: @@ -992,7 +1047,7 @@ importers: version: 4.6.1(encoding@0.1.13) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -1026,16 +1081,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) e2e/react-router/view-transitions: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -1075,13 +1130,13 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) e2e/react-start/basic: dependencies: @@ -1121,7 +1176,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1139,13 +1194,13 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) combinate: specifier: ^1.1.11 version: 1.1.11 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -1154,10 +1209,10 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) zod: specifier: ^3.24.2 version: 3.25.57 @@ -1196,14 +1251,14 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) devDependencies: '@playwright/test': specifier: ^1.56.1 version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1218,7 +1273,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) dotenv: specifier: ^17.2.3 version: 17.2.3 @@ -1233,7 +1288,7 @@ importers: version: 5.8.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/react-start/basic-cloudflare: dependencies: @@ -1255,13 +1310,13 @@ importers: devDependencies: '@cloudflare/vite-plugin': specifier: ^1.15.1 - version: 1.15.1(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(workerd@1.20251118.0)(wrangler@4.49.1) + version: 1.15.1(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(workerd@1.20251118.0)(wrangler@4.49.1) '@playwright/test': specifier: ^1.56.1 version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1276,7 +1331,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -1285,10 +1340,10 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) wrangler: specifier: ^4.49.1 version: 4.49.1 @@ -1327,7 +1382,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) zod: specifier: ^4.1.12 version: 4.1.12 @@ -1337,7 +1392,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1352,10 +1407,10 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -1364,7 +1419,7 @@ importers: version: 5.8.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/react-start/basic-rsc: dependencies: @@ -1394,11 +1449,11 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/react': specifier: ^19.2.2 version: 19.2.2 @@ -1407,7 +1462,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -1416,7 +1471,7 @@ importers: version: 5.9.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/react-start/basic-tsr-config: dependencies: @@ -1434,7 +1489,7 @@ importers: version: 19.2.0(react@19.2.0) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) devDependencies: '@tanstack/router-e2e-utils': specifier: workspace:^ @@ -1450,7 +1505,7 @@ importers: version: 19.2.2(@types/react@19.2.2) srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 typescript: specifier: ^5.7.2 version: 5.8.2 @@ -1483,14 +1538,14 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) devDependencies: '@playwright/test': specifier: ^1.56.1 version: 1.56.1 '@tailwindcss/vite': specifier: 4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1505,7 +1560,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: 4.1.18 version: 4.1.18 @@ -1514,7 +1569,7 @@ importers: version: 5.9.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/react-start/custom-basepath: dependencies: @@ -1545,7 +1600,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1563,13 +1618,13 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) cross-env: specifier: ^10.0.0 version: 10.0.0 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -1581,10 +1636,10 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/react-start/i18n-paraglide: dependencies: @@ -1612,7 +1667,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1627,7 +1682,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -1636,10 +1691,10 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/react-start/query-integration: dependencies: @@ -1672,7 +1727,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) zod: specifier: ^3.24.2 version: 3.25.57 @@ -1682,7 +1737,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1697,7 +1752,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -1706,7 +1761,7 @@ importers: version: 5.8.3 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.3)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/react-start/scroll-restoration: dependencies: @@ -1736,7 +1791,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) zod: specifier: ^3.24.2 version: 3.25.57 @@ -1746,7 +1801,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1761,13 +1816,13 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) combinate: specifier: ^1.1.11 version: 1.1.11 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -1776,7 +1831,7 @@ importers: version: 5.8.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/react-start/selective-ssr: dependencies: @@ -1797,17 +1852,17 @@ importers: version: 19.2.0(react@19.2.0) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.3)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) zod: specifier: ^3.24.2 version: 3.25.57 devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1822,10 +1877,10 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -1852,17 +1907,17 @@ importers: version: 19.2.0(react@19.2.0) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) zod: specifier: ^3.24.2 version: 3.25.57 devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1877,10 +1932,10 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -1922,7 +1977,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) zod: specifier: ^3.24.2 version: 3.25.57 @@ -1932,7 +1987,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1950,13 +2005,13 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) combinate: specifier: ^1.1.11 version: 1.1.11 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -1965,7 +2020,7 @@ importers: version: 5.8.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/react-start/server-functions-global-middleware: dependencies: @@ -1983,14 +2038,14 @@ importers: version: 19.2.0(react@19.2.0) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) devDependencies: '@playwright/test': specifier: ^1.56.1 version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -2005,10 +2060,10 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -2017,7 +2072,7 @@ importers: version: 5.9.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/react-start/server-routes: dependencies: @@ -2053,7 +2108,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) zod: specifier: ^3.24.2 version: 3.25.57 @@ -2063,7 +2118,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -2081,13 +2136,13 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) combinate: specifier: ^1.1.11 version: 1.1.11 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -2096,7 +2151,7 @@ importers: version: 5.8.3 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.3)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/react-start/server-routes-global-middleware: dependencies: @@ -2114,14 +2169,14 @@ importers: version: 19.2.0(react@19.2.0) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) devDependencies: '@playwright/test': specifier: ^1.56.1 version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -2136,10 +2191,10 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -2148,7 +2203,7 @@ importers: version: 5.9.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/react-start/spa-mode: dependencies: @@ -2170,7 +2225,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -2191,10 +2246,10 @@ importers: version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.3)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/react-start/streaming-ssr: dependencies: @@ -2218,7 +2273,7 @@ importers: version: 19.2.0(react@19.2.0) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) devDependencies: '@playwright/test': specifier: ^1.56.1 @@ -2237,7 +2292,7 @@ importers: version: 19.2.2(@types/react@19.2.2) srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 typescript: specifier: ^5.7.2 version: 5.9.2 @@ -2270,7 +2325,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) zod: specifier: ^3.24.2 version: 3.25.57 @@ -2280,7 +2335,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -2295,13 +2350,13 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) combinate: specifier: ^1.1.11 version: 1.1.11 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -2310,7 +2365,7 @@ importers: version: 5.8.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/react-start/website: dependencies: @@ -2344,7 +2399,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -2359,10 +2414,10 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -2371,10 +2426,10 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-router/basepath-file-based: dependencies: @@ -2399,16 +2454,16 @@ importers: version: link:../../e2e-utils vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-router/basic: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -2433,10 +2488,10 @@ importers: version: link:../../e2e-utils vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-router/basic-esbuild-file-based: dependencies: @@ -2479,7 +2534,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -2516,16 +2571,16 @@ importers: version: 1.1.11 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-router/basic-file-based-code-splitting: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -2553,16 +2608,16 @@ importers: version: link:../../e2e-utils vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-router/basic-scroll-restoration: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -2590,16 +2645,16 @@ importers: version: link:../../e2e-utils vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-router/basic-solid-query: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-query': specifier: ^5.90.9 version: 5.90.9(solid-js@1.9.10) @@ -2630,16 +2685,16 @@ importers: version: link:../../e2e-utils vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-router/basic-solid-query-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -2676,16 +2731,16 @@ importers: version: link:../../e2e-utils vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-router/basic-virtual-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -2719,16 +2774,16 @@ importers: version: link:../../e2e-utils vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-router/basic-virtual-named-export-config-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -2762,16 +2817,16 @@ importers: version: link:../../e2e-utils vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-router/generator-cli-only: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-cli': specifier: workspace:* version: link:../../../packages/router-cli @@ -2799,16 +2854,16 @@ importers: version: link:../../e2e-utils vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-router/js-only-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -2836,10 +2891,10 @@ importers: version: link:../../../packages/router-plugin vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-router/rspack-basic-file-based: dependencies: @@ -2940,7 +2995,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -2974,10 +3029,10 @@ importers: version: link:../../e2e-utils vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-router/sentry-integration: dependencies: @@ -2992,7 +3047,7 @@ importers: version: 4.6.1(encoding@0.1.13) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-router': specifier: workspace:^ version: link:../../../packages/solid-router @@ -3017,16 +3072,16 @@ importers: version: link:../../e2e-utils vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-router/view-transitions: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -3060,10 +3115,10 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-start/basic: dependencies: @@ -3096,7 +3151,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) zod: specifier: ^3.24.2 version: 3.25.57 @@ -3106,7 +3161,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3121,7 +3176,7 @@ importers: version: 1.1.11 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -3130,10 +3185,10 @@ importers: version: 5.8.2 vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-start/basic-auth: dependencies: @@ -3166,14 +3221,14 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) devDependencies: '@playwright/test': specifier: ^1.56.1 version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3188,7 +3243,7 @@ importers: version: 7.0.0(@types/react@19.2.2)(magicast@0.3.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -3197,10 +3252,10 @@ importers: version: 5.9.2 vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-start/basic-cloudflare: dependencies: @@ -3219,13 +3274,13 @@ importers: devDependencies: '@cloudflare/vite-plugin': specifier: ^1.15.1 - version: 1.15.1(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(workerd@1.20251118.0)(wrangler@4.49.1) + version: 1.15.1(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(workerd@1.20251118.0)(wrangler@4.49.1) '@playwright/test': specifier: ^1.56.1 version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3240,13 +3295,13 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) wrangler: specifier: ^4.49.1 version: 4.49.1 @@ -3282,7 +3337,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) zod: specifier: ^4.1.12 version: 4.1.12 @@ -3292,7 +3347,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3301,7 +3356,7 @@ importers: version: 22.10.2 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -3310,10 +3365,10 @@ importers: version: 5.9.2 vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-start/basic-tsr-config: dependencies: @@ -3331,7 +3386,7 @@ importers: version: 1.9.10 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) devDependencies: '@tanstack/router-e2e-utils': specifier: workspace:^ @@ -3341,16 +3396,16 @@ importers: version: 22.10.2 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 typescript: specifier: ^5.7.2 version: 5.8.2 vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-start/custom-basepath: dependencies: @@ -3378,7 +3433,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3393,7 +3448,7 @@ importers: version: 10.0.0 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -3405,13 +3460,13 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-start/query-integration: dependencies: @@ -3441,7 +3496,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) zod: specifier: ^3.24.2 version: 3.25.57 @@ -3451,7 +3506,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3466,10 +3521,10 @@ importers: version: 5.9.2 vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-start/scroll-restoration: dependencies: @@ -3496,7 +3551,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) zod: specifier: ^3.24.2 version: 3.25.57 @@ -3506,7 +3561,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3518,7 +3573,7 @@ importers: version: 1.1.11 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -3527,10 +3582,10 @@ importers: version: 5.8.2 vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-start/selective-ssr: dependencies: @@ -3549,13 +3604,13 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -3564,13 +3619,13 @@ importers: version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.3)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-start/serialization-adapters: dependencies: @@ -3588,17 +3643,17 @@ importers: version: 1.9.10 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) zod: specifier: ^3.24.2 version: 3.25.57 devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3607,7 +3662,7 @@ importers: version: 22.10.2 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -3616,7 +3671,7 @@ importers: version: 5.9.2 vite-plugin-solid: specifier: ^2.11.9 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-start/server-functions: dependencies: @@ -3649,7 +3704,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) zod: specifier: ^3.24.2 version: 3.25.57 @@ -3659,7 +3714,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3674,7 +3729,7 @@ importers: version: 1.1.11 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -3683,10 +3738,10 @@ importers: version: 5.8.2 vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-start/server-routes: dependencies: @@ -3719,7 +3774,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) zod: specifier: ^3.24.2 version: 3.25.57 @@ -3729,7 +3784,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3744,7 +3799,7 @@ importers: version: 1.1.11 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -3753,10 +3808,10 @@ importers: version: 5.8.3 vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.3)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-start/spa-mode: dependencies: @@ -3778,7 +3833,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3790,13 +3845,13 @@ importers: version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.3)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-start/virtual-routes: dependencies: @@ -3823,7 +3878,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) zod: specifier: ^3.24.2 version: 3.25.57 @@ -3833,7 +3888,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3845,7 +3900,7 @@ importers: version: 1.1.11 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -3854,10 +3909,10 @@ importers: version: 5.9.2 vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/solid-start/website: dependencies: @@ -3881,7 +3936,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) zod: specifier: ^3.24.2 version: 3.25.57 @@ -3891,7 +3946,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -3900,7 +3955,7 @@ importers: version: 22.10.2 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -3909,16 +3964,16 @@ importers: version: 5.8.2 vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/vue-router/basepath-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -3952,16 +4007,16 @@ importers: version: link:../../e2e-utils '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) typescript: specifier: ~5.8.3 version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue-tsc: specifier: ^3.1.5 version: 3.1.5(typescript@5.8.3) @@ -3970,7 +4025,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/vue-router': specifier: workspace:* version: link:../../../packages/vue-router @@ -3995,13 +4050,13 @@ importers: version: link:../../e2e-utils '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) typescript: specifier: ~5.8.3 version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue-tsc: specifier: ^3.1.5 version: 3.1.5(typescript@5.8.3) @@ -4053,7 +4108,7 @@ importers: version: 0.25.10 esbuild-plugin-vue3: specifier: ^0.5.1 - version: 0.5.1(cheerio@1.0.0)(vue@3.5.25(typescript@5.9.2)) + version: 0.5.1(cheerio@1.0.0)(sass@1.93.2)(vue@3.5.25(typescript@5.9.2)) eslint-plugin-vue: specifier: ^9.33.0 version: 9.33.0(eslint@9.22.0(jiti@2.6.1)) @@ -4071,7 +4126,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -4114,10 +4169,10 @@ importers: version: 8.44.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.8.3) '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) eslint-plugin-vue: specifier: ^9.33.0 version: 9.33.0(eslint@9.22.0(jiti@2.6.1)) @@ -4126,7 +4181,7 @@ importers: version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue-eslint-parser: specifier: ^9.4.3 version: 9.4.3(eslint@9.22.0(jiti@2.6.1)) @@ -4138,7 +4193,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -4172,16 +4227,16 @@ importers: version: link:../../e2e-utils '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) typescript: specifier: ~5.8.3 version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue-tsc: specifier: ^3.1.5 version: 3.1.5(typescript@5.8.3) @@ -4190,7 +4245,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/vue-router': specifier: workspace:* version: link:../../../packages/vue-router @@ -4218,16 +4273,16 @@ importers: version: link:../../e2e-utils '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) typescript: specifier: ~5.8.3 version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue-tsc: specifier: ^3.1.5 version: 3.1.5(typescript@5.8.3) @@ -4236,7 +4291,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -4273,16 +4328,16 @@ importers: version: link:../../e2e-utils '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) typescript: specifier: ~5.8.3 version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue-tsc: specifier: ^3.1.5 version: 3.1.5(typescript@5.8.3) @@ -4291,7 +4346,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -4328,16 +4383,16 @@ importers: version: link:../../e2e-utils '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) typescript: specifier: ~5.8.3 version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue-tsc: specifier: ^3.1.5 version: 3.1.5(typescript@5.8.3) @@ -4346,7 +4401,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/vue-query': specifier: ^5.90.0 version: 5.92.0(vue@3.5.25(typescript@5.8.3)) @@ -4377,16 +4432,16 @@ importers: version: link:../../e2e-utils '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) typescript: specifier: ~5.8.3 version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue-tsc: specifier: ^3.1.5 version: 3.1.5(typescript@5.8.3) @@ -4395,7 +4450,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -4432,16 +4487,16 @@ importers: version: link:../../e2e-utils '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) typescript: specifier: ~5.8.3 version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue-tsc: specifier: ^3.1.5 version: 3.1.5(typescript@5.8.3) @@ -4450,7 +4505,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-cli': specifier: workspace:* version: link:../../../packages/router-cli @@ -4478,16 +4533,16 @@ importers: version: link:../../e2e-utils '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) typescript: specifier: ~5.8.3 version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue-tsc: specifier: ^3.1.5 version: 3.1.5(typescript@5.8.3) @@ -4496,7 +4551,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -4530,13 +4585,13 @@ importers: version: link:../../e2e-utils '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) e2e/vue-router/rspack-basic-file-based: dependencies: @@ -4652,7 +4707,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -4686,16 +4741,16 @@ importers: version: link:../../e2e-utils '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) typescript: specifier: ~5.8.3 version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue-tsc: specifier: ^3.1.5 version: 3.1.5(typescript@5.8.3) @@ -4713,7 +4768,7 @@ importers: version: 10.32.0(@tanstack/vue-router@packages+vue-router)(vue@3.5.25(typescript@5.8.3)) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/vue-router': specifier: workspace:* version: link:../../../packages/vue-router @@ -4738,13 +4793,13 @@ importers: version: link:../../e2e-utils '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) typescript: specifier: ~5.8.3 version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue-tsc: specifier: ^3.1.5 version: 3.1.5(typescript@5.8.3) @@ -4753,7 +4808,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -4787,16 +4842,16 @@ importers: version: link:../../e2e-utils '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) typescript: specifier: ~5.8.3 version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue-tsc: specifier: ^3.1.5 version: 3.1.5(typescript@5.8.3) @@ -4829,7 +4884,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue: specifier: ^3.5.16 version: 3.5.25(typescript@5.9.2) @@ -4842,7 +4897,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -4854,16 +4909,16 @@ importers: version: 22.10.2 '@vitejs/plugin-vue': specifier: ^5.2.4 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) combinate: specifier: ^1.1.11 version: 1.1.11 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -4872,7 +4927,7 @@ importers: version: 5.9.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/vue-start/basic-auth: dependencies: @@ -4902,7 +4957,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue: specifier: ^3.5.25 version: 3.5.25(typescript@5.9.2) @@ -4912,7 +4967,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -4921,10 +4976,10 @@ importers: version: 22.10.2 '@vitejs/plugin-vue': specifier: ^6.0.3 - version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.2 - version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) dotenv: specifier: ^17.2.3 version: 17.2.3 @@ -4933,7 +4988,7 @@ importers: version: 7.0.0(@types/react@19.2.2)(magicast@0.3.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -4942,7 +4997,7 @@ importers: version: 5.9.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/vue-start/basic-cloudflare: dependencies: @@ -4961,13 +5016,13 @@ importers: devDependencies: '@cloudflare/vite-plugin': specifier: ^1.15.1 - version: 1.15.1(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(workerd@1.20251118.0)(wrangler@4.49.1) + version: 1.15.1(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(workerd@1.20251118.0)(wrangler@4.49.1) '@playwright/test': specifier: ^1.56.1 version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -4976,10 +5031,10 @@ importers: version: 22.10.2 '@vitejs/plugin-vue': specifier: ^6.0.3 - version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.2 - version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -4988,10 +5043,10 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) wrangler: specifier: ^4.49.1 version: 4.49.1 @@ -5009,7 +5064,7 @@ importers: version: link:../../../packages/vue-start vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue: specifier: ^3.5.25 version: 3.5.25(typescript@5.9.2) @@ -5022,19 +5077,19 @@ importers: version: 22.10.2 '@vitejs/plugin-vue': specifier: ^6.0.3 - version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.2 - version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 typescript: specifier: ^5.7.2 version: 5.9.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/vue-start/basic-vue-query: dependencies: @@ -5064,7 +5119,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue: specifier: ^3.5.25 version: 3.5.25(typescript@5.9.2) @@ -5077,7 +5132,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5086,13 +5141,13 @@ importers: version: 22.10.2 '@vitejs/plugin-vue': specifier: ^6.0.3 - version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.2 - version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -5101,7 +5156,7 @@ importers: version: 5.9.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/vue-start/custom-basepath: dependencies: @@ -5129,7 +5184,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5141,16 +5196,16 @@ importers: version: 22.10.2 '@vitejs/plugin-vue': specifier: ^6.0.3 - version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.2 - version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) cross-env: specifier: ^10.0.0 version: 10.0.0 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -5162,10 +5217,10 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/vue-start/query-integration: dependencies: @@ -5192,7 +5247,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue: specifier: ^3.5.16 version: 3.5.25(typescript@5.9.2) @@ -5205,7 +5260,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5214,10 +5269,10 @@ importers: version: 22.10.2 '@vitejs/plugin-vue': specifier: ^5.2.4 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -5226,7 +5281,7 @@ importers: version: 5.9.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/vue-start/scroll-restoration: dependencies: @@ -5250,7 +5305,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue: specifier: ^3.5.25 version: 3.5.25(typescript@5.9.2) @@ -5263,7 +5318,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5272,16 +5327,16 @@ importers: version: 22.10.2 '@vitejs/plugin-vue': specifier: ^6.0.3 - version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.2 - version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) combinate: specifier: ^1.1.11 version: 1.1.11 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -5290,7 +5345,7 @@ importers: version: 5.9.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/vue-start/selective-ssr: dependencies: @@ -5309,19 +5364,19 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils '@vitejs/plugin-vue': specifier: ^6.0.3 - version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.2 - version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -5330,10 +5385,10 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vue-tsc: specifier: ^3.1.8 version: 3.1.8(typescript@5.9.2) @@ -5358,19 +5413,19 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils '@vitejs/plugin-vue': specifier: ^6.0.3 - version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.2 - version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -5379,10 +5434,10 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vue-tsc: specifier: ^3.1.8 version: 3.1.8(typescript@5.9.2) @@ -5415,7 +5470,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue: specifier: ^3.5.25 version: 3.5.25(typescript@5.9.2) @@ -5428,7 +5483,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5440,16 +5495,16 @@ importers: version: 22.10.2 '@vitejs/plugin-vue': specifier: ^6.0.3 - version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.2 - version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) combinate: specifier: ^1.1.11 version: 1.1.11 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -5458,7 +5513,7 @@ importers: version: 5.9.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/vue-start/server-routes: dependencies: @@ -5488,7 +5543,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue: specifier: ^3.5.25 version: 3.5.25(typescript@5.9.2) @@ -5501,7 +5556,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5513,16 +5568,16 @@ importers: version: 22.10.2 '@vitejs/plugin-vue': specifier: ^6.0.3 - version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.2 - version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) combinate: specifier: ^1.1.11 version: 1.1.11 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -5531,7 +5586,7 @@ importers: version: 5.9.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/vue-start/spa-mode: dependencies: @@ -5553,16 +5608,16 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils '@vitejs/plugin-vue': specifier: ^6.0.3 - version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.2 - version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -5571,10 +5626,10 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/vue-start/virtual-routes: dependencies: @@ -5598,7 +5653,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue: specifier: ^3.5.25 version: 3.5.25(typescript@5.9.2) @@ -5611,7 +5666,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5620,16 +5675,16 @@ importers: version: 22.10.2 '@vitejs/plugin-vue': specifier: ^6.0.3 - version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.2 - version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) combinate: specifier: ^1.1.11 version: 1.1.11 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -5638,7 +5693,7 @@ importers: version: 5.9.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) e2e/vue-start/website: dependencies: @@ -5659,7 +5714,7 @@ importers: version: 2.6.0 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue: specifier: ^3.5.25 version: 3.5.25(typescript@5.9.2) @@ -5672,7 +5727,7 @@ importers: version: 1.56.1 '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -5681,13 +5736,13 @@ importers: version: 22.10.2 '@vitejs/plugin-vue': specifier: ^6.0.3 - version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.2 - version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -5696,13 +5751,181 @@ importers: version: 5.9.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) + + examples/angular/basic: + dependencies: + '@angular/common': + specifier: 21.0.4 + version: 21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/compiler': + specifier: 21.0.4 + version: 21.0.4 + '@angular/core': + specifier: 21.0.4 + version: 21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/forms': + specifier: 21.0.4 + version: 21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@standard-schema/spec@1.0.0)(rxjs@7.8.2) + '@angular/platform-browser': + specifier: 21.0.4 + version: 21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)) + '@tanstack/angular-router-devtools': + specifier: workspace:^ + version: link:../../../packages/angular-router-devtools + '@tanstack/angular-router-experimental': + specifier: workspace:^ + version: link:../../../packages/angular-router-experimental + rxjs: + specifier: ~7.8.0 + version: 7.8.2 + tslib: + specifier: ^2.3.0 + version: 2.8.1 + zod: + specifier: ^4.3.4 + version: 4.3.4 + devDependencies: + '@angular/build': + specifier: 21.0.4 + version: 21.0.4(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(@angular/compiler@21.0.4)(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.10.2)(chokidar@4.0.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(ng-packagr@21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)(vitest@4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.3.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1) + '@angular/cli': + specifier: 21.0.4 + version: 21.0.4(@types/node@22.10.2)(chokidar@4.0.3) + '@angular/compiler-cli': + specifier: 21.0.4 + version: 21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2) + jsdom: + specifier: ^27.1.0 + version: 27.3.0 + typescript: + specifier: ~5.9.2 + version: 5.9.2 + vitest: + specifier: ^4.0.8 + version: 4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.3.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + + examples/angular/basic-file-based: + dependencies: + '@angular/common': + specifier: 21.0.4 + version: 21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/compiler': + specifier: 21.0.4 + version: 21.0.4 + '@angular/core': + specifier: 21.0.4 + version: 21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': + specifier: 21.0.4 + version: 21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)) + '@tailwindcss/vite': + specifier: ^4.1.18 + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) + '@tanstack/angular-router-devtools': + specifier: workspace:^ + version: link:../../../packages/angular-router-devtools + '@tanstack/angular-router-experimental': + specifier: workspace:^ + version: link:../../../packages/angular-router-experimental + rxjs: + specifier: ~7.8.0 + version: 7.8.2 + tailwindcss: + specifier: ^4.1.18 + version: 4.1.18 + tslib: + specifier: ^2.3.0 + version: 2.8.1 + devDependencies: + '@analogjs/vite-plugin-angular': + specifier: ^2.2.1 + version: 2.2.1(@angular/build@21.0.4(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(@angular/compiler@21.0.4)(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.10.2)(chokidar@4.0.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(ng-packagr@21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)(vitest@4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1)) + '@tanstack/router-cli': + specifier: workspace:* + version: link:../../../packages/router-cli + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + typescript: + specifier: ~5.9.2 + version: 5.9.2 + vite: + specifier: ^7.1.7 + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + + examples/angular/kitchen-sink: + dependencies: + '@angular/common': + specifier: 21.0.4 + version: 21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/compiler': + specifier: 21.0.4 + version: 21.0.4 + '@angular/core': + specifier: 21.0.4 + version: 21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/forms': + specifier: 21.0.4 + version: 21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@standard-schema/spec@1.0.0)(rxjs@7.8.2) + '@angular/platform-browser': + specifier: 21.0.4 + version: 21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)) + '@tanstack/angular-router-devtools': + specifier: workspace:^ + version: link:../../../packages/angular-router-devtools + '@tanstack/angular-router-experimental': + specifier: workspace:^ + version: link:../../../packages/angular-router-experimental + immer: + specifier: ^10.1.1 + version: 10.1.1 + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + rxjs: + specifier: ~7.8.2 + version: 7.8.2 + tslib: + specifier: ^2.3.0 + version: 2.8.1 + zod: + specifier: ^3.24.2 + version: 3.25.57 + devDependencies: + '@angular/build': + specifier: 21.0.4 + version: 21.0.4(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(@angular/compiler@21.0.4)(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.10.2)(chokidar@4.0.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(ng-packagr@21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)(vitest@4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.3.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1) + '@angular/cli': + specifier: 21.0.4 + version: 21.0.4(@types/node@22.10.2)(chokidar@4.0.3) + '@angular/compiler-cli': + specifier: 21.0.4 + version: 21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2) + '@tailwindcss/postcss': + specifier: ^4.1.18 + version: 4.1.18 + jsdom: + specifier: ^27.1.0 + version: 27.3.0 + postcss: + specifier: ^8.5.6 + version: 8.5.6 + tailwindcss: + specifier: ^4.1.18 + version: 4.1.18 + typescript: + specifier: ~5.9.2 + version: 5.9.2 + vitest: + specifier: ^4.0.8 + version: 4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.3.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/authenticated-routes: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -5736,19 +5959,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/authenticated-routes-firebase: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -5788,19 +6011,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/basic: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -5828,19 +6051,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/basic-default-search-params: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-query': specifier: ^5.90.7 version: 5.90.7(react@19.2.0) @@ -5874,19 +6097,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/basic-devtools-panel: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-query-devtools': specifier: ^5.67.2 version: 5.67.2(@tanstack/react-query@5.90.7(react@19.2.0))(react@19.2.0) @@ -5917,19 +6140,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/basic-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -5963,19 +6186,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/basic-non-nested-devtools: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -6003,19 +6226,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/basic-react-query: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-query': specifier: ^5.90.7 version: 5.90.7(react@19.2.0) @@ -6049,19 +6272,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/basic-react-query-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-query': specifier: ^5.90.7 version: 5.90.7(react@19.2.0) @@ -6101,13 +6324,13 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/basic-ssr-file-based: dependencies: @@ -6150,13 +6373,13 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.5.2 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.8.3 version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/basic-ssr-streaming-file-based: dependencies: @@ -6199,19 +6422,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/basic-virtual-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -6248,19 +6471,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/basic-virtual-inside-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -6297,19 +6520,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/deferred-data: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -6340,19 +6563,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/i18n-paraglide: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -6383,19 +6606,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^5.0.3 - version: 5.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.9.2 version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/kitchen-sink: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -6429,19 +6652,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/kitchen-sink-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -6478,19 +6701,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/kitchen-sink-react-query: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-query': specifier: ^5.90.7 version: 5.90.7(react@19.2.0) @@ -6530,19 +6753,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/kitchen-sink-react-query-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-query': specifier: ^5.90.7 version: 5.90.7(react@19.2.0) @@ -6585,19 +6808,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/large-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-query': specifier: ^5.90.7 version: 5.90.7(react@19.2.0) @@ -6634,13 +6857,13 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/location-masking: dependencies: @@ -6649,7 +6872,7 @@ importers: version: 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-query': specifier: ^5.90.7 version: 5.90.7(react@19.2.0) @@ -6680,19 +6903,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/navigation-blocking: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-query': specifier: ^5.90.7 version: 5.90.7(react@19.2.0) @@ -6723,19 +6946,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/quickstart: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -6760,13 +6983,13 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/quickstart-esbuild-file-based: dependencies: @@ -6806,7 +7029,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -6840,13 +7063,13 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/quickstart-rspack-file-based: dependencies: @@ -6975,16 +7198,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-dts: specifier: 4.0.3 - version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/router-monorepo-react-query/packages/app: dependencies: @@ -7006,7 +7229,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: 4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router-devtools': specifier: workspace:^ version: link:../../../../../packages/react-router-devtools @@ -7018,7 +7241,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: 4.1.18 version: 4.1.18 @@ -7027,10 +7250,10 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-dts: specifier: 4.0.3 - version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/router-monorepo-react-query/packages/post-feature: dependencies: @@ -7058,16 +7281,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-dts: specifier: 4.0.3 - version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/router-monorepo-react-query/packages/post-query: dependencies: @@ -7083,13 +7306,13 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/router-monorepo-react-query/packages/router: dependencies: @@ -7129,16 +7352,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-dts: specifier: 4.0.3 - version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/router-monorepo-simple: dependencies: @@ -7172,16 +7395,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-dts: specifier: 4.0.3 - version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/router-monorepo-simple-lazy: dependencies: @@ -7215,16 +7438,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-dts: specifier: 4.0.3 - version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/router-monorepo-simple-lazy/packages/app: dependencies: @@ -7243,7 +7466,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: 4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router-devtools': specifier: workspace:^ version: link:../../../../../packages/react-router-devtools @@ -7255,7 +7478,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: 4.1.18 version: 4.1.18 @@ -7264,10 +7487,10 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-dts: specifier: 4.0.3 - version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/router-monorepo-simple-lazy/packages/post-feature: dependencies: @@ -7292,16 +7515,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-dts: specifier: 4.0.3 - version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/router-monorepo-simple-lazy/packages/router: dependencies: @@ -7335,16 +7558,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-dts: specifier: 4.0.3 - version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/router-monorepo-simple/packages/app: dependencies: @@ -7363,7 +7586,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: 4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router-devtools': specifier: workspace:^ version: link:../../../../../packages/react-router-devtools @@ -7375,7 +7598,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: 4.1.18 version: 4.1.18 @@ -7384,10 +7607,10 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-dts: specifier: 4.0.3 - version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/router-monorepo-simple/packages/post-feature: dependencies: @@ -7409,16 +7632,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-dts: specifier: 4.0.3 - version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/router-monorepo-simple/packages/router: dependencies: @@ -7452,22 +7675,22 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-dts: specifier: 4.0.3 - version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/scroll-restoration: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -7495,19 +7718,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/search-validator-adapters: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/arktype-adapter': specifier: workspace:* version: link:../../../packages/arktype-adapter @@ -7562,13 +7785,13 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/start-bare: dependencies: @@ -7602,16 +7825,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/start-basic: dependencies: @@ -7639,7 +7862,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -7651,7 +7874,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.6.0 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -7660,10 +7883,10 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/start-basic-auth: dependencies: @@ -7700,7 +7923,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -7712,7 +7935,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) dotenv: specifier: ^17.2.3 version: 17.2.3 @@ -7727,10 +7950,10 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/start-basic-authjs: dependencies: @@ -7761,7 +7984,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -7773,7 +7996,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.6.0 - version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -7782,10 +8005,10 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/start-basic-cloudflare: dependencies: @@ -7807,10 +8030,10 @@ importers: devDependencies: '@cloudflare/vite-plugin': specifier: ^1.13.7 - version: 1.13.7(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(workerd@1.20251118.0)(wrangler@4.49.1) + version: 1.13.7(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(workerd@1.20251118.0)(wrangler@4.49.1) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -7822,7 +8045,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.6.0 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -7831,10 +8054,10 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) wrangler: specifier: ^4.49.1 version: 4.49.1 @@ -7874,7 +8097,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -7886,7 +8109,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -7895,10 +8118,10 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/start-basic-rsc: dependencies: @@ -7929,7 +8152,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: 4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/react': specifier: ^19.2.2 version: 19.2.2 @@ -7938,7 +8161,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: 4.1.18 version: 4.1.18 @@ -7947,10 +8170,10 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/start-basic-static: dependencies: @@ -7968,7 +8191,7 @@ importers: version: link:../../../packages/start-static-server-functions '@vitejs/plugin-react': specifier: ^5.1.0 - version: 5.1.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) react: specifier: ^19.2.0 version: 19.2.0 @@ -7984,7 +8207,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: 4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -8002,16 +8225,16 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.3 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/start-bun: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-devtools': specifier: ^0.7.0 version: 0.7.0(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(csstype@3.1.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10) @@ -8041,7 +8264,7 @@ importers: version: 4.1.18 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) devDependencies: '@tanstack/eslint-config': specifier: ^0.3.2 @@ -8066,7 +8289,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^5.0.3 - version: 5.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) jsdom: specifier: ^27.0.0 version: 27.0.0(postcss@8.5.6) @@ -8078,10 +8301,10 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) web-vitals: specifier: ^5.1.0 version: 5.1.0 @@ -8102,7 +8325,7 @@ importers: version: link:../../../packages/react-start '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) react: specifier: ^19.2.0 version: 19.2.0 @@ -8114,14 +8337,14 @@ importers: version: 0.5.1 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tailwind-merge: specifier: ^2.6.0 version: 2.6.0 devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -8139,10 +8362,10 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/start-convex-trellaux: dependencies: @@ -8203,7 +8426,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -8215,7 +8438,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -8224,10 +8447,10 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/start-counter: dependencies: @@ -8258,13 +8481,13 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/start-i18n-paraglide: dependencies: @@ -8292,7 +8515,7 @@ importers: version: 2.4.0(babel-plugin-macros@3.1.0) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -8304,7 +8527,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.7.0 - version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -8313,10 +8536,10 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/start-large: dependencies: @@ -8350,7 +8573,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -8362,7 +8585,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -8371,10 +8594,10 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/start-material-ui: dependencies: @@ -8423,16 +8646,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/start-streaming-data-from-server-functions: dependencies: @@ -8466,16 +8689,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/start-supabase-basic: dependencies: @@ -8506,7 +8729,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/react': specifier: ^19.2.2 version: 19.2.2 @@ -8515,7 +8738,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -8524,10 +8747,10 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/start-tailwind-v4: dependencies: @@ -8555,7 +8778,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -8567,7 +8790,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -8576,10 +8799,10 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/start-trellaux: dependencies: @@ -8631,7 +8854,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -8643,7 +8866,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -8652,10 +8875,10 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/start-workos: dependencies: @@ -8695,22 +8918,22 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/react/view-transitions: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -8744,19 +8967,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/with-framer-motion: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -8790,19 +9013,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) typescript: specifier: ^5.7.2 version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/with-trpc: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-router': specifier: workspace:* version: link:../../../packages/react-router @@ -8848,19 +9071,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tsx: specifier: ^4.20.3 version: 4.20.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/react/with-trpc-react-query: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/react-query': specifier: ^5.90.7 version: 5.90.7(react@19.2.0) @@ -8915,19 +9138,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tsx: specifier: ^4.20.3 version: 4.20.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) examples/solid/authenticated-routes: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -8955,16 +9178,16 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/authenticated-routes-firebase: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -8998,16 +9221,16 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/basic: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-router': specifier: ^1.144.0 version: link:../../../packages/solid-router @@ -9035,16 +9258,16 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/basic-default-search-params: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-query': specifier: ^5.90.9 version: 5.90.9(solid-js@1.9.10) @@ -9072,16 +9295,16 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/basic-devtools-panel: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-router': specifier: ^1.144.0 version: link:../../../packages/solid-router @@ -9103,16 +9326,16 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/basic-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-router': specifier: ^1.144.0 version: link:../../../packages/solid-router @@ -9140,16 +9363,16 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/basic-non-nested-devtools: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-router': specifier: ^1.144.0 version: link:../../../packages/solid-router @@ -9177,16 +9400,16 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/basic-solid-query: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-query': specifier: ^5.90.9 version: 5.90.9(solid-js@1.9.10) @@ -9217,16 +9440,16 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/basic-solid-query-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-query': specifier: ^5.90.9 version: 5.90.9(solid-js@1.9.10) @@ -9260,10 +9483,10 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/basic-ssr-file-based: dependencies: @@ -9300,16 +9523,16 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/basic-ssr-streaming-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-router': specifier: ^1.144.0 version: link:../../../packages/solid-router @@ -9352,16 +9575,16 @@ importers: version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/basic-virtual-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -9392,16 +9615,16 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/basic-virtual-inside-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -9432,16 +9655,16 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/deferred-data: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-router': specifier: ^1.144.0 version: link:../../../packages/solid-router @@ -9466,16 +9689,16 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/i18n-paraglide: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -9500,16 +9723,16 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/kitchen-sink: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-router': specifier: ^1.144.0 version: link:../../../packages/solid-router @@ -9537,16 +9760,16 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/kitchen-sink-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-router': specifier: ^1.144.0 version: link:../../../packages/solid-router @@ -9577,16 +9800,16 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/kitchen-sink-solid-query: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-query': specifier: ^5.90.9 version: 5.90.9(solid-js@1.9.10) @@ -9620,16 +9843,16 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/kitchen-sink-solid-query-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -9666,16 +9889,16 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/large-file-based: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -9706,16 +9929,16 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/location-masking: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-query': specifier: ^5.90.9 version: 5.90.9(solid-js@1.9.10) @@ -9740,16 +9963,16 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/navigation-blocking: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-query': specifier: ^5.90.9 version: 5.90.9(solid-js@1.9.10) @@ -9774,16 +9997,16 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/quickstart: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-router': specifier: ^1.144.0 version: link:../../../packages/solid-router @@ -9802,10 +10025,10 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/quickstart-esbuild-file-based: dependencies: @@ -9842,7 +10065,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-router': specifier: ^1.144.0 version: link:../../../packages/solid-router @@ -9870,10 +10093,10 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/quickstart-rspack-file-based: dependencies: @@ -9996,13 +10219,13 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-dts: specifier: 4.0.3 - version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/router-monorepo-simple-lazy: dependencies: @@ -10030,13 +10253,13 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-dts: specifier: 4.0.3 - version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/router-monorepo-solid-query: dependencies: @@ -10070,19 +10293,19 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-dts: specifier: 4.0.3 - version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/scroll-restoration: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-router': specifier: ^1.144.0 version: link:../../../packages/solid-router @@ -10104,16 +10327,16 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/search-validator-adapters: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/arktype-adapter': specifier: workspace:* version: link:../../../packages/arktype-adapter @@ -10162,10 +10385,10 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/start-basic: dependencies: @@ -10190,7 +10413,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -10202,13 +10425,13 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/start-basic-auth: dependencies: @@ -10242,7 +10465,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -10260,13 +10483,13 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/start-basic-authjs: dependencies: @@ -10294,7 +10517,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -10306,13 +10529,13 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/start-basic-cloudflare: dependencies: @@ -10331,10 +10554,10 @@ importers: devDependencies: '@cloudflare/vite-plugin': specifier: ^1.13.7 - version: 1.13.7(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(workerd@1.20251118.0)(wrangler@4.49.1) + version: 1.13.7(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(workerd@1.20251118.0)(wrangler@4.49.1) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -10346,13 +10569,13 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) wrangler: specifier: ^4.49.1 version: 4.49.1 @@ -10374,10 +10597,10 @@ importers: devDependencies: '@netlify/vite-plugin-tanstack-start': specifier: ^1.1.4 - version: 1.1.4(@tanstack/solid-start@packages+solid-start)(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.8.0)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 1.1.4(@tanstack/solid-start@packages+solid-start)(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(encoding@0.1.13)(ioredis@5.8.0)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -10389,13 +10612,13 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/start-basic-nitro: dependencies: @@ -10414,13 +10637,13 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 nitro: specifier: npm:nitro-nightly@latest - version: nitro-nightly@3.0.1-20251230-165713-6e801e22(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@4.0.3)(ioredis@5.8.0)(lru-cache@11.2.2)(mysql2@3.15.3)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: nitro-nightly@3.0.1-20260227-181935-bfbb207c(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@4.0.3)(dotenv@17.2.3)(giget@2.0.0)(jiti@2.6.1)(mysql2@3.15.3)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) tailwindcss: specifier: ^4.1.18 version: 4.1.18 @@ -10429,13 +10652,13 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/start-basic-solid-query: dependencies: @@ -10469,7 +10692,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -10481,13 +10704,13 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/start-basic-static: dependencies: @@ -10515,7 +10738,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: 4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -10527,19 +10750,19 @@ importers: version: 5.8.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.3 - version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/start-bun: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -10566,7 +10789,7 @@ importers: version: 4.1.18 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) devDependencies: '@solidjs/testing-library': specifier: ^0.8.10 @@ -10594,13 +10817,13 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) web-vitals: specifier: ^5.1.0 version: 5.1.0 @@ -10612,7 +10835,7 @@ importers: version: 0.9.7(@standard-schema/spec@1.0.0)(better-auth@1.3.27(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10))(convex@1.28.2(@clerk/clerk-react@5.53.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0))(hono@4.7.10)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-router': specifier: ^1.144.0 version: link:../../../packages/solid-router @@ -10661,13 +10884,13 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/start-counter: dependencies: @@ -10704,13 +10927,13 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/start-i18n-paraglide: dependencies: @@ -10735,7 +10958,7 @@ importers: version: 2.4.0(babel-plugin-macros@3.1.0) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -10747,13 +10970,13 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/start-large: dependencies: @@ -10784,7 +11007,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -10796,13 +11019,13 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/start-streaming-data-from-server-functions: dependencies: @@ -10830,13 +11053,13 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/start-supabase-basic: dependencies: @@ -10864,7 +11087,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -10876,13 +11099,13 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/start-tailwind-v4: dependencies: @@ -10907,7 +11130,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@types/node': specifier: 22.10.2 version: 22.10.2 @@ -10919,19 +11142,19 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/view-transitions: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -10959,16 +11182,16 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/with-framer-motion: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/solid-router': specifier: ^1.144.0 version: link:../../../packages/solid-router @@ -10996,16 +11219,16 @@ importers: version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/solid/with-trpc: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -11045,10 +11268,10 @@ importers: version: 4.20.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) examples/vue/basic: dependencies: @@ -11070,19 +11293,19 @@ importers: devDependencies: '@tailwindcss/vite': specifier: 4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) typescript: specifier: ^5.7.2 version: 5.9.2 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue-tsc: specifier: ^3.1.5 version: 3.1.5(typescript@5.9.2) @@ -11091,7 +11314,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -11128,10 +11351,10 @@ importers: version: 8.44.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.8.3) '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) eslint-plugin-vue: specifier: ^9.33.0 version: 9.33.0(eslint@9.22.0(jiti@2.6.1)) @@ -11140,7 +11363,7 @@ importers: version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue-eslint-parser: specifier: ^9.4.3 version: 9.4.3(eslint@9.22.0(jiti@2.6.1)) @@ -11152,7 +11375,7 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@tanstack/router-plugin': specifier: workspace:* version: link:../../../packages/router-plugin @@ -11180,20 +11403,118 @@ importers: devDependencies: '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3)) typescript: specifier: ~5.8.3 version: 5.8.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue-tsc: specifier: ^3.1.5 version: 3.1.5(typescript@5.8.3) + packages/angular-router-devtools: + dependencies: + '@angular/core': + specifier: 21.0.4 + version: 21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1) + '@tanstack/angular-router-experimental': + specifier: workspace:^ + version: link:../angular-router-experimental + '@tanstack/router-core': + specifier: workspace:* + version: link:../router-core + '@tanstack/router-devtools-core': + specifier: workspace:^ + version: link:../router-devtools-core + tslib: + specifier: ^2.3.0 + version: 2.8.1 + devDependencies: + '@analogjs/vite-plugin-angular': + specifier: ^2.0.0 + version: 2.2.1(@angular/build@21.0.4(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(@angular/compiler@21.0.4)(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.10.2)(chokidar@4.0.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(ng-packagr@21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)(vitest@4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1)) + '@analogjs/vitest-angular': + specifier: ^2.2.1 + version: 2.2.1(2019a81a47365156328ff75aeb8a7511) + '@angular/compiler': + specifier: 21.0.4 + version: 21.0.4 + '@angular/compiler-cli': + specifier: 21.0.4 + version: 21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2) + ng-packagr: + specifier: ^21.0.0 + version: 21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2) + + packages/angular-router-experimental: + dependencies: + '@angular/core': + specifier: ^21.0.0 + version: 21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1) + '@tanstack/angular-store': + specifier: ^0.8.0 + version: 0.8.0(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)) + '@tanstack/history': + specifier: workspace:* + version: link:../history + '@tanstack/router-core': + specifier: workspace:* + version: link:../router-core + isbot: + specifier: ^5.1.22 + version: 5.1.28 + tiny-invariant: + specifier: ^1.3.3 + version: 1.3.3 + tiny-warning: + specifier: ^1.0.3 + version: 1.0.3 + tslib: + specifier: ^2.3.0 + version: 2.8.1 + devDependencies: + '@analogjs/vite-plugin-angular': + specifier: ^2.2.1 + version: 2.2.1(@angular/build@21.0.4(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(@angular/compiler@21.0.4)(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.10.2)(chokidar@4.0.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(ng-packagr@21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)(vitest@4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1)) + '@analogjs/vitest-angular': + specifier: ^2.2.1 + version: 2.2.1(2019a81a47365156328ff75aeb8a7511) + '@angular/compiler': + specifier: ^21.0.0 + version: 21.0.4 + '@angular/compiler-cli': + specifier: ^21.0.0 + version: 21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2) + '@angular/platform-browser': + specifier: ^21.0.0 + version: 21.0.4(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)) + '@testing-library/angular': + specifier: ^19.0.0 + version: 19.0.0(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/router@21.0.6(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@testing-library/dom@10.4.1) + '@testing-library/jest-dom': + specifier: ^6.6.3 + version: 6.6.3 + combinate: + specifier: ^1.1.11 + version: 1.1.11 + jsdom: + specifier: ^27.4.0 + version: 27.4.0 + ng-packagr: + specifier: ^21.0.0 + version: 21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2) + vibe-rules: + specifier: ^0.2.57 + version: 0.2.57 + zod: + specifier: ^3.24.2 + version: 3.25.57 + packages/arktype-adapter: devDependencies: '@tanstack/react-router': @@ -11237,13 +11558,13 @@ importers: dependencies: nitropack: specifier: ^2.12.6 - version: 2.12.6(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(encoding@0.1.13)(mysql2@3.15.3) + version: 2.12.6(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(encoding@0.1.13)(mysql2@3.15.3)(rolldown@1.0.0-rc.6) pathe: specifier: ^2.0.3 version: 2.0.3 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) packages/react-router: dependencies: @@ -11274,7 +11595,7 @@ importers: version: 16.2.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -11305,7 +11626,7 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) react: specifier: ^19.2.0 version: 19.2.0 @@ -11314,7 +11635,7 @@ importers: version: 19.2.0(react@19.2.0) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) packages/react-router-ssr-query: dependencies: @@ -11333,7 +11654,7 @@ importers: version: link:../react-router '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) react: specifier: ^19.2.0 version: 19.2.0 @@ -11375,7 +11696,7 @@ importers: version: 19.2.0(react@19.2.0) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) packages/react-start-client: dependencies: @@ -11406,7 +11727,7 @@ importers: version: 16.2.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) packages/react-start-server: dependencies: @@ -11428,7 +11749,7 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) react: specifier: ^19.2.0 version: 19.2.0 @@ -11503,7 +11824,7 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) react: specifier: ^19.2.0 version: 19.2.0 @@ -11512,7 +11833,7 @@ importers: version: 19.2.0(react@19.2.0) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) packages/router-devtools-core: dependencies: @@ -11537,10 +11858,10 @@ importers: version: 1.9.10 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) packages/router-generator: dependencies: @@ -11613,7 +11934,7 @@ importers: version: link:../virtual-file-routes babel-dead-code-elimination: specifier: ^1.0.11 - version: 1.0.11 + version: 1.0.12 chokidar: specifier: ^3.6.0 version: 3.6.0 @@ -11622,10 +11943,10 @@ importers: version: 2.3.4 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) webpack: specifier: '>=5.92.0' version: 5.97.1(@swc/core@1.10.15(@swc/helpers@0.5.15)) @@ -11742,7 +12063,7 @@ importers: version: 1.9.10 vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) zod: specifier: ^3.23.8 version: 3.25.57 @@ -11764,10 +12085,10 @@ importers: version: 1.9.10 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) packages/solid-router-ssr-query: dependencies: @@ -11792,7 +12113,7 @@ importers: version: 1.9.10 vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) packages/solid-start: dependencies: @@ -11826,7 +12147,7 @@ importers: version: link:../router-utils vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) packages/solid-start-client: dependencies: @@ -11857,7 +12178,7 @@ importers: version: 6.6.3 vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) packages/solid-start-server: dependencies: @@ -11888,7 +12209,7 @@ importers: version: 5.8.2 vite-plugin-solid: specifier: ^2.11.10 - version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) packages/start-client-core: dependencies: @@ -11947,7 +12268,7 @@ importers: version: link:../start-server-core babel-dead-code-elimination: specifier: ^1.0.11 - version: 1.0.11 + version: 1.0.12 cheerio: specifier: ^1.0.0 version: 1.0.0 @@ -11959,7 +12280,7 @@ importers: version: 2.0.3 srvx: specifier: ^0.10.0 - version: 0.10.0 + version: 0.10.1 tinyglobby: specifier: ^0.2.15 version: 0.2.15 @@ -11968,7 +12289,7 @@ importers: version: 1.6.1 vitefu: specifier: ^1.1.1 - version: 1.1.1(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + version: 1.1.1(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) xmlbuilder2: specifier: ^4.0.3 version: 4.0.3 @@ -11984,7 +12305,7 @@ importers: version: 7.20.5 vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) packages/start-server-core: dependencies: @@ -12002,7 +12323,7 @@ importers: version: link:../start-storage-context h3-v2: specifier: npm:h3@2.0.1-rc.7 - version: h3@2.0.1-rc.7(crossws@0.4.1(srvx@0.10.0)) + version: h3@2.0.1-rc.7(crossws@0.4.4(srvx@0.11.8)) seroval: specifier: ^1.4.1 version: 1.4.1 @@ -12102,10 +12423,10 @@ importers: version: 3.0.3 '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -12129,11 +12450,11 @@ importers: version: link:../vue-router vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) devDependencies: '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) vue: specifier: ^3.5.13 version: 3.5.25(typescript@5.9.2) @@ -12155,7 +12476,7 @@ importers: version: link:../vue-router '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) vue: specifier: ^3.5.25 version: 3.5.25(typescript@5.9.2) @@ -12189,10 +12510,10 @@ importers: version: link:../router-utils '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) vite: specifier: ^7.1.7 - version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue: specifier: ^3.5.25 version: 3.5.25(typescript@5.9.2) @@ -12223,7 +12544,7 @@ importers: version: 8.1.0(@vue/compiler-sfc@3.5.25)(vue@3.5.25(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) vue: specifier: ^3.5.25 version: 3.5.25(typescript@5.9.2) @@ -12248,7 +12569,7 @@ importers: devDependencies: '@vitejs/plugin-vue-jsx': specifier: ^4.1.2 - version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) + version: 4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2)) typescript: specifier: ^5.7.2 version: 5.9.2 @@ -12279,16 +12600,237 @@ importers: packages: + '@acemir/cssom@0.9.30': + resolution: {integrity: sha512-9CnlMCI0LmCIq0olalQqdWrJHPzm0/tw3gzOA9zJSgvFX7Xau3D24mAGa4BtwxwY69nsuJW6kQqqCzf/mEcQgg==} + '@adobe/css-tools@4.4.1': resolution: {integrity: sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==} + '@algolia/abtesting@1.6.1': + resolution: {integrity: sha512-wV/gNRkzb7sI9vs1OneG129hwe3Q5zPj7zigz3Ps7M5Lpo2hSorrOnXNodHEOV+yXE/ks4Pd+G3CDFIjFTWhMQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-abtesting@5.40.1': + resolution: {integrity: sha512-cxKNATPY5t+Mv8XAVTI57altkaPH+DZi4uMrnexPxPHODMljhGYY+GDZyHwv9a+8CbZHcY372OkxXrDMZA4Lnw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.40.1': + resolution: {integrity: sha512-XP008aMffJCRGAY8/70t+hyEyvqqV7YKm502VPu0+Ji30oefrTn2al7LXkITz7CK6I4eYXWRhN6NaIUi65F1OA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.40.1': + resolution: {integrity: sha512-gWfQuQUBtzUboJv/apVGZMoxSaB0M4Imwl1c9Ap+HpCW7V0KhjBddqF2QQt5tJZCOFsfNIgBbZDGsEPaeKUosw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.40.1': + resolution: {integrity: sha512-RTLjST/t+lsLMouQ4zeLJq2Ss+UNkLGyNVu+yWHanx6kQ3LT5jv8UvPwyht9s7R6jCPnlSI77WnL80J32ZuyJg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.40.1': + resolution: {integrity: sha512-2FEK6bUomBzEYkTKzD0iRs7Ljtjb45rKK/VSkyHqeJnG+77qx557IeSO0qVFE3SfzapNcoytTofnZum0BQ6r3Q==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.40.1': + resolution: {integrity: sha512-Nju4NtxAvXjrV2hHZNLKVJLXjOlW6jAXHef/CwNzk1b2qIrCWDO589ELi5ZHH1uiWYoYyBXDQTtHmhaOVVoyXg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.40.1': + resolution: {integrity: sha512-Mw6pAUF121MfngQtcUb5quZVqMC68pSYYjCRZkSITC085S3zdk+h/g7i6FxnVdbSU6OztxikSDMh1r7Z+4iPlA==} + engines: {node: '>= 14.0.0'} + + '@algolia/ingestion@1.40.1': + resolution: {integrity: sha512-z+BPlhs45VURKJIxsR99NNBWpUEEqIgwt10v/fATlNxc4UlXvALdOsWzaFfe89/lbP5Bu4+mbO59nqBC87ZM/g==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.40.1': + resolution: {integrity: sha512-VJMUMbO0wD8Rd2VVV/nlFtLJsOAQvjnVNGkMkspFiFhpBA7s/xJOb+fJvvqwKFUjbKTUA7DjiSi1ljSMYBasXg==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.40.1': + resolution: {integrity: sha512-ehvJLadKVwTp9Scg9NfzVSlBKH34KoWOQNTaN8i1Ac64AnO6iH2apJVSP6GOxssaghZ/s8mFQsDH3QIZoluFHA==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.40.1': + resolution: {integrity: sha512-PbidVsPurUSQIr6X9/7s34mgOMdJnn0i6p+N6Ab+lsNhY5eiu+S33kZEpZwkITYBCIbhzDLOvb7xZD3gDi+USA==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.40.1': + resolution: {integrity: sha512-ThZ5j6uOZCF11fMw9IBkhigjOYdXGXQpj6h4k+T9UkZrF2RlKcPynFzDeRgaLdpYk8Yn3/MnFbwUmib7yxj5Lw==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.40.1': + resolution: {integrity: sha512-H1gYPojO6krWHnUXu/T44DrEun/Wl95PJzMXRcM/szstNQczSbwq6wIFJPI9nyE95tarZfUNU3rgorT+wZ6iCQ==} + engines: {node: '>= 14.0.0'} + '@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'} + + '@analogjs/vite-plugin-angular@2.2.1': + resolution: {integrity: sha512-SYtaWKPHE+BtywbSOQl5r31bIDuph7SCzCbRMsrS7H3MvS1SDc9bsTdn+RewYKqKUJzReRwNe9CDLdVCY8eLFg==} + peerDependencies: + '@angular-devkit/build-angular': ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 + '@angular/build': ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 + peerDependenciesMeta: + '@angular-devkit/build-angular': + optional: true + '@angular/build': + optional: true + + '@analogjs/vitest-angular@2.2.1': + resolution: {integrity: sha512-fwu8hZZPXK1FVHIxGhIjg+KF5vHSOh9IzGnygJNEHC0Q6con9BkjsdlxdTlFPpdBcjvj440kjEkCX6vm5PBL1A==} + peerDependencies: + '@analogjs/vite-plugin-angular': '*' + '@angular-devkit/architect': '>=0.1500.0 < 0.2200.0' + vitest: ^1.3.1 || ^2.0.0 || ^3.0.0 || ^4.0.0 + '@andrewbranch/untar.js@1.0.3': resolution: {integrity: sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==} + '@angular-devkit/architect@0.2100.4': + resolution: {integrity: sha512-tKtb0I8AU59m75JjHlL1XEsoPxVaEWhnHKeesDpk49RNm0sVqWnfXesse8IXqdVds0Hpjisc3In7j4xKbigfXg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@angular-devkit/core@21.0.4': + resolution: {integrity: sha512-Mbze8tMtBs7keSOx4UIR9utLQs1uSiGjfTaOkCu/dbBEiG6umopy1OlUCvHiHyeiYqh+wR0yiGtTS+Cexo5iLg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^4.0.0 + peerDependenciesMeta: + chokidar: + optional: true + + '@angular-devkit/schematics@21.0.4': + resolution: {integrity: sha512-am39kuaBB/v7RL++bsepvUhP2JKDmfMLQbyJvyHIG6UxnQztxQYZ2/CiPb91dz9NMiqAZqIJaN+kqvIc8h7AeQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@angular/build@21.0.4': + resolution: {integrity: sha512-tnh9llk9288noG6buV9HtsAfR/QCVIArTsx9pFJebAFOIDyObpHItfWTnmqYBQecSNEwH5l4XlkDInbjxM9MuA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + '@angular/compiler': ^21.0.0 + '@angular/compiler-cli': ^21.0.0 + '@angular/core': ^21.0.0 + '@angular/localize': ^21.0.0 + '@angular/platform-browser': ^21.0.0 + '@angular/platform-server': ^21.0.0 + '@angular/service-worker': ^21.0.0 + '@angular/ssr': ^21.0.4 + karma: ^6.4.0 + less: ^4.2.0 + ng-packagr: ^21.0.0 + postcss: ^8.4.0 + tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 + tslib: ^2.3.0 + typescript: '>=5.9 <6.0' + vitest: ^4.0.8 + peerDependenciesMeta: + '@angular/core': + optional: true + '@angular/localize': + optional: true + '@angular/platform-browser': + optional: true + '@angular/platform-server': + optional: true + '@angular/service-worker': + optional: true + '@angular/ssr': + optional: true + karma: + optional: true + less: + optional: true + ng-packagr: + optional: true + postcss: + optional: true + tailwindcss: + optional: true + vitest: + optional: true + + '@angular/cli@21.0.4': + resolution: {integrity: sha512-L4uKhC3KorF04x9A7noff2m25Phkq54wdqzuWNnbGg3bNfOHdXMv97t2e02J1mk+XOeEcPfDJmOiXj4fcviCLA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true + + '@angular/common@21.0.4': + resolution: {integrity: sha512-hBEq0d01UNPgngxHApg4sVaX9y9xAV5BZnAnlVW0ph2uECZ03X7ortKwFDXeWMFd+0oPOLNqxr3WkzITPZ1d0g==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/core': 21.0.4 + rxjs: ^6.5.3 || ^7.4.0 + + '@angular/common@21.0.6': + resolution: {integrity: sha512-Yd8PF0dR37FAzqEcBHAyVCiSGMJOezSJe6rV/4BC6AVLfaZ7oZLl8CNVxKsod2UHd6rKxt1hzx05QdVcVvYNeA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/core': 21.0.6 + rxjs: ^6.5.3 || ^7.4.0 + + '@angular/compiler-cli@21.0.4': + resolution: {integrity: sha512-CZeTia783iQ2Pp8ulWa2itTKC4YW7gBM0H4MDc4wbKlN2NSNzzUlttL5sQ4lKKq8DUZk3Cmj3DfJbwsECtQe5Q==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@angular/compiler': 21.0.4 + typescript: '>=5.9 <6.0' + peerDependenciesMeta: + typescript: + optional: true + + '@angular/compiler@21.0.4': + resolution: {integrity: sha512-I5Y1BjizOv5gTiix3+iRycjQtXgUECJTgacTZw8wZmu2T1Qv0BMRqTeXZ87iaD6EUNxFLwneJq3AOrZe3imtKw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@angular/core@21.0.4': + resolution: {integrity: sha512-VGFTvPdG5eowHi+BSYHRIvaFJuxhMejgulNKVz+ewDcq/U0KkNtEYFL2w0sNz4jBMrC4YsdRU/PwIpL/ATHryg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/compiler': 21.0.4 + rxjs: ^6.5.3 || ^7.4.0 + zone.js: ~0.15.0 || ~0.16.0 + peerDependenciesMeta: + '@angular/compiler': + optional: true + zone.js: + optional: true + + '@angular/forms@21.0.4': + resolution: {integrity: sha512-xWU5TN1TINX0gdIApEG5YVdHQwBzVwRSNr3Wqx/nOkOvmUZlFCcgnpvO5hj50wlp2ASvZX3EsRNJQr6kV0F8bw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/common': 21.0.4 + '@angular/core': 21.0.4 + '@angular/platform-browser': 21.0.4 + '@standard-schema/spec': ^1.0.0 + rxjs: ^6.5.3 || ^7.4.0 + + '@angular/platform-browser@21.0.4': + resolution: {integrity: sha512-f2gYavjKrf60JYkBt6G2M4bCLZGnh3ZXf7OOpBzCladdzxoC/z7RFhtJ+3q5pFUkhRlgD+zgNtdW5dDDoplUbg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/animations': 21.0.4 + '@angular/common': 21.0.4 + '@angular/core': 21.0.4 + peerDependenciesMeta: + '@angular/animations': + optional: true + + '@angular/router@21.0.6': + resolution: {integrity: sha512-HOfomKq7jRSgxt/uUvpdbB8RNaYuGB/FJQ3BfQCFfGw1O9L3B72b7Hilk6AcjCruul6cfv/kmT4EB6Vqi3dQtA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/common': 21.0.6 + '@angular/core': 21.0.6 + '@angular/platform-browser': 21.0.6 + rxjs: ^6.5.3 || ^7.4.0 + '@arethetypeswrong/cli@0.18.2': resolution: {integrity: sha512-PcFM20JNlevEDKBg4Re29Rtv2xvjvQZzg7ENnrWFSS0PHgdP2njibVFw+dRUhNkPgNfac9iUqO0ohAXqQL4hbw==} engines: {node: '>=20'} @@ -12310,9 +12852,15 @@ packages: '@asamuzakjp/css-color@4.0.5': resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==} + '@asamuzakjp/css-color@4.1.1': + resolution: {integrity: sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ==} + '@asamuzakjp/dom-selector@6.5.6': resolution: {integrity: sha512-Mj3Hu9ymlsERd7WOsUKNUZnJYL4IZ/I9wVVYgtvOsWYiEFbkQ4G7VRIh2USxTVW4BBDIsLG+gBUgqOqf2Kvqow==} + '@asamuzakjp/dom-selector@6.7.6': + resolution: {integrity: sha512-hBaJER6A9MpdG3WgdlOolHmbOYvSk46y7IQN/1+iqiCuUu6iWdQrs9DGKF8ocqsEqWujWf/V7b7vaDgiUmIvUg==} + '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} @@ -12334,8 +12882,12 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.5': - resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} engines: {node: '>=6.9.0'} '@babel/core@7.28.5': @@ -12410,6 +12962,10 @@ packages: resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} 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.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -12426,6 +12982,11 @@ packages: resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} + '@babel/parser@7.27.5': + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/parser@7.28.5': resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} @@ -12537,6 +13098,10 @@ packages: resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} @@ -12813,6 +13378,10 @@ packages: peerDependencies: postcss: ^8.4 + '@csstools/css-syntax-patches-for-csstree@1.0.22': + resolution: {integrity: sha512-qBcx6zYlhleiFfdtzkRgwNC7VVoAwfK76Vmsw5t+PbvtdknO9StgRk7ROvq9so1iqbdW4uLIDAsXRsTfUrIoOw==} + engines: {node: '>=18'} + '@csstools/css-tokenizer@3.0.3': resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} engines: {node: '>=18'} @@ -12946,6 +13515,18 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.26.0': + resolution: {integrity: sha512-hj0sKNCQOOo2fgyII3clmJXP28VhgDfU5iy3GNHlWO76KG6N7x4D9ezH5lJtQTG+1J6MFDAJXC1qsI+W+LvZoA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.23.0': resolution: {integrity: sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==} engines: {node: '>=18'} @@ -12970,6 +13551,18 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.26.0': + resolution: {integrity: sha512-DDnoJ5eoa13L8zPh87PUlRd/IyFaIKOlRbxiwcSbeumcJ7UZKdtuMCHa1Q27LWQggug6W4m28i4/O2qiQQ5NZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.23.0': resolution: {integrity: sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==} engines: {node: '>=18'} @@ -12994,6 +13587,18 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.26.0': + resolution: {integrity: sha512-C0hkDsYNHZkBtPxxDx177JN90/1MiCpvBNjz1f5yWJo1+5+c5zr8apjastpEG+wtPjo9FFtGG7owSsAxyKiHxA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.23.0': resolution: {integrity: sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==} engines: {node: '>=18'} @@ -13018,6 +13623,18 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.26.0': + resolution: {integrity: sha512-bKDkGXGZnj0T70cRpgmv549x38Vr2O3UWLbjT2qmIkdIWcmlg8yebcFWoT9Dku7b5OV3UqPEuNKRzlNhjwUJ9A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.23.0': resolution: {integrity: sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==} engines: {node: '>=18'} @@ -13042,6 +13659,18 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.26.0': + resolution: {integrity: sha512-6Z3naJgOuAIB0RLlJkYc81An3rTlQ/IeRdrU3dOea8h/PvZSgitZV+thNuIccw0MuK1GmIAnAmd5TrMZad8FTQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.23.0': resolution: {integrity: sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==} engines: {node: '>=18'} @@ -13066,6 +13695,18 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.26.0': + resolution: {integrity: sha512-OPnYj0zpYW0tHusMefyaMvNYQX5pNQuSsHFTHUBNp3vVXupwqpxofcjVsUx11CQhGVkGeXjC3WLjh91hgBG2xw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.23.0': resolution: {integrity: sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==} engines: {node: '>=18'} @@ -13090,6 +13731,18 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.26.0': + resolution: {integrity: sha512-jix2fa6GQeZhO1sCKNaNMjfj5hbOvoL2F5t+w6gEPxALumkpOV/wq7oUBMHBn2hY2dOm+mEV/K+xfZy3mrsxNQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.23.0': resolution: {integrity: sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==} engines: {node: '>=18'} @@ -13114,6 +13767,18 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.26.0': + resolution: {integrity: sha512-tccJaH5xHJD/239LjbVvJwf6T4kSzbk6wPFerF0uwWlkw/u7HL+wnAzAH5GB2irGhYemDgiNTp8wJzhAHQ64oA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.23.0': resolution: {integrity: sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==} engines: {node: '>=18'} @@ -13138,6 +13803,18 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.26.0': + resolution: {integrity: sha512-IMJYN7FSkLttYyTbsbme0Ra14cBO5z47kpamo16IwggzzATFY2lcZAwkbcNkWiAduKrTgFJP7fW5cBI7FzcuNQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.23.0': resolution: {integrity: sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==} engines: {node: '>=18'} @@ -13162,6 +13839,18 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.26.0': + resolution: {integrity: sha512-JY8NyU31SyRmRpuc5W8PQarAx4TvuYbyxbPIpHAZdr/0g4iBr8KwQBS4kiiamGl2f42BBecHusYCsyxi7Kn8UQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.23.0': resolution: {integrity: sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==} engines: {node: '>=18'} @@ -13186,6 +13875,18 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.26.0': + resolution: {integrity: sha512-XITaGqGVLgk8WOHw8We9Z1L0lbLFip8LyQzKYFKO4zFo1PFaaSKsbNjvkb7O8kEXytmSGRkYpE8LLVpPJpsSlw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.23.0': resolution: {integrity: sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==} engines: {node: '>=18'} @@ -13210,6 +13911,18 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.26.0': + resolution: {integrity: sha512-MkggfbDIczStUJwq9wU7gQ7kO33d8j9lWuOCDifN9t47+PeI+9m2QVh51EI/zZQ1spZtFMC1nzBJ+qNGCjJnsg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.23.0': resolution: {integrity: sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==} engines: {node: '>=18'} @@ -13234,6 +13947,18 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.26.0': + resolution: {integrity: sha512-fUYup12HZWAeccNLhQ5HwNBPr4zXCPgUWzEq2Rfw7UwqwfQrFZ0SR/JljaURR8xIh9t+o1lNUFTECUTmaP7yKA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.23.0': resolution: {integrity: sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==} engines: {node: '>=18'} @@ -13258,6 +13983,18 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.26.0': + resolution: {integrity: sha512-MzRKhM0Ip+//VYwC8tialCiwUQ4G65WfALtJEFyU0GKJzfTYoPBw5XNWf0SLbCUYQbxTKamlVwPmcw4DgZzFxg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.23.0': resolution: {integrity: sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==} engines: {node: '>=18'} @@ -13282,6 +14019,18 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.26.0': + resolution: {integrity: sha512-QhCc32CwI1I4Jrg1enCv292sm3YJprW8WHHlyxJhae/dVs+KRWkbvz2Nynl5HmZDW/m9ZxrXayHzjzVNvQMGQA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.23.0': resolution: {integrity: sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==} engines: {node: '>=18'} @@ -13306,6 +14055,18 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.26.0': + resolution: {integrity: sha512-1D6vi6lfI18aNT1aTf2HV+RIlm6fxtlAp8eOJ4mmnbYmZ4boz8zYDar86sIYNh0wmiLJEbW/EocaKAX6Yso2fw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.23.0': resolution: {integrity: sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==} engines: {node: '>=18'} @@ -13330,6 +14091,18 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.26.0': + resolution: {integrity: sha512-rnDcepj7LjrKFvZkx+WrBv6wECeYACcFjdNPvVPojCPJD8nHpb3pv3AuR9CXgdnjH1O23btICj0rsp0L9wAnHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.10': resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} engines: {node: '>=18'} @@ -13342,6 +14115,18 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.26.0': + resolution: {integrity: sha512-FSWmgGp0mDNjEXXFcsf12BmVrb+sZBBBlyh3LwB/B9ac3Kkc8x5D2WimYW9N7SUkolui8JzVnVlWh7ZmjCpnxw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.23.0': resolution: {integrity: sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==} engines: {node: '>=18'} @@ -13366,6 +14151,18 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.26.0': + resolution: {integrity: sha512-0QfciUDFryD39QoSPUDshj4uNEjQhp73+3pbSAaxjV2qGOEDsM67P7KbJq7LzHoVl46oqhIhJ1S+skKGR7lMXA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.23.0': resolution: {integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==} engines: {node: '>=18'} @@ -13390,6 +14187,18 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.26.0': + resolution: {integrity: sha512-vmAK+nHhIZWImwJ3RNw9hX3fU4UGN/OqbSE0imqljNbUQC3GvVJ1jpwYoTfD6mmXmQaxdJY6Hn4jQbLGJKg5Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.23.0': resolution: {integrity: sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==} engines: {node: '>=18'} @@ -13414,12 +14223,36 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.26.0': + resolution: {integrity: sha512-GPXF7RMkJ7o9bTyUsnyNtrFMqgM3X+uM/LWw4CeHIjqc32fm0Ir6jKDnWHpj8xHFstgWDUYseSABK9KCkHGnpg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.25.10': resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.26.0': + resolution: {integrity: sha512-nUHZ5jEYqbBthbiBksbmHTlbb5eElyVfs/s1iHQ8rLBq1eWsd5maOnDpCocw1OM8kFK747d1Xms8dXJHtduxSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.23.0': resolution: {integrity: sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==} engines: {node: '>=18'} @@ -13444,6 +14277,18 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.26.0': + resolution: {integrity: sha512-TMg3KCTCYYaVO+R6P5mSORhcNDDlemUVnUbb8QkboUtOhb5JWKAzd5uMIMECJQOxHZ/R+N8HHtDF5ylzLfMiLw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.23.0': resolution: {integrity: sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==} engines: {node: '>=18'} @@ -13468,6 +14313,18 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.26.0': + resolution: {integrity: sha512-apqYgoAUd6ZCb9Phcs8zN32q6l0ZQzQBdVXOofa6WvHDlSOhwCWgSfVQabGViThS40Y1NA4SCvQickgZMFZRlA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.23.0': resolution: {integrity: sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==} engines: {node: '>=18'} @@ -13492,6 +14349,18 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.26.0': + resolution: {integrity: sha512-FGJAcImbJNZzLWu7U6WB0iKHl4RuY4TsXEwxJPl9UZLS47agIZuILZEX3Pagfw7I4J3ddflomt9f0apfaJSbaw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.23.0': resolution: {integrity: sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==} engines: {node: '>=18'} @@ -13516,6 +14385,18 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.26.0': + resolution: {integrity: sha512-WAckBKaVnmFqbEhbymrPK7M086DQMpL1XoRbpmN0iW8k5JSXjDRQBhcZNa0VweItknLq9eAeCL34jK7/CDcw7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -13598,6 +14479,15 @@ packages: resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@exodus/bytes@1.8.0': + resolution: {integrity: sha512-8JPn18Bcp8Uo1T82gR8lh2guEOa5KKU/IEKvvdp0sgmi7coPBWf1Doi1EXsGZb2ehc8ym/StJCjffYV+ne7sXQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@exodus/crypto': ^1.0.0-rc.4 + peerDependenciesMeta: + '@exodus/crypto': + optional: true + '@fastify/accept-negotiator@2.0.1': resolution: {integrity: sha512-/c/TW2bO/v9JeEgoD/g1G5GxGeCF1Hafdf79WPmUlgYiBXummY0oX3VVq4yFkKKVBKDNlaDUYoab7g38RpPqCQ==} @@ -14125,6 +15015,37 @@ packages: resolution: {integrity: sha512-cvz/C1rF5WBxzHbEoiBoI6Sz6q6M+TdxfWkEGBYTD77opY8i8WN01prUWXEM87GPF4SZcyIySez9U0Ccm12oFQ==} engines: {node: '>=18.0.0'} + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.3.2': + resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': 22.10.2 + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@5.1.19': + resolution: {integrity: sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': 22.10.2 + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': 22.10.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/confirm@5.1.4': resolution: {integrity: sha512-EsiT7K4beM5fN5Mz6j866EFA9+v9d5o9VUra3hrg8zY4GHmCS8b616FErbdo5eyKoVotBQkHzMIeeKYsKDStDw==} engines: {node: '>=18'} @@ -14135,10 +15056,122 @@ packages: resolution: {integrity: sha512-/vyCWhET0ktav/mUeBqJRYTwmjFPIKPRYb3COAw7qORULgipGSUO2vL32lQKki3UxDKJ8BvuEbokaoyCA6YlWw==} engines: {node: '>=18'} + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': 22.10.2 + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@4.2.23': + resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': 22.10.2 + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.23': + resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': 22.10.2 + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': 22.10.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/figures@1.0.10': resolution: {integrity: sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==} engines: {node: '>=18'} + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/input@4.3.1': + resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': 22.10.2 + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.23': + resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': 22.10.2 + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.23': + resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': 22.10.2 + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.9.0': + resolution: {integrity: sha512-X7/+dG9SLpSzRkwgG5/xiIzW0oMrV3C0HOa7YHG1WnrLK+vCQHfte4k/T80059YBdei29RBC3s+pSMvPJDU9/A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': 22.10.2 + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@4.1.11': + resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': 22.10.2 + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@3.2.2': + resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': 22.10.2 + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@4.4.2': + resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': 22.10.2 + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': 22.10.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/type@3.0.4': resolution: {integrity: sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==} engines: {node: '>=18'} @@ -14151,6 +15184,14 @@ packages: '@ioredis/commands@1.4.0': resolution: {integrity: sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==} + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -14159,6 +15200,10 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + '@jest/diff-sequences@30.0.1': resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -14332,6 +15377,13 @@ packages: cpu: [x64] os: [win32] + '@listr2/prompt-adapter-inquirer@3.0.5': + resolution: {integrity: sha512-WELs+hj6xcilkloBXYf9XXK8tYEnKsgLj01Xl5ONUJpKjmT5hGVUzNUS5tooUxs7pGMrw+jFD/41WpqW4V3LDA==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@inquirer/prompts': '>= 3 < 8' + listr2: 9.0.5 + '@lix-js/sdk@0.4.7': resolution: {integrity: sha512-pRbW+joG12L0ULfMiWYosIW0plmW4AsUdiPCp+Z8rAsElJ+wJ6in58zhD3UwUcd4BNcpldEGjg6PdA7e0RgsDQ==} engines: {node: '>=18'} @@ -14339,6 +15391,41 @@ packages: '@lix-js/server-protocol-schema@0.1.1': resolution: {integrity: sha512-jBeALB6prAbtr5q4vTuxnRZZv1M2rKe8iNqRQhFJ4Tv7150unEa0vKyz0hs8Gl3fUGsWaNJBh3J8++fpbrpRBQ==} + '@lmdb/lmdb-darwin-arm64@3.4.3': + resolution: {integrity: sha512-zR6Y45VNtW5s+A+4AyhrJk0VJKhXdkLhrySCpCu7PSdnakebsOzNxf58p5Xoq66vOSuueGAxlqDAF49HwdrSTQ==} + cpu: [arm64] + os: [darwin] + + '@lmdb/lmdb-darwin-x64@3.4.3': + resolution: {integrity: sha512-nfGm5pQksBGfaj9uMbjC0YyQreny/Pl7mIDtHtw6g7WQuCgeLullr9FNRsYyKplaEJBPrCVpEjpAznxTBIrXBw==} + cpu: [x64] + os: [darwin] + + '@lmdb/lmdb-linux-arm64@3.4.3': + resolution: {integrity: sha512-uX9eaPqWb740wg5D3TCvU/js23lSRSKT7lJrrQ8IuEG/VLgpPlxO3lHDywU44yFYdGS7pElBn6ioKFKhvALZlw==} + cpu: [arm64] + os: [linux] + + '@lmdb/lmdb-linux-arm@3.4.3': + resolution: {integrity: sha512-Kjqomp7i0rgSbYSUmv9JnXpS55zYT/YcW3Bdf9oqOTjcH0/8tFAP8MLhu/i9V2pMKIURDZk63Ww49DTK0T3c/Q==} + cpu: [arm] + os: [linux] + + '@lmdb/lmdb-linux-x64@3.4.3': + resolution: {integrity: sha512-7/8l20D55CfwdMupkc3fNxNJdn4bHsti2X0cp6PwiXlLeSFvAfWs5kCCx+2Cyje4l4GtN//LtKWjTru/9hDJQg==} + cpu: [x64] + os: [linux] + + '@lmdb/lmdb-win32-arm64@3.4.3': + resolution: {integrity: sha512-yWVR0e5Gl35EGJBsAuqPOdjtUYuN8CcTLKrqpQFoM+KsMadViVCulhKNhkcjSGJB88Am5bRPjMro4MBB9FS23Q==} + cpu: [arm64] + os: [win32] + + '@lmdb/lmdb-win32-x64@3.4.3': + resolution: {integrity: sha512-1JdBkcO0Vrua4LUgr4jAe4FUyluwCeq/pDkBrlaVjX3/BBWP1TzVjCL+TibWNQtPAL1BITXPAhlK5Ru4FBd/hg==} + cpu: [x64] + os: [win32] + '@loaderkit/resolve@1.0.4': resolution: {integrity: sha512-rJzYKVcV4dxJv+vW6jlvagF8zvGxHJ2+HTr1e2qOejfmGhAApgJHl8Aog4mMszxceTRiKTTbnpgmTO1bEZHV/A==} @@ -14360,6 +15447,16 @@ packages: '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + '@modelcontextprotocol/sdk@1.24.0': + resolution: {integrity: sha512-D8h5KXY2vHFW8zTuxn2vuZGN0HGrQ5No6LkHwlEA9trVgNdPL3TF1dSqKA7Dny6BbBYKSW/rOBDXdC8KJAjUCg==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + '@module-federation/error-codes@0.8.4': resolution: {integrity: sha512-55LYmrDdKb4jt+qr8qE8U3al62ZANp3FhfVaNPOaAmdTh0jHdD8M3yf5HKFlr5xVkVO4eV/F/J2NCfpbh+pEXQ==} @@ -14397,6 +15494,36 @@ packages: resolution: {integrity: sha512-JwqeCQ1U3fvccttHZq7Tk0m/TMC6WcFAQZdukypW3AzlJYKYTGNVd1ANU2GuhKnv4UQuOFj3oAl0LLG/gxFN1w==} engines: {node: '>=16'} + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} + cpu: [x64] + os: [win32] + '@mswjs/interceptors@0.37.6': resolution: {integrity: sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==} engines: {node: '>=18'} @@ -14481,14 +15608,120 @@ packages: '@types/react': optional: true + '@napi-rs/nice-android-arm-eabi@1.1.1': + resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/nice-android-arm64@1.1.1': + resolution: {integrity: sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/nice-darwin-arm64@1.1.1': + resolution: {integrity: sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/nice-darwin-x64@1.1.1': + resolution: {integrity: sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/nice-freebsd-x64@1.1.1': + resolution: {integrity: sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': + resolution: {integrity: sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/nice-linux-arm64-gnu@1.1.1': + resolution: {integrity: sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/nice-linux-arm64-musl@1.1.1': + resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/nice-linux-ppc64-gnu@1.1.1': + resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==} + engines: {node: '>= 10'} + cpu: [ppc64] + os: [linux] + + '@napi-rs/nice-linux-riscv64-gnu@1.1.1': + resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/nice-linux-s390x-gnu@1.1.1': + resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==} + engines: {node: '>= 10'} + cpu: [s390x] + os: [linux] + + '@napi-rs/nice-linux-x64-gnu@1.1.1': + resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/nice-linux-x64-musl@1.1.1': + resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/nice-openharmony-arm64@1.1.1': + resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [openharmony] + + '@napi-rs/nice-win32-arm64-msvc@1.1.1': + resolution: {integrity: sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/nice-win32-ia32-msvc@1.1.1': + resolution: {integrity: sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/nice-win32-x64-msvc@1.1.1': + resolution: {integrity: sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/nice@1.1.1': + resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} + engines: {node: '>= 10'} + '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} '@napi-rs/wasm-runtime@0.2.4': resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} - '@napi-rs/wasm-runtime@1.1.0': - resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==} + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} '@neon-rs/load@0.0.4': resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} @@ -14635,6 +15868,47 @@ packages: '@nothing-but/utils@0.17.0': resolution: {integrity: sha512-TuCHcHLOqDL0SnaAxACfuRHBNRgNJcNn9X0GiH5H3YSDBVquCr3qEIG3FOQAuMyZCbu9w8nk2CHhOsn7IvhIwQ==} + '@npmcli/agent@4.0.0': + resolution: {integrity: sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@npmcli/fs@5.0.0': + resolution: {integrity: sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@npmcli/git@7.0.1': + resolution: {integrity: sha512-+XTFxK2jJF/EJJ5SoAzXk3qwIDfvFc5/g+bD274LZ7uY7LE8sTfG6Z8rOanPl2ZEvZWqNvmEdtXC25cE54VcoA==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@npmcli/installed-package-contents@3.0.0': + resolution: {integrity: sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + '@npmcli/node-gyp@5.0.0': + resolution: {integrity: sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@npmcli/package-json@7.0.4': + resolution: {integrity: sha512-0wInJG3j/K40OJt/33ax47WfWMzZTm6OQxB9cDhTt5huCP2a9g2GnlsxmfN+PulItNPIpPrZ+kfwwUil7eHcZQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@npmcli/promise-spawn@8.0.3': + resolution: {integrity: sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==} + engines: {node: ^18.17.0 || >=20.5.0} + + '@npmcli/promise-spawn@9.0.1': + resolution: {integrity: sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@npmcli/redact@4.0.0': + resolution: {integrity: sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@npmcli/run-script@10.0.3': + resolution: {integrity: sha512-ER2N6itRkzWbbtVmZ9WKaWxVlKlOeBFF1/7xx+KA5J1xKa4JjUwBdb6tDpk0v1qA+d+VDwHI9qmLcXSWcmi+Rw==} + engines: {node: ^20.17.0 || >=22.9.0} + '@nx/nx-darwin-arm64@22.1.3': resolution: {integrity: sha512-4D/jXGsr3jcQ0vBo8aXXZMdfmC3n4OsZ1zjFaOXlF62Ujug+RqI/IvKxycT9r7Lr09PmW2OqBC01NfIWKoBLhg==} cpu: [arm64] @@ -14713,243 +15987,11 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - '@oxc-minify/binding-android-arm-eabi@0.106.0': - resolution: {integrity: sha512-J5PkKITrOtip9yvFuJbNq4voA0B65zgILsIeJZ6UBcjbdvQoYTSWfHs21OPfmNegJUT1uFB/kKkrw2VSSnGmaA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [android] - - '@oxc-minify/binding-android-arm64@0.106.0': - resolution: {integrity: sha512-ZmIOq0qdu1REaZN1rVES3TjNIhFFhTKB2SWLZb/42AJ5u5Ms8gQj/G1gRYh+Pa2dVKibZyiHycSiLnD0rkHUkA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - - '@oxc-minify/binding-darwin-arm64@0.106.0': - resolution: {integrity: sha512-Sz9Bivc1l9J6dbmId/xhzUkwTT8TQqoLb7SvWbdwxaBIstvqMe4S3zmWUgZKK/++X2Mtst8+iJh0nKZHt4uXjA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - - '@oxc-minify/binding-darwin-x64@0.106.0': - resolution: {integrity: sha512-FLOTIL3bn8bXvGKa0Ft1xQFVTSfYC+PwqpyCeEKarCEHLg9oYgvG+/PMBEVqctx5SHkikBemoja0bPmHa0YeqA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - - '@oxc-minify/binding-freebsd-x64@0.106.0': - resolution: {integrity: sha512-U/losZ9zyvDob3BuwalYqrCbyQEvRu14PftmCF3Bn0HWKFiTM26cPd6E5C5YpVvvHSomjVgN4omaoyT9tz4EvQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - - '@oxc-minify/binding-linux-arm-gnueabihf@0.106.0': - resolution: {integrity: sha512-VXPRE2F1PLbPqkC0+qICB210cFcCgabUGMBRALCA1o/TVqOYDFOc4a7tWT90NpcAaHbVqfw/zo6tSf2cXvKyKA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@oxc-minify/binding-linux-arm-musleabihf@0.106.0': - resolution: {integrity: sha512-cGU5EZQ1V3aFEnJs11HX/XyyqxhFrduPPA8Yv53VgZqGHxxLIrTolE3nhlPDXk7lIpUimSynrKfMiPEOKQQAWg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@oxc-minify/binding-linux-arm64-gnu@0.106.0': - resolution: {integrity: sha512-AOs41iJ2LcFNOLH8RBRu9hnygIX0FMDwrcpB0+wrJjBYED179HyfKeBH7kS9qHuVNxsnuUMo5jr8wr5uVR9T0Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - - '@oxc-minify/binding-linux-arm64-musl@0.106.0': - resolution: {integrity: sha512-Do0ku8LL2VVEFLFO0bzWjPTiZDk2VLkZcbBDzjnIYR7aTEjtwtouuoQK2LLpCcJsCTd3S02/nr/JvwpFLNtmVw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - - '@oxc-minify/binding-linux-ppc64-gnu@0.106.0': - resolution: {integrity: sha512-+TAQ3Xzgg5GIMms1SH6XF/KHwLtUIXPANV4iRFDknnmgaZwV/D9eIA+3crZ6TQmCavecNNH5We1mssQlK4CuGg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - - '@oxc-minify/binding-linux-riscv64-gnu@0.106.0': - resolution: {integrity: sha512-mQu0Zbeai9dkuMIF7fKDT9DyiUuP5iQhcp1NBJ8fkQxhLnS1RfjBiqb1XVcMUb0ZdZlh35TdP19BmbeqtWjDnQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - - '@oxc-minify/binding-linux-riscv64-musl@0.106.0': - resolution: {integrity: sha512-y4Q9Q3d++Lw4HTqC82OmXBdYzV9Btwhhtigi7OmzyVg09sfrjH1NAC3dn2EudWOixaEqsna3s+bKm4aoh6IUVA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - - '@oxc-minify/binding-linux-s390x-gnu@0.106.0': - resolution: {integrity: sha512-T/JrNIqqWDSynqqYW4+0Z1wxwXkaTP4/nwDfPQHP/8qFzTA+gNYsw7J7kyMOzkkQ//jwiOil4nJFgLwFDNVZeQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - - '@oxc-minify/binding-linux-x64-gnu@0.106.0': - resolution: {integrity: sha512-sZOPGQtg6xs/onafBI0W1nC6Bq3bfvR3FZY+dWPGdOxNb/kfOqotw9cmTlLvf3QUDiOKSW+dEV0AeTLtPStZSA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - - '@oxc-minify/binding-linux-x64-musl@0.106.0': - resolution: {integrity: sha512-UhE/5of53deyX4c5NYdCr7irLEiWRQ6cQkL5NPf0jtnXsIj661byN5Oidq5O2XBATAigvHdmAWG751uxr5utug==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - - '@oxc-minify/binding-openharmony-arm64@0.106.0': - resolution: {integrity: sha512-ChFHc+bcSawsIBB4grqeUY3W+4Eq9hVxBgQW5J93G4IO+fyXw6BWPyxUPT6ITsHdiVWlNS9SShBNJxu0MtzOtQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - - '@oxc-minify/binding-wasm32-wasi@0.106.0': - resolution: {integrity: sha512-i4vZVsJD/JMfcFaNm7q839IYrCoz3Q1G+4ARgCg7nPkHKzygBAecxf/RgVNqdKEEatm3ERypbUsOgrqYencdfg==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@oxc-minify/binding-win32-arm64-msvc@0.106.0': - resolution: {integrity: sha512-IOK/5A0CLkvSfLs4+60B6+RjLPyyKP525QowLi9zVo6LpJBEcK8BkvsBChQaauSScKyWnMWZhhfBJXFAGx1fWA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - - '@oxc-minify/binding-win32-ia32-msvc@0.106.0': - resolution: {integrity: sha512-4iBLJR4H5lZ6BJmoqrjBLFdDmDuLweymiX0jKkhNTWbnX2/Gdu5HvP5Qzt54ZQvfVxMw4SWrdzd3MrSIwcWpUA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ia32] - os: [win32] - - '@oxc-minify/binding-win32-x64-msvc@0.106.0': - resolution: {integrity: sha512-On02e+1/dWYQz8o4W4/CwctWimrsdJG0aj5NXzKYUUBmZ3nqCJduuidVkibTjAw0BvudOs8Zq5l3+rIR01R8sw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - - '@oxc-transform/binding-android-arm-eabi@0.106.0': - resolution: {integrity: sha512-3MdeadurvkOHsDDheqIawCIxj40DYUnPRf0BatrB/ppbRPCpkgzCXTdchpAJjaAEsa3MavHMNmtqlrYg9yjYQg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [android] - - '@oxc-transform/binding-android-arm64@0.106.0': - resolution: {integrity: sha512-fTOoMGXSKjf2zI/5ziHS4T0jUPMTclZBiNHghEeI2MynaVmd5GsTFcq4xz44tf6qdGpMXlLLyTL8XOM5CzRZdQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] + '@oxc-project/types@0.115.0': + resolution: {integrity: sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==} - '@oxc-transform/binding-darwin-arm64@0.106.0': - resolution: {integrity: sha512-0DpGOYrvxS31S/wmibT3DAxEajEGkQlsRpG9YulJIedSWUD/y2S2QxTn4Br0L/LnptWaNC0c/aa5sTPsHuguxA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - - '@oxc-transform/binding-darwin-x64@0.106.0': - resolution: {integrity: sha512-Ilf4t86xpfu4U4yTWDd9wi8lAys3GGmLu8Aeut0BN51ghxZfsK8Au0helu493ag3uvb98U4zkqyQxY+Cw0rS0w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - - '@oxc-transform/binding-freebsd-x64@0.106.0': - resolution: {integrity: sha512-vy+O79HhHke52SCGj6K0E+DwwAru5340cyHR69CTar46AtEw/WKPMt28ClWLlq0O6sf1LqOGo4rKH4mG8+pBIw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - - '@oxc-transform/binding-linux-arm-gnueabihf@0.106.0': - resolution: {integrity: sha512-Cacp3VKptVBAU8RsDLDzzAkBohKslSPq02J16wCDgTZRbjyKjILZLOVwnXKJRmbH6yEwxMHIMGalRSwJnqQLRA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@oxc-transform/binding-linux-arm-musleabihf@0.106.0': - resolution: {integrity: sha512-Bu/5f5NujFPUZ5pscv+Cbtu4qVUbRnnt5LnAUtZ4c3amBirz9KQILvpF3mzhfvC3MAauXlBTgJ+j6HGZj2sZFQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@oxc-transform/binding-linux-arm64-gnu@0.106.0': - resolution: {integrity: sha512-Io4ub7tciFQhG2Q3DF9KXeGE+bVuZUiym/XxmElwgaiyjFBLsj8bcaq09layrLbz0iGXfVnVSqLUfh/OPOK0LA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - - '@oxc-transform/binding-linux-arm64-musl@0.106.0': - resolution: {integrity: sha512-6tlCg/v79IY0UXTy7ltIFeWaIw7utYLyOtBPzeaCfYkCrkf/77V2tq+vDG75QyKstMCgM4+70i4rsj1akbL2uw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - - '@oxc-transform/binding-linux-ppc64-gnu@0.106.0': - resolution: {integrity: sha512-DDk09anf2YOK4hSvs8mTWBP6ZEB4X3PessqTznvLcp2zHw/AKKbwTubW9h5zYZLj7vB6cekbeL4wNEXtTG2nvg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - - '@oxc-transform/binding-linux-riscv64-gnu@0.106.0': - resolution: {integrity: sha512-VjVuiXCYX/z7pOV+zLcqILTTEtEkYCBkaml3t3DsCXp2Jf2YZlHyipCy1iFntJWaIjaYm1SjBMsIfG7iVIuGWA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - - '@oxc-transform/binding-linux-riscv64-musl@0.106.0': - resolution: {integrity: sha512-VROiOlOjhCiJdbJ0yKCw/hCi0jjYANgyGIjEIWsxGh3sYCh/mwFDJTIIkzr8Y3M/afZp38t+a/WHgOg0WAAJIg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - - '@oxc-transform/binding-linux-s390x-gnu@0.106.0': - resolution: {integrity: sha512-etDNWVvlwXMIK6iSh1Cs1q+7GbstQs5jMHPqzV1uesrhe2Lf3si40fSZaJpmn8gqMs4I0qBCljdv4/wQGgX4Ug==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - - '@oxc-transform/binding-linux-x64-gnu@0.106.0': - resolution: {integrity: sha512-JLSdBWhgul80D+mc4xhgT+OinN4eWSuQORZ64sy2oKrhUgdLSc2WrtA6CWu7qCilTD6WGaU6EORbSFu5wN5Fng==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - - '@oxc-transform/binding-linux-x64-musl@0.106.0': - resolution: {integrity: sha512-S1tnCAb1XdPCKyjPJgYpQWZWNiYSRTy9AZAjcZaTwIPqAzfhz8rlNQZY86F7WXktlIwVEQT0dQYbRucnxZmFgQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - - '@oxc-transform/binding-openharmony-arm64@0.106.0': - resolution: {integrity: sha512-NUwmWSeUW7DmK8ObbqOnLkXgNWTNjkl9aZ+aUTwm0gO+mRDnhgITbbLXH2xtdWLE5zGk0MDP1xsZ+TA2VyG0LA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - - '@oxc-transform/binding-wasm32-wasi@0.106.0': - resolution: {integrity: sha512-VuNTNqcbvfv9CgTGAWFKk3H1w3g9S5ErAMsUiXc3birDLFKntaZ5SOORxOtcklpxX48uhb6rOkvCiHE62671wA==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@oxc-transform/binding-win32-arm64-msvc@0.106.0': - resolution: {integrity: sha512-oVTNEBYeAUilrOMit7ul4K3r9NzQO7ydKgMSDM94T/l/ULs0gmxxNajU5R6lfRoFky1dJA7H0Pp6YIGkBvoyGQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - - '@oxc-transform/binding-win32-ia32-msvc@0.106.0': - resolution: {integrity: sha512-zeK0ZxNeYCWMCm8Edux4st2NiqzRNMPJYTb3wFGW78Jn2cAyS6ocIP4s/AqUhs4QyLxXTmDHTz2hnQW8RHoekA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ia32] - os: [win32] - - '@oxc-transform/binding-win32-x64-msvc@0.106.0': - resolution: {integrity: sha512-gPquD6ss2WQea6vS9aLbVHFAkrIC3l/Ez7Wu8JmiaPdzoDiPffEQ+SUOytqa+o3r459QVmXaw/QEBBhKpyajOg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] + '@oxc-project/types@0.96.0': + resolution: {integrity: sha512-r/xkmoXA0xEpU6UGtn18CNVjXH6erU3KCpCDbpLmbVxBFor1U9MqN5Z2uMmCHJuXjJzlnDR+hWY+yPoLo8oHDw==} '@panva/hkdf@1.2.1': resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} @@ -15867,6 +16909,166 @@ packages: '@remix-run/node-fetch-server@0.8.1': resolution: {integrity: sha512-J1dev372wtJqmqn9U/qbpbZxbJSQrogNN2+Qv1lKlpATpe/WQ9aCZfl/xSb9d2Rgh1IyLSvNxZAXPZxruO6Xig==} + '@rolldown/binding-android-arm64@1.0.0-beta.47': + resolution: {integrity: sha512-vPP9/MZzESh9QtmvQYojXP/midjgkkc1E4AdnPPAzQXo668ncHJcVLKjJKzoBdsQmaIvNjrMdsCwES8vTQHRQw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-android-arm64@1.0.0-rc.6': + resolution: {integrity: sha512-kvjTSWGcrv+BaR2vge57rsKiYdVR8V8CoS0vgKrc570qRBfty4bT+1X0z3j2TaVV+kAYzA0PjeB9+mdZyqUZlg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.47': + resolution: {integrity: sha512-Lc3nrkxeaDVCVl8qR3qoxh6ltDZfkQ98j5vwIr5ALPkgjZtDK4BGCrrBoLpGVMg+csWcaqUbwbKwH5yvVa0oOw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.6': + resolution: {integrity: sha512-+tJhD21KvGNtUrpLXrZQlT+j5HZKiEwR2qtcZb3vNOUpvoT9QjEykr75ZW/Kr0W89gose/HVXU6351uVZD8Qvw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.47': + resolution: {integrity: sha512-eBYxQDwP0O33plqNVqOtUHqRiSYVneAknviM5XMawke3mwMuVlAsohtOqEjbCEl/Loi/FWdVeks5WkqAkzkYWQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.6': + resolution: {integrity: sha512-DKNhjMk38FAWaHwUt1dFR3rA/qRAvn2NUvSG2UGvxvlMxSmN/qqww/j4ABAbXhNRXtGQNmrAINMXRuwHl16ZHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.47': + resolution: {integrity: sha512-Ns+kgp2+1Iq/44bY/Z30DETUSiHY7ZuqaOgD5bHVW++8vme9rdiWsN4yG4rRPXkdgzjvQ9TDHmZZKfY4/G11AA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.6': + resolution: {integrity: sha512-8TThsRkCPAnfyMBShxrGdtoOE6h36QepqRQI97iFaQSCRbHFWHcDHppcojZnzXoruuhPnjMEygzaykvPVJsMRg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.47': + resolution: {integrity: sha512-4PecgWCJhTA2EFOlptYJiNyVP2MrVP4cWdndpOu3WmXqWqZUmSubhb4YUAIxAxnXATlGjC1WjxNPhV7ZllNgdA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.6': + resolution: {integrity: sha512-ZfmFoOwPUZCWtGOVC9/qbQzfc0249FrRUOzV2XabSMUV60Crp211OWLQN1zmQAsRIVWRcEwhJ46Z1mXGo/L/nQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.47': + resolution: {integrity: sha512-CyIunZ6D9U9Xg94roQI1INt/bLkOpPsZjZZkiaAZ0r6uccQdICmC99M9RUPlMLw/qg4yEWLlQhG73W/mG437NA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.6': + resolution: {integrity: sha512-ZsGzbNETxPodGlLTYHaCSGVhNN/rvkMDCJYHdT7PZr5jFJRmBfmDi2awhF64Dt2vxrJqY6VeeYSgOzEbHRsb7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.47': + resolution: {integrity: sha512-doozc/Goe7qRCSnzfJbFINTHsMktqmZQmweull6hsZZ9sjNWQ6BWQnbvOlfZJe4xE5NxM1NhPnY5Giqnl3ZrYQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.6': + resolution: {integrity: sha512-elPpdevtCdUOqziemR86C4CSCr/5sUxalzDrf/CJdMT+kZt2C556as++qHikNOz0vuFf52h+GJNXZM08eWgGPQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.47': + resolution: {integrity: sha512-fodvSMf6Aqwa0wEUSTPewmmZOD44rc5Tpr5p9NkwQ6W1SSpUKzD3SwpJIgANDOhwiYhDuiIaYPGB7Ujkx1q0UQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.6': + resolution: {integrity: sha512-IBwXsf56o3xhzAyaZxdM1CX8UFiBEUFCjiVUgny67Q8vPIqkjzJj0YKhd3TbBHanuxThgBa59f6Pgutg2OGk5A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.47': + resolution: {integrity: sha512-Rxm5hYc0mGjwLh5sjlGmMygxAaV2gnsx7CNm2lsb47oyt5UQyPDZf3GP/ct8BEcwuikdqzsrrlIp8+kCSvMFNQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.6': + resolution: {integrity: sha512-vOk7G8V9Zm+8a6PL6JTpCea61q491oYlGtO6CvnsbhNLlKdf0bbCPytFzGQhYmCKZDKkEbmnkcIprTEGCURnwg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.47': + resolution: {integrity: sha512-YakuVe+Gc87jjxazBL34hbr8RJpRuFBhun7NEqoChVDlH5FLhLXjAPHqZd990TVGVNkemourf817Z8u2fONS8w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.6': + resolution: {integrity: sha512-ASjEDI4MRv7XCQb2JVaBzfEYO98JKCGrAgoW6M03fJzH/ilCnC43Mb3ptB9q/lzsaahoJyIBoAGKAYEjUvpyvQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.47': + resolution: {integrity: sha512-ak2GvTFQz3UAOw8cuQq8pWE+TNygQB6O47rMhvevvTzETh7VkHRFtRUwJynX5hwzFvQMP6G0az5JrBGuwaMwYQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.6': + resolution: {integrity: sha512-mYa1+h2l6Zc0LvmwUh0oXKKYihnw/1WC73vTqw+IgtfEtv47A+rWzzcWwVDkW73+UDr0d/Ie/HRXoaOY22pQDw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.47': + resolution: {integrity: sha512-o5BpmBnXU+Cj+9+ndMcdKjhZlPb79dVPBZnWwMnI4RlNSSq5yOvFZqvfPYbyacvnW03Na4n5XXQAPhu3RydZ0w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.6': + resolution: {integrity: sha512-e2ABskbNH3MRUBMjgxaMjYIw11DSwjLJxBII3UgpF6WClGLIh8A20kamc+FKH5vIaFVnYQInmcLYSUVpqMPLow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.47': + resolution: {integrity: sha512-FVOmfyYehNE92IfC9Kgs913UerDog2M1m+FADJypKz0gmRg3UyTt4o1cZMCAl7MiR89JpM9jegNO1nXuP1w1vw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.47': + resolution: {integrity: sha512-by/70F13IUE101Bat0oeH8miwWX5mhMFPk1yjCdxoTNHTyTdLgb0THNaebRM6AP7Kz+O3O2qx87sruYuF5UxHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.6': + resolution: {integrity: sha512-dJVc3ifhaRXxIEh1xowLohzFrlQXkJ66LepHm+CmSprTWgVrPa8Fx3OL57xwIqDEH9hufcKkDX2v65rS3NZyRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.0-beta.19': resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==} @@ -15882,12 +17084,18 @@ packages: '@rolldown/pluginutils@1.0.0-beta.43': resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==} + '@rolldown/pluginutils@1.0.0-beta.47': + resolution: {integrity: sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==} + '@rolldown/pluginutils@1.0.0-beta.53': resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} '@rolldown/pluginutils@1.0.0-beta.54': resolution: {integrity: sha512-AHgcZ+w7RIRZ65ihSQL8YuoKcpD9Scew4sEeP1BBUT9QdTo6KjwHrZZXjID6nL10fhKessCH6OPany2QKwAwTQ==} + '@rolldown/pluginutils@1.0.0-rc.6': + resolution: {integrity: sha512-Y0+JT8Mi1mmW08K6HieG315XNRu4L0rkfCpA364HtytjgiqYnMYRdFPcxRl+BQQqNXzecL2S9nii+RUpO93XIA==} + '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} @@ -16180,6 +17388,11 @@ packages: cpu: [x64] os: [win32] + '@rollup/wasm-node@4.54.0': + resolution: {integrity: sha512-CeEdHzNY+ZIR6NWpIOiJuCrr6tTK7cRGeOf6GYg5f73+UwJLqn5a4d5Ovf/hOWDyHM1KcySbxHQESJ9krhe0+A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + '@rsbuild/core@1.2.4': resolution: {integrity: sha512-GPn4TLW9nv7OgmbSBs9Col3dNr55CEDoeoGLl1B0pszyj9yI3s4ArVWVo/R5oXrRa9sDmA/T54rsb2r3trnttw==} engines: {node: '>=16.7.0'} @@ -16312,6 +17525,10 @@ packages: '@rushstack/ts-command-line@4.22.3': resolution: {integrity: sha512-edMpWB3QhFFZ4KtSzS8WNjBgR4PXPPOVrOHMbb7kNpmQ1UFS9HdVtjCXg1H5fG+xYAbeE+TMPcVPUyX2p84STA==} + '@schematics/angular@21.0.4': + resolution: {integrity: sha512-/jJOf3iLvTaVa25xwiYLsfmidVAzC6rPy3Nl85iRo5bVod8be+KhHTn8aGq/8o7pzzB6Cin1oLs+riPR1nLVhg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@sentry-internal/browser-utils@10.32.0': resolution: {integrity: sha512-LI83ZKv5ItRajfY7xmQpNs00nWNOXO+A6MCj8LNDpPouYA8m7VvqkCKG9Yh50a/5eIO9lbSWTrARO8rWR3c9jA==} engines: {node: '>=18'} @@ -16467,6 +17684,30 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@sigstore/bundle@4.0.0': + resolution: {integrity: sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@sigstore/core@3.1.0': + resolution: {integrity: sha512-o5cw1QYhNQ9IroioJxpzexmPjfCe7gzafd2RY3qnMpxr4ZEja+Jad/U8sgFpaue6bOaF+z7RVkyKVV44FN+N8A==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@sigstore/protobuf-specs@0.5.0': + resolution: {integrity: sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==} + engines: {node: ^18.17.0 || >=20.5.0} + + '@sigstore/sign@4.1.0': + resolution: {integrity: sha512-Vx1RmLxLGnSUqx/o5/VsCjkuN5L7y+vxEEwawvc7u+6WtX2W4GNa7b9HEjmcRWohw/d6BpATXmvOwc78m+Swdg==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@sigstore/tuf@4.0.1': + resolution: {integrity: sha512-OPZBg8y5Vc9yZjmWCHrlWPMBqW5yd8+wFNl+thMdtcWz3vjVSoJQutF8YkrzI0SLGnkuFof4HSsWUhXrf219Lw==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@sigstore/verify@3.1.0': + resolution: {integrity: sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==} + engines: {node: ^20.17.0 || >=22.9.0} + '@simplewebauthn/browser@13.2.2': resolution: {integrity: sha512-FNW1oLQpTJyqG5kkDg5ZsotvWgmBaC6jCHR7Ej0qUNep36Wl9tj2eZu7J5rP+uhXgHaLk+QQ3lqcw2vS5MX1IA==} @@ -16857,9 +18098,16 @@ packages: peerDependencies: vite: ^7.1.7 + '@tanstack/angular-store@0.8.0': + resolution: {integrity: sha512-6A5SdXmpLXh6ZULdu9r3aekCuz3nCLgHd8xbbmEcYKcEePTAsBQhRCNolM9REqtyxVqXNgoU2pQws56cW9x0+w==} + peerDependencies: + '@angular/common': '>=19.0.0' + '@angular/core': '>=19.0.0' + '@tanstack/config@0.22.0': resolution: {integrity: sha512-7Wwfw6wBv2Kc+OBNIJQzBSJ6q7GABtwVT+VOQ/7/Gl7z8z1rtEYUZrxUrNvbbrHY+J5/WNZNZjJjTWDf8nTUBw==} engines: {node: '>=18'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. '@tanstack/devtools-client@0.0.4': resolution: {integrity: sha512-LefnH9KE9uRDEWifc3QDcooskA8ikfs41bybDTgpYQpyTUspZnaEdUdya9Hry0KYxZ8nos0S3nNbsP79KHqr6Q==} @@ -17054,6 +18302,15 @@ packages: peerDependencies: vue: ^2.7.0 || ^3.0.0 + '@testing-library/angular@19.0.0': + resolution: {integrity: sha512-thUIHbpfpI7FTPwxZ4phKvVK7Twx254nZ3i48WG72xT9CK+tFWuP/4KuVy23Odr3eJ6JAqKmsYxdEQay8Rv33A==} + peerDependencies: + '@angular/common': '>= 21.0.0' + '@angular/core': '>= 21.0.0' + '@angular/platform-browser': '>= 21.0.0' + '@angular/router': '>= 21.0.0' + '@testing-library/dom': ^10.0.0 + '@testing-library/dom@10.4.1': resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} engines: {node: '>=18'} @@ -17133,6 +18390,17 @@ packages: react-dom: ^19.2.0 typescript: '>=5.7.2' + '@ts-morph/common@0.22.0': + resolution: {integrity: sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==} + + '@tufjs/canonical-json@2.0.0': + resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@tufjs/models@4.1.0': + resolution: {integrity: sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==} + engines: {node: ^20.17.0 || >=22.9.0} + '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -17543,6 +18811,12 @@ packages: engines: {node: '>=18'} hasBin: true + '@vitejs/plugin-basic-ssl@2.1.0': + resolution: {integrity: sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + peerDependencies: + vite: ^7.1.7 + '@vitejs/plugin-react@4.3.4': resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} engines: {node: ^14.18.0 || >=16.0.0} @@ -17619,6 +18893,9 @@ packages: '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.0.16': + resolution: {integrity: sha512-eshqULT2It7McaJkQGLkPjPjNph+uevROGuIMJdG3V+0BSR2w9u6J9Lwu+E8cK5TETlfou8GRijhafIMhXsimA==} + '@vitest/mocker@3.0.6': resolution: {integrity: sha512-KPztr4/tn7qDGZfqlSPQoF2VgJcKxnDNhmfR3VgZ6Fy1bO8T9Fc1stUiTXtqz0yG24VpD00pZP5f8EOFknjNuQ==} peerDependencies: @@ -17641,24 +18918,47 @@ packages: vite: optional: true + '@vitest/mocker@4.0.16': + resolution: {integrity: sha512-yb6k4AZxJTB+q9ycAvsoxGn+j/po0UaPgajllBgt1PzoMAAmJGYFdDk0uCcRcxb3BrME34I6u8gHZTQlkqSZpg==} + peerDependencies: + msw: ^2.4.9 + vite: ^7.1.7 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/pretty-format@3.0.6': resolution: {integrity: sha512-Zyctv3dbNL+67qtHfRnUE/k8qxduOamRfAL1BurEIQSyOEFffoMvx2pnDSSbKAAVxY0Ej2J/GH2dQKI0W2JyVg==} '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.0.16': + resolution: {integrity: sha512-eNCYNsSty9xJKi/UdVD8Ou16alu7AYiS2fCPRs0b1OdhJiV89buAXQLpTbe+X8V9L6qrs9CqyvU7OaAopJYPsA==} + '@vitest/runner@3.2.4': resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/runner@4.0.16': + resolution: {integrity: sha512-VWEDm5Wv9xEo80ctjORcTQRJ539EGPB3Pb9ApvVRAY1U/WkHXmmYISqU5E79uCwcW7xYUV38gwZD+RV755fu3Q==} + '@vitest/snapshot@3.2.4': resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@4.0.16': + resolution: {integrity: sha512-sf6NcrYhYBsSYefxnry+DR8n3UV4xWZwWxYbCJUt2YdvtqzSPR7VfGrY0zsv090DAbjFZsi7ZaMi1KnSRyK1XA==} + '@vitest/spy@3.0.6': resolution: {integrity: sha512-HfOGx/bXtjy24fDlTOpgiAEJbRfFxoX3zIGagCqACkFKKZ/TTOE6gYMKXlqecvxEndKFuNHcHqP081ggZ2yM0Q==} '@vitest/spy@3.2.4': resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.0.16': + resolution: {integrity: sha512-4jIOWjKP0ZUaEmJm00E0cOBLU+5WE0BpeNr3XN6TEF05ltro6NJqHWxXD0kA8/Zc8Nh23AT8WQxwNG+WeROupw==} + '@vitest/ui@3.0.6': resolution: {integrity: sha512-N4M2IUG2Q5LCeX4OWs48pQF4P3qsFejmDTc6QWGRFTLPrEe5EvM5HN0WSUnGAmuzQpSWv7ItfSsIJIWaEM2wpQ==} peerDependencies: @@ -17670,6 +18970,9 @@ packages: '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.0.16': + resolution: {integrity: sha512-h8z9yYhV3e1LEfaQ3zdypIrnAg/9hguReGZoS7Gl0aBG5xgA410zBqECqmaF/+RkTggRsfnzc1XaAHA6bmUufA==} + '@volar/language-core@2.4.11': resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==} @@ -17923,6 +19226,10 @@ packages: resolution: {integrity: sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==} engines: {node: ^18.17.0 || >=20.5.0} + abbrev@4.0.0: + resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==} + engines: {node: ^20.17.0 || >=22.9.0} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -18029,6 +19336,10 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + algoliasearch@5.40.1: + resolution: {integrity: sha512-iUNxcXUNg9085TJx0HJLjqtDE0r1RZ0GOGrt8KNQqQT5ugu8lZsHuMUYW/e0lHhq6xBvmktU9Bw4CXP9VQeKrg==} + engines: {node: '>= 14.0.0'} + alien-signals@3.1.1: resolution: {integrity: sha512-ogkIWbVrLwKtHY6oOAXaYkAxP+cTH7V5FZ5+Tm4NZFd8VDZ6uNMDrfzqctTZ42eTMCSR3ne3otpcxmqSnFfPYA==} @@ -18166,8 +19477,8 @@ packages: b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} - babel-dead-code-elimination@1.0.11: - resolution: {integrity: sha512-mwq3W3e/pKSI6TG8lXMiDWvEi1VXYlSBlJlB3l+I0bAb5u1RNUl88udos85eOPNK3m5EXK9uO7d2g08pesTySQ==} + babel-dead-code-elimination@1.0.12: + resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} babel-loader@10.0.0: resolution: {integrity: sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==} @@ -18213,6 +19524,10 @@ packages: batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + beasties@0.3.5: + resolution: {integrity: sha512-NaWu+f4YrJxEttJSm16AzMIFtVldCvaJ68b1L098KpqXmxt9xOLtKoLkKxb8ekhOrLqEJAbvT6n6SEvB/sac7A==} + engines: {node: '>=14.0.0'} + better-ajv-errors@1.2.0: resolution: {integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==} engines: {node: '>= 12.13.0'} @@ -18356,6 +19671,10 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cacache@20.0.3: + resolution: {integrity: sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==} + engines: {node: ^20.17.0 || >=22.9.0} + call-bind-apply-helpers@1.0.1: resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} engines: {node: '>= 0.4'} @@ -18396,6 +19715,10 @@ packages: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} engines: {node: '>=8'} @@ -18408,10 +19731,17 @@ packages: resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -18459,6 +19789,10 @@ packages: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + cli-highlight@2.1.11: resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} engines: {node: '>=8.0.0', npm: '>=5.0.0'} @@ -18468,10 +19802,22 @@ packages: resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} engines: {node: '>=6'} + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-spinners@3.3.0: + resolution: {integrity: sha512-/+40ljC3ONVnYIttjMWrlL51nItDAbBrq2upN8BPyvGU/2n5Oxw3tbNwORCaNuNqLJnxGqOfjUuhsv7l5Q4IsQ==} + engines: {node: '>=18.20'} + cli-table3@0.6.5: resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} + cli-truncate@5.1.1: + resolution: {integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==} + engines: {node: '>=20'} + cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -18487,6 +19833,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + clone-deep@4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} @@ -18503,6 +19853,9 @@ packages: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} + code-block-writer@12.0.0: + resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -18555,6 +19908,10 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} + commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + engines: {node: '>=20'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -18752,6 +20109,9 @@ packages: resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} + copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + copy-file@11.1.0: resolution: {integrity: sha512-X8XDzyvYaA6msMyAM575CUoygY5b44QzLcGRKsK3MFmXcOvQa518dNPLsKYwkYsn72g3EiW+LE0ytd/FlqWmyw==} engines: {node: '>=18'} @@ -18762,6 +20122,10 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} @@ -18804,8 +20168,8 @@ packages: crossws@0.3.5: resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} - crossws@0.4.1: - resolution: {integrity: sha512-E7WKBcHVhAVrY6JYD5kteNqVq1GSZxqGrdSiwXR9at+XHi43HJoCQKXcCczR5LBnBquFZPsB3o7HklulKoBU5w==} + crossws@0.4.4: + resolution: {integrity: sha512-w6c4OdpRNnudVmcgr7brb/+/HmYjMQvYToO/oTrprTwxRUiom3LYWU1PMWuD006okbUWpII1Ea9/+kwpUfmyRg==} peerDependencies: srvx: '>=0.7.1' peerDependenciesMeta: @@ -18830,6 +20194,9 @@ packages: css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-select@6.0.0: + resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} + 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'} @@ -18842,6 +20209,10 @@ packages: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} + css-what@7.0.0: + resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==} + engines: {node: '>= 6'} + css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} @@ -18865,6 +20236,10 @@ packages: resolution: {integrity: sha512-g5PC9Aiph9eiczFpcgUhd9S4UUO3F+LHGRIi5NUMZ+4xtoIYbHNZwZnWA2JsFGe8OU8nl4WyaEFiZuGuxlutJQ==} engines: {node: '>=20'} + cssstyle@5.3.5: + resolution: {integrity: sha512-GlsEptulso7Jg0VaOZ8BXQi3AkYM5BOJKEO/rjMidSCq70FkIC5y0eawrCXeYzxgt3OCf4Ls+eoxN+/05vN0Ag==} + engines: {node: '>=20'} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -18973,6 +20348,9 @@ packages: decimal.js@10.5.0: resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + dedent@1.5.1: resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} peerDependencies: @@ -19054,6 +20432,10 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + dependency-graph@1.0.0: + resolution: {integrity: sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==} + engines: {node: '>=4'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -19230,6 +20612,9 @@ packages: electron-to-chromium@1.5.90: resolution: {integrity: sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -19303,6 +20688,13 @@ packages: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -19384,6 +20776,16 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.26.0: + resolution: {integrity: sha512-3Hq7jri+tRrVWha+ZeIVhl4qJRha/XjRNSopvTsOaCvfPHrflTYTcUFcEjMKdxofsXXsdc4zjg5NOTnL4Gl57Q==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -19630,10 +21032,21 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -19646,6 +21059,15 @@ packages: resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + + express-rate-limit@7.5.1: + resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + express@4.21.2: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} @@ -19758,6 +21180,10 @@ packages: resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} engines: {node: '>= 0.8'} + find-cache-directory@6.0.0: + resolution: {integrity: sha512-CvFd5ivA6HcSHbD+59P7CyzINHXzwhuQK8RY7CxJZtgDSAtRlHiCaQpZQ2lMR/WRyUIEmzUvL6G2AGurMfegZA==} + engines: {node: '>=20'} + find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} @@ -19863,6 +21289,10 @@ packages: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -19894,6 +21324,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + get-intrinsic@1.2.7: resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} engines: {node: '>= 0.4'} @@ -19962,6 +21396,10 @@ packages: engines: {node: 20 || >=22} hasBin: true + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} + engines: {node: 20 || >=22} + globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} @@ -20019,6 +21457,16 @@ packages: h3@1.15.4: resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} + h3@2.0.1-rc.14: + resolution: {integrity: sha512-163qbGmTr/9rqQRNuqMqtgXnOUAkE4KTdauiC9y0E5iG1I65kte9NyfWvZw5RTDMt6eY+DtyoNzrQ9wA2BfvGQ==} + engines: {node: '>=20.11.1'} + hasBin: true + peerDependencies: + crossws: ^0.4.1 + peerDependenciesMeta: + crossws: + optional: true + h3@2.0.1-rc.7: resolution: {integrity: sha512-qbrRu1OLXmUYnysWOCVrYhtC/m8ZuXu/zCbo3U/KyphJxbPFiC76jHYwVrmEcss9uNAHO5BoUguQ46yEpgI2PA==} engines: {node: '>=20.11.1'} @@ -20081,10 +21529,17 @@ packages: hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + hookable@6.0.1: + resolution: {integrity: sha512-uKGyY8BuzN/a5gvzvA+3FVWo0+wUjgtfSdnmjtrOVwQCZPHpHDH2WRO3VZSOeluYrHoDCiXFffZXs8Dj1ULWtw==} + hosted-git-info@7.0.2: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} + hosted-git-info@9.0.2: + resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} + engines: {node: ^20.17.0 || >=22.9.0} + hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} @@ -20092,6 +21547,10 @@ packages: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + html-entities@2.3.3: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} @@ -20122,12 +21581,18 @@ packages: webpack: optional: true + htmlparser2@10.0.0: + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} htmlparser2@9.1.0: resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} @@ -20217,6 +21682,10 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore-walk@8.0.0: + resolution: {integrity: sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==} + engines: {node: ^20.17.0 || >=22.9.0} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -20228,6 +21697,11 @@ packages: image-meta@0.2.2: resolution: {integrity: sha512-3MOLanc3sb3LNGWQl1RlQlNWURE5g32aUphrDyFeCsxBTk08iE3VNe4CwsUZ0Qs1X+EfX0+r29Sxdpza4B+yRA==} + image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + image-size@2.0.2: resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} engines: {node: '>=16.x'} @@ -20236,6 +21710,9 @@ packages: immer@10.1.1: resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} + immutable@5.1.4: + resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} + import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -20277,6 +21754,17 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + ini@5.0.0: + resolution: {integrity: sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==} + engines: {node: ^18.17.0 || >=20.5.0} + + ini@6.0.0: + resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + injection-js@2.6.1: + resolution: {integrity: sha512-dbR5bdhi7TWDoCye9cByZqeg/gAfamm8Vu3G1KZOTYkOif8WkuM8CD0oeDPtZYMzT5YH76JAFB7bkmyY9OJi2A==} + inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} @@ -20292,6 +21780,10 @@ packages: resolution: {integrity: sha512-AUXbKn9gvo9hHKvk6LbZJQSKn/qIfkWXrnsyL9Yrf+oeXmla9Nmf6XEumOddyhM8neynpK5oAV6r9r99KBuwzA==} engines: {node: '>=12.22.0'} + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -20384,6 +21876,10 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} + engines: {node: '>=18'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -20407,6 +21903,10 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -20528,6 +22028,9 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} + is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} @@ -20557,6 +22060,10 @@ packages: 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'} @@ -20565,6 +22072,14 @@ packages: resolution: {integrity: sha512-HM0q6XqQ93psDlqvuViNs/Ea3hAyGDkIdVAHlrEocjjAwGrs1fZ+EdQjS9eUPacnYB7Y8SoDdSY3H8p3ce205A==} engines: {node: '>=14.17.6'} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -20596,6 +22111,9 @@ packages: jose@6.1.0: resolution: {integrity: sha512-TTQJyoEoKcC1lscpVDCSsVgYzUDg/0Bt3WE//WiTPK6uOCQC2KZS4MpugbMWt/zyjkopgZoXhZuCi00gLudfUA==} + jose@6.1.3: + resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} + jpeg-js@0.4.4: resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} @@ -20653,6 +22171,24 @@ packages: canvas: optional: true + jsdom@27.3.0: + resolution: {integrity: sha512-GtldT42B8+jefDUC4yUKAvsaOrH7PDHmZxZXNgF2xMmymjUbRYJvpAybZAKEmXDGTM0mCsz8duOa4vTm5AY2Kg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + jsdom@27.4.0: + resolution: {integrity: sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -20664,6 +22200,10 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@5.0.0: + resolution: {integrity: sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==} + engines: {node: ^20.17.0 || >=22.9.0} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -20681,6 +22221,9 @@ packages: jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -20776,6 +22319,11 @@ packages: leb@1.0.0: resolution: {integrity: sha512-Y3c3QZfvKWHX60BVOQPhLCvVGmDYWyJEiINE3drOog6KCyN2AOwvuQQzlS3uJg1J85kzpILXIUwRXULWavir+w==} + less@4.5.1: + resolution: {integrity: sha512-UKgI3/KON4u6ngSsnDADsUERqhZknsVZbnuzlRZXLQCmfC/MDld42fTydUE9B+Mla1AL6SJ/Pp6SlEFi/AVGfw==} + engines: {node: '>=14'} + hasBin: true + leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -20882,6 +22430,14 @@ packages: resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} hasBin: true + listr2@9.0.5: + resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} + engines: {node: '>=20.0.0'} + + lmdb@3.4.3: + resolution: {integrity: sha512-GWV1kVi6uhrXWqe+3NXWO73OYe8fto6q8JMo0HOpk1vf8nEyFWgo4CSNJpIFzsOxOrysVUlcO48qRbQfmKd1gA==} + hasBin: true + loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} @@ -20950,6 +22506,14 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} + engines: {node: '>=18'} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + logform@2.7.0: resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} engines: {node: '>= 12.0.0'} @@ -20977,6 +22541,10 @@ packages: resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} engines: {node: 20 || >=22} + lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -21019,6 +22587,14 @@ packages: magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-fetch-happen@15.0.3: + resolution: {integrity: sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw==} + engines: {node: ^20.17.0 || >=22.9.0} + map-obj@5.0.2: resolution: {integrity: sha512-K6K2NgKnTXimT3779/4KxSvobxOtMmx1LBZ3NwRxT/MDIR3Br/fQ4Q+WCX5QxjyUR8zg5+RV9Tbf2c5pAWTD2A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -21144,6 +22720,10 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -21161,8 +22741,8 @@ packages: minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} minimatch@3.0.8: @@ -21190,12 +22770,36 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-fetch@5.0.0: + resolution: {integrity: sha512-fiCdUALipqgPWrOVTz9fw0XhcazULXOSU6ie40DDbX1F49p1dBrSRBuswndTx1x3vEb/g0FT7vC4c4C2u/mh3A==} + engines: {node: ^20.17.0 || >=22.9.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@3.0.1: - resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} mkdirp@3.0.1: @@ -21224,8 +22828,8 @@ packages: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} - mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} ms@2.0.0: @@ -21234,6 +22838,13 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + msgpackr-extract@3.0.3: + resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} + hasBin: true + + msgpackr@1.11.8: + resolution: {integrity: sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA==} + msw@2.7.0: resolution: {integrity: sha512-BIodwZ19RWfCbYTxWTUfTXc+sg4OwjCAgxU1ZsgmggX/7S3LdUifsbUPJs61j0rWb19CZRGY5if77duhc0uXzw==} engines: {node: '>=18'} @@ -21283,6 +22894,11 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + needle@3.3.1: + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + engines: {node: '>= 4.4.x'} + hasBin: true + negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -21301,20 +22917,39 @@ packages: netlify-redirector@0.5.0: resolution: {integrity: sha512-4zdzIP+6muqPCuE8avnrgDJ6KW/2+UpHTRcTbMXCIRxiRmyrX+IZ4WSJGZdHPWF3WmQpXpy603XxecZ9iygN7w==} - nitro-nightly@3.0.1-20251230-165713-6e801e22: - resolution: {integrity: sha512-JAnC8nvgHGbVOYQMQOtfYxA57DIfHvmDoLyAx4SzAYzPB5MfF+nX0V6ba5ISQURVVOAMvuH/xCgb7sFCJBPtuw==} + nf3@0.3.10: + resolution: {integrity: sha512-UlqmHkZiHGgSkRj17yrOXEsSu5ECvtlJ3Xm1W5WsWrTKgu9m7OjrMZh9H/ME2LcWrTlMD0/vmmNVpyBG4yRdGg==} + + ng-packagr@21.0.1: + resolution: {integrity: sha512-IZGxuF226GF0d8FOZIfPvHsyBl53PrDEg/IB2+CVamsm3r4+gUw3mBp27eygpowBpdVLG0Sm2IbUiH4aSspzyA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@angular/compiler-cli': ^21.0.0-next || ^21.0.0 + tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 + tslib: ^2.3.0 + typescript: '>=5.9 <6.0' + peerDependenciesMeta: + tailwindcss: + optional: true + + nitro-nightly@3.0.1-20260227-181935-bfbb207c: + resolution: {integrity: sha512-J9dNAHHuZqzDra4Zr9N6+4hkRPgfrUVw++9I32BHDmwo6MkyRdvmqucWTB5T+J8G3xAMc4+XskExmUEEqxpbZw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - nf3: '>=0.3.1' - rolldown: '*' - rollup: ^4.54.0 + dotenv: '*' + giget: '*' + jiti: ^2.6.1 + rollup: ^4.59.0 vite: ^7.1.7 xml2js: ^0.6.2 peerDependenciesMeta: - nf3: + dotenv: optional: true - rolldown: + giget: + optional: true + jiti: optional: true rollup: optional: true @@ -21336,6 +22971,9 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} @@ -21368,10 +23006,19 @@ packages: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + hasBin: true + node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true + node-gyp@12.1.0: + resolution: {integrity: sha512-W+RYA8jBnhSr2vrTtlPYPc1K+CSjGpVDRZxcqJcERZ8ND3A1ThWPHRwctTx3qC3oW99jt726jhdz3Y6ky87J4g==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + node-machine-id@1.1.12: resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} @@ -21402,6 +23049,11 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true + nopt@9.0.0: + resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + normalize-package-data@6.0.2: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} @@ -21414,6 +23066,38 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + npm-bundled@4.0.0: + resolution: {integrity: sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==} + engines: {node: ^18.17.0 || >=20.5.0} + + npm-install-checks@8.0.0: + resolution: {integrity: sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==} + engines: {node: ^20.17.0 || >=22.9.0} + + npm-normalize-package-bin@4.0.0: + resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==} + engines: {node: ^18.17.0 || >=20.5.0} + + npm-normalize-package-bin@5.0.0: + resolution: {integrity: sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==} + engines: {node: ^20.17.0 || >=22.9.0} + + npm-package-arg@13.0.1: + resolution: {integrity: sha512-6zqls5xFvJbgFjB1B2U6yITtyGBjDBORB7suI4zA4T/sZ1OmkMFlaQSNB/4K0LtXNA1t4OprAFxPisadK5O2ag==} + engines: {node: ^20.17.0 || >=22.9.0} + + npm-packlist@10.0.3: + resolution: {integrity: sha512-zPukTwJMOu5X5uvm0fztwS5Zxyvmk38H/LfidkOMt3gbZVCyro2cD/ETzwzVPcWZA3JOyPznfUN/nkyFiyUbxg==} + engines: {node: ^20.17.0 || >=22.9.0} + + npm-pick-manifest@11.0.3: + resolution: {integrity: sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + npm-registry-fetch@19.1.1: + resolution: {integrity: sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==} + engines: {node: ^20.17.0 || >=22.9.0} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -21471,6 +23155,9 @@ packages: obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + ofetch@1.4.1: resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} @@ -21505,6 +23192,10 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + open@10.1.0: resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} @@ -21521,16 +23212,15 @@ packages: resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} engines: {node: '>=10'} - outvariant@1.4.3: - resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + ora@9.0.0: + resolution: {integrity: sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==} + engines: {node: '>=20'} - oxc-minify@0.106.0: - resolution: {integrity: sha512-WuhR/Vz0ISIU1W7YRZqRT1ILDfCJ6ik83ma90QnblSj/BBJhyC16YnC0BI/9sG71Fezcrl4NqN10oLNH2Z+Trw==} - engines: {node: ^20.19.0 || >=22.12.0} + ordered-binary@1.6.0: + resolution: {integrity: sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==} - oxc-transform@0.106.0: - resolution: {integrity: sha512-qaEQDTcyIMO9YtmrxK8EYIOtgUMx6CKDNguqHEbnKBHAYCwlrA8RawAh1Gvo8zNdDbclOtRwT3t5WqV3bB3GRA==} - engines: {node: ^20.19.0 || >=22.12.0} + outvariant@1.4.3: + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} p-event@6.0.1: resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} @@ -21586,6 +23276,11 @@ packages: package-manager-detector@1.3.0: resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} + pacote@21.0.3: + resolution: {integrity: sha512-itdFlanxO0nmQv4ORsvA9K1wv40IPfB9OmWqfaJWvoJ30VKyHsqNgDVeG+TVhI7Gk7XW8slUy7cA9r6dF5qohw==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} @@ -21609,6 +23304,13 @@ packages: resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} engines: {node: '>=18'} + parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + + parse5-html-rewriting-stream@8.0.0: + resolution: {integrity: sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==} + parse5-htmlparser2-tree-adapter@6.0.1: resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} @@ -21618,6 +23320,9 @@ packages: parse5-parser-stream@7.1.2: resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + parse5-sax-parser@8.0.0: + resolution: {integrity: sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==} + parse5@5.1.1: resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} @@ -21627,6 +23332,9 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parse5@8.0.0: + resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -21718,10 +23426,26 @@ packages: picoquery@2.5.0: resolution: {integrity: sha512-j1kgOFxtaCyoFCkpoYG2Oj3OdGakadO7HZ7o5CqyRazlmBekKhbDoUnNnXASE07xSY4nDImWZkrZv7toSxMi/g==} + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + piscina@5.1.3: + resolution: {integrity: sha512-0u3N7H4+hbr40KjuVn2uNhOcthu/9usKhnw5vT3J7ply79v3D3M8naI00el9Klcy16x557VsEkkUQaHCWFXC/g==} + engines: {node: '>=20.x'} + + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + pkg-dir@8.0.0: + resolution: {integrity: sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==} + engines: {node: '>=18'} + pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} @@ -21759,6 +23483,9 @@ packages: webpack: optional: true + postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + postcss-modules-extract-imports@3.1.0: resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} engines: {node: ^10 || ^12 || >= 14} @@ -21872,6 +23599,14 @@ packages: typescript: optional: true + proc-log@5.0.0: + resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + proc-log@6.1.0: + resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==} + engines: {node: ^20.17.0 || >=22.9.0} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -21886,6 +23621,10 @@ packages: promise-limit@2.7.0: resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -21906,6 +23645,9 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} @@ -22197,11 +23939,6 @@ packages: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true - resolve@1.22.11: resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} @@ -22215,6 +23952,10 @@ packages: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -22227,15 +23968,31 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} - hasBin: true + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} rimraf@6.0.1: resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} engines: {node: 20 || >=22} hasBin: true + rolldown@1.0.0-beta.47: + resolution: {integrity: sha512-Mid74GckX1OeFAOYz9KuXeWYhq3xkXbMziYIC+ULVdUzPTG9y70OBSBQDQn9hQP8u/AfhuYw1R0BSg15nBI4Dg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rolldown@1.0.0-rc.6: + resolution: {integrity: sha512-B8vFPV1ADyegoYfhg+E7RAucYKv0xdVlwYYsIJgfPNeiSxZGWNxts9RqhyGzC11ULK/VaeXyKezGCwpMiH8Ktw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup-plugin-dts@6.3.0: + resolution: {integrity: sha512-d0UrqxYd8KyZ6i3M2Nx7WOMy708qsV/7fTHMHxCMCBOAe3V/U7OMPu5GkX8hC+cmkHhzGnfeYongl1IgiooddA==} + engines: {node: '>=16'} + peerDependencies: + rollup: ^3.29.4 || ^4 + typescript: ^4.5 || ^5.0 + rollup-plugin-preserve-directives@0.4.0: resolution: {integrity: sha512-gx4nBxYm5BysmEQS+e2tAMrtFxrGvk+Pe5ppafRibQi0zlW7VYAbEGk6IKDw9sJGPdFWgVTE0o4BU4cdG0Fylg==} peerDependencies: @@ -22299,8 +24056,8 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} @@ -22323,6 +24080,11 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sass@1.93.2: + resolution: {integrity: sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==} + engines: {node: '>=14.0.0'} + hasBin: true + sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} @@ -22355,6 +24117,10 @@ packages: resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -22490,6 +24256,10 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sigstore@4.1.0: + resolution: {integrity: sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA==} + engines: {node: ^20.17.0 || >=22.9.0} + simple-git@3.28.0: resolution: {integrity: sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==} @@ -22515,12 +24285,28 @@ packages: slashes@3.0.12: resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} + slice-ansi@7.1.2: + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} + engines: {node: '>=18'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + smob@1.5.0: resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + solid-js@1.9.10: resolution: {integrity: sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==} @@ -22595,11 +24381,24 @@ packages: resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} engines: {node: '>= 0.6'} - srvx@0.10.0: - resolution: {integrity: sha512-NqIsR+wQCfkvvwczBh8J8uM4wTZx41K2lLSEp/3oMp917ODVVMtW5Me4epCmQ3gH8D+0b+/t4xxkUKutyhimTA==} + srvx@0.10.1: + resolution: {integrity: sha512-A//xtfak4eESMWWydSRFUVvCTQbSwivnGCEf8YGPe2eHU0+Z6znfUTCPF0a7oV3sObSOcrXHlL6Bs9vVctfXdg==} + engines: {node: '>=20.16.0'} + hasBin: true + + srvx@0.11.8: + resolution: {integrity: sha512-2n9t0YnAXPJjinytvxccNgs7rOA5gmE7Wowt/8Dy2dx2fDC6sBhfBpbrCvjYKALlVukPS/Uq3QwkolKNa7P/2Q==} engines: {node: '>=20.16.0'} hasBin: true + ssri@12.0.0: + resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + ssri@13.0.0: + resolution: {integrity: sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng==} + engines: {node: ^20.17.0 || >=22.9.0} + stable-hash-x@0.2.0: resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} engines: {node: '>=12.0.0'} @@ -22633,9 +24432,16 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -22665,6 +24471,14 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string-width@8.1.0: + resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} + engines: {node: '>=20'} + string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -22675,8 +24489,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} strip-bom@3.0.0: @@ -22774,8 +24588,8 @@ packages: tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - tar@7.4.3: - resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + tar@7.5.2: + resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} engines: {node: '>=18'} terser-webpack-plugin@5.3.11: @@ -22815,6 +24629,11 @@ packages: engines: {node: '>=10'} hasBin: true + terser@5.44.0: + resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} + engines: {node: '>=10'} + hasBin: true + text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} @@ -22856,6 +24675,10 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -22868,6 +24691,10 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + tinyspy@3.0.2: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} @@ -22968,6 +24795,9 @@ packages: peerDependencies: typescript: '>=4.0.0' + ts-morph@21.0.1: + resolution: {integrity: sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==} + ts-pattern@5.6.2: resolution: {integrity: sha512-d4IxJUXROL5NCa3amvMg6VQW2HVtZYmUTPfvVtO7zJWGYLJ+mry9v2OmYm+z67aniQoQ8/yFNadiEwtNS9qQiw==} @@ -23005,6 +24835,10 @@ packages: resolution: {integrity: sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==} engines: {node: '>= 6.0.0'} + tuf-js@4.1.0: + resolution: {integrity: sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==} + engines: {node: ^20.17.0 || >=22.9.0} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -23160,6 +24994,14 @@ packages: resolution: {integrity: sha512-cty7t1DESgm0OPfCy9oyn5u9B5t0tMW6tH6bXTjAGIO3SkJsbg/DXYHjrPrUKqultqbAAoltAfYsuu/FEDocjg==} engines: {node: '>=18.12.0'} + unique-filename@5.0.0: + resolution: {integrity: sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==} + engines: {node: ^20.17.0 || >=22.9.0} + + unique-slug@6.0.0: + resolution: {integrity: sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==} + engines: {node: ^20.17.0 || >=22.9.0} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -23260,32 +25102,32 @@ packages: uploadthing: optional: true - unstorage@2.0.0-alpha.4: - resolution: {integrity: sha512-ywXZMZRfrvmO1giJeMTCw6VUn0ALYxVl8pFqJPStiyQUvgJImejtAHrKvXPj4QGJAoS/iLGcVGF6ljN/lkh1bw==} + unstorage@2.0.0-alpha.6: + resolution: {integrity: sha512-w5vLYCJtnSx3OBtDk7cG4c1p3dfAnHA4WSZq9Xsurjbl2wMj7zqfOIjaHQI1Bl7yKzUxXAi+kbMr8iO2RhJmBA==} peerDependencies: - '@azure/app-configuration': ^1.8.0 - '@azure/cosmos': ^4.2.0 - '@azure/data-tables': ^13.3.0 - '@azure/identity': ^4.6.0 - '@azure/keyvault-secrets': ^4.9.0 - '@azure/storage-blob': ^12.26.0 - '@capacitor/preferences': ^6.0.3 || ^7.0.0 - '@deno/kv': '>=0.9.0' + '@azure/app-configuration': ^1.11.0 + '@azure/cosmos': ^4.9.1 + '@azure/data-tables': ^13.3.2 + '@azure/identity': ^4.13.0 + '@azure/keyvault-secrets': ^4.10.0 + '@azure/storage-blob': ^12.31.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.13.0' '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 '@planetscale/database': ^1.19.0 - '@upstash/redis': ^1.34.3 - '@vercel/blob': '>=0.27.1' + '@upstash/redis': ^1.36.2 + '@vercel/blob': '>=0.27.3' '@vercel/functions': ^2.2.12 || ^3.0.0 '@vercel/kv': ^1.0.1 aws4fetch: ^1.0.20 - chokidar: ^4.0.3 - db0: '>=0.2.1' - idb-keyval: ^6.2.1 - ioredis: ^5.4.2 - lru-cache: ^11.2.2 - mongodb: ^6.20.0 + chokidar: ^4 || ^5 + db0: '>=0.3.4' + idb-keyval: ^6.2.2 + ioredis: ^5.9.3 + lru-cache: ^11.2.6 + mongodb: ^6 || ^7 ofetch: '*' - uploadthing: ^7.4.4 + uploadthing: ^7.7.4 peerDependenciesMeta: '@azure/app-configuration': optional: true @@ -23451,6 +25293,10 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + validate-npm-package-name@6.0.2: + resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==} + engines: {node: ^18.17.0 || >=20.5.0} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -23573,6 +25419,40 @@ packages: jsdom: optional: true + vitest@4.0.16: + resolution: {integrity: sha512-E4t7DJ9pESL6E3I8nFjPa4xGUd3PmiWDLsDztS2qXSJWfHtbQnwAWylaBvSNY48I3vr8PTqIZlyK8TE3V3CA4Q==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': 22.10.2 + '@vitest/browser-playwright': 4.0.16 + '@vitest/browser-preview': 4.0.16 + '@vitest/browser-webdriverio': 4.0.16 + '@vitest/ui': 4.0.16 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} @@ -23646,6 +25526,9 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + weak-lru-cache@1.2.2: + resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} + web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -23758,6 +25641,7 @@ packages: whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} @@ -23791,6 +25675,16 @@ packages: engines: {node: '>= 8'} hasBin: true + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + which@6.0.0: + resolution: {integrity: sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -23843,6 +25737,10 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -23930,6 +25828,10 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} @@ -23938,6 +25840,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} @@ -23953,6 +25859,14 @@ packages: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + youch-core@0.3.3: resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} @@ -23969,6 +25883,11 @@ packages: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} + zod-to-json-schema@3.25.0: + resolution: {integrity: sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==} + peerDependencies: + zod: ^3.25 || ^4 + zod@3.22.3: resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} @@ -23978,14 +25897,422 @@ packages: zod@4.1.12: resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + zod@4.1.13: + resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} + + zod@4.3.4: + resolution: {integrity: sha512-Zw/uYiiyF6pUT1qmKbZziChgNPRu+ZRneAsMUDU6IwmXdWt5JwcUfy2bvLOCUtz5UniaN/Zx5aFttZYbYc7O/A==} + + zone.js@0.15.1: + resolution: {integrity: sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==} + snapshots: + '@acemir/cssom@0.9.30': {} + '@adobe/css-tools@4.4.1': {} + '@algolia/abtesting@1.6.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/client-abtesting@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/client-analytics@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/client-common@5.40.1': {} + + '@algolia/client-insights@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/client-personalization@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/client-query-suggestions@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/client-search@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/ingestion@1.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/monitoring@1.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/recommend@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/requester-browser-xhr@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + + '@algolia/requester-fetch@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + + '@algolia/requester-node-http@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@alloc/quick-lru@5.2.0': {} + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@analogjs/vite-plugin-angular@2.2.1(@angular/build@21.0.4(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(@angular/compiler@21.0.4)(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.10.2)(chokidar@4.0.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(ng-packagr@21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)(vitest@4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1))': + dependencies: + ts-morph: 21.0.1 + optionalDependencies: + '@angular/build': 21.0.4(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(@angular/compiler@21.0.4)(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.10.2)(chokidar@4.0.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(ng-packagr@21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)(vitest@4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1) + + '@analogjs/vite-plugin-angular@2.2.1(@angular/build@21.0.4(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(@angular/compiler@21.0.4)(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.10.2)(chokidar@4.0.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(ng-packagr@21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)(vitest@4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1))': + dependencies: + ts-morph: 21.0.1 + optionalDependencies: + '@angular/build': 21.0.4(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(@angular/compiler@21.0.4)(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.10.2)(chokidar@4.0.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(ng-packagr@21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)(vitest@4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1) + + '@analogjs/vitest-angular@2.2.1(2019a81a47365156328ff75aeb8a7511)': + dependencies: + '@analogjs/vite-plugin-angular': 2.2.1(@angular/build@21.0.4(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(@angular/compiler@21.0.4)(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.10.2)(chokidar@4.0.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(ng-packagr@21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)(vitest@4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1)) + '@angular-devkit/architect': 0.2100.4(chokidar@4.0.3) + vitest: 4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + '@andrewbranch/untar.js@1.0.3': {} + '@angular-devkit/architect@0.2100.4(chokidar@4.0.3)': + dependencies: + '@angular-devkit/core': 21.0.4(chokidar@4.0.3) + rxjs: 7.8.2 + transitivePeerDependencies: + - chokidar + + '@angular-devkit/core@21.0.4(chokidar@4.0.3)': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + jsonc-parser: 3.3.1 + picomatch: 4.0.3 + rxjs: 7.8.2 + source-map: 0.7.6 + optionalDependencies: + chokidar: 4.0.3 + + '@angular-devkit/schematics@21.0.4(chokidar@4.0.3)': + dependencies: + '@angular-devkit/core': 21.0.4(chokidar@4.0.3) + jsonc-parser: 3.3.1 + magic-string: 0.30.19 + ora: 9.0.0 + rxjs: 7.8.2 + transitivePeerDependencies: + - chokidar + + '@angular/build@21.0.4(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(@angular/compiler@21.0.4)(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.10.2)(chokidar@4.0.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(ng-packagr@21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)(vitest@4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.3.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@angular-devkit/architect': 0.2100.4(chokidar@4.0.3) + '@angular/compiler': 21.0.4 + '@angular/compiler-cli': 21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2) + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-split-export-declaration': 7.24.7 + '@inquirer/confirm': 5.1.19(@types/node@22.10.2) + '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) + beasties: 0.3.5 + browserslist: 4.28.1 + esbuild: 0.26.0 + https-proxy-agent: 7.0.6 + istanbul-lib-instrument: 6.0.3 + jsonc-parser: 3.3.1 + listr2: 9.0.5 + magic-string: 0.30.19 + mrmime: 2.0.1 + parse5-html-rewriting-stream: 8.0.0 + picomatch: 4.0.3 + piscina: 5.1.3 + rolldown: 1.0.0-beta.47 + sass: 1.93.2 + semver: 7.7.3 + source-map-support: 0.5.21 + tinyglobby: 0.2.15 + tslib: 2.8.1 + typescript: 5.9.2 + undici: 7.16.0 + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + watchpack: 2.4.4 + optionalDependencies: + '@angular/core': 21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)) + less: 4.5.1 + lmdb: 3.4.3 + ng-packagr: 21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2) + postcss: 8.5.6 + tailwindcss: 4.1.18 + vitest: 4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.3.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + transitivePeerDependencies: + - '@types/node' + - chokidar + - jiti + - lightningcss + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@angular/build@21.0.4(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(@angular/compiler@21.0.4)(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.10.2)(chokidar@4.0.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(ng-packagr@21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)(vitest@4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@angular-devkit/architect': 0.2100.4(chokidar@4.0.3) + '@angular/compiler': 21.0.4 + '@angular/compiler-cli': 21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2) + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-split-export-declaration': 7.24.7 + '@inquirer/confirm': 5.1.19(@types/node@22.10.2) + '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) + beasties: 0.3.5 + browserslist: 4.28.1 + esbuild: 0.26.0 + https-proxy-agent: 7.0.6 + istanbul-lib-instrument: 6.0.3 + jsonc-parser: 3.3.1 + listr2: 9.0.5 + magic-string: 0.30.19 + mrmime: 2.0.1 + parse5-html-rewriting-stream: 8.0.0 + picomatch: 4.0.3 + piscina: 5.1.3 + rolldown: 1.0.0-beta.47 + sass: 1.93.2 + semver: 7.7.3 + source-map-support: 0.5.21 + tinyglobby: 0.2.15 + tslib: 2.8.1 + typescript: 5.9.2 + undici: 7.16.0 + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + watchpack: 2.4.4 + optionalDependencies: + '@angular/core': 21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)) + less: 4.5.1 + lmdb: 3.4.3 + ng-packagr: 21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2) + postcss: 8.5.6 + tailwindcss: 4.1.18 + vitest: 4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + transitivePeerDependencies: + - '@types/node' + - chokidar + - jiti + - lightningcss + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@angular/build@21.0.4(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(@angular/compiler@21.0.4)(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@types/node@22.10.2)(chokidar@4.0.3)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(ng-packagr@21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2))(postcss@8.5.6)(tailwindcss@4.1.18)(terser@5.44.0)(tslib@2.8.1)(tsx@4.20.3)(typescript@5.9.2)(vitest@4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(yaml@2.8.1)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@angular-devkit/architect': 0.2100.4(chokidar@4.0.3) + '@angular/compiler': 21.0.4 + '@angular/compiler-cli': 21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2) + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-split-export-declaration': 7.24.7 + '@inquirer/confirm': 5.1.19(@types/node@22.10.2) + '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) + beasties: 0.3.5 + browserslist: 4.28.1 + esbuild: 0.26.0 + https-proxy-agent: 7.0.6 + istanbul-lib-instrument: 6.0.3 + jsonc-parser: 3.3.1 + listr2: 9.0.5 + magic-string: 0.30.19 + mrmime: 2.0.1 + parse5-html-rewriting-stream: 8.0.0 + picomatch: 4.0.3 + piscina: 5.1.3 + rolldown: 1.0.0-beta.47 + sass: 1.93.2 + semver: 7.7.3 + source-map-support: 0.5.21 + tinyglobby: 0.2.15 + tslib: 2.8.1 + typescript: 5.9.2 + undici: 7.16.0 + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + watchpack: 2.4.4 + optionalDependencies: + '@angular/core': 21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.0.4(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)) + less: 4.5.1 + lmdb: 3.4.3 + ng-packagr: 21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2) + postcss: 8.5.6 + tailwindcss: 4.1.18 + vitest: 4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + transitivePeerDependencies: + - '@types/node' + - chokidar + - jiti + - lightningcss + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + optional: true + + '@angular/cli@21.0.4(@types/node@22.10.2)(chokidar@4.0.3)': + dependencies: + '@angular-devkit/architect': 0.2100.4(chokidar@4.0.3) + '@angular-devkit/core': 21.0.4(chokidar@4.0.3) + '@angular-devkit/schematics': 21.0.4(chokidar@4.0.3) + '@inquirer/prompts': 7.9.0(@types/node@22.10.2) + '@listr2/prompt-adapter-inquirer': 3.0.5(@inquirer/prompts@7.9.0(@types/node@22.10.2))(@types/node@22.10.2)(listr2@9.0.5) + '@modelcontextprotocol/sdk': 1.24.0(zod@4.1.13) + '@schematics/angular': 21.0.4(chokidar@4.0.3) + '@yarnpkg/lockfile': 1.1.0 + algoliasearch: 5.40.1 + ini: 5.0.0 + jsonc-parser: 3.3.1 + listr2: 9.0.5 + npm-package-arg: 13.0.1 + pacote: 21.0.3 + parse5-html-rewriting-stream: 8.0.0 + resolve: 1.22.11 + semver: 7.7.3 + yargs: 18.0.0 + zod: 4.1.13 + transitivePeerDependencies: + - '@cfworker/json-schema' + - '@types/node' + - chokidar + - supports-color + + '@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)': + dependencies: + '@angular/core': 21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1) + rxjs: 7.8.2 + tslib: 2.8.1 + + '@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)': + dependencies: + '@angular/core': 21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1) + rxjs: 7.8.2 + tslib: 2.8.1 + + '@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2)': + dependencies: + '@angular/compiler': 21.0.4 + '@babel/core': 7.28.4 + '@jridgewell/sourcemap-codec': 1.5.5 + chokidar: 4.0.3 + convert-source-map: 1.9.0 + reflect-metadata: 0.2.2 + semver: 7.7.3 + tslib: 2.8.1 + yargs: 18.0.0 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@angular/compiler@21.0.4': + dependencies: + tslib: 2.8.1 + + '@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)': + dependencies: + rxjs: 7.8.2 + tslib: 2.8.1 + optionalDependencies: + '@angular/compiler': 21.0.4 + zone.js: 0.15.1 + + '@angular/forms@21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@standard-schema/spec@1.0.0)(rxjs@7.8.2)': + dependencies: + '@angular/common': 21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)) + '@standard-schema/spec': 1.0.0 + rxjs: 7.8.2 + tslib: 2.8.1 + + '@angular/platform-browser@21.0.4(@angular/common@21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))': + dependencies: + '@angular/common': 21.0.4(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1) + tslib: 2.8.1 + + '@angular/platform-browser@21.0.4(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))': + dependencies: + '@angular/common': 21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1) + tslib: 2.8.1 + + '@angular/router@21.0.6(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': + dependencies: + '@angular/common': 21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.0.4(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)) + rxjs: 7.8.2 + tslib: 2.8.1 + '@arethetypeswrong/cli@0.18.2': dependencies: '@arethetypeswrong/core': 0.18.2 @@ -24027,7 +26354,15 @@ snapshots: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - lru-cache: 11.2.2 + lru-cache: 11.2.4 + + '@asamuzakjp/css-color@4.1.1': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 11.2.4 '@asamuzakjp/dom-selector@6.5.6': dependencies: @@ -24037,6 +26372,14 @@ snapshots: is-potential-custom-element-name: 1.0.1 lru-cache: 11.2.2 + '@asamuzakjp/dom-selector@6.7.6': + dependencies: + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.1.0 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.2.4 + '@asamuzakjp/nwsapi@2.3.9': {} '@auth/core@0.41.1': @@ -24053,7 +26396,27 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.5': {} + '@babel/compat-data@7.28.5': {} + + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color '@babel/core@7.28.5': dependencies: @@ -24089,9 +26452,9 @@ snapshots: '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.27.5 + '@babel/compat-data': 7.28.5 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.24.4 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 @@ -24148,6 +26511,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -24179,6 +26551,10 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.28.5 + '@babel/helper-string-parser@7.27.1': {} '@babel/helper-validator-identifier@7.28.5': {} @@ -24190,6 +26566,10 @@ snapshots: '@babel/template': 7.27.2 '@babel/types': 7.28.5 + '@babel/parser@7.27.5': + dependencies: + '@babel/types': 7.28.5 + '@babel/parser@7.28.5': dependencies: '@babel/types': 7.28.5 @@ -24324,6 +26704,8 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 + '@babel/runtime@7.28.4': {} + '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 @@ -24355,7 +26737,7 @@ snapshots: '@better-auth/core@1.3.27': dependencies: better-call: 1.0.19 - zod: 4.1.12 + zod: 4.3.4 '@better-auth/utils@0.3.0': {} @@ -24416,7 +26798,7 @@ snapshots: dequal: 2.0.3 glob-to-regexp: 0.4.1 js-cookie: 3.0.5 - std-env: 3.9.0 + std-env: 3.10.0 swr: 2.3.4(react@19.2.0) optionalDependencies: react: 19.2.0 @@ -24466,7 +26848,7 @@ snapshots: optionalDependencies: workerd: 1.20251118.0 - '@cloudflare/vite-plugin@1.13.7(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(workerd@1.20251118.0)(wrangler@4.49.1)': + '@cloudflare/vite-plugin@1.13.7(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(workerd@1.20251118.0)(wrangler@4.49.1)': dependencies: '@cloudflare/unenv-preset': 2.7.4(unenv@2.0.0-rc.21)(workerd@1.20251118.0) '@remix-run/node-fetch-server': 0.8.1 @@ -24475,7 +26857,7 @@ snapshots: picocolors: 1.1.1 tinyglobby: 0.2.15 unenv: 2.0.0-rc.21 - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) wrangler: 4.49.1 ws: 8.18.0 transitivePeerDependencies: @@ -24483,7 +26865,7 @@ snapshots: - utf-8-validate - workerd - '@cloudflare/vite-plugin@1.15.1(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(workerd@1.20251118.0)(wrangler@4.49.1)': + '@cloudflare/vite-plugin@1.15.1(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(workerd@1.20251118.0)(wrangler@4.49.1)': dependencies: '@cloudflare/unenv-preset': 2.7.10(unenv@2.0.0-rc.24)(workerd@1.20251118.0) '@remix-run/node-fetch-server': 0.8.1 @@ -24492,7 +26874,7 @@ snapshots: picocolors: 1.1.1 tinyglobby: 0.2.15 unenv: 2.0.0-rc.24 - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) wrangler: 4.49.1 ws: 8.18.0 transitivePeerDependencies: @@ -24544,7 +26926,7 @@ snapshots: '@commitlint/types@19.8.1': dependencies: '@types/conventional-commits-parser': 5.0.1 - chalk: 5.4.1 + chalk: 5.6.2 '@convex-dev/better-auth@0.9.7(@standard-schema/spec@1.0.0)(better-auth@1.3.27(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10))(convex@1.28.2(@clerk/clerk-react@5.53.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0))(hono@4.7.10)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.2)': dependencies: @@ -24613,6 +26995,8 @@ snapshots: dependencies: postcss: 8.5.6 + '@csstools/css-syntax-patches-for-csstree@1.0.22': {} + '@csstools/css-tokenizer@3.0.3': {} '@csstools/css-tokenizer@3.0.4': {} @@ -24667,7 +27051,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.27.1 - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -24766,6 +27150,12 @@ snapshots: '@esbuild/aix-ppc64@0.25.4': optional: true + '@esbuild/aix-ppc64@0.26.0': + optional: true + + '@esbuild/aix-ppc64@0.27.2': + optional: true + '@esbuild/android-arm64@0.23.0': optional: true @@ -24778,6 +27168,12 @@ snapshots: '@esbuild/android-arm64@0.25.4': optional: true + '@esbuild/android-arm64@0.26.0': + optional: true + + '@esbuild/android-arm64@0.27.2': + optional: true + '@esbuild/android-arm@0.23.0': optional: true @@ -24790,6 +27186,12 @@ snapshots: '@esbuild/android-arm@0.25.4': optional: true + '@esbuild/android-arm@0.26.0': + optional: true + + '@esbuild/android-arm@0.27.2': + optional: true + '@esbuild/android-x64@0.23.0': optional: true @@ -24802,6 +27204,12 @@ snapshots: '@esbuild/android-x64@0.25.4': optional: true + '@esbuild/android-x64@0.26.0': + optional: true + + '@esbuild/android-x64@0.27.2': + optional: true + '@esbuild/darwin-arm64@0.23.0': optional: true @@ -24814,6 +27222,12 @@ snapshots: '@esbuild/darwin-arm64@0.25.4': optional: true + '@esbuild/darwin-arm64@0.26.0': + optional: true + + '@esbuild/darwin-arm64@0.27.2': + optional: true + '@esbuild/darwin-x64@0.23.0': optional: true @@ -24826,6 +27240,12 @@ snapshots: '@esbuild/darwin-x64@0.25.4': optional: true + '@esbuild/darwin-x64@0.26.0': + optional: true + + '@esbuild/darwin-x64@0.27.2': + optional: true + '@esbuild/freebsd-arm64@0.23.0': optional: true @@ -24838,6 +27258,12 @@ snapshots: '@esbuild/freebsd-arm64@0.25.4': optional: true + '@esbuild/freebsd-arm64@0.26.0': + optional: true + + '@esbuild/freebsd-arm64@0.27.2': + optional: true + '@esbuild/freebsd-x64@0.23.0': optional: true @@ -24850,6 +27276,12 @@ snapshots: '@esbuild/freebsd-x64@0.25.4': optional: true + '@esbuild/freebsd-x64@0.26.0': + optional: true + + '@esbuild/freebsd-x64@0.27.2': + optional: true + '@esbuild/linux-arm64@0.23.0': optional: true @@ -24862,6 +27294,12 @@ snapshots: '@esbuild/linux-arm64@0.25.4': optional: true + '@esbuild/linux-arm64@0.26.0': + optional: true + + '@esbuild/linux-arm64@0.27.2': + optional: true + '@esbuild/linux-arm@0.23.0': optional: true @@ -24874,6 +27312,12 @@ snapshots: '@esbuild/linux-arm@0.25.4': optional: true + '@esbuild/linux-arm@0.26.0': + optional: true + + '@esbuild/linux-arm@0.27.2': + optional: true + '@esbuild/linux-ia32@0.23.0': optional: true @@ -24886,6 +27330,12 @@ snapshots: '@esbuild/linux-ia32@0.25.4': optional: true + '@esbuild/linux-ia32@0.26.0': + optional: true + + '@esbuild/linux-ia32@0.27.2': + optional: true + '@esbuild/linux-loong64@0.23.0': optional: true @@ -24898,6 +27348,12 @@ snapshots: '@esbuild/linux-loong64@0.25.4': optional: true + '@esbuild/linux-loong64@0.26.0': + optional: true + + '@esbuild/linux-loong64@0.27.2': + optional: true + '@esbuild/linux-mips64el@0.23.0': optional: true @@ -24910,6 +27366,12 @@ snapshots: '@esbuild/linux-mips64el@0.25.4': optional: true + '@esbuild/linux-mips64el@0.26.0': + optional: true + + '@esbuild/linux-mips64el@0.27.2': + optional: true + '@esbuild/linux-ppc64@0.23.0': optional: true @@ -24922,6 +27384,12 @@ snapshots: '@esbuild/linux-ppc64@0.25.4': optional: true + '@esbuild/linux-ppc64@0.26.0': + optional: true + + '@esbuild/linux-ppc64@0.27.2': + optional: true + '@esbuild/linux-riscv64@0.23.0': optional: true @@ -24934,6 +27402,12 @@ snapshots: '@esbuild/linux-riscv64@0.25.4': optional: true + '@esbuild/linux-riscv64@0.26.0': + optional: true + + '@esbuild/linux-riscv64@0.27.2': + optional: true + '@esbuild/linux-s390x@0.23.0': optional: true @@ -24946,6 +27420,12 @@ snapshots: '@esbuild/linux-s390x@0.25.4': optional: true + '@esbuild/linux-s390x@0.26.0': + optional: true + + '@esbuild/linux-s390x@0.27.2': + optional: true + '@esbuild/linux-x64@0.23.0': optional: true @@ -24958,12 +27438,24 @@ snapshots: '@esbuild/linux-x64@0.25.4': optional: true + '@esbuild/linux-x64@0.26.0': + optional: true + + '@esbuild/linux-x64@0.27.2': + optional: true + '@esbuild/netbsd-arm64@0.25.10': optional: true '@esbuild/netbsd-arm64@0.25.4': optional: true + '@esbuild/netbsd-arm64@0.26.0': + optional: true + + '@esbuild/netbsd-arm64@0.27.2': + optional: true + '@esbuild/netbsd-x64@0.23.0': optional: true @@ -24976,6 +27468,12 @@ snapshots: '@esbuild/netbsd-x64@0.25.4': optional: true + '@esbuild/netbsd-x64@0.26.0': + optional: true + + '@esbuild/netbsd-x64@0.27.2': + optional: true + '@esbuild/openbsd-arm64@0.23.0': optional: true @@ -24988,6 +27486,12 @@ snapshots: '@esbuild/openbsd-arm64@0.25.4': optional: true + '@esbuild/openbsd-arm64@0.26.0': + optional: true + + '@esbuild/openbsd-arm64@0.27.2': + optional: true + '@esbuild/openbsd-x64@0.23.0': optional: true @@ -25000,9 +27504,21 @@ snapshots: '@esbuild/openbsd-x64@0.25.4': optional: true + '@esbuild/openbsd-x64@0.26.0': + optional: true + + '@esbuild/openbsd-x64@0.27.2': + optional: true + '@esbuild/openharmony-arm64@0.25.10': optional: true + '@esbuild/openharmony-arm64@0.26.0': + optional: true + + '@esbuild/openharmony-arm64@0.27.2': + optional: true + '@esbuild/sunos-x64@0.23.0': optional: true @@ -25015,6 +27531,12 @@ snapshots: '@esbuild/sunos-x64@0.25.4': optional: true + '@esbuild/sunos-x64@0.26.0': + optional: true + + '@esbuild/sunos-x64@0.27.2': + optional: true + '@esbuild/win32-arm64@0.23.0': optional: true @@ -25027,6 +27549,12 @@ snapshots: '@esbuild/win32-arm64@0.25.4': optional: true + '@esbuild/win32-arm64@0.26.0': + optional: true + + '@esbuild/win32-arm64@0.27.2': + optional: true + '@esbuild/win32-ia32@0.23.0': optional: true @@ -25039,6 +27567,12 @@ snapshots: '@esbuild/win32-ia32@0.25.4': optional: true + '@esbuild/win32-ia32@0.26.0': + optional: true + + '@esbuild/win32-ia32@0.27.2': + optional: true + '@esbuild/win32-x64@0.23.0': optional: true @@ -25051,6 +27585,12 @@ snapshots: '@esbuild/win32-x64@0.25.4': optional: true + '@esbuild/win32-x64@0.26.0': + optional: true + + '@esbuild/win32-x64@0.27.2': + optional: true + '@eslint-community/eslint-utils@4.4.1(eslint@9.22.0(jiti@2.6.1))': dependencies: eslint: 9.22.0(jiti@2.6.1) @@ -25195,6 +27735,8 @@ snapshots: '@eslint/core': 0.12.0 levn: 0.4.1 + '@exodus/bytes@1.8.0': {} + '@fastify/accept-negotiator@2.0.1': {} '@fastify/busboy@3.1.1': {} @@ -25719,12 +28261,12 @@ snapshots: '@img/sharp-wasm32@0.33.5': dependencies: - '@emnapi/runtime': 1.5.0 + '@emnapi/runtime': 1.7.1 optional: true '@img/sharp-wasm32@0.34.4': dependencies: - '@emnapi/runtime': 1.5.0 + '@emnapi/runtime': 1.7.1 optional: true '@img/sharp-win32-arm64@0.34.4': @@ -25770,6 +28312,32 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros + '@inquirer/ansi@1.0.2': {} + + '@inquirer/checkbox@4.3.2(@types/node@22.10.2)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@22.10.2) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.10.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.10.2 + + '@inquirer/confirm@5.1.19(@types/node@22.10.2)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.10.2) + '@inquirer/type': 3.0.10(@types/node@22.10.2) + optionalDependencies: + '@types/node': 22.10.2 + + '@inquirer/confirm@5.1.21(@types/node@22.10.2)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.10.2) + '@inquirer/type': 3.0.10(@types/node@22.10.2) + optionalDependencies: + '@types/node': 22.10.2 + '@inquirer/confirm@5.1.4(@types/node@22.10.2)': dependencies: '@inquirer/core': 10.1.5(@types/node@22.10.2) @@ -25779,7 +28347,7 @@ snapshots: '@inquirer/core@10.1.5(@types/node@22.10.2)': dependencies: '@inquirer/figures': 1.0.10 - '@inquirer/type': 3.0.4(@types/node@22.10.2) + '@inquirer/type': 3.0.10(@types/node@22.10.2) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -25789,19 +28357,131 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@inquirer/core@10.3.2(@types/node@22.10.2)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.10.2) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.10.2 + + '@inquirer/editor@4.2.23(@types/node@22.10.2)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.10.2) + '@inquirer/external-editor': 1.0.3(@types/node@22.10.2) + '@inquirer/type': 3.0.10(@types/node@22.10.2) + optionalDependencies: + '@types/node': 22.10.2 + + '@inquirer/expand@4.0.23(@types/node@22.10.2)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.10.2) + '@inquirer/type': 3.0.10(@types/node@22.10.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.10.2 + + '@inquirer/external-editor@1.0.3(@types/node@22.10.2)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 22.10.2 + '@inquirer/figures@1.0.10': {} + '@inquirer/figures@1.0.15': {} + + '@inquirer/input@4.3.1(@types/node@22.10.2)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.10.2) + '@inquirer/type': 3.0.10(@types/node@22.10.2) + optionalDependencies: + '@types/node': 22.10.2 + + '@inquirer/number@3.0.23(@types/node@22.10.2)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.10.2) + '@inquirer/type': 3.0.10(@types/node@22.10.2) + optionalDependencies: + '@types/node': 22.10.2 + + '@inquirer/password@4.0.23(@types/node@22.10.2)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@22.10.2) + '@inquirer/type': 3.0.10(@types/node@22.10.2) + optionalDependencies: + '@types/node': 22.10.2 + + '@inquirer/prompts@7.9.0(@types/node@22.10.2)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@22.10.2) + '@inquirer/confirm': 5.1.21(@types/node@22.10.2) + '@inquirer/editor': 4.2.23(@types/node@22.10.2) + '@inquirer/expand': 4.0.23(@types/node@22.10.2) + '@inquirer/input': 4.3.1(@types/node@22.10.2) + '@inquirer/number': 3.0.23(@types/node@22.10.2) + '@inquirer/password': 4.0.23(@types/node@22.10.2) + '@inquirer/rawlist': 4.1.11(@types/node@22.10.2) + '@inquirer/search': 3.2.2(@types/node@22.10.2) + '@inquirer/select': 4.4.2(@types/node@22.10.2) + optionalDependencies: + '@types/node': 22.10.2 + + '@inquirer/rawlist@4.1.11(@types/node@22.10.2)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.10.2) + '@inquirer/type': 3.0.10(@types/node@22.10.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.10.2 + + '@inquirer/search@3.2.2(@types/node@22.10.2)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.10.2) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.10.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.10.2 + + '@inquirer/select@4.4.2(@types/node@22.10.2)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@22.10.2) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.10.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.10.2 + + '@inquirer/type@3.0.10(@types/node@22.10.2)': + optionalDependencies: + '@types/node': 22.10.2 + '@inquirer/type@3.0.4(@types/node@22.10.2)': optionalDependencies: '@types/node': 22.10.2 '@ioredis/commands@1.4.0': {} + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 @@ -25810,6 +28490,8 @@ snapshots: dependencies: minipass: 7.1.2 + '@istanbuljs/schema@0.1.3': {} + '@jest/diff-sequences@30.0.1': {} '@jest/get-type@30.0.1': {} @@ -25985,6 +28667,14 @@ snapshots: '@libsql/win32-x64-msvc@0.5.22': optional: true + '@listr2/prompt-adapter-inquirer@3.0.5(@inquirer/prompts@7.9.0(@types/node@22.10.2))(@types/node@22.10.2)(listr2@9.0.5)': + dependencies: + '@inquirer/prompts': 7.9.0(@types/node@22.10.2) + '@inquirer/type': 3.0.10(@types/node@22.10.2) + listr2: 9.0.5 + transitivePeerDependencies: + - '@types/node' + '@lix-js/sdk@0.4.7(babel-plugin-macros@3.1.0)': dependencies: '@lix-js/server-protocol-schema': 0.1.1 @@ -25999,6 +28689,27 @@ snapshots: '@lix-js/server-protocol-schema@0.1.1': {} + '@lmdb/lmdb-darwin-arm64@3.4.3': + optional: true + + '@lmdb/lmdb-darwin-x64@3.4.3': + optional: true + + '@lmdb/lmdb-linux-arm64@3.4.3': + optional: true + + '@lmdb/lmdb-linux-arm@3.4.3': + optional: true + + '@lmdb/lmdb-linux-x64@3.4.3': + optional: true + + '@lmdb/lmdb-win32-arm64@3.4.3': + optional: true + + '@lmdb/lmdb-win32-x64@3.4.3': + optional: true + '@loaderkit/resolve@1.0.4': dependencies: '@braidai/lang': 1.1.2 @@ -26011,7 +28722,7 @@ snapshots: node-fetch: 2.7.0(encoding@0.1.13) nopt: 8.1.0 semver: 7.7.3 - tar: 7.4.3 + tar: 7.5.2 transitivePeerDependencies: - encoding - supports-color @@ -26035,7 +28746,7 @@ snapshots: '@rushstack/ts-command-line': 4.22.3(@types/node@22.10.2) lodash: 4.17.21 minimatch: 3.0.8 - resolve: 1.22.10 + resolve: 1.22.11 semver: 7.5.4 source-map: 0.6.1 typescript: 5.4.2 @@ -26047,10 +28758,29 @@ snapshots: '@microsoft/tsdoc': 0.15.1 ajv: 8.12.0 jju: 1.4.0 - resolve: 1.22.10 + resolve: 1.22.11 '@microsoft/tsdoc@0.15.1': {} + '@modelcontextprotocol/sdk@1.24.0(zod@4.1.13)': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.1.0 + express-rate-limit: 7.5.1(express@5.1.0) + jose: 6.1.3 + pkce-challenge: 5.0.1 + raw-body: 3.0.1 + zod: 4.1.13 + zod-to-json-schema: 3.25.0(zod@4.1.13) + transitivePeerDependencies: + - supports-color + '@module-federation/error-codes@0.8.4': {} '@module-federation/runtime-tools@0.8.4': @@ -26112,6 +28842,24 @@ snapshots: chevrotain: 10.5.0 lilconfig: 2.1.0 + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + optional: true + '@mswjs/interceptors@0.37.6': dependencies: '@open-draft/deferred-promise': 2.2.0 @@ -26146,7 +28894,7 @@ snapshots: '@mui/private-theming@6.4.6(@types/react@19.2.2)(react@19.2.0)': dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 '@mui/utils': 6.4.6(@types/react@19.2.2)(react@19.2.0) prop-types: 15.8.1 react: 19.2.0 @@ -26155,7 +28903,7 @@ snapshots: '@mui/styled-engine@6.4.6(@emotion/react@11.14.0(@types/react@19.2.2)(react@19.2.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)': dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 '@emotion/sheet': 1.4.0 @@ -26168,7 +28916,7 @@ snapshots: '@mui/system@6.4.7(@emotion/react@11.14.0(@types/react@19.2.2)(react@19.2.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0)': dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 '@mui/private-theming': 6.4.6(@types/react@19.2.2)(react@19.2.0) '@mui/styled-engine': 6.4.6(@emotion/react@11.14.0(@types/react@19.2.2)(react@19.2.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(react@19.2.0))(react@19.2.0) '@mui/types': 7.2.21(@types/react@19.2.2) @@ -26188,7 +28936,7 @@ snapshots: '@mui/utils@6.4.6(@types/react@19.2.2)(react@19.2.0)': dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 '@mui/types': 7.2.21(@types/react@19.2.2) '@types/prop-types': 15.7.14 clsx: 2.1.1 @@ -26198,10 +28946,82 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 + '@napi-rs/nice-android-arm-eabi@1.1.1': + optional: true + + '@napi-rs/nice-android-arm64@1.1.1': + optional: true + + '@napi-rs/nice-darwin-arm64@1.1.1': + optional: true + + '@napi-rs/nice-darwin-x64@1.1.1': + optional: true + + '@napi-rs/nice-freebsd-x64@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm64-musl@1.1.1': + optional: true + + '@napi-rs/nice-linux-ppc64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-riscv64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-s390x-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-x64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-x64-musl@1.1.1': + optional: true + + '@napi-rs/nice-openharmony-arm64@1.1.1': + optional: true + + '@napi-rs/nice-win32-arm64-msvc@1.1.1': + optional: true + + '@napi-rs/nice-win32-ia32-msvc@1.1.1': + optional: true + + '@napi-rs/nice-win32-x64-msvc@1.1.1': + optional: true + + '@napi-rs/nice@1.1.1': + optionalDependencies: + '@napi-rs/nice-android-arm-eabi': 1.1.1 + '@napi-rs/nice-android-arm64': 1.1.1 + '@napi-rs/nice-darwin-arm64': 1.1.1 + '@napi-rs/nice-darwin-x64': 1.1.1 + '@napi-rs/nice-freebsd-x64': 1.1.1 + '@napi-rs/nice-linux-arm-gnueabihf': 1.1.1 + '@napi-rs/nice-linux-arm64-gnu': 1.1.1 + '@napi-rs/nice-linux-arm64-musl': 1.1.1 + '@napi-rs/nice-linux-ppc64-gnu': 1.1.1 + '@napi-rs/nice-linux-riscv64-gnu': 1.1.1 + '@napi-rs/nice-linux-s390x-gnu': 1.1.1 + '@napi-rs/nice-linux-x64-gnu': 1.1.1 + '@napi-rs/nice-linux-x64-musl': 1.1.1 + '@napi-rs/nice-openharmony-arm64': 1.1.1 + '@napi-rs/nice-win32-arm64-msvc': 1.1.1 + '@napi-rs/nice-win32-ia32-msvc': 1.1.1 + '@napi-rs/nice-win32-x64-msvc': 1.1.1 + optional: true + '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.5.0 - '@emnapi/runtime': 1.5.0 + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 '@tybys/wasm-util': 0.10.1 optional: true @@ -26211,7 +29031,7 @@ snapshots: '@emnapi/runtime': 1.5.0 '@tybys/wasm-util': 0.9.0 - '@napi-rs/wasm-runtime@1.1.0': + '@napi-rs/wasm-runtime@1.1.1': dependencies: '@emnapi/core': 1.7.1 '@emnapi/runtime': 1.7.1 @@ -26244,7 +29064,7 @@ snapshots: '@netlify/api': 14.0.7 '@netlify/headers-parser': 9.0.2 '@netlify/redirect-parser': 15.0.3 - chalk: 5.4.1 + chalk: 5.6.2 cron-parser: 4.9.0 deepmerge: 4.3.1 dot-prop: 9.0.0 @@ -26283,13 +29103,13 @@ snapshots: uuid: 11.1.0 write-file-atomic: 5.0.1 - '@netlify/dev@4.6.3(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.8.0)(rollup@4.52.5)': + '@netlify/dev@4.6.3(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(encoding@0.1.13)(ioredis@5.8.0)(rollup@4.52.5)': dependencies: '@netlify/blobs': 10.1.0 '@netlify/config': 23.2.0 '@netlify/dev-utils': 4.3.0 '@netlify/edge-functions-dev': 1.0.0 - '@netlify/functions-dev': 1.0.0(rollup@4.52.5) + '@netlify/functions-dev': 1.0.0(encoding@0.1.13)(rollup@4.52.5) '@netlify/headers': 2.1.0 '@netlify/images': 1.3.0(@netlify/blobs@10.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.8.0) '@netlify/redirects': 3.1.0 @@ -26337,7 +29157,7 @@ snapshots: parse-imports: 2.2.1 path-key: 4.0.0 semver: 7.7.3 - tar: 7.4.3 + tar: 7.5.2 tmp-promise: 3.0.3 urlpattern-polyfill: 8.0.2 uuid: 11.1.0 @@ -26357,12 +29177,12 @@ snapshots: dependencies: '@netlify/types': 2.1.0 - '@netlify/functions-dev@1.0.0(rollup@4.52.5)': + '@netlify/functions-dev@1.0.0(encoding@0.1.13)(rollup@4.52.5)': dependencies: '@netlify/blobs': 10.1.0 '@netlify/dev-utils': 4.3.0 '@netlify/functions': 5.0.0 - '@netlify/zip-it-and-ship-it': 14.1.11(rollup@4.52.5) + '@netlify/zip-it-and-ship-it': 14.1.11(encoding@0.1.13)(rollup@4.52.5) cron-parser: 4.9.0 decache: 4.6.2 extract-zip: 2.0.1 @@ -26452,10 +29272,10 @@ snapshots: '@netlify/types@2.1.0': {} - '@netlify/vite-plugin-tanstack-start@1.1.4(@tanstack/solid-start@packages+solid-start)(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.8.0)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))': + '@netlify/vite-plugin-tanstack-start@1.1.4(@tanstack/solid-start@packages+solid-start)(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(encoding@0.1.13)(ioredis@5.8.0)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: - '@netlify/vite-plugin': 2.7.4(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.8.0)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + '@netlify/vite-plugin': 2.7.4(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(encoding@0.1.13)(ioredis@5.8.0)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) optionalDependencies: '@tanstack/solid-start': link:packages/solid-start transitivePeerDependencies: @@ -26482,12 +29302,12 @@ snapshots: - supports-color - uploadthing - '@netlify/vite-plugin@2.7.4(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.8.0)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))': + '@netlify/vite-plugin@2.7.4(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(encoding@0.1.13)(ioredis@5.8.0)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: - '@netlify/dev': 4.6.3(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.8.0)(rollup@4.52.5) + '@netlify/dev': 4.6.3(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(encoding@0.1.13)(ioredis@5.8.0)(rollup@4.52.5) '@netlify/dev-utils': 4.3.0 dedent: 1.7.0(babel-plugin-macros@3.1.0) - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -26512,13 +29332,13 @@ snapshots: - supports-color - uploadthing - '@netlify/zip-it-and-ship-it@14.1.11(rollup@4.52.5)': + '@netlify/zip-it-and-ship-it@14.1.11(encoding@0.1.13)(rollup@4.52.5)': dependencies: '@babel/parser': 7.28.5 '@babel/types': 7.28.4 '@netlify/binary-info': 1.0.0 '@netlify/serverless-functions-api': 2.7.1 - '@vercel/nft': 0.29.4(rollup@4.52.5) + '@vercel/nft': 0.29.4(encoding@0.1.13)(rollup@4.52.5) archiver: 7.0.1 common-path-prefix: 3.0.0 copy-file: 11.1.0 @@ -26569,6 +29389,69 @@ snapshots: '@nothing-but/utils@0.17.0': {} + '@npmcli/agent@4.0.0': + dependencies: + agent-base: 7.1.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 11.2.4 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + '@npmcli/fs@5.0.0': + dependencies: + semver: 7.7.3 + + '@npmcli/git@7.0.1': + dependencies: + '@npmcli/promise-spawn': 9.0.1 + ini: 6.0.0 + lru-cache: 11.2.4 + npm-pick-manifest: 11.0.3 + proc-log: 6.1.0 + promise-retry: 2.0.1 + semver: 7.7.3 + which: 6.0.0 + + '@npmcli/installed-package-contents@3.0.0': + dependencies: + npm-bundled: 4.0.0 + npm-normalize-package-bin: 4.0.0 + + '@npmcli/node-gyp@5.0.0': {} + + '@npmcli/package-json@7.0.4': + dependencies: + '@npmcli/git': 7.0.1 + glob: 13.0.0 + hosted-git-info: 9.0.2 + json-parse-even-better-errors: 5.0.0 + proc-log: 6.1.0 + semver: 7.7.3 + validate-npm-package-license: 3.0.4 + + '@npmcli/promise-spawn@8.0.3': + dependencies: + which: 5.0.0 + + '@npmcli/promise-spawn@9.0.1': + dependencies: + which: 6.0.0 + + '@npmcli/redact@4.0.0': {} + + '@npmcli/run-script@10.0.3': + dependencies: + '@npmcli/node-gyp': 5.0.0 + '@npmcli/package-json': 7.0.4 + '@npmcli/promise-spawn': 9.0.1 + node-gyp: 12.1.0 + proc-log: 6.1.0 + which: 6.0.0 + transitivePeerDependencies: + - supports-color + '@nx/nx-darwin-arm64@22.1.3': optional: true @@ -26627,129 +29510,9 @@ snapshots: '@open-draft/until@2.1.0': {} - '@oxc-minify/binding-android-arm-eabi@0.106.0': - optional: true - - '@oxc-minify/binding-android-arm64@0.106.0': - optional: true - - '@oxc-minify/binding-darwin-arm64@0.106.0': - optional: true - - '@oxc-minify/binding-darwin-x64@0.106.0': - optional: true - - '@oxc-minify/binding-freebsd-x64@0.106.0': - optional: true - - '@oxc-minify/binding-linux-arm-gnueabihf@0.106.0': - optional: true - - '@oxc-minify/binding-linux-arm-musleabihf@0.106.0': - optional: true - - '@oxc-minify/binding-linux-arm64-gnu@0.106.0': - optional: true + '@oxc-project/types@0.115.0': {} - '@oxc-minify/binding-linux-arm64-musl@0.106.0': - optional: true - - '@oxc-minify/binding-linux-ppc64-gnu@0.106.0': - optional: true - - '@oxc-minify/binding-linux-riscv64-gnu@0.106.0': - optional: true - - '@oxc-minify/binding-linux-riscv64-musl@0.106.0': - optional: true - - '@oxc-minify/binding-linux-s390x-gnu@0.106.0': - optional: true - - '@oxc-minify/binding-linux-x64-gnu@0.106.0': - optional: true - - '@oxc-minify/binding-linux-x64-musl@0.106.0': - optional: true - - '@oxc-minify/binding-openharmony-arm64@0.106.0': - optional: true - - '@oxc-minify/binding-wasm32-wasi@0.106.0': - dependencies: - '@napi-rs/wasm-runtime': 1.1.0 - optional: true - - '@oxc-minify/binding-win32-arm64-msvc@0.106.0': - optional: true - - '@oxc-minify/binding-win32-ia32-msvc@0.106.0': - optional: true - - '@oxc-minify/binding-win32-x64-msvc@0.106.0': - optional: true - - '@oxc-transform/binding-android-arm-eabi@0.106.0': - optional: true - - '@oxc-transform/binding-android-arm64@0.106.0': - optional: true - - '@oxc-transform/binding-darwin-arm64@0.106.0': - optional: true - - '@oxc-transform/binding-darwin-x64@0.106.0': - optional: true - - '@oxc-transform/binding-freebsd-x64@0.106.0': - optional: true - - '@oxc-transform/binding-linux-arm-gnueabihf@0.106.0': - optional: true - - '@oxc-transform/binding-linux-arm-musleabihf@0.106.0': - optional: true - - '@oxc-transform/binding-linux-arm64-gnu@0.106.0': - optional: true - - '@oxc-transform/binding-linux-arm64-musl@0.106.0': - optional: true - - '@oxc-transform/binding-linux-ppc64-gnu@0.106.0': - optional: true - - '@oxc-transform/binding-linux-riscv64-gnu@0.106.0': - optional: true - - '@oxc-transform/binding-linux-riscv64-musl@0.106.0': - optional: true - - '@oxc-transform/binding-linux-s390x-gnu@0.106.0': - optional: true - - '@oxc-transform/binding-linux-x64-gnu@0.106.0': - optional: true - - '@oxc-transform/binding-linux-x64-musl@0.106.0': - optional: true - - '@oxc-transform/binding-openharmony-arm64@0.106.0': - optional: true - - '@oxc-transform/binding-wasm32-wasi@0.106.0': - dependencies: - '@napi-rs/wasm-runtime': 1.1.0 - optional: true - - '@oxc-transform/binding-win32-arm64-msvc@0.106.0': - optional: true - - '@oxc-transform/binding-win32-ia32-msvc@0.106.0': - optional: true - - '@oxc-transform/binding-win32-x64-msvc@0.106.0': - optional: true + '@oxc-project/types@0.96.0': {} '@panva/hkdf@1.2.1': {} @@ -27802,6 +30565,91 @@ snapshots: '@remix-run/node-fetch-server@0.8.1': {} + '@rolldown/binding-android-arm64@1.0.0-beta.47': + optional: true + + '@rolldown/binding-android-arm64@1.0.0-rc.6': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.47': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.6': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.47': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.6': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.47': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.6': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.47': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.6': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.47': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.6': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.47': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.6': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.47': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.6': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.47': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.6': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.47': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.6': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.47': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.6': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.47': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.6': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.47': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.47': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.6': + optional: true + '@rolldown/pluginutils@1.0.0-beta.19': {} '@rolldown/pluginutils@1.0.0-beta.27': {} @@ -27812,10 +30660,14 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.43': {} + '@rolldown/pluginutils@1.0.0-beta.47': {} + '@rolldown/pluginutils@1.0.0-beta.53': {} '@rolldown/pluginutils@1.0.0-beta.54': {} + '@rolldown/pluginutils@1.0.0-rc.6': {} + '@rollup/plugin-alias@5.1.1(rollup@4.52.2)': optionalDependencies: rollup: 4.52.2 @@ -27846,13 +30698,19 @@ snapshots: optionalDependencies: rollup: 4.52.2 + '@rollup/plugin-json@6.1.0(rollup@4.52.5)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.52.5) + optionalDependencies: + rollup: 4.52.5 + '@rollup/plugin-node-resolve@16.0.1(rollup@4.52.2)': dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.52.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.10 + resolve: 1.22.11 optionalDependencies: rollup: 4.52.2 @@ -28019,6 +30877,12 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.52.5': optional: true + '@rollup/wasm-node@4.54.0': + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + '@rsbuild/core@1.2.4': dependencies: '@rspack/core': 1.2.2(@swc/helpers@0.5.15) @@ -28162,14 +31026,14 @@ snapshots: fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.10 + resolve: 1.22.11 semver: 7.5.4 optionalDependencies: '@types/node': 22.10.2 '@rushstack/rig-package@0.5.3': dependencies: - resolve: 1.22.10 + resolve: 1.22.11 strip-json-comments: 3.1.1 '@rushstack/terminal@0.13.3(@types/node@22.10.2)': @@ -28188,6 +31052,14 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@schematics/angular@21.0.4(chokidar@4.0.3)': + dependencies: + '@angular-devkit/core': 21.0.4(chokidar@4.0.3) + '@angular-devkit/schematics': 21.0.4(chokidar@4.0.3) + jsonc-parser: 3.3.1 + transitivePeerDependencies: + - chokidar + '@sentry-internal/browser-utils@10.32.0': dependencies: '@sentry/core': 10.32.0 @@ -28348,6 +31220,38 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@sigstore/bundle@4.0.0': + dependencies: + '@sigstore/protobuf-specs': 0.5.0 + + '@sigstore/core@3.1.0': {} + + '@sigstore/protobuf-specs@0.5.0': {} + + '@sigstore/sign@4.1.0': + dependencies: + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.1.0 + '@sigstore/protobuf-specs': 0.5.0 + make-fetch-happen: 15.0.3 + proc-log: 6.1.0 + promise-retry: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@sigstore/tuf@4.0.1': + dependencies: + '@sigstore/protobuf-specs': 0.5.0 + tuf-js: 4.1.0 + transitivePeerDependencies: + - supports-color + + '@sigstore/verify@3.1.0': + dependencies: + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.1.0 + '@sigstore/protobuf-specs': 0.5.0 + '@simplewebauthn/browser@13.2.2': {} '@simplewebauthn/server@13.2.2': @@ -28739,19 +31643,26 @@ snapshots: postcss: 8.5.6 tailwindcss: 4.1.18 - '@tailwindcss/vite@4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))': + '@tailwindcss/vite@4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + + '@tanstack/angular-store@0.8.0(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))': + dependencies: + '@angular/common': 21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1) + '@tanstack/store': 0.8.0 + tslib: 2.8.1 - '@tanstack/config@0.22.0(@types/node@22.10.2)(eslint@9.22.0(jiti@2.6.1))(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))': + '@tanstack/config@0.22.0(@types/node@22.10.2)(eslint@9.22.0(jiti@2.6.1))(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@tanstack/eslint-config': 0.3.2(@typescript-eslint/utils@8.44.1(eslint@9.22.0(jiti@2.6.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.22.0(jiti@2.6.1))(typescript@5.9.2) '@tanstack/publish-config': 0.2.1 '@tanstack/typedoc-config': 0.3.0(typescript@5.9.2) - '@tanstack/vite-config': 0.4.0(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + '@tanstack/vite-config': 0.4.0(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) transitivePeerDependencies: - '@types/node' - '@typescript-eslint/utils' @@ -28953,12 +31864,12 @@ snapshots: '@tanstack/virtual-core@3.13.13': {} - '@tanstack/vite-config@0.4.0(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))': + '@tanstack/vite-config@0.4.0(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.52.5) - vite-plugin-dts: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) - vite-plugin-externalize-deps: 0.10.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) - vite-tsconfig-paths: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + vite-plugin-dts: 4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) + vite-plugin-externalize-deps: 0.10.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) + vite-tsconfig-paths: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) transitivePeerDependencies: - '@types/node' - rollup @@ -29025,6 +31936,15 @@ snapshots: '@tanstack/virtual-core': 3.13.13 vue: 3.5.25(typescript@5.8.3) + '@testing-library/angular@19.0.0(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/router@21.0.6(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@testing-library/dom@10.4.1)': + dependencies: + '@angular/common': 21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.0.4(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)) + '@angular/router': 21.0.6(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.4(@angular/common@21.0.6(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.4(@angular/compiler@21.0.4)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + '@testing-library/dom': 10.4.1 + tslib: 2.8.1 + '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.27.1 @@ -29039,7 +31959,7 @@ snapshots: '@testing-library/dom@9.3.4': dependencies: '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 @@ -29108,6 +32028,20 @@ snapshots: react-dom: 19.2.0(react@19.2.0) typescript: 5.9.2 + '@ts-morph/common@0.22.0': + dependencies: + fast-glob: 3.3.3 + minimatch: 9.0.5 + mkdirp: 3.0.1 + path-browserify: 1.0.1 + + '@tufjs/canonical-json@2.0.0': {} + + '@tufjs/models@4.1.0': + dependencies: + '@tufjs/canonical-json': 2.0.0 + minimatch: 10.1.1 + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 @@ -29129,7 +32063,7 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.27.5 '@babel/types': 7.28.5 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 @@ -29141,7 +32075,7 @@ snapshots: '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.27.5 '@babel/types': 7.28.5 '@types/babel__traverse@7.28.0': @@ -29204,7 +32138,7 @@ snapshots: '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 '@types/estree@1.0.7': {} @@ -29649,7 +32583,7 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vercel/nft@0.29.4(rollup@4.52.5)': + '@vercel/nft@0.29.4(encoding@0.1.13)(rollup@4.52.5)': dependencies: '@mapbox/node-pre-gyp': 2.0.0(encoding@0.1.13) '@rollup/pluginutils': 5.1.4(rollup@4.52.5) @@ -29658,7 +32592,7 @@ snapshots: async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 - glob: 10.4.5 + glob: 10.5.0 graceful-fs: 4.2.11 node-gyp-build: 4.8.4 picomatch: 4.0.3 @@ -29687,18 +32621,22 @@ snapshots: - rollup - supports-color - '@vitejs/plugin-react@4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))': + '@vitejs/plugin-basic-ssl@2.1.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))': + dependencies: + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + + '@vitejs/plugin-react@4.3.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.28.5) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))': + '@vitejs/plugin-react@4.6.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -29706,11 +32644,11 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.19 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))': + '@vitejs/plugin-react@4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -29718,11 +32656,11 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@5.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))': + '@vitejs/plugin-react@5.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -29730,11 +32668,11 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.35 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@5.1.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))': + '@vitejs/plugin-react@5.1.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -29742,71 +32680,71 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.43 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3))': + '@vitejs/plugin-vue-jsx@4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) '@rolldown/pluginutils': 1.0.0-beta.40 '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5) - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue: 3.5.25(typescript@5.8.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2))': + '@vitejs/plugin-vue-jsx@4.2.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) '@rolldown/pluginutils': 1.0.0-beta.40 '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5) - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue: 3.5.25(typescript@5.9.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2))': + '@vitejs/plugin-vue-jsx@5.1.2(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) '@rolldown/pluginutils': 1.0.0-beta.54 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.28.5) - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue: 3.5.25(typescript@5.9.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3))': + '@vitejs/plugin-vue@5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.8.3))': dependencies: - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue: 3.5.25(typescript@5.8.3) - '@vitejs/plugin-vue@5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2))': + '@vitejs/plugin-vue@5.2.4(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2))': dependencies: - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue: 3.5.25(typescript@5.9.2) - '@vitejs/plugin-vue@6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2))': + '@vitejs/plugin-vue@6.0.3(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vue@3.5.25(typescript@5.9.2))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.53 - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) vue: 3.5.25(typescript@5.9.2) - '@vitest/browser@3.0.6(@types/node@22.10.2)(playwright@1.56.1)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4)': + '@vitest/browser@3.0.6(@types/node@22.10.2)(playwright@1.56.1)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4)': dependencies: '@testing-library/dom': 10.4.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) - '@vitest/mocker': 3.0.6(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + '@vitest/mocker': 3.0.6(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@vitest/utils': 3.0.6 magic-string: 0.30.17 msw: 2.7.0(@types/node@22.10.2)(typescript@5.9.2) sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vitest: 3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@25.0.1)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) ws: 8.18.0 optionalDependencies: playwright: 1.56.1 @@ -29825,23 +32763,41 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.6(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))': + '@vitest/expect@4.0.16': + dependencies: + '@standard-schema/spec': 1.0.0 + '@types/chai': 5.2.2 + '@vitest/spy': 4.0.16 + '@vitest/utils': 4.0.16 + chai: 6.2.2 + tinyrainbow: 3.0.3 + + '@vitest/mocker@3.0.6(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.0.6 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.7.0(@types/node@22.10.2)(typescript@5.9.2) - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) - '@vitest/mocker@3.2.4(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.7.0(@types/node@22.10.2)(typescript@5.9.2) - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + + '@vitest/mocker@4.0.16(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))': + dependencies: + '@vitest/spy': 4.0.16 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + msw: 2.7.0(@types/node@22.10.2)(typescript@5.9.2) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) '@vitest/pretty-format@3.0.6': dependencies: @@ -29851,18 +32807,33 @@ snapshots: dependencies: tinyrainbow: 2.0.0 + '@vitest/pretty-format@4.0.16': + dependencies: + tinyrainbow: 3.0.3 + '@vitest/runner@3.2.4': dependencies: '@vitest/utils': 3.2.4 pathe: 2.0.3 strip-literal: 3.0.0 + '@vitest/runner@4.0.16': + dependencies: + '@vitest/utils': 4.0.16 + pathe: 2.0.3 + '@vitest/snapshot@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 magic-string: 0.30.21 pathe: 2.0.3 + '@vitest/snapshot@4.0.16': + dependencies: + '@vitest/pretty-format': 4.0.16 + magic-string: 0.30.21 + pathe: 2.0.3 + '@vitest/spy@3.0.6': dependencies: tinyspy: 3.0.2 @@ -29871,6 +32842,8 @@ snapshots: dependencies: tinyspy: 4.0.4 + '@vitest/spy@4.0.16': {} + '@vitest/ui@3.0.6(vitest@3.2.4)': dependencies: '@vitest/utils': 3.0.6 @@ -29880,7 +32853,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vitest: 3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@25.0.1)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) '@vitest/utils@3.0.6': dependencies: @@ -29894,6 +32867,11 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 + '@vitest/utils@4.0.16': + dependencies: + '@vitest/pretty-format': 4.0.16 + tinyrainbow: 3.0.3 + '@volar/language-core@2.4.11': dependencies: '@volar/source-map': 2.4.11 @@ -30294,6 +33272,8 @@ snapshots: abbrev@3.0.0: {} + abbrev@4.0.0: {} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -30360,6 +33340,10 @@ snapshots: optionalDependencies: ajv: 8.13.0 + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 @@ -30397,6 +33381,23 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + algoliasearch@5.40.1: + dependencies: + '@algolia/abtesting': 1.6.1 + '@algolia/client-abtesting': 5.40.1 + '@algolia/client-analytics': 5.40.1 + '@algolia/client-common': 5.40.1 + '@algolia/client-insights': 5.40.1 + '@algolia/client-personalization': 5.40.1 + '@algolia/client-query-suggestions': 5.40.1 + '@algolia/client-search': 5.40.1 + '@algolia/ingestion': 1.40.1 + '@algolia/monitoring': 1.40.1 + '@algolia/recommend': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + alien-signals@3.1.1: {} ansi-colors@4.1.3: {} @@ -30528,7 +33529,7 @@ snapshots: b4a@1.6.7: {} - babel-dead-code-elimination@1.0.11: + babel-dead-code-elimination@1.0.12: dependencies: '@babel/core': 7.28.5 '@babel/parser': 7.28.5 @@ -30554,9 +33555,9 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 cosmiconfig: 7.1.0 - resolve: 1.22.10 + resolve: 1.22.11 babel-plugin-vue-jsx-hmr@1.0.0: dependencies: @@ -30583,6 +33584,17 @@ snapshots: batch@0.6.1: {} + beasties@0.3.5: + dependencies: + css-select: 6.0.0 + css-what: 7.0.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + htmlparser2: 10.0.0 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-media-query-parser: 0.2.3 + better-ajv-errors@1.2.0(ajv@8.17.1): dependencies: '@babel/code-frame': 7.27.1 @@ -30606,7 +33618,7 @@ snapshots: jose: 6.1.0 kysely: 0.28.8 nanostores: 1.0.1 - zod: 4.1.12 + zod: 4.3.4 optionalDependencies: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -30771,6 +33783,20 @@ snapshots: cac@6.7.14: {} + cacache@20.0.3: + dependencies: + '@npmcli/fs': 5.0.0 + fs-minipass: 3.0.3 + glob: 13.0.0 + lru-cache: 11.2.4 + minipass: 7.1.2 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 7.0.3 + ssri: 13.0.0 + unique-filename: 5.0.0 + call-bind-apply-helpers@1.0.1: dependencies: es-errors: 1.3.0 @@ -30819,6 +33845,8 @@ snapshots: loupe: 3.1.3 pathval: 2.0.0 + chai@6.2.2: {} + chalk@3.0.0: dependencies: ansi-styles: 4.3.0 @@ -30831,8 +33859,12 @@ snapshots: chalk@5.4.1: {} + chalk@5.6.2: {} + char-regex@1.0.2: {} + chardet@2.1.1: {} + check-error@2.1.1: {} cheerio-select@2.1.0: @@ -30903,6 +33935,10 @@ snapshots: dependencies: restore-cursor: 3.1.0 + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + cli-highlight@2.1.11: dependencies: chalk: 4.1.2 @@ -30914,12 +33950,21 @@ snapshots: cli-spinners@2.6.1: {} + cli-spinners@2.9.2: {} + + cli-spinners@3.3.0: {} + cli-table3@0.6.5: dependencies: string-width: 4.2.3 optionalDependencies: '@colors/colors': 1.5.0 + cli-truncate@5.1.1: + dependencies: + slice-ansi: 7.1.2 + string-width: 8.1.0 + cli-width@4.1.0: {} clipboardy@4.0.0: @@ -30940,6 +33985,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 + clone-deep@4.0.1: dependencies: is-plain-object: 2.0.4 @@ -30952,6 +34003,8 @@ snapshots: cluster-key-slot@1.1.2: {} + code-block-writer@12.0.0: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -30997,6 +34050,8 @@ snapshots: commander@12.1.0: {} + commander@14.0.2: {} + commander@2.20.3: {} commander@8.3.0: {} @@ -31059,7 +34114,7 @@ snapshots: chalk: 4.1.2 date-fns: 2.30.0 lodash: 4.17.21 - rxjs: 7.8.1 + rxjs: 7.8.2 shell-quote: 1.8.2 spawn-command: 0.0.2 supports-color: 8.1.1 @@ -31160,6 +34215,10 @@ snapshots: cookie@1.0.2: {} + copy-anything@2.0.6: + dependencies: + is-what: 3.14.1 + copy-file@11.1.0: dependencies: graceful-fs: 4.2.11 @@ -31169,6 +34228,11 @@ snapshots: core-util-is@1.0.3: {} + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 @@ -31214,9 +34278,9 @@ snapshots: dependencies: uncrypto: 0.1.3 - crossws@0.4.1(srvx@0.10.0): + crossws@0.4.4(srvx@0.11.8): optionalDependencies: - srvx: 0.10.0 + srvx: 0.11.8 css-loader@7.1.2(@rspack/core@1.2.2(@swc/helpers@0.5.15))(webpack@5.97.1): dependencies: @@ -31248,6 +34312,14 @@ snapshots: domutils: 3.2.2 nth-check: 2.1.1 + css-select@6.0.0: + dependencies: + boolbase: 1.0.0 + css-what: 7.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + css-tree@2.2.1: dependencies: mdn-data: 2.0.28 @@ -31260,6 +34332,8 @@ snapshots: css-what@6.1.0: {} + css-what@7.0.0: {} + css.escape@1.5.1: {} cssesc@3.0.0: {} @@ -31283,6 +34357,12 @@ snapshots: transitivePeerDependencies: - postcss + cssstyle@5.3.5: + dependencies: + '@asamuzakjp/css-color': 4.1.1 + '@csstools/css-syntax-patches-for-csstree': 1.0.22 + css-tree: 3.1.0 + csstype@3.1.3: {} data-uri-to-buffer@4.0.1: {} @@ -31299,7 +34379,7 @@ snapshots: date-fns@2.30.0: dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 db0@0.3.2(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3): optionalDependencies: @@ -31338,6 +34418,8 @@ snapshots: decimal.js@10.5.0: {} + decimal.js@10.6.0: {} + dedent@1.5.1(babel-plugin-macros@3.1.0): optionalDependencies: babel-plugin-macros: 3.1.0 @@ -31412,6 +34494,8 @@ snapshots: depd@2.0.0: {} + dependency-graph@1.0.0: {} + dequal@2.0.3: {} destr@2.0.5: {} @@ -31502,7 +34586,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 csstype: 3.1.3 dom-serializer@1.4.1: @@ -31564,7 +34648,7 @@ snapshots: dunder-proto@1.0.1: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 @@ -31594,6 +34678,8 @@ snapshots: electron-to-chromium@1.5.90: {} + emoji-regex@10.6.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -31650,6 +34736,13 @@ snapshots: environment@1.1.0: {} + err-code@2.0.3: {} + + errno@0.1.8: + dependencies: + prr: 1.0.1 + optional: true + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -31713,12 +34806,13 @@ snapshots: transitivePeerDependencies: - supports-color - esbuild-plugin-vue3@0.5.1(cheerio@1.0.0)(vue@3.5.25(typescript@5.9.2)): + esbuild-plugin-vue3@0.5.1(cheerio@1.0.0)(sass@1.93.2)(vue@3.5.25(typescript@5.9.2)): dependencies: typescript: 4.9.5 vue: 3.5.25(typescript@5.9.2) optionalDependencies: cheerio: 1.0.0 + sass: 1.93.2 esbuild@0.23.0: optionalDependencies: @@ -31831,6 +34925,64 @@ snapshots: '@esbuild/win32-ia32': 0.25.4 '@esbuild/win32-x64': 0.25.4 + esbuild@0.26.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.26.0 + '@esbuild/android-arm': 0.26.0 + '@esbuild/android-arm64': 0.26.0 + '@esbuild/android-x64': 0.26.0 + '@esbuild/darwin-arm64': 0.26.0 + '@esbuild/darwin-x64': 0.26.0 + '@esbuild/freebsd-arm64': 0.26.0 + '@esbuild/freebsd-x64': 0.26.0 + '@esbuild/linux-arm': 0.26.0 + '@esbuild/linux-arm64': 0.26.0 + '@esbuild/linux-ia32': 0.26.0 + '@esbuild/linux-loong64': 0.26.0 + '@esbuild/linux-mips64el': 0.26.0 + '@esbuild/linux-ppc64': 0.26.0 + '@esbuild/linux-riscv64': 0.26.0 + '@esbuild/linux-s390x': 0.26.0 + '@esbuild/linux-x64': 0.26.0 + '@esbuild/netbsd-arm64': 0.26.0 + '@esbuild/netbsd-x64': 0.26.0 + '@esbuild/openbsd-arm64': 0.26.0 + '@esbuild/openbsd-x64': 0.26.0 + '@esbuild/openharmony-arm64': 0.26.0 + '@esbuild/sunos-x64': 0.26.0 + '@esbuild/win32-arm64': 0.26.0 + '@esbuild/win32-ia32': 0.26.0 + '@esbuild/win32-x64': 0.26.0 + + esbuild@0.27.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -31885,7 +35037,7 @@ snapshots: eslint: 9.22.0(jiti@2.6.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 - minimatch: 10.0.1 + minimatch: 10.1.1 semver: 7.7.3 stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 @@ -32167,7 +35319,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 esutils@2.0.3: {} @@ -32177,8 +35329,16 @@ snapshots: eventemitter3@4.0.7: {} + eventemitter3@5.0.1: {} + events@3.3.0: {} + eventsource-parser@3.0.6: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.0.6 + execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -32195,6 +35355,12 @@ snapshots: expect-type@1.2.2: {} + exponential-backoff@3.1.3: {} + + express-rate-limit@7.5.1(express@5.1.0): + dependencies: + express: 5.1.0 + express@4.21.2: dependencies: accepts: 1.3.8 @@ -32373,6 +35539,11 @@ snapshots: transitivePeerDependencies: - supports-color + find-cache-directory@6.0.0: + dependencies: + common-path-prefix: 3.0.0 + pkg-dir: 8.0.0 + find-root@1.1.0: {} find-up-simple@1.0.1: {} @@ -32502,6 +35673,10 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fs-minipass@3.0.3: + dependencies: + minipass: 7.1.2 + fsevents@2.3.2: optional: true @@ -32525,6 +35700,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.4.0: {} + get-intrinsic@1.2.7: dependencies: call-bind-apply-helpers: 1.0.1 @@ -32619,11 +35796,17 @@ snapshots: dependencies: foreground-child: 3.3.1 jackspeak: 4.0.2 - minimatch: 10.0.1 + minimatch: 10.1.1 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.0 + glob@13.0.0: + dependencies: + minimatch: 10.1.1 + minipass: 7.1.2 + path-scurry: 2.0.0 + globals@13.24.0: dependencies: type-fest: 0.20.2 @@ -32679,12 +35862,19 @@ snapshots: ufo: 1.6.1 uncrypto: 0.1.3 - h3@2.0.1-rc.7(crossws@0.4.1(srvx@0.10.0)): + h3@2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8)): + dependencies: + rou3: 0.7.12 + srvx: 0.11.8 + optionalDependencies: + crossws: 0.4.4(srvx@0.11.8) + + h3@2.0.1-rc.7(crossws@0.4.4(srvx@0.11.8)): dependencies: rou3: 0.7.12 - srvx: 0.10.0 + srvx: 0.10.1 optionalDependencies: - crossws: 0.4.1(srvx@0.10.0) + crossws: 0.4.4(srvx@0.11.8) handle-thing@2.0.1: {} @@ -32724,10 +35914,16 @@ snapshots: hookable@5.5.3: {} + hookable@6.0.1: {} + hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 + hosted-git-info@9.0.2: + dependencies: + lru-cache: 11.2.4 + hpack.js@2.1.6: dependencies: inherits: 2.0.4 @@ -32739,6 +35935,12 @@ snapshots: dependencies: whatwg-encoding: 3.1.1 + html-encoding-sniffer@6.0.0: + dependencies: + '@exodus/bytes': 1.8.0 + transitivePeerDependencies: + - '@exodus/crypto' + html-entities@2.3.3: {} html-entities@2.5.2: {} @@ -32770,6 +35972,13 @@ snapshots: '@rspack/core': 1.2.2(@swc/helpers@0.5.15) webpack: 5.97.1(@swc/core@1.10.15(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + htmlparser2@10.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 6.0.0 + htmlparser2@6.1.0: dependencies: domelementtype: 2.3.0 @@ -32784,6 +35993,8 @@ snapshots: domutils: 3.2.2 entities: 4.5.0 + http-cache-semantics@4.2.0: {} + http-deceiver@1.2.7: {} http-errors@1.6.3: @@ -32887,16 +36098,25 @@ snapshots: ieee754@1.2.1: {} + ignore-walk@8.0.0: + dependencies: + minimatch: 10.1.1 + ignore@5.3.2: {} ignore@7.0.5: {} image-meta@0.2.2: {} + image-size@0.5.5: + optional: true + image-size@2.0.2: {} immer@10.1.1: {} + immutable@5.1.4: {} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 @@ -32925,6 +36145,14 @@ snapshots: ini@1.3.8: {} + ini@5.0.0: {} + + ini@6.0.0: {} + + injection-js@2.6.1: + dependencies: + tslib: 2.8.1 + inline-style-parser@0.2.4: {} internal-slot@1.1.0: @@ -32949,6 +36177,8 @@ snapshots: transitivePeerDependencies: - supports-color + ip-address@10.1.0: {} + ipaddr.js@1.9.1: {} ipaddr.js@2.2.0: {} @@ -33063,6 +36293,10 @@ snapshots: is-fullwidth-code-point@3.0.0: {} + is-fullwidth-code-point@5.1.0: + dependencies: + get-east-asian-width: 1.4.0 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -33087,6 +36321,8 @@ snapshots: is-interactive@1.0.0: {} + is-interactive@2.0.0: {} + is-map@2.0.3: {} is-module@1.0.0: {} @@ -33126,7 +36362,7 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 is-regex@1.2.1: dependencies: @@ -33177,6 +36413,8 @@ snapshots: call-bound: 1.0.3 get-intrinsic: 1.2.7 + is-what@3.14.1: {} + is-what@4.1.16: {} is-wsl@2.2.0: @@ -33199,10 +36437,24 @@ snapshots: isexe@2.0.0: {} + isexe@3.1.1: {} + isobject@3.0.1: {} isomorphic-rslog@0.0.6: {} + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -33236,6 +36488,8 @@ snapshots: jose@6.1.0: {} + jose@6.1.3: {} + jpeg-js@0.4.4: {} js-base64@3.7.8: {} @@ -33329,12 +36583,69 @@ snapshots: - supports-color - utf-8-validate + jsdom@27.3.0: + dependencies: + '@acemir/cssom': 0.9.30 + '@asamuzakjp/dom-selector': 6.7.6 + cssstyle: 5.3.5 + data-urls: 6.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + parse5: 8.0.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 15.1.0 + ws: 8.18.3 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsdom@27.4.0: + dependencies: + '@acemir/cssom': 0.9.30 + '@asamuzakjp/dom-selector': 6.7.6 + '@exodus/bytes': 1.8.0 + cssstyle: 5.3.5 + data-urls: 6.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + parse5: 8.0.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.0 + whatwg-mimetype: 4.0.0 + whatwg-url: 15.1.0 + ws: 8.18.3 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - '@exodus/crypto' + - bufferutil + - supports-color + - utf-8-validate + jsesc@3.1.0: {} json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} + json-parse-even-better-errors@5.0.0: {} + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -33345,6 +36656,8 @@ snapshots: jsonc-parser@3.2.0: {} + jsonc-parser@3.3.1: {} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -33438,6 +36751,20 @@ snapshots: leb@1.0.0: {} + less@4.5.1: + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.8.1 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.3.1 + source-map: 0.6.1 + leven@3.1.0: {} levn@0.4.1: @@ -33548,11 +36875,37 @@ snapshots: mlly: 1.8.0 node-forge: 1.3.1 pathe: 1.1.2 - std-env: 3.9.0 + std-env: 3.10.0 ufo: 1.6.1 untun: 0.1.3 uqr: 0.1.2 + listr2@9.0.5: + dependencies: + cli-truncate: 5.1.1 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.2 + + lmdb@3.4.3: + dependencies: + msgpackr: 1.11.8 + node-addon-api: 6.1.0 + node-gyp-build-optional-packages: 5.2.2 + ordered-binary: 1.6.0 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 3.4.3 + '@lmdb/lmdb-darwin-x64': 3.4.3 + '@lmdb/lmdb-linux-arm': 3.4.3 + '@lmdb/lmdb-linux-arm64': 3.4.3 + '@lmdb/lmdb-linux-x64': 3.4.3 + '@lmdb/lmdb-win32-arm64': 3.4.3 + '@lmdb/lmdb-win32-x64': 3.4.3 + optional: true + loader-runner@4.3.0: {} loader-runner@4.3.1: {} @@ -33609,6 +36962,19 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + log-symbols@7.0.1: + dependencies: + is-unicode-supported: 2.1.0 + yoctocolors: 2.1.2 + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.2 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 + logform@2.7.0: dependencies: '@colors/colors': 1.6.0 @@ -33636,6 +37002,8 @@ snapshots: lru-cache@11.2.2: {} + lru-cache@11.2.4: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -33676,6 +37044,28 @@ snapshots: '@babel/types': 7.28.5 source-map-js: 1.2.1 + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + optional: true + + make-fetch-happen@15.0.3: + dependencies: + '@npmcli/agent': 4.0.0 + cacache: 20.0.3 + http-cache-semantics: 4.2.0 + minipass: 7.1.2 + minipass-fetch: 5.0.0 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 1.0.0 + proc-log: 6.1.0 + promise-retry: 2.0.1 + ssri: 13.0.0 + transitivePeerDependencies: + - supports-color + map-obj@5.0.2: {} markdown-it@14.1.0: @@ -33773,6 +37163,8 @@ snapshots: mimic-fn@4.0.0: {} + mimic-function@5.0.1: {} + min-indent@1.0.1: {} miniflare@4.20250924.0: @@ -33813,9 +37205,9 @@ snapshots: minimalistic-assert@1.0.1: {} - minimatch@10.0.1: + minimatch@10.1.1: dependencies: - brace-expansion: 2.0.1 + '@isaacs/brace-expansion': 5.0.0 minimatch@3.0.8: dependencies: @@ -33843,12 +37235,39 @@ snapshots: minimist@1.2.8: {} + minipass-collect@2.0.1: + dependencies: + minipass: 7.1.2 + + minipass-fetch@5.0.0: + dependencies: + minipass: 7.1.2 + minipass-sized: 1.0.3 + minizlib: 3.1.0 + optionalDependencies: + encoding: 0.1.13 + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + minipass@7.1.2: {} - minizlib@3.0.1: + minizlib@3.1.0: dependencies: minipass: 7.1.2 - rimraf: 5.0.10 mkdirp@3.0.1: {} @@ -33879,12 +37298,29 @@ snapshots: mri@1.2.0: {} - mrmime@2.0.0: {} + mrmime@2.0.1: {} ms@2.0.0: {} ms@2.1.3: {} + msgpackr-extract@3.0.3: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 + optional: true + + msgpackr@1.11.8: + optionalDependencies: + msgpackr-extract: 3.0.3 + optional: true + msw@2.7.0(@types/node@22.10.2)(typescript@5.8.2): dependencies: '@bundled-es-modules/cookie': 2.0.1 @@ -33974,6 +37410,12 @@ snapshots: natural-compare@1.4.0: {} + needle@3.3.1: + dependencies: + iconv-lite: 0.6.3 + sax: 1.4.1 + optional: true + negotiator@0.6.3: {} negotiator@0.6.4: {} @@ -33984,24 +37426,58 @@ snapshots: netlify-redirector@0.5.0: {} - nitro-nightly@3.0.1-20251230-165713-6e801e22(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@4.0.3)(ioredis@5.8.0)(lru-cache@11.2.2)(mysql2@3.15.3)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)): + nf3@0.3.10: {} + + ng-packagr@21.0.1(@angular/compiler-cli@21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2))(tailwindcss@4.1.18)(tslib@2.8.1)(typescript@5.9.2): + dependencies: + '@ampproject/remapping': 2.3.0 + '@angular/compiler-cli': 21.0.4(@angular/compiler@21.0.4)(typescript@5.9.2) + '@rollup/plugin-json': 6.1.0(rollup@4.52.5) + '@rollup/wasm-node': 4.54.0 + ajv: 8.17.1 + ansi-colors: 4.1.3 + browserslist: 4.28.1 + chokidar: 4.0.3 + commander: 14.0.2 + dependency-graph: 1.0.0 + esbuild: 0.27.2 + find-cache-directory: 6.0.0 + injection-js: 2.6.1 + jsonc-parser: 3.3.1 + less: 4.5.1 + ora: 9.0.0 + piscina: 5.1.3 + postcss: 8.5.6 + rollup-plugin-dts: 6.3.0(rollup@4.52.5)(typescript@5.9.2) + rxjs: 7.8.2 + sass: 1.93.2 + tinyglobby: 0.2.15 + tslib: 2.8.1 + typescript: 5.9.2 + optionalDependencies: + rollup: 4.52.5 + tailwindcss: 4.1.18 + + nitro-nightly@3.0.1-20260227-181935-bfbb207c(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@4.0.3)(dotenv@17.2.3)(giget@2.0.0)(jiti@2.6.1)(mysql2@3.15.3)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: consola: 3.4.2 - crossws: 0.4.1(srvx@0.10.0) + crossws: 0.4.4(srvx@0.11.8) db0: 0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3) - h3: 2.0.1-rc.7(crossws@0.4.1(srvx@0.10.0)) - jiti: 2.6.1 + h3: 2.0.1-rc.14(crossws@0.4.4(srvx@0.11.8)) + hookable: 6.0.1 + nf3: 0.3.10 ofetch: 2.0.0-alpha.3 ohash: 2.0.11 - oxc-minify: 0.106.0 - oxc-transform: 0.106.0 - srvx: 0.10.0 - undici: 7.16.0 + rolldown: 1.0.0-rc.6 + srvx: 0.11.8 unenv: 2.0.0-rc.24 - unstorage: 2.0.0-alpha.4(@netlify/blobs@10.1.0)(chokidar@4.0.3)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.8.0)(lru-cache@11.2.2)(ofetch@2.0.0-alpha.3) + unstorage: 2.0.0-alpha.6(@netlify/blobs@10.1.0)(chokidar@4.0.3)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ofetch@2.0.0-alpha.3) optionalDependencies: + dotenv: 17.2.3 + giget: 2.0.0 + jiti: 2.6.1 rollup: 4.52.5 - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -34031,7 +37507,7 @@ snapshots: - sqlite3 - uploadthing - nitropack@2.12.6(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(encoding@0.1.13)(mysql2@3.15.3): + nitropack@2.12.6(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(encoding@0.1.13)(mysql2@3.15.3)(rolldown@1.0.0-rc.6): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 '@rollup/plugin-alias': 5.1.1(rollup@4.52.2) @@ -34084,7 +37560,7 @@ snapshots: pretty-bytes: 7.1.0 radix3: 1.1.2 rollup: 4.52.2 - rollup-plugin-visualizer: 6.0.3(rollup@4.52.2) + rollup-plugin-visualizer: 6.0.3(rolldown@1.0.0-rc.6)(rollup@4.52.2) scule: 1.3.0 semver: 7.7.2 serve-placeholder: 2.0.2 @@ -34136,6 +37612,9 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 + node-addon-api@6.1.0: + optional: true + node-addon-api@7.1.1: {} node-domexception@1.0.0: {} @@ -34163,8 +37642,28 @@ snapshots: node-forge@1.3.1: {} + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.1.2 + optional: true + node-gyp-build@4.8.4: {} + node-gyp@12.1.0: + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.3 + graceful-fs: 4.2.11 + make-fetch-happen: 15.0.3 + nopt: 9.0.0 + proc-log: 6.1.0 + semver: 7.7.3 + tar: 7.5.2 + tinyglobby: 0.2.15 + which: 6.0.0 + transitivePeerDependencies: + - supports-color + node-machine-id@1.1.12: {} node-mock-http@1.0.3: {} @@ -34187,6 +37686,10 @@ snapshots: dependencies: abbrev: 3.0.0 + nopt@9.0.0: + dependencies: + abbrev: 4.0.0 + normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 @@ -34199,6 +37702,50 @@ snapshots: normalize-path@3.0.0: {} + npm-bundled@4.0.0: + dependencies: + npm-normalize-package-bin: 4.0.0 + + npm-install-checks@8.0.0: + dependencies: + semver: 7.7.3 + + npm-normalize-package-bin@4.0.0: {} + + npm-normalize-package-bin@5.0.0: {} + + npm-package-arg@13.0.1: + dependencies: + hosted-git-info: 9.0.2 + proc-log: 5.0.0 + semver: 7.7.3 + validate-npm-package-name: 6.0.2 + + npm-packlist@10.0.3: + dependencies: + ignore-walk: 8.0.0 + proc-log: 6.1.0 + + npm-pick-manifest@11.0.3: + dependencies: + npm-install-checks: 8.0.0 + npm-normalize-package-bin: 5.0.0 + npm-package-arg: 13.0.1 + semver: 7.7.3 + + npm-registry-fetch@19.1.1: + dependencies: + '@npmcli/redact': 4.0.0 + jsonparse: 1.3.1 + make-fetch-happen: 15.0.3 + minipass: 7.1.2 + minipass-fetch: 5.0.0 + minizlib: 3.1.0 + npm-package-arg: 13.0.1 + proc-log: 6.1.0 + transitivePeerDependencies: + - supports-color + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -34297,6 +37844,8 @@ snapshots: obuf@1.1.2: {} + obug@2.1.1: {} + ofetch@1.4.1: dependencies: destr: 2.0.5 @@ -34331,6 +37880,10 @@ snapshots: dependencies: mimic-fn: 4.0.0 + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + open@10.1.0: dependencies: default-browser: 5.2.1 @@ -34358,59 +37911,28 @@ snapshots: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.6.1 + cli-spinners: 2.9.2 is-interactive: 1.0.0 log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - outvariant@1.4.3: {} + ora@9.0.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 3.3.0 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 7.0.1 + stdin-discarder: 0.2.2 + string-width: 8.1.0 + strip-ansi: 7.1.2 - oxc-minify@0.106.0: - optionalDependencies: - '@oxc-minify/binding-android-arm-eabi': 0.106.0 - '@oxc-minify/binding-android-arm64': 0.106.0 - '@oxc-minify/binding-darwin-arm64': 0.106.0 - '@oxc-minify/binding-darwin-x64': 0.106.0 - '@oxc-minify/binding-freebsd-x64': 0.106.0 - '@oxc-minify/binding-linux-arm-gnueabihf': 0.106.0 - '@oxc-minify/binding-linux-arm-musleabihf': 0.106.0 - '@oxc-minify/binding-linux-arm64-gnu': 0.106.0 - '@oxc-minify/binding-linux-arm64-musl': 0.106.0 - '@oxc-minify/binding-linux-ppc64-gnu': 0.106.0 - '@oxc-minify/binding-linux-riscv64-gnu': 0.106.0 - '@oxc-minify/binding-linux-riscv64-musl': 0.106.0 - '@oxc-minify/binding-linux-s390x-gnu': 0.106.0 - '@oxc-minify/binding-linux-x64-gnu': 0.106.0 - '@oxc-minify/binding-linux-x64-musl': 0.106.0 - '@oxc-minify/binding-openharmony-arm64': 0.106.0 - '@oxc-minify/binding-wasm32-wasi': 0.106.0 - '@oxc-minify/binding-win32-arm64-msvc': 0.106.0 - '@oxc-minify/binding-win32-ia32-msvc': 0.106.0 - '@oxc-minify/binding-win32-x64-msvc': 0.106.0 - - oxc-transform@0.106.0: - optionalDependencies: - '@oxc-transform/binding-android-arm-eabi': 0.106.0 - '@oxc-transform/binding-android-arm64': 0.106.0 - '@oxc-transform/binding-darwin-arm64': 0.106.0 - '@oxc-transform/binding-darwin-x64': 0.106.0 - '@oxc-transform/binding-freebsd-x64': 0.106.0 - '@oxc-transform/binding-linux-arm-gnueabihf': 0.106.0 - '@oxc-transform/binding-linux-arm-musleabihf': 0.106.0 - '@oxc-transform/binding-linux-arm64-gnu': 0.106.0 - '@oxc-transform/binding-linux-arm64-musl': 0.106.0 - '@oxc-transform/binding-linux-ppc64-gnu': 0.106.0 - '@oxc-transform/binding-linux-riscv64-gnu': 0.106.0 - '@oxc-transform/binding-linux-riscv64-musl': 0.106.0 - '@oxc-transform/binding-linux-s390x-gnu': 0.106.0 - '@oxc-transform/binding-linux-x64-gnu': 0.106.0 - '@oxc-transform/binding-linux-x64-musl': 0.106.0 - '@oxc-transform/binding-openharmony-arm64': 0.106.0 - '@oxc-transform/binding-wasm32-wasi': 0.106.0 - '@oxc-transform/binding-win32-arm64-msvc': 0.106.0 - '@oxc-transform/binding-win32-ia32-msvc': 0.106.0 - '@oxc-transform/binding-win32-x64-msvc': 0.106.0 + ordered-binary@1.6.0: + optional: true + + outvariant@1.4.3: {} p-event@6.0.1: dependencies: @@ -34460,6 +37982,28 @@ snapshots: package-manager-detector@1.3.0: {} + pacote@21.0.3: + dependencies: + '@npmcli/git': 7.0.1 + '@npmcli/installed-package-contents': 3.0.0 + '@npmcli/package-json': 7.0.4 + '@npmcli/promise-spawn': 8.0.3 + '@npmcli/run-script': 10.0.3 + cacache: 20.0.3 + fs-minipass: 3.0.3 + minipass: 7.1.2 + npm-package-arg: 13.0.1 + npm-packlist: 10.0.3 + npm-pick-manifest: 11.0.3 + npm-registry-fetch: 19.1.1 + proc-log: 5.0.0 + promise-retry: 2.0.1 + sigstore: 4.1.0 + ssri: 12.0.0 + tar: 7.5.2 + transitivePeerDependencies: + - supports-color + param-case@3.0.4: dependencies: dot-case: 3.0.4 @@ -34489,6 +38033,14 @@ snapshots: index-to-position: 1.2.0 type-fest: 4.41.0 + parse-node-version@1.0.1: {} + + parse5-html-rewriting-stream@8.0.0: + dependencies: + entities: 6.0.0 + parse5: 8.0.0 + parse5-sax-parser: 8.0.0 + parse5-htmlparser2-tree-adapter@6.0.1: dependencies: parse5: 6.0.1 @@ -34502,6 +38054,10 @@ snapshots: dependencies: parse5: 7.3.0 + parse5-sax-parser@8.0.0: + dependencies: + parse5: 8.0.0 + parse5@5.1.1: {} parse5@6.0.1: {} @@ -34510,6 +38066,10 @@ snapshots: dependencies: entities: 6.0.0 + parse5@8.0.0: + dependencies: + entities: 6.0.0 + parseurl@1.3.3: {} pascal-case@3.1.2: @@ -34536,7 +38096,7 @@ snapshots: path-scurry@2.0.0: dependencies: - lru-cache: 11.2.2 + lru-cache: 11.2.4 minipass: 7.1.2 path-to-regexp@0.1.12: {} @@ -34571,10 +38131,23 @@ snapshots: picoquery@2.5.0: {} + pify@4.0.1: + optional: true + + piscina@5.1.3: + optionalDependencies: + '@napi-rs/nice': 1.1.1 + + pkce-challenge@5.0.1: {} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 + pkg-dir@8.0.0: + dependencies: + find-up-simple: 1.0.1 + pkg-types@1.3.1: dependencies: confbox: 0.1.8 @@ -34611,6 +38184,8 @@ snapshots: transitivePeerDependencies: - typescript + postcss-media-query-parser@0.2.3: {} + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -34750,6 +38325,10 @@ snapshots: - react - react-dom + proc-log@5.0.0: {} + + proc-log@6.1.0: {} + process-nextick-args@2.0.1: {} process@0.11.10: {} @@ -34758,6 +38337,11 @@ snapshots: promise-limit@2.7.0: {} + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -34794,6 +38378,9 @@ snapshots: proxy-from-env@1.1.0: {} + prr@1.0.1: + optional: true + psl@1.15.0: dependencies: punycode: 2.3.1 @@ -34980,7 +38567,7 @@ snapshots: react-transition-group@4.4.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -35047,7 +38634,7 @@ snapshots: rechoir@0.8.0: dependencies: - resolve: 1.22.10 + resolve: 1.22.11 redaxios@0.5.1: {} @@ -35125,18 +38712,11 @@ snapshots: resolve.exports@2.0.3: {} - resolve@1.22.10: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - resolve@1.22.11: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - optional: true resolve@2.0.0-next.5: dependencies: @@ -35149,34 +38729,85 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + retry@0.12.0: {} retry@0.13.1: {} reusify@1.0.4: {} - rimraf@5.0.10: - dependencies: - glob: 10.4.5 + rfdc@1.4.1: {} rimraf@6.0.1: dependencies: glob: 11.0.1 package-json-from-dist: 1.0.1 + rolldown@1.0.0-beta.47: + dependencies: + '@oxc-project/types': 0.96.0 + '@rolldown/pluginutils': 1.0.0-beta.47 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.47 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.47 + '@rolldown/binding-darwin-x64': 1.0.0-beta.47 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.47 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.47 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.47 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.47 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.47 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.47 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.47 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.47 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.47 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.47 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.47 + + rolldown@1.0.0-rc.6: + dependencies: + '@oxc-project/types': 0.115.0 + '@rolldown/pluginutils': 1.0.0-rc.6 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.6 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.6 + '@rolldown/binding-darwin-x64': 1.0.0-rc.6 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.6 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.6 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.6 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.6 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.6 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.6 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.6 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.6 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.6 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.6 + + rollup-plugin-dts@6.3.0(rollup@4.52.5)(typescript@5.9.2): + dependencies: + magic-string: 0.30.21 + rollup: 4.52.5 + typescript: 5.9.2 + optionalDependencies: + '@babel/code-frame': 7.27.1 + rollup-plugin-preserve-directives@0.4.0(rollup@4.52.5): dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.52.5) magic-string: 0.30.21 rollup: 4.52.5 - rollup-plugin-visualizer@6.0.3(rollup@4.52.2): + rollup-plugin-visualizer@6.0.3(rolldown@1.0.0-rc.6)(rollup@4.52.2): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: + rolldown: 1.0.0-rc.6 rollup: 4.52.2 rollup@4.52.2: @@ -35256,7 +38887,7 @@ snapshots: rspack-vue-loader@17.4.4(vue@3.5.25(typescript@5.9.2))(webpack@5.104.0(@swc/core@1.10.15(@swc/helpers@0.5.15))): dependencies: chalk: 4.1.2 - watchpack: 2.4.2 + watchpack: 2.4.4 webpack: 5.104.0(@swc/core@1.10.15(@swc/helpers@0.5.15)) optionalDependencies: vue: 3.5.25(typescript@5.9.2) @@ -35267,7 +38898,7 @@ snapshots: dependencies: queue-microtask: 1.2.3 - rxjs@7.8.1: + rxjs@7.8.2: dependencies: tslib: 2.8.1 @@ -35289,6 +38920,14 @@ snapshots: safer-buffer@2.1.2: {} + sass@1.93.2: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.4 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + sax@1.4.1: {} saxes@6.0.0: @@ -35326,6 +38965,9 @@ snapshots: '@types/node-forge': 1.3.11 node-forge: 1.3.1 + semver@5.7.2: + optional: true + semver@6.3.1: {} semver@7.5.4: @@ -35518,16 +39160,16 @@ snapshots: side-channel-map@1.0.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-inspect: 1.13.3 side-channel-weakmap@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-inspect: 1.13.3 side-channel-map: 1.0.1 @@ -35545,6 +39187,17 @@ snapshots: signal-exit@4.1.0: {} + sigstore@4.1.0: + dependencies: + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.1.0 + '@sigstore/protobuf-specs': 0.5.0 + '@sigstore/sign': 4.1.0 + '@sigstore/tuf': 4.0.1 + '@sigstore/verify': 3.1.0 + transitivePeerDependencies: + - supports-color + simple-git@3.28.0: dependencies: '@kwsites/file-exists': 1.1.1 @@ -35562,7 +39215,7 @@ snapshots: sirv@3.0.1: dependencies: '@polka/url': 1.0.0-next.28 - mrmime: 2.0.0 + mrmime: 2.0.1 totalist: 3.0.1 skin-tone@2.0.0: @@ -35573,6 +39226,13 @@ snapshots: slashes@3.0.12: {} + slice-ansi@7.1.2: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.1.0 + + smart-buffer@4.2.0: {} + smob@1.5.0: {} sockjs@0.3.24: @@ -35581,6 +39241,19 @@ snapshots: uuid: 8.3.2 websocket-driver: 0.7.4 + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.3 + debug: 4.4.3 + socks: 2.8.7 + transitivePeerDependencies: + - supports-color + + socks@2.8.7: + dependencies: + ip-address: 10.1.0 + smart-buffer: 4.2.0 + solid-js@1.9.10: dependencies: csstype: 3.1.3 @@ -35669,7 +39342,17 @@ snapshots: sqlstring@2.3.3: {} - srvx@0.10.0: {} + srvx@0.10.1: {} + + srvx@0.11.8: {} + + ssri@12.0.0: + dependencies: + minipass: 7.1.2 + + ssri@13.0.0: + dependencies: + minipass: 7.1.2 stable-hash-x@0.2.0: {} @@ -35695,8 +39378,12 @@ snapshots: statuses@2.0.1: {} + std-env@3.10.0: {} + std-env@3.9.0: {} + stdin-discarder@0.2.2: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -35727,7 +39414,18 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + string-width@8.1.0: + dependencies: + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 string_decoder@1.1.1: dependencies: @@ -35741,7 +39439,7 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.1.2: dependencies: ansi-regex: 6.1.0 @@ -35834,13 +39532,12 @@ snapshots: fast-fifo: 1.3.2 streamx: 2.22.0 - tar@7.4.3: + tar@7.5.2: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 minipass: 7.1.2 - minizlib: 3.0.1 - mkdirp: 3.0.1 + minizlib: 3.1.0 yallist: 5.0.0 terser-webpack-plugin@5.3.11(@swc/core@1.10.15(@swc/helpers@0.5.15))(webpack@5.97.1(@swc/core@1.10.15(@swc/helpers@0.5.15))): @@ -35871,7 +39568,7 @@ snapshots: jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 - terser: 5.37.0 + terser: 5.44.0 webpack: 5.104.0(@swc/core@1.10.15(@swc/helpers@0.5.15)) optionalDependencies: '@swc/core': 1.10.15(@swc/helpers@0.5.15) @@ -35883,6 +39580,13 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + terser@5.44.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + text-decoder@1.2.3: dependencies: b4a: 1.6.7 @@ -35915,6 +39619,8 @@ snapshots: tinyexec@0.3.2: {} + tinyexec@1.0.2: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -35924,6 +39630,8 @@ snapshots: tinyrainbow@2.0.0: {} + tinyrainbow@3.0.3: {} + tinyspy@3.0.2: {} tinyspy@4.0.4: {} @@ -36001,7 +39709,7 @@ snapshots: ts-declaration-location@1.0.5(typescript@5.9.2): dependencies: - minimatch: 10.0.1 + minimatch: 10.1.1 typescript: 5.9.2 ts-declaration-location@1.0.7(typescript@5.9.2): @@ -36009,6 +39717,11 @@ snapshots: picomatch: 4.0.3 typescript: 5.9.2 + ts-morph@21.0.1: + dependencies: + '@ts-morph/common': 0.22.0 + code-block-writer: 12.0.0 + ts-pattern@5.6.2: {} tsconfck@3.1.4(typescript@5.8.2): @@ -36051,6 +39764,14 @@ snapshots: dependencies: tslib: 1.14.1 + tuf-js@4.1.0: + dependencies: + '@tufjs/models': 4.1.0 + debug: 4.4.3 + make-fetch-happen: 15.0.3 + transitivePeerDependencies: + - supports-color + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -36181,6 +39902,14 @@ snapshots: unplugin: 2.3.10 unplugin-utils: 0.3.0 + unique-filename@5.0.0: + dependencies: + unique-slug: 6.0.0 + + unique-slug@6.0.0: + dependencies: + imurmurhash: 0.1.4 + universalify@0.1.2: {} universalify@0.2.0: {} @@ -36272,13 +40001,11 @@ snapshots: db0: 0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3) ioredis: 5.8.0 - unstorage@2.0.0-alpha.4(@netlify/blobs@10.1.0)(chokidar@4.0.3)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.8.0)(lru-cache@11.2.2)(ofetch@2.0.0-alpha.3): + unstorage@2.0.0-alpha.6(@netlify/blobs@10.1.0)(chokidar@4.0.3)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ofetch@2.0.0-alpha.3): optionalDependencies: '@netlify/blobs': 10.1.0 chokidar: 4.0.3 db0: 0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3) - ioredis: 5.8.0 - lru-cache: 11.2.2 ofetch: 2.0.0-alpha.3 untun@0.1.3: @@ -36391,6 +40118,8 @@ snapshots: validate-npm-package-name@5.0.1: {} + validate-npm-package-name@6.0.2: {} + vary@1.1.2: {} vibe-rules@0.2.57: @@ -36401,13 +40130,13 @@ snapshots: import-meta-resolve: 4.1.0 zod: 3.25.57 - vite-node@3.2.4(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1): + vite-node@3.2.4(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -36422,7 +40151,7 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)): + vite-plugin-dts@4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: '@microsoft/api-extractor': 7.47.4(@types/node@22.10.2) '@rollup/pluginutils': 5.1.4(rollup@4.52.5) @@ -36436,13 +40165,13 @@ snapshots: typescript: 5.8.2 vue-tsc: 2.0.29(typescript@5.8.2) optionalDependencies: - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-dts@4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)): + vite-plugin-dts@4.0.3(@types/node@22.10.2)(rollup@4.52.5)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: '@microsoft/api-extractor': 7.47.4(@types/node@22.10.2) '@rollup/pluginutils': 5.1.4(rollup@4.52.5) @@ -36456,17 +40185,17 @@ snapshots: typescript: 5.9.2 vue-tsc: 2.0.29(typescript@5.9.2) optionalDependencies: - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.10.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)): + vite-plugin-externalize-deps@0.10.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) - vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)): + vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.10)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: '@babel/core': 7.28.5 '@types/babel__core': 7.20.5 @@ -36474,47 +40203,47 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.10 solid-refresh: 0.6.3(solid-js@1.9.10) - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) optionalDependencies: '@testing-library/jest-dom': 6.6.3 transitivePeerDependencies: - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.8.2) optionalDependencies: - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.8.3) optionalDependencies: - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.9.2) optionalDependencies: - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1): + vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1): dependencies: esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) @@ -36526,20 +40255,22 @@ snapshots: '@types/node': 22.10.2 fsevents: 2.3.3 jiti: 2.6.1 + less: 4.5.1 lightningcss: 1.30.2 - terser: 5.37.0 + sass: 1.93.2 + terser: 5.44.0 tsx: 4.20.3 yaml: 2.8.1 - vitefu@1.1.1(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)): + vitefu@1.1.1(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)): optionalDependencies: - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) - vitest@3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1): + vitest@3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@25.0.1)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -36557,12 +40288,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.10.2 - '@vitest/browser': 3.0.6(@types/node@22.10.2)(playwright@1.56.1)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.0.6(@types/node@22.10.2)(playwright@1.56.1)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4) '@vitest/ui': 3.0.6(vitest@3.2.4) jsdom: 25.0.1 transitivePeerDependencies: @@ -36579,11 +40310,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1): + vitest@3.2.4(@types/node@22.10.2)(@vitest/browser@3.0.6)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -36601,12 +40332,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.10.2 - '@vitest/browser': 3.0.6(@types/node@22.10.2)(playwright@1.56.1)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.0.6(@types/node@22.10.2)(playwright@1.56.1)(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1))(vitest@3.2.4) '@vitest/ui': 3.0.6(vitest@3.2.4) jsdom: 27.0.0(postcss@8.5.6) transitivePeerDependencies: @@ -36623,6 +40354,84 @@ snapshots: - tsx - yaml + vitest@4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.3.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1): + dependencies: + '@vitest/expect': 4.0.16 + '@vitest/mocker': 4.0.16(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.16 + '@vitest/runner': 4.0.16 + '@vitest/snapshot': 4.0.16 + '@vitest/spy': 4.0.16 + '@vitest/utils': 4.0.16 + es-module-lexer: 1.7.0 + expect-type: 1.2.2 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.10.2 + '@vitest/ui': 3.0.6(vitest@3.2.4) + jsdom: 27.3.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + vitest@4.0.16(@types/node@22.10.2)(@vitest/ui@3.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.5.1)(lightningcss@1.30.2)(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1): + dependencies: + '@vitest/expect': 4.0.16 + '@vitest/mocker': 4.0.16(msw@2.7.0(@types/node@22.10.2)(typescript@5.9.2))(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.16 + '@vitest/runner': 4.0.16 + '@vitest/snapshot': 4.0.16 + '@vitest/spy': 4.0.16 + '@vitest/utils': 4.0.16 + es-module-lexer: 1.7.0 + expect-type: 1.2.2 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.44.0)(tsx@4.20.3)(yaml@2.8.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.10.2 + '@vitest/ui': 3.0.6(vitest@3.2.4) + jsdom: 27.4.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + vscode-uri@3.0.8: {} vue-component-type-helpers@2.2.12: {} @@ -36734,6 +40543,9 @@ snapshots: dependencies: defaults: 1.0.4 + weak-lru-cache@1.2.2: + optional: true + web-streams-polyfill@3.3.3: {} web-vitals@4.2.4: {} @@ -36988,6 +40800,14 @@ snapshots: dependencies: isexe: 2.0.0 + which@5.0.0: + dependencies: + isexe: 3.1.1 + + which@6.0.0: + dependencies: + isexe: 3.1.1 + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 @@ -37065,7 +40885,13 @@ snapshots: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.2 wrappy@1.0.2: {} @@ -37114,6 +40940,8 @@ snapshots: yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} + yargs@16.2.0: dependencies: cliui: 7.0.4 @@ -37134,6 +40962,15 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + yauzl@2.10.0: dependencies: buffer-crc32: 0.2.13 @@ -37145,6 +40982,10 @@ snapshots: yoctocolors-cjs@2.1.2: {} + yoctocolors-cjs@2.1.3: {} + + yoctocolors@2.1.2: {} + youch-core@0.3.3: dependencies: '@poppinss/exception': 1.2.2 @@ -37176,8 +41017,19 @@ snapshots: compress-commons: 6.0.2 readable-stream: 4.7.0 + zod-to-json-schema@3.25.0(zod@4.1.13): + dependencies: + zod: 4.1.13 + zod@3.22.3: {} zod@3.25.57: {} zod@4.1.12: {} + + zod@4.1.13: {} + + zod@4.3.4: {} + + zone.js@0.15.1: + optional: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index da7d07317b4..f683dfa5ec7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,6 +7,7 @@ packages: - 'examples/react/*' - 'examples/solid/*' - 'examples/vue/*' + - 'examples/angular/*' - 'examples/react/router-monorepo-react-query/packages/*' - 'examples/react/router-monorepo-simple/packages/*' - 'examples/react/router-monorepo-simple-lazy/packages/*' @@ -14,6 +15,7 @@ packages: - 'e2e/react-router/*' - 'e2e/solid-router/*' - 'e2e/vue-router/*' + - 'e2e/angular-router-experimental/*' - 'e2e/react-start/*' - 'e2e/solid-start/*' - 'e2e/vue-start/*' diff --git a/scripts/publish.js b/scripts/publish.js index 1196db777d9..197a8f36705 100644 --- a/scripts/publish.js +++ b/scripts/publish.js @@ -28,6 +28,10 @@ await publish({ name: '@tanstack/vue-router', packageDir: 'packages/vue-router', }, + { + name: '@tanstack/angular-router-experimental', + packageDir: 'packages/angular-router-experimental', + }, { name: '@tanstack/solid-router-ssr-query', packageDir: 'packages/solid-router-ssr-query', @@ -72,6 +76,10 @@ await publish({ name: '@tanstack/vue-router-devtools', packageDir: 'packages/vue-router-devtools', }, + { + name: '@tanstack/angular-router-devtools', + packageDir: 'packages/angular-router-devtools', + }, { name: '@tanstack/router-devtools-core', packageDir: 'packages/router-devtools-core',