From f59ae48de5cd05d3e68fd7570984a6d2f7fe172b Mon Sep 17 00:00:00 2001 From: Tanner Linsley Date: Tue, 20 Oct 2026 01:15:23 -0700 Subject: [PATCH 1/2] Match migration source labels to framework names --- src/utils/application-starter.ts | 1 + tests/application-starter-partners.test.ts | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/utils/application-starter.ts b/src/utils/application-starter.ts index 8791335cd..50af42082 100644 --- a/src/utils/application-starter.ts +++ b/src/utils/application-starter.ts @@ -1340,6 +1340,7 @@ function buildPrompt({ function detectMigrationSource(input: string) { for (const source of migrationSources) { + if (source === 'next' && !isNextJsMigrationInput(input)) continue if (input.toLowerCase().includes(source)) { return source } diff --git a/tests/application-starter-partners.test.ts b/tests/application-starter-partners.test.ts index 5bd61c509..0f76593cc 100644 --- a/tests/application-starter-partners.test.ts +++ b/tests/application-starter-partners.test.ts @@ -586,3 +586,16 @@ test('migration guides distinguish framework names from timing and accept multil 'https://tanstack.com/router/latest/docs/how-to/migrate-from-react-router', ) }) + +test('migration source ignores next week when the source is Remix', async () => { + const result = await resolveApplicationStarterDeterministically({ + context: 'home', + input: 'Migrate my Remix app next week to TanStack Start.', + }) + assert.ok(result.prompt.startsWith('Migrate remix into a fresh')) + assert.ok( + result.prompt.includes( + 'https://tanstack.com/router/latest/docs/how-to/migrate-from-react-router', + ), + ) +}) From e89356a3b862ff9cb36d212246eae71e7cd04b70 Mon Sep 17 00:00:00 2001 From: Tanner Linsley Date: Tue, 20 Oct 2026 01:27:13 -0700 Subject: [PATCH 2/2] Recognize Next site migration requests --- src/utils/application-starter.ts | 2 +- tests/application-starter-partners.test.ts | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/utils/application-starter.ts b/src/utils/application-starter.ts index 50af42082..f0ada738d 100644 --- a/src/utils/application-starter.ts +++ b/src/utils/application-starter.ts @@ -1485,7 +1485,7 @@ export function buildDownloadUrl(recipe: ApplicationStarterRecipe) { } const nextJsMigrationPattern = - /migrat(?:e|ing|ion)[\s\S]*\bnext(?:\.?js|\s+(?:app|application|project))\b|\bnext(?:\.?js|\s+(?:app|application|project))\b[\s\S]*migrat(?:e|ing|ion)/i + /migrat(?:e|ing|ion)[\s\S]*\bnext(?:\.?js|\s+(?:app|application|project|site))\b|\bnext(?:\.?js|\s+(?:app|application|project|site))\b[\s\S]*migrat(?:e|ing|ion)/i const remixMigrationPattern = /migrat(?:e|ing|ion)[\s\S]*\b(remix|react[\s-]?router)\b|\b(remix|react[\s-]?router)\b[\s\S]*migrat(?:e|ing|ion)/i diff --git a/tests/application-starter-partners.test.ts b/tests/application-starter-partners.test.ts index 0f76593cc..cca08d732 100644 --- a/tests/application-starter-partners.test.ts +++ b/tests/application-starter-partners.test.ts @@ -599,3 +599,16 @@ test('migration source ignores next week when the source is Remix', async () => ), ) }) + +test('migration source recognizes a Next site', async () => { + const result = await resolveApplicationStarterDeterministically({ + context: 'home', + input: 'Migrate my Next site to TanStack Start.', + }) + assert.ok(result.prompt.startsWith('Migrate next into a fresh')) + assert.ok( + result.prompt.includes( + 'https://tanstack.com/start/latest/docs/framework/react/migrate-from-next-js', + ), + ) +})