Skip to content

Commit 1aa78f4

Browse files
orinokaiserhalp
andauthored
feat: framework detection for tanstack router and tanstack start (#5857)
* feat: framework detection for tanstack router and tanstack start * feat: remove TanStack logos for now * feat: add TanStack logos as PNGs for now * feat: add tanstack to main framework list * feat: ensure vite doesn't match when using tanstack * fix: use vite dev to avoid mismatching npm scripts Co-authored-by: Philippe Serhal <[email protected]> * test(build-info): add TanStack detection tests --------- Co-authored-by: Philippe Serhal <[email protected]>
1 parent 3a78085 commit 1aa78f4

File tree

8 files changed

+144
-0
lines changed

8 files changed

+144
-0
lines changed
157 KB
Loading
157 KB
Loading

packages/build-info/src/frameworks/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ import { Solid } from './solid.js'
3939
import { Stencil } from './stencil.js'
4040
import { SvelteKit } from './svelte-kit.js'
4141
import { Svelte } from './svelte.js'
42+
import { TanStackRouter } from './tanstack-router.js'
43+
import { TanStackStart } from './tanstack-start.js'
4244
import { Vite } from './vite.js'
4345
import { Vue } from './vue.js'
4446
import { VuePress } from './vuepress.js'
@@ -69,6 +71,8 @@ export const frameworks = [
6971
Solid,
7072
SolidStart,
7173
Stencil,
74+
TanStackRouter,
75+
TanStackStart,
7276
VuePress,
7377
Assemble,
7478
DocPad,
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { beforeEach, expect, test } from 'vitest'
2+
3+
import { mockFileSystem } from '../../tests/mock-file-system.js'
4+
import { NodeFS } from '../node/file-system.js'
5+
import { Project } from '../project.js'
6+
7+
beforeEach((ctx) => {
8+
ctx.fs = new NodeFS()
9+
})
10+
11+
test('detects a TanStack Router site', async ({ fs }) => {
12+
const cwd = mockFileSystem({
13+
'package.json': JSON.stringify({
14+
scripts: {
15+
dev: 'vite --port=3001',
16+
build: 'vite build && tsc --noEmit',
17+
serve: 'vite preview',
18+
start: 'vite',
19+
},
20+
dependencies: {
21+
'@tanstack/react-router': '^1.58.15',
22+
'@tanstack/router-devtools': '^1.58.15',
23+
'@tanstack/router-plugin': '^1.58.12',
24+
react: '^18.2.0',
25+
'react-dom': '^18.2.0',
26+
},
27+
devDependencies: {
28+
vite: '^5.4.5',
29+
},
30+
}),
31+
})
32+
const detected = await new Project(fs, cwd).detectFrameworks()
33+
34+
const detectedFrameworks = (detected ?? []).map((framework) => framework.id)
35+
expect(detectedFrameworks).not.toContain('vinxi')
36+
expect(detectedFrameworks).not.toContain('vite')
37+
expect(detectedFrameworks).not.toContain('tanstack-start')
38+
39+
expect(detected?.[0]?.id).toBe('tanstack-router')
40+
expect(detected?.[0]?.build?.command).toBe('vite build')
41+
expect(detected?.[0]?.build?.directory).toBe('dist')
42+
expect(detected?.[0]?.dev?.command).toBe('vite dev')
43+
expect(detected?.[0]?.dev?.port).toBe(3000)
44+
})
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { BaseFramework, Category, Framework } from './framework.js'
2+
3+
export class TanStackRouter extends BaseFramework implements Framework {
4+
readonly id = 'tanstack-router'
5+
name = 'TanStack Router'
6+
npmDependencies = ['@tanstack/react-router']
7+
excludedNpmDependencies = ['@tanstack/start']
8+
category = Category.SSG
9+
10+
dev = {
11+
command: 'vite dev',
12+
port: 3000,
13+
pollingStrategies: [{ name: 'TCP' }],
14+
}
15+
16+
build = {
17+
command: 'vite build',
18+
directory: 'dist',
19+
}
20+
21+
logo = {
22+
default: '/logos/tanstack-router/default.png',
23+
light: '/logos/tanstack-router/default.png',
24+
dark: '/logos/tanstack-router/default.png',
25+
}
26+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { beforeEach, expect, test } from 'vitest'
2+
3+
import { mockFileSystem } from '../../tests/mock-file-system.js'
4+
import { NodeFS } from '../node/file-system.js'
5+
import { Project } from '../project.js'
6+
7+
beforeEach((ctx) => {
8+
ctx.fs = new NodeFS()
9+
})
10+
11+
test('detects a TanStack Start site', async ({ fs }) => {
12+
const cwd = mockFileSystem({
13+
'package.json': JSON.stringify({
14+
scripts: {
15+
dev: 'vinxi dev',
16+
build: 'vinxi build',
17+
start: 'vinxi start',
18+
},
19+
dependencies: {
20+
'@tanstack/react-router': '^1.58.15',
21+
'@tanstack/router-devtools': '^1.58.15',
22+
'@tanstack/start': '^1.58.15',
23+
react: '^18.3.1',
24+
'react-dom': '^18.3.1',
25+
},
26+
devDependencies: {
27+
vinxi: '0.4.3',
28+
},
29+
}),
30+
})
31+
const detected = await new Project(fs, cwd).detectFrameworks()
32+
33+
const detectedFrameworks = (detected ?? []).map((framework) => framework.id)
34+
expect(detectedFrameworks).not.toContain('vinxi')
35+
expect(detectedFrameworks).not.toContain('vite')
36+
expect(detectedFrameworks).not.toContain('tanstack-router')
37+
38+
expect(detected?.[0]?.id).toBe('tanstack-start')
39+
expect(detected?.[0]?.build?.command).toBe('vinxi build')
40+
expect(detected?.[0]?.build?.directory).toBe('dist')
41+
expect(detected?.[0]?.dev?.command).toBe('vinxi dev')
42+
expect(detected?.[0]?.dev?.port).toBe(3000)
43+
})
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { BaseFramework, Category, Framework } from './framework.js'
2+
3+
export class TanStackStart extends BaseFramework implements Framework {
4+
readonly id = 'tanstack-start'
5+
name = 'TanStack Start'
6+
npmDependencies = ['@tanstack/start']
7+
category = Category.SSG
8+
9+
dev = {
10+
command: 'vinxi dev',
11+
port: 3000,
12+
pollingStrategies: [{ name: 'TCP' }],
13+
}
14+
15+
build = {
16+
command: 'vinxi build',
17+
directory: 'dist',
18+
}
19+
20+
logo = {
21+
default: '/logos/tanstack-start/default.png',
22+
light: '/logos/tanstack-start/default.png',
23+
dark: '/logos/tanstack-start/default.png',
24+
}
25+
}

packages/build-info/src/frameworks/vite.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ export class Vite extends BaseFramework implements Framework {
1212
'@builder.io/qwik',
1313
'solid-start',
1414
'solid-js',
15+
'@tanstack/react-router',
16+
'@tanstack/start',
1517
'@sveltejs/kit',
1618
'@analogjs/platform',
1719
]

0 commit comments

Comments
 (0)