diff --git a/.changeset/easy-zoos-greet.md b/.changeset/easy-zoos-greet.md new file mode 100644 index 00000000000..6e222967819 --- /dev/null +++ b/.changeset/easy-zoos-greet.md @@ -0,0 +1,7 @@ +--- +'@tanstack/react-router': patch +'@tanstack/solid-router': patch +'@tanstack/vue-router': patch +--- + +createFileRoute does not rely on FileRoute class diff --git a/packages/react-router/src/fileRoute.ts b/packages/react-router/src/fileRoute.ts index 46b96240a47..e5fdb4993b9 100644 --- a/packages/react-router/src/fileRoute.ts +++ b/packages/react-router/src/fileRoute.ts @@ -54,11 +54,14 @@ export function createFileRoute< TFullPath extends RouteConstraints['TFullPath'] = FileRoutesByPath[TFilePath]['fullPath'], >( + // eslint-disable-next-line unused-imports/no-unused-vars path?: TFilePath, ): FileRoute['createRoute'] { - return new FileRoute(path, { - silent: true, - }).createRoute + return (options) => { + const route = createRoute(options as any) + ;(route as any).isRoot = false + return route as any + } } /** diff --git a/packages/react-router/tests/fileRoute.test.ts b/packages/react-router/tests/fileRoute.test.ts index 2a8e225371e..9f3fa290d3a 100644 --- a/packages/react-router/tests/fileRoute.test.ts +++ b/packages/react-router/tests/fileRoute.test.ts @@ -1,5 +1,5 @@ /* eslint-disable */ -import { describe, it, expect } from 'vitest' +import { afterEach, describe, it, expect, vi } from 'vitest' import { getRouteApi, createFileRoute, @@ -7,8 +7,33 @@ import { createLazyFileRoute, LazyRoute, AnyRoute, + FileRoute, } from '../src' +afterEach(() => { + vi.restoreAllMocks() +}) + +describe('createFileRoute', () => { + it('creates a non-root route without a deprecation warning', () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + // @ts-expect-error + const route = createFileRoute('')({}) + + expect(route.isRoot).toBe(false) + expect(warn).not.toHaveBeenCalled() + }) + + it('keeps the deprecation warning for direct FileRoute usage', () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + // @ts-expect-error + const route = new FileRoute('').createRoute({}) + + expect(route.isRoot).toBe(false) + expect(warn).toHaveBeenCalledOnce() + }) +}) + describe('createFileRoute has the same hooks as getRouteApi', () => { const routeApi = getRouteApi('foo') const hookNames = Object.keys(routeApi).filter((key) => key.startsWith('use')) diff --git a/packages/solid-router/src/fileRoute.ts b/packages/solid-router/src/fileRoute.ts index 35aa4de1717..1115ee54144 100644 --- a/packages/solid-router/src/fileRoute.ts +++ b/packages/solid-router/src/fileRoute.ts @@ -43,11 +43,14 @@ export function createFileRoute< TFullPath extends RouteConstraints['TFullPath'] = FileRoutesByPath[TFilePath]['fullPath'], >( + // eslint-disable-next-line unused-imports/no-unused-vars path?: TFilePath, ): FileRoute['createRoute'] { - return new FileRoute(path, { - silent: true, - }).createRoute + return (options) => { + const route = createRoute(options as any) + ;(route as any).isRoot = false + return route as any + } } /** diff --git a/packages/solid-router/tests/fileRoute.test.ts b/packages/solid-router/tests/fileRoute.test.ts index f6b92298c8e..5d459d1b7ed 100644 --- a/packages/solid-router/tests/fileRoute.test.ts +++ b/packages/solid-router/tests/fileRoute.test.ts @@ -1,13 +1,38 @@ /* eslint-disable */ -import { describe, it, expect } from 'vitest' +import { afterEach, describe, it, expect, vi } from 'vitest' import { getRouteApi, createFileRoute, createLazyRoute, createLazyFileRoute, LazyRoute, + FileRoute, } from '../src' +afterEach(() => { + vi.restoreAllMocks() +}) + +describe('createFileRoute', () => { + it('creates a non-root route without a deprecation warning', () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + // @ts-expect-error + const route = createFileRoute('')({}) + + expect(route.isRoot).toBe(false) + expect(warn).not.toHaveBeenCalled() + }) + + it('keeps the deprecation warning for direct FileRoute usage', () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + // @ts-expect-error + const route = new FileRoute('').createRoute({}) + + expect(route.isRoot).toBe(false) + expect(warn).toHaveBeenCalledOnce() + }) +}) + describe('createFileRoute has the same hooks as getRouteApi', () => { const routeApi = getRouteApi('foo') const hookNames = Object.keys(routeApi).filter((key) => key.startsWith('use')) diff --git a/packages/vue-router/src/fileRoute.ts b/packages/vue-router/src/fileRoute.ts index 672328b5607..0e0b6c8368f 100644 --- a/packages/vue-router/src/fileRoute.ts +++ b/packages/vue-router/src/fileRoute.ts @@ -43,11 +43,14 @@ export function createFileRoute< TFullPath extends RouteConstraints['TFullPath'] = FileRoutesByPath[TFilePath]['fullPath'], >( + // eslint-disable-next-line unused-imports/no-unused-vars path?: TFilePath, ): FileRoute['createRoute'] { - return new FileRoute(path, { - silent: true, - }).createRoute + return (options) => { + const route = createRoute(options as any) + ;(route as any).isRoot = false + return route as any + } } /** diff --git a/packages/vue-router/tests/fileRoute.test.ts b/packages/vue-router/tests/fileRoute.test.ts index f6b92298c8e..5d459d1b7ed 100644 --- a/packages/vue-router/tests/fileRoute.test.ts +++ b/packages/vue-router/tests/fileRoute.test.ts @@ -1,13 +1,38 @@ /* eslint-disable */ -import { describe, it, expect } from 'vitest' +import { afterEach, describe, it, expect, vi } from 'vitest' import { getRouteApi, createFileRoute, createLazyRoute, createLazyFileRoute, LazyRoute, + FileRoute, } from '../src' +afterEach(() => { + vi.restoreAllMocks() +}) + +describe('createFileRoute', () => { + it('creates a non-root route without a deprecation warning', () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + // @ts-expect-error + const route = createFileRoute('')({}) + + expect(route.isRoot).toBe(false) + expect(warn).not.toHaveBeenCalled() + }) + + it('keeps the deprecation warning for direct FileRoute usage', () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + // @ts-expect-error + const route = new FileRoute('').createRoute({}) + + expect(route.isRoot).toBe(false) + expect(warn).toHaveBeenCalledOnce() + }) +}) + describe('createFileRoute has the same hooks as getRouteApi', () => { const routeApi = getRouteApi('foo') const hookNames = Object.keys(routeApi).filter((key) => key.startsWith('use'))