Skip to content

Conversation

@birkskyum
Copy link
Member

@birkskyum birkskyum commented Dec 18, 2025

Summary by CodeRabbit

  • New Features

    • Added authentication system (login, signup, logout) across Vue Start projects
    • Introduced protected routes and session management
    • Added Cloudflare Workers support in new Vue Start project
  • Bug Fixes & Updates

    • Refactored component APIs for improved state management
    • Enhanced build and test scripts with type-checking and database setup
  • Configuration

    • Updated build and server startup commands
    • Added SQLite database configuration and migrations
    • Configured Playwright e2e testing with proper setup/teardown

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 18, 2025

Walkthrough

This PR adds comprehensive e2e projects for Vue Start with both basic authentication and Cloudflare integration, while updating the existing Solid Start basic-auth project with enhanced build processes, server function bindings, and database configuration changes.

Changes

Cohort / File(s) Summary
Solid Start: Build & Start Scripts
e2e/solid-start/basic-auth/package.json, e2e/solid-start/basic-auth/.gitignore
Build script now includes TypeScript type-checking (tsc --noEmit); start script switches to srvx server; e2e test script now manages temporary SQLite database in .tmp/ directory with explicit DATABASE_URL configuration and migrations.
Solid Start: Playwright Config
e2e/solid-start/basic-auth/playwright.config.ts
Updated to dynamically manage port files in config directory; environment variables (VITE_SERVER_PORT, PORT) now set at server startup rather than build time.
Solid Start: Component API Changes
e2e/solid-start/basic-auth/src/components/Auth.tsx, e2e/solid-start/basic-auth/src/components/Login.tsx
Auth component's afterSubmit prop changed from JSX.Element to function returning JSX.Element; Login component now wraps loginFn with useServerFn and passes render function to afterSubmit.
Solid Start: Database & Utils
e2e/solid-start/basic-auth/src/utils/prisma.ts, e2e/solid-start/basic-auth/src/utils/session.ts, e2e/solid-start/basic-auth/src/routes/signup.tsx
Prisma default DB path changed from prisma/dev.db to dev.db; session imports User type from generated client path; signup route updated accordingly.
Solid Start: Test Utilities
e2e/solid-start/basic-auth/tests/mock-db-setup.test.ts, e2e/solid-start/basic-auth/tests/mock-db-teardown.test.ts, e2e/solid-start/basic-auth/tests/app.spec.ts
Test helpers now use shared prismaClient and hashPassword; signup() helper signature simplified; tests refactored to use unique emails via Date.now() and dynamic hydration waits.
Vue Start Basic-Auth: Project Setup
e2e/vue-start/basic-auth/.env, e2e/vue-start/basic-auth/.gitignore, e2e/vue-start/basic-auth/.prettierignore, e2e/vue-start/basic-auth/package.json, e2e/vue-start/basic-auth/tsconfig.json, e2e/vue-start/basic-auth/vite.config.ts
New Vue e2e project initialized with Tailwind CSS, Vite, TypeScript, and path aliases; build and e2e test scripts include migrations; srvx added as dependency.
Vue Start Basic-Auth: Prisma Setup
e2e/vue-start/basic-auth/prisma.config.ts, e2e/vue-start/basic-auth/prisma/schema.prisma, e2e/vue-start/basic-auth/prisma/migrations/...
Prisma schema and migrations created for User model (email as PK, password field); adapter configured for LibSQL with SQLite backend.
Vue Start Basic-Auth: Prisma Generated
e2e/vue-start/basic-auth/src/prisma-generated/*
Auto-generated Prisma client types, models, and namespace exports for browser and server contexts; includes User model types, filters, inputs, and delegates.
Vue Start Basic-Auth: Routes & Components
e2e/vue-start/basic-auth/src/routes/__root.tsx, e2e/vue-start/basic-auth/src/routes/_authed.tsx, e2e/vue-start/basic-auth/src/routes/_authed/posts*, e2e/vue-start/basic-auth/src/routes/login.tsx, e2e/vue-start/basic-auth/src/routes/signup.tsx, e2e/vue-start/basic-auth/src/routes/logout.tsx, e2e/vue-start/basic-auth/src/routes/index.tsx
Complete route tree with authentication guards, server functions for login/signup/logout, post listing from jsonplaceholder, and protected post detail views.
Vue Start Basic-Auth: Components & Hooks
e2e/vue-start/basic-auth/src/components/Auth.tsx, e2e/vue-start/basic-auth/src/components/Login.tsx, e2e/vue-start/basic-auth/src/components/DefaultCatchBoundary.tsx, e2e/vue-start/basic-auth/src/components/NotFound.tsx, e2e/vue-start/basic-auth/src/hooks/useMutation.ts
Vue components for authentication UI, error boundaries, not-found pages; custom useMutation hook for server function integration with loading states.
Vue Start Basic-Auth: Utils & Styles
e2e/vue-start/basic-auth/src/utils/prisma.ts, e2e/vue-start/basic-auth/src/utils/session.ts, e2e/vue-start/basic-auth/src/utils/posts.ts, e2e/vue-start/basic-auth/src/utils/seo.ts, e2e/vue-start/basic-auth/src/styles/app.css, e2e/vue-start/basic-auth/src/routeTree.gen.ts
Prisma client initialization with LibSQL adapter, app session hook, post fetching from external API, SEO meta tag helper, Tailwind-based styling, and generated route tree.
Vue Start Basic-Auth: Playwright Setup
e2e/vue-start/basic-auth/playwright.config.ts, e2e/vue-start/basic-auth/tests/mock-db-setup.test.ts, e2e/vue-start/basic-auth/tests/mock-db-teardown.test.ts, e2e/vue-start/basic-auth/tests/app.spec.ts, e2e/vue-start/basic-auth/public/site.webmanifest
Playwright config with dynamic port handling and single Chromium project; test setup/teardown for database initialization; e2e tests for signup, login, posts, and navigation flows.
Vue Start Basic-Cloudflare: Project Setup
e2e/vue-start/basic-cloudflare/.gitignore, e2e/vue-start/basic-cloudflare/.prettierignore, e2e/vue-start/basic-cloudflare/package.json, e2e/vue-start/basic-cloudflare/tsconfig.json, e2e/vue-start/basic-cloudflare/vite.config.ts, e2e/vue-start/basic-cloudflare/wrangler.jsonc
New Vue + Cloudflare Workers e2e project with Wrangler config; Vite config includes Cloudflare and TanStack Start plugins with prerendering enabled.
Vue Start Basic-Cloudflare: Routes & Components
e2e/vue-start/basic-cloudflare/src/routes/__root.tsx, e2e/vue-start/basic-cloudflare/src/routes/index.tsx, e2e/vue-start/basic-cloudflare/src/routes/static.tsx, e2e/vue-start/basic-cloudflare/src/components/DefaultCatchBoundary.tsx, e2e/vue-start/basic-cloudflare/src/components/NotFound.tsx
Root layout with error handling, home page that fetches Cloudflare environment variables, prerendered static page, error boundaries, and not-found component.
Vue Start Basic-Cloudflare: Utils, Config & Tests
e2e/vue-start/basic-cloudflare/src/utils/seo.ts, e2e/vue-start/basic-cloudflare/src/styles/app.css, e2e/vue-start/basic-cloudflare/src/routeTree.gen.ts, e2e/vue-start/basic-cloudflare/src/router.tsx, e2e/vue-start/basic-cloudflare/tests/setup/global.setup.ts, e2e/vue-start/basic-cloudflare/tests/setup/global.teardown.ts, e2e/vue-start/basic-cloudflare/tests/app.spec.ts, e2e/vue-start/basic-cloudflare/public/site.webmanifest
SEO utilities, Tailwind styling, generated route tree, router factory, test setup/teardown for dummy server, e2e tests for environment variables and prerendering, and web app manifest.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60–90 minutes

Areas requiring extra attention:

  • Prisma generated code verification (e2e/vue-start/basic-auth/src/prisma-generated/*): Verify auto-generated types are correct; check LibSQL adapter configuration and schema alignment
  • Authentication flow implementation (e2e/vue-start/basic-auth/src/routes/_authed.tsx, src/routes/signup.tsx): Review server function logic, password hashing, session management, and error handling paths
  • Solid Start component API migration (e2e/solid-start/basic-auth/src/components/Auth.tsx, Login.tsx, signup.tsx): Ensure render-function pattern is correctly applied throughout; verify all callsites updated
  • Database path and import migration (e2e/solid-start/basic-auth/src/utils/prisma.ts, session.ts): Confirm Prisma client path changes (~/prisma-generated/client) and default database location (dev.db) work across both projects
  • Test helper refactoring (e2e/solid-start/basic-auth/tests/app.spec.ts): Validate dynamic email generation and hydration waits maintain test reliability
  • Cloudflare Vite plugin integration (e2e/vue-start/basic-cloudflare/vite.config.ts): Review plugin ordering, SSR environment configuration, and prerendering filter correctness

Possibly related PRs

Suggested labels

feat: e2e, vue, auth, database, test

Suggested reviewers

  • birkskyum
  • schiller-manuel
  • nlynzaad

Poem

🐰 A tale of auth flows newly spun,
With Vue and Solid, projects begun,
Prisma types dance, routes unfold,
Sessions kept, passwords hashed in gold—
Two paths to login, one to the cloud! ☁️

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'test(vue-start): basic-cloudflare, basic-auth' accurately describes the primary changes - adding comprehensive test e2e setups for Vue Start with two new project templates (basic-cloudflare and basic-auth).
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch basic-cloudflare-vue

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@nx-cloud
Copy link

nx-cloud bot commented Dec 18, 2025

View your CI Pipeline Execution ↗ for commit 6fe8ae5

Command Status Duration Result
nx affected --targets=test:eslint,test:unit,tes... ✅ Succeeded 1m 3s View ↗
nx run-many --target=build --exclude=examples/*... ✅ Succeeded 1s View ↗

☁️ Nx Cloud last updated this comment at 2025-12-18 10:59:21 UTC

@pkg-pr-new
Copy link

pkg-pr-new bot commented Dec 18, 2025

More templates

@tanstack/arktype-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/arktype-adapter@6137

@tanstack/directive-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/directive-functions-plugin@6137

@tanstack/eslint-plugin-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/eslint-plugin-router@6137

@tanstack/history

npm i https://pkg.pr.new/TanStack/router/@tanstack/history@6137

@tanstack/nitro-v2-vite-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/nitro-v2-vite-plugin@6137

@tanstack/react-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router@6137

@tanstack/react-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-devtools@6137

@tanstack/react-router-ssr-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-ssr-query@6137

@tanstack/react-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start@6137

@tanstack/react-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-client@6137

@tanstack/react-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-server@6137

@tanstack/router-cli

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-cli@6137

@tanstack/router-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-core@6137

@tanstack/router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools@6137

@tanstack/router-devtools-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools-core@6137

@tanstack/router-generator

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-generator@6137

@tanstack/router-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-plugin@6137

@tanstack/router-ssr-query-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-ssr-query-core@6137

@tanstack/router-utils

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-utils@6137

@tanstack/router-vite-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-vite-plugin@6137

@tanstack/server-functions-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/server-functions-plugin@6137

@tanstack/solid-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router@6137

@tanstack/solid-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router-devtools@6137

@tanstack/solid-router-ssr-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router-ssr-query@6137

@tanstack/solid-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start@6137

@tanstack/solid-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-client@6137

@tanstack/solid-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-server@6137

@tanstack/start-client-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-client-core@6137

@tanstack/start-plugin-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-plugin-core@6137

@tanstack/start-server-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-core@6137

@tanstack/start-static-server-functions

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-static-server-functions@6137

@tanstack/start-storage-context

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-storage-context@6137

@tanstack/valibot-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/valibot-adapter@6137

@tanstack/virtual-file-routes

npm i https://pkg.pr.new/TanStack/router/@tanstack/virtual-file-routes@6137

@tanstack/vue-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-router@6137

@tanstack/vue-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-router-devtools@6137

@tanstack/vue-router-ssr-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-router-ssr-query@6137

@tanstack/vue-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-start@6137

@tanstack/vue-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-start-client@6137

@tanstack/vue-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-start-server@6137

@tanstack/zod-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/zod-adapter@6137

commit: 6fe8ae5

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 15

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
e2e/solid-start/basic-auth/src/utils/prisma.ts (1)

10-20: Critical security flaw: hardcoded salt defeats password hashing.

The hashPassword function uses a static salt 'salt' for all passwords. This means:

  • Identical passwords produce identical hashes
  • The database is vulnerable to rainbow table attacks
  • Password security is significantly weakened

Each password must have a unique, randomly generated salt.

🔎 Refactor to use unique salts per password:
 export function hashPassword(password: string) {
   return new Promise<string>((resolve, reject) => {
-    crypto.pbkdf2(password, 'salt', 100000, 64, 'sha256', (err, derivedKey) => {
+    const salt = crypto.randomBytes(16)
+    crypto.pbkdf2(password, salt, 100000, 64, 'sha256', (err, derivedKey) => {
       if (err) {
         reject(err)
       } else {
-        resolve(derivedKey.toString('hex'))
+        // Store salt + hash together, e.g., "salt:hash"
+        resolve(salt.toString('hex') + ':' + derivedKey.toString('hex'))
       }
     })
   })
 }

Note: You'll also need to update the verification logic to split the stored value and extract the salt for comparison.

Alternatively, consider using a battle-tested library like bcrypt or argon2:

-import crypto from 'node:crypto'
+import bcrypt from 'bcrypt'

-export function hashPassword(password: string) {
-  return new Promise<string>((resolve, reject) => {
-    crypto.pbkdf2(password, 'salt', 100000, 64, 'sha256', (err, derivedKey) => {
-      if (err) {
-        reject(err)
-      } else {
-        resolve(derivedKey.toString('hex'))
-      }
-    })
-  })
-}
+export async function hashPassword(password: string) {
+  return bcrypt.hash(password, 10)
+}
e2e/solid-start/basic-auth/src/routes/signup.tsx (1)

23-24: Misleading comment about password hashing.

Line 23's comment states "Encrypt the password using Sha256 into plaintext", which is inaccurate:

  • The code uses PBKDF2 (not direct SHA-256)
  • Hashing produces a hash digest, not "plaintext"
  • The phrase "encrypt...into plaintext" is contradictory
🔎 Update the comment for accuracy:
-    // Encrypt the password using Sha256 into plaintext
+    // Hash the password using PBKDF2 with SHA-256
     const password = await hashPassword(payload.password)
🧹 Nitpick comments (11)
e2e/vue-start/basic-auth/src/utils/session.ts (1)

1-1: Stale file path comment.

The comment references src/services/session.server.ts but the actual file path is src/utils/session.ts. Consider updating or removing it.

Suggested fix
-// src/services/session.server.ts
+// src/utils/session.ts
e2e/vue-start/basic-auth/prisma/migrations/20240811183753_init/migration.sql (1)

7-8: Redundant unique index on primary key.

The unique index on email is redundant since email is already defined as the primary key (Line 3), which automatically ensures uniqueness and creates an index. While harmless, this adds unnecessary overhead.

🔎 Consider removing the redundant index:
-
--- CreateIndex
-CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
e2e/vue-start/basic-auth/.env (1)

7-7: Consider minor formatting improvements.

Static analysis suggests:

  1. Adding a blank line at the end of the file
  2. Removing quotes around the value (optional for simple paths)
🔎 Apply formatting improvements:
-DATABASE_URL="file:./dev.db"
+DATABASE_URL=file:./dev.db
+
e2e/vue-start/basic-auth/tests/mock-db-teardown.test.ts (1)

5-5: Test name could be more descriptive.

The teardown is named 'create new database' but actually resets the existing database by deleting all users and creating a fresh test user. Consider renaming to better reflect the actual behavior.

🔎 Suggested improvement:
-teardown('create new database', async () => {
+teardown('reset database with test user', async () => {
e2e/vue-start/basic-cloudflare/src/router.tsx (1)

10-11: Consider consistent component passing.

defaultErrorComponent is passed directly while defaultNotFoundComponent is wrapped in an arrow function. Both are functional components, so this inconsistency is unexpected unless required by the framework.

🔎 If both can be passed directly, consider:
 defaultErrorComponent: DefaultCatchBoundary,
-defaultNotFoundComponent: () => <NotFound />,
+defaultNotFoundComponent: NotFound,

Verify whether TanStack Vue Router requires the arrow function wrapper for defaultNotFoundComponent or if both can be passed directly.

e2e/vue-start/basic-auth/src/routes/login.tsx (1)

8-10: Consider removing the unnecessary wrapper function.

The LoginComp wrapper doesn't add any logic or transformation. You can simplify by using the Login component directly in the route definition.

🔎 Apply this diff to simplify the route:
 export const Route = createFileRoute('/login')({
-  component: LoginComp,
+  component: Login,
 })
-
-function LoginComp() {
-  return <Login />
-}
e2e/vue-start/basic-auth/src/components/Auth.tsx (1)

1-13: Consider consistent prop typing with React version.

The Vue version uses VNode | null for afterSubmit, while the React version (e2e/react-start/basic-auth/src/components/Auth.tsx) uses React.ReactNode. For Vue, consider using a more flexible type that allows both render functions and VNodes.

The current typing works, but if you want to support both static VNodes and render functions consistently across the codebase, you could type it as:

afterSubmit?: (() => VNode) | VNode | null

This would allow both patterns while maintaining type safety.

e2e/vue-start/basic-auth/src/components/DefaultCatchBoundary.tsx (1)

42-45: Consider explicit event typing for consistency.

The onClick handler uses an implicit event type (e), while similar implementations in other Vue Start projects (e.g., e2e/vue-start/server-routes, e2e/vue-start/custom-basepath) explicitly type it as (e: MouseEvent).

For consistency across the codebase:

-          onClick={(e) => {
+          onClick={(e: MouseEvent) => {
             e.preventDefault()
             window.history.back()
           }}
e2e/solid-start/basic-auth/src/components/Login.tsx (1)

8-25: Consider consistent server function binding pattern.

Line 10 binds loginFn to login outside the mutation, while line 24 uses useServerFn(signupFn) inline. For consistency and readability, consider extracting the signup binding as well:

const login = useServerFn(loginFn)
const signup = useServerFn(signupFn)

const loginMutation = useMutation({
  fn: login,
  // ...
})

const signupMutation = useMutation({
  fn: signup,
})
e2e/vue-start/basic-auth/src/hooks/useMutation.ts (1)

1-40: LGTM with optional enhancement.

The mutation hook follows a solid pattern with proper Vue 3 reactivity using shallowRef. Error handling and state management are correct.

One optional enhancement: The catch block on line 26-28 doesn't return a value, so mutate returns undefined on error. While this may be intentional, you could explicitly document this behavior or add an explicit return undefined for clarity:

🔎 Optional: Make error return explicit
    } catch (err) {
      status.value = 'error'
      error.value = err as TError
+     return undefined
    }
e2e/vue-start/basic-auth/src/routes/signup.tsx (1)

30-48: Optional: Unusual signup behavior when user exists.

Lines 30-48 implement a pattern where if a user already exists with a matching password, the signup function logs them in and redirects. This is unconventional (signup typically fails if a user exists), but may be intentional for e2e test convenience.

If this is production code, consider whether this behavior could be a security concern (it leaks information about whether an email is registered). For e2e tests, this is likely fine.

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 41dba10 and 6fe8ae5.

⛔ Files ignored due to path filters (17)
  • e2e/solid-start/basic-auth/dev.db is excluded by !**/*.db
  • e2e/vue-start/basic-auth/dev.db is excluded by !**/*.db
  • e2e/vue-start/basic-auth/public/android-chrome-192x192.png is excluded by !**/*.png
  • e2e/vue-start/basic-auth/public/android-chrome-512x512.png is excluded by !**/*.png
  • e2e/vue-start/basic-auth/public/apple-touch-icon.png is excluded by !**/*.png
  • e2e/vue-start/basic-auth/public/favicon-16x16.png is excluded by !**/*.png
  • e2e/vue-start/basic-auth/public/favicon-32x32.png is excluded by !**/*.png
  • e2e/vue-start/basic-auth/public/favicon.ico is excluded by !**/*.ico
  • e2e/vue-start/basic-auth/public/favicon.png is excluded by !**/*.png
  • e2e/vue-start/basic-cloudflare/public/android-chrome-192x192.png is excluded by !**/*.png
  • e2e/vue-start/basic-cloudflare/public/android-chrome-512x512.png is excluded by !**/*.png
  • e2e/vue-start/basic-cloudflare/public/apple-touch-icon.png is excluded by !**/*.png
  • e2e/vue-start/basic-cloudflare/public/favicon-16x16.png is excluded by !**/*.png
  • e2e/vue-start/basic-cloudflare/public/favicon-32x32.png is excluded by !**/*.png
  • e2e/vue-start/basic-cloudflare/public/favicon.ico is excluded by !**/*.ico
  • e2e/vue-start/basic-cloudflare/public/favicon.png is excluded by !**/*.png
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (78)
  • e2e/solid-start/basic-auth/.gitignore (1 hunks)
  • e2e/solid-start/basic-auth/package.json (2 hunks)
  • e2e/solid-start/basic-auth/playwright.config.ts (2 hunks)
  • e2e/solid-start/basic-auth/src/components/Auth.tsx (2 hunks)
  • e2e/solid-start/basic-auth/src/components/Login.tsx (2 hunks)
  • e2e/solid-start/basic-auth/src/routes/signup.tsx (1 hunks)
  • e2e/solid-start/basic-auth/src/utils/prisma.ts (1 hunks)
  • e2e/solid-start/basic-auth/src/utils/session.ts (1 hunks)
  • e2e/solid-start/basic-auth/tests/app.spec.ts (3 hunks)
  • e2e/solid-start/basic-auth/tests/mock-db-setup.test.ts (1 hunks)
  • e2e/solid-start/basic-auth/tests/mock-db-teardown.test.ts (1 hunks)
  • e2e/vue-start/basic-auth/.env (1 hunks)
  • e2e/vue-start/basic-auth/.gitignore (1 hunks)
  • e2e/vue-start/basic-auth/.prettierignore (1 hunks)
  • e2e/vue-start/basic-auth/package.json (1 hunks)
  • e2e/vue-start/basic-auth/playwright.config.ts (1 hunks)
  • e2e/vue-start/basic-auth/postcss.config.mjs (1 hunks)
  • e2e/vue-start/basic-auth/prisma.config.ts (1 hunks)
  • e2e/vue-start/basic-auth/prisma/migrations/20240811183753_init/migration.sql (1 hunks)
  • e2e/vue-start/basic-auth/prisma/migrations/migration_lock.toml (1 hunks)
  • e2e/vue-start/basic-auth/prisma/schema.prisma (1 hunks)
  • e2e/vue-start/basic-auth/public/site.webmanifest (1 hunks)
  • e2e/vue-start/basic-auth/src/components/Auth.tsx (1 hunks)
  • e2e/vue-start/basic-auth/src/components/DefaultCatchBoundary.tsx (1 hunks)
  • e2e/vue-start/basic-auth/src/components/Login.tsx (1 hunks)
  • e2e/vue-start/basic-auth/src/components/NotFound.tsx (1 hunks)
  • e2e/vue-start/basic-auth/src/hooks/useMutation.ts (1 hunks)
  • e2e/vue-start/basic-auth/src/prisma-generated/browser.ts (1 hunks)
  • e2e/vue-start/basic-auth/src/prisma-generated/client.ts (1 hunks)
  • e2e/vue-start/basic-auth/src/prisma-generated/commonInputTypes.ts (1 hunks)
  • e2e/vue-start/basic-auth/src/prisma-generated/enums.ts (1 hunks)
  • e2e/vue-start/basic-auth/src/prisma-generated/internal/class.ts (1 hunks)
  • e2e/vue-start/basic-auth/src/prisma-generated/internal/prismaNamespace.ts (1 hunks)
  • e2e/vue-start/basic-auth/src/prisma-generated/internal/prismaNamespaceBrowser.ts (1 hunks)
  • e2e/vue-start/basic-auth/src/prisma-generated/models.ts (1 hunks)
  • e2e/vue-start/basic-auth/src/prisma-generated/models/User.ts (1 hunks)
  • e2e/vue-start/basic-auth/src/routeTree.gen.ts (1 hunks)
  • e2e/vue-start/basic-auth/src/router.tsx (1 hunks)
  • e2e/vue-start/basic-auth/src/routes/__root.tsx (1 hunks)
  • e2e/vue-start/basic-auth/src/routes/_authed.tsx (1 hunks)
  • e2e/vue-start/basic-auth/src/routes/_authed/posts.$postId.tsx (1 hunks)
  • e2e/vue-start/basic-auth/src/routes/_authed/posts.index.tsx (1 hunks)
  • e2e/vue-start/basic-auth/src/routes/_authed/posts.tsx (1 hunks)
  • e2e/vue-start/basic-auth/src/routes/index.tsx (1 hunks)
  • e2e/vue-start/basic-auth/src/routes/login.tsx (1 hunks)
  • e2e/vue-start/basic-auth/src/routes/logout.tsx (1 hunks)
  • e2e/vue-start/basic-auth/src/routes/signup.tsx (1 hunks)
  • e2e/vue-start/basic-auth/src/styles/app.css (1 hunks)
  • e2e/vue-start/basic-auth/src/utils/posts.ts (1 hunks)
  • e2e/vue-start/basic-auth/src/utils/prisma.ts (1 hunks)
  • e2e/vue-start/basic-auth/src/utils/seo.ts (1 hunks)
  • e2e/vue-start/basic-auth/src/utils/session.ts (1 hunks)
  • e2e/vue-start/basic-auth/tests/app.spec.ts (1 hunks)
  • e2e/vue-start/basic-auth/tests/mock-db-setup.test.ts (1 hunks)
  • e2e/vue-start/basic-auth/tests/mock-db-teardown.test.ts (1 hunks)
  • e2e/vue-start/basic-auth/tsconfig.json (1 hunks)
  • e2e/vue-start/basic-auth/vite.config.ts (1 hunks)
  • e2e/vue-start/basic-cloudflare/.gitignore (1 hunks)
  • e2e/vue-start/basic-cloudflare/.prettierignore (1 hunks)
  • e2e/vue-start/basic-cloudflare/package.json (1 hunks)
  • e2e/vue-start/basic-cloudflare/playwright.config.ts (1 hunks)
  • e2e/vue-start/basic-cloudflare/postcss.config.mjs (1 hunks)
  • e2e/vue-start/basic-cloudflare/public/site.webmanifest (1 hunks)
  • e2e/vue-start/basic-cloudflare/src/components/DefaultCatchBoundary.tsx (1 hunks)
  • e2e/vue-start/basic-cloudflare/src/components/NotFound.tsx (1 hunks)
  • e2e/vue-start/basic-cloudflare/src/routeTree.gen.ts (1 hunks)
  • e2e/vue-start/basic-cloudflare/src/router.tsx (1 hunks)
  • e2e/vue-start/basic-cloudflare/src/routes/__root.tsx (1 hunks)
  • e2e/vue-start/basic-cloudflare/src/routes/index.tsx (1 hunks)
  • e2e/vue-start/basic-cloudflare/src/routes/static.tsx (1 hunks)
  • e2e/vue-start/basic-cloudflare/src/styles/app.css (1 hunks)
  • e2e/vue-start/basic-cloudflare/src/utils/seo.ts (1 hunks)
  • e2e/vue-start/basic-cloudflare/tests/app.spec.ts (1 hunks)
  • e2e/vue-start/basic-cloudflare/tests/setup/global.setup.ts (1 hunks)
  • e2e/vue-start/basic-cloudflare/tests/setup/global.teardown.ts (1 hunks)
  • e2e/vue-start/basic-cloudflare/tsconfig.json (1 hunks)
  • e2e/vue-start/basic-cloudflare/vite.config.ts (1 hunks)
  • e2e/vue-start/basic-cloudflare/wrangler.jsonc (1 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Use TypeScript strict mode with extensive type safety for all code

Files:

  • e2e/vue-start/basic-cloudflare/src/routes/static.tsx
  • e2e/vue-start/basic-cloudflare/playwright.config.ts
  • e2e/vue-start/basic-cloudflare/src/router.tsx
  • e2e/vue-start/basic-auth/src/router.tsx
  • e2e/vue-start/basic-auth/src/utils/seo.ts
  • e2e/vue-start/basic-auth/src/components/Auth.tsx
  • e2e/vue-start/basic-cloudflare/src/utils/seo.ts
  • e2e/vue-start/basic-auth/src/utils/prisma.ts
  • e2e/solid-start/basic-auth/tests/mock-db-teardown.test.ts
  • e2e/vue-start/basic-auth/src/routes/__root.tsx
  • e2e/vue-start/basic-auth/src/components/Login.tsx
  • e2e/vue-start/basic-auth/src/components/DefaultCatchBoundary.tsx
  • e2e/vue-start/basic-auth/src/utils/session.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/commonInputTypes.ts
  • e2e/vue-start/basic-auth/vite.config.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/internal/prismaNamespaceBrowser.ts
  • e2e/vue-start/basic-auth/src/components/NotFound.tsx
  • e2e/vue-start/basic-auth/src/routeTree.gen.ts
  • e2e/vue-start/basic-auth/src/routes/_authed.tsx
  • e2e/vue-start/basic-auth/src/routes/index.tsx
  • e2e/vue-start/basic-auth/prisma.config.ts
  • e2e/solid-start/basic-auth/src/utils/prisma.ts
  • e2e/vue-start/basic-cloudflare/src/routes/__root.tsx
  • e2e/solid-start/basic-auth/playwright.config.ts
  • e2e/vue-start/basic-auth/playwright.config.ts
  • e2e/vue-start/basic-cloudflare/tests/setup/global.teardown.ts
  • e2e/solid-start/basic-auth/tests/mock-db-setup.test.ts
  • e2e/vue-start/basic-auth/src/routes/signup.tsx
  • e2e/vue-start/basic-auth/src/routes/_authed/posts.index.tsx
  • e2e/vue-start/basic-cloudflare/tests/setup/global.setup.ts
  • e2e/vue-start/basic-cloudflare/src/components/DefaultCatchBoundary.tsx
  • e2e/vue-start/basic-auth/src/prisma-generated/client.ts
  • e2e/vue-start/basic-auth/src/utils/posts.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/internal/class.ts
  • e2e/solid-start/basic-auth/src/components/Login.tsx
  • e2e/vue-start/basic-auth/src/routes/_authed/posts.$postId.tsx
  • e2e/solid-start/basic-auth/src/components/Auth.tsx
  • e2e/vue-start/basic-cloudflare/src/routes/index.tsx
  • e2e/solid-start/basic-auth/tests/app.spec.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/browser.ts
  • e2e/solid-start/basic-auth/src/routes/signup.tsx
  • e2e/vue-start/basic-auth/tests/mock-db-teardown.test.ts
  • e2e/vue-start/basic-cloudflare/vite.config.ts
  • e2e/vue-start/basic-auth/src/routes/logout.tsx
  • e2e/vue-start/basic-cloudflare/src/components/NotFound.tsx
  • e2e/vue-start/basic-auth/src/routes/_authed/posts.tsx
  • e2e/solid-start/basic-auth/src/utils/session.ts
  • e2e/vue-start/basic-auth/tests/app.spec.ts
  • e2e/vue-start/basic-cloudflare/src/routeTree.gen.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/models.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/enums.ts
  • e2e/vue-start/basic-auth/tests/mock-db-setup.test.ts
  • e2e/vue-start/basic-auth/src/routes/login.tsx
  • e2e/vue-start/basic-auth/src/hooks/useMutation.ts
  • e2e/vue-start/basic-cloudflare/tests/app.spec.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/internal/prismaNamespace.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/models/User.ts
**/*.{js,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Implement ESLint rules for router best practices using the ESLint plugin router

Files:

  • e2e/vue-start/basic-cloudflare/src/routes/static.tsx
  • e2e/vue-start/basic-cloudflare/playwright.config.ts
  • e2e/vue-start/basic-cloudflare/src/router.tsx
  • e2e/vue-start/basic-auth/src/router.tsx
  • e2e/vue-start/basic-auth/src/utils/seo.ts
  • e2e/vue-start/basic-auth/src/components/Auth.tsx
  • e2e/vue-start/basic-cloudflare/src/utils/seo.ts
  • e2e/vue-start/basic-auth/src/utils/prisma.ts
  • e2e/solid-start/basic-auth/tests/mock-db-teardown.test.ts
  • e2e/vue-start/basic-auth/src/routes/__root.tsx
  • e2e/vue-start/basic-auth/src/components/Login.tsx
  • e2e/vue-start/basic-auth/src/components/DefaultCatchBoundary.tsx
  • e2e/vue-start/basic-auth/src/utils/session.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/commonInputTypes.ts
  • e2e/vue-start/basic-auth/vite.config.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/internal/prismaNamespaceBrowser.ts
  • e2e/vue-start/basic-auth/src/components/NotFound.tsx
  • e2e/vue-start/basic-auth/src/routeTree.gen.ts
  • e2e/vue-start/basic-auth/src/routes/_authed.tsx
  • e2e/vue-start/basic-auth/src/routes/index.tsx
  • e2e/vue-start/basic-auth/prisma.config.ts
  • e2e/solid-start/basic-auth/src/utils/prisma.ts
  • e2e/vue-start/basic-cloudflare/src/routes/__root.tsx
  • e2e/solid-start/basic-auth/playwright.config.ts
  • e2e/vue-start/basic-auth/playwright.config.ts
  • e2e/vue-start/basic-cloudflare/tests/setup/global.teardown.ts
  • e2e/solid-start/basic-auth/tests/mock-db-setup.test.ts
  • e2e/vue-start/basic-auth/src/routes/signup.tsx
  • e2e/vue-start/basic-auth/src/routes/_authed/posts.index.tsx
  • e2e/vue-start/basic-cloudflare/tests/setup/global.setup.ts
  • e2e/vue-start/basic-cloudflare/src/components/DefaultCatchBoundary.tsx
  • e2e/vue-start/basic-auth/src/prisma-generated/client.ts
  • e2e/vue-start/basic-auth/src/utils/posts.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/internal/class.ts
  • e2e/solid-start/basic-auth/src/components/Login.tsx
  • e2e/vue-start/basic-auth/src/routes/_authed/posts.$postId.tsx
  • e2e/solid-start/basic-auth/src/components/Auth.tsx
  • e2e/vue-start/basic-cloudflare/src/routes/index.tsx
  • e2e/solid-start/basic-auth/tests/app.spec.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/browser.ts
  • e2e/solid-start/basic-auth/src/routes/signup.tsx
  • e2e/vue-start/basic-auth/tests/mock-db-teardown.test.ts
  • e2e/vue-start/basic-cloudflare/vite.config.ts
  • e2e/vue-start/basic-auth/src/routes/logout.tsx
  • e2e/vue-start/basic-cloudflare/src/components/NotFound.tsx
  • e2e/vue-start/basic-auth/src/routes/_authed/posts.tsx
  • e2e/solid-start/basic-auth/src/utils/session.ts
  • e2e/vue-start/basic-auth/tests/app.spec.ts
  • e2e/vue-start/basic-cloudflare/src/routeTree.gen.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/models.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/enums.ts
  • e2e/vue-start/basic-auth/tests/mock-db-setup.test.ts
  • e2e/vue-start/basic-auth/src/routes/login.tsx
  • e2e/vue-start/basic-auth/src/hooks/useMutation.ts
  • e2e/vue-start/basic-cloudflare/tests/app.spec.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/internal/prismaNamespace.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/models/User.ts
**/package.json

📄 CodeRabbit inference engine (AGENTS.md)

Use workspace protocol workspace:* for internal dependencies in package.json files

Files:

  • e2e/solid-start/basic-auth/package.json
  • e2e/vue-start/basic-cloudflare/package.json
  • e2e/vue-start/basic-auth/package.json
🧠 Learnings (9)
📚 Learning: 2025-10-09T12:59:14.842Z
Learnt from: hokkyss
Repo: TanStack/router PR: 5418
File: e2e/react-start/custom-identifier-prefix/public/site.webmanifest:2-3
Timestamp: 2025-10-09T12:59:14.842Z
Learning: In e2e test fixtures (files under e2e directories), empty or placeholder values in configuration files like site.webmanifest are acceptable and should not be flagged unless the test specifically validates those fields.

Applied to files:

  • e2e/vue-start/basic-cloudflare/playwright.config.ts
  • e2e/vue-start/basic-auth/playwright.config.ts
  • e2e/vue-start/basic-cloudflare/tests/setup/global.setup.ts
  • e2e/vue-start/basic-cloudflare/public/site.webmanifest
  • e2e/vue-start/basic-auth/public/site.webmanifest
  • e2e/vue-start/basic-cloudflare/tests/app.spec.ts
📚 Learning: 2025-12-06T15:03:07.223Z
Learnt from: CR
Repo: TanStack/router PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-06T15:03:07.223Z
Learning: Applies to **/*.{js,ts,tsx} : Implement ESLint rules for router best practices using the ESLint plugin router

Applied to files:

  • e2e/vue-start/basic-auth/src/router.tsx
  • e2e/vue-start/basic-auth/tsconfig.json
  • e2e/vue-start/basic-auth/src/routes/__root.tsx
  • e2e/vue-start/basic-auth/.prettierignore
  • e2e/vue-start/basic-auth/src/routeTree.gen.ts
  • e2e/vue-start/basic-auth/src/routes/index.tsx
  • e2e/vue-start/basic-cloudflare/src/routes/__root.tsx
  • e2e/vue-start/basic-cloudflare/.prettierignore
  • e2e/vue-start/basic-auth/src/routes/_authed/posts.tsx
  • e2e/vue-start/basic-cloudflare/src/routeTree.gen.ts
  • e2e/vue-start/basic-auth/src/routes/login.tsx
📚 Learning: 2025-10-08T08:11:47.088Z
Learnt from: nlynzaad
Repo: TanStack/router PR: 5402
File: packages/router-generator/tests/generator/no-formatted-route-tree/routeTree.nonnested.snapshot.ts:19-21
Timestamp: 2025-10-08T08:11:47.088Z
Learning: Test snapshot files in the router-generator tests directory (e.g., files matching the pattern `packages/router-generator/tests/generator/**/routeTree*.snapshot.ts` or `routeTree*.snapshot.js`) should not be modified or have issues flagged, as they are fixtures used to verify the generator's output and are intentionally preserved as-is.

Applied to files:

  • e2e/vue-start/basic-auth/src/router.tsx
  • e2e/vue-start/basic-auth/.prettierignore
  • e2e/vue-start/basic-auth/src/routeTree.gen.ts
  • e2e/vue-start/basic-auth/src/routes/index.tsx
  • e2e/vue-start/basic-cloudflare/.prettierignore
  • e2e/vue-start/basic-auth/src/routes/_authed/posts.tsx
  • e2e/vue-start/basic-cloudflare/src/routeTree.gen.ts
📚 Learning: 2025-12-06T15:03:07.223Z
Learnt from: CR
Repo: TanStack/router PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-06T15:03:07.223Z
Learning: Applies to **/*.{ts,tsx} : Use TypeScript strict mode with extensive type safety for all code

Applied to files:

  • e2e/vue-start/basic-auth/tsconfig.json
  • e2e/vue-start/basic-cloudflare/tsconfig.json
📚 Learning: 2025-11-02T16:16:24.898Z
Learnt from: nlynzaad
Repo: TanStack/router PR: 5732
File: packages/start-client-core/src/client/hydrateStart.ts:6-9
Timestamp: 2025-11-02T16:16:24.898Z
Learning: In packages/start-client-core/src/client/hydrateStart.ts, the `import/no-duplicates` ESLint disable is necessary for imports from `#tanstack-router-entry` and `#tanstack-start-entry` because both aliases resolve to the same placeholder file (`fake-start-entry.js`) in package.json during static analysis, even though they resolve to different files at runtime.

Applied to files:

  • e2e/vue-start/basic-auth/tsconfig.json
  • e2e/vue-start/basic-auth/vite.config.ts
  • e2e/vue-start/basic-auth/src/routeTree.gen.ts
  • e2e/vue-start/basic-auth/src/routes/index.tsx
  • e2e/vue-start/basic-cloudflare/tests/setup/global.setup.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/client.ts
  • e2e/vue-start/basic-auth/src/prisma-generated/browser.ts
  • e2e/solid-start/basic-auth/src/utils/session.ts
  • e2e/vue-start/basic-cloudflare/package.json
  • e2e/vue-start/basic-cloudflare/src/routeTree.gen.ts
  • e2e/vue-start/basic-auth/package.json
📚 Learning: 2025-10-14T18:59:33.990Z
Learnt from: FatahChan
Repo: TanStack/router PR: 5475
File: e2e/react-start/basic-prerendering/src/routes/redirect/$target/via-beforeLoad.tsx:8-0
Timestamp: 2025-10-14T18:59:33.990Z
Learning: In TanStack Router e2e test files, when a route parameter is validated at the route level (e.g., using zod in validateSearch or param validation), switch statements on that parameter do not require a default case, as the validation ensures only expected values will reach the switch.

Applied to files:

  • e2e/vue-start/basic-auth/src/routes/__root.tsx
📚 Learning: 2025-10-01T18:31:35.420Z
Learnt from: schiller-manuel
Repo: TanStack/router PR: 5330
File: e2e/react-start/custom-basepath/src/routeTree.gen.ts:58-61
Timestamp: 2025-10-01T18:31:35.420Z
Learning: Do not review files named `routeTree.gen.ts` in TanStack Router repositories, as these are autogenerated files that should not be manually modified.

Applied to files:

  • e2e/vue-start/basic-auth/.prettierignore
  • e2e/vue-start/basic-auth/src/routeTree.gen.ts
  • e2e/vue-start/basic-auth/src/routes/index.tsx
  • e2e/vue-start/basic-cloudflare/.prettierignore
  • e2e/vue-start/basic-cloudflare/src/routeTree.gen.ts
📚 Learning: 2025-12-17T02:17:55.086Z
Learnt from: schiller-manuel
Repo: TanStack/router PR: 6120
File: packages/router-generator/src/generator.ts:654-657
Timestamp: 2025-12-17T02:17:55.086Z
Learning: In `packages/router-generator/src/generator.ts`, pathless_layout routes must receive a `path` property when they have a `cleanedPath`, even though they are non-path routes. This is necessary because child routes inherit the path from their parent, and without this property, child routes would not have the correct full path at runtime.

Applied to files:

  • e2e/vue-start/basic-auth/src/routeTree.gen.ts
  • e2e/vue-start/basic-auth/src/routes/index.tsx
  • e2e/vue-start/basic-cloudflare/src/routes/__root.tsx
  • e2e/vue-start/basic-auth/src/routes/_authed/posts.tsx
  • e2e/vue-start/basic-cloudflare/src/routeTree.gen.ts
📚 Learning: 2025-12-06T15:03:07.223Z
Learnt from: CR
Repo: TanStack/router PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-06T15:03:07.223Z
Learning: Use file-based routing in `src/routes/` directories or code-based routing with route definitions

Applied to files:

  • e2e/vue-start/basic-auth/src/routeTree.gen.ts
  • e2e/vue-start/basic-cloudflare/src/routeTree.gen.ts
🧬 Code graph analysis (35)
e2e/vue-start/basic-cloudflare/src/routes/static.tsx (1)
e2e/vue-start/basic-cloudflare/worker-configuration.d.ts (1)
  • env (9629-9629)
e2e/vue-start/basic-cloudflare/src/router.tsx (2)
e2e/vue-start/basic-cloudflare/src/components/DefaultCatchBoundary.tsx (1)
  • DefaultCatchBoundary (10-53)
e2e/vue-start/basic-cloudflare/src/components/NotFound.tsx (1)
  • NotFound (3-25)
e2e/vue-start/basic-auth/src/router.tsx (4)
e2e/vue-start/basic-auth/src/components/DefaultCatchBoundary.tsx (1)
  • DefaultCatchBoundary (10-53)
e2e/vue-start/basic-auth/src/components/NotFound.tsx (1)
  • NotFound (3-25)
e2e/vue-start/scroll-restoration/src/router.tsx (1)
  • getRouter (6-16)
e2e/react-start/basic-cloudflare/src/router.tsx (1)
  • getRouter (6-16)
e2e/vue-start/basic-auth/src/utils/seo.ts (5)
examples/solid/start-basic-netlify/src/utils/seo.ts (1)
  • title (1-33)
examples/solid/start-basic-nitro/src/utils/seo.ts (1)
  • title (1-33)
e2e/vue-start/website/src/utils/seo.ts (1)
  • title (1-33)
examples/react/start-i18n-paraglide/src/utils/seo.ts (1)
  • title (1-33)
examples/solid/start-basic-cloudflare/src/utils/seo.ts (1)
  • title (1-33)
e2e/vue-start/basic-auth/src/components/Auth.tsx (1)
e2e/react-start/basic-auth/src/components/Auth.tsx (1)
  • Auth (1-57)
e2e/vue-start/basic-cloudflare/src/utils/seo.ts (1)
scripts/llms-generate.mjs (1)
  • title (101-101)
e2e/vue-start/basic-auth/src/utils/prisma.ts (2)
e2e/vue-start/basic-auth/src/prisma-generated/client.ts (2)
  • PrismaClient (37-37)
  • PrismaClient (38-44)
e2e/vue-start/basic-auth/src/prisma-generated/internal/class.ts (1)
  • PrismaClient (105-238)
e2e/vue-start/basic-auth/src/routes/__root.tsx (4)
e2e/vue-start/basic-auth/src/utils/session.ts (1)
  • useAppSession (9-13)
e2e/vue-start/basic-auth/src/utils/seo.ts (1)
  • seo (1-33)
e2e/vue-start/basic-auth/src/components/DefaultCatchBoundary.tsx (1)
  • DefaultCatchBoundary (10-53)
e2e/vue-start/basic-auth/src/components/NotFound.tsx (1)
  • NotFound (3-25)
e2e/vue-start/basic-auth/src/components/Login.tsx (4)
e2e/vue-start/basic-auth/src/routes/_authed.tsx (1)
  • loginFn (8-46)
e2e/vue-start/basic-auth/src/routes/signup.tsx (1)
  • signupFn (10-67)
e2e/vue-start/basic-auth/src/hooks/useMutation.ts (1)
  • useMutation (3-40)
e2e/vue-start/basic-auth/src/components/Auth.tsx (1)
  • Auth (3-65)
e2e/vue-start/basic-auth/src/components/DefaultCatchBoundary.tsx (5)
e2e/vue-start/website/src/components/DefaultCatchBoundary.tsx (2)
  • DefaultCatchBoundary (10-53)
  • e (42-45)
e2e/vue-start/custom-basepath/src/components/DefaultCatchBoundary.tsx (1)
  • DefaultCatchBoundary (10-53)
e2e/vue-start/server-routes/src/components/DefaultCatchBoundary.tsx (1)
  • DefaultCatchBoundary (10-53)
e2e/vue-start/server-functions/src/components/DefaultCatchBoundary.tsx (1)
  • DefaultCatchBoundary (10-53)
e2e/vue-start/scroll-restoration/src/components/DefaultCatchBoundary.tsx (1)
  • DefaultCatchBoundary (10-53)
e2e/vue-start/basic-auth/src/utils/session.ts (3)
e2e/vue-start/basic-auth/src/prisma-generated/browser.ts (1)
  • User (23-23)
e2e/vue-start/basic-auth/src/prisma-generated/client.ts (1)
  • User (51-51)
packages/start-server-core/src/request-response.ts (1)
  • useSession (274-279)
e2e/vue-start/basic-auth/src/prisma-generated/commonInputTypes.ts (2)
e2e/solid-start/basic-auth/src/prisma-generated/commonInputTypes.ts (5)
  • StringFilter (15-27)
  • NestedStringFilter (46-58)
  • StringWithAggregatesFilter (29-44)
  • NestedStringWithAggregatesFilter (60-75)
  • NestedIntFilter (77-86)
e2e/solid-start/basic-auth/src/prisma-generated/internal/prismaNamespace.ts (2)
  • StringFieldRefInput (575-578)
  • IntFieldRefInput (583-586)
e2e/vue-start/basic-auth/src/components/NotFound.tsx (5)
e2e/vue-start/custom-basepath/src/components/NotFound.tsx (1)
  • NotFound (3-25)
e2e/vue-start/server-routes/src/components/NotFound.tsx (1)
  • NotFound (3-25)
e2e/vue-start/basic-vue-query/src/components/NotFound.tsx (1)
  • NotFound (3-25)
e2e/vue-start/website/src/components/NotFound.tsx (1)
  • NotFound (3-25)
e2e/vue-start/server-functions/src/components/NotFound.tsx (1)
  • NotFound (3-25)
e2e/vue-start/basic-auth/src/routeTree.gen.ts (1)
e2e/vue-start/basic-auth/src/router.tsx (1)
  • getRouter (6-16)
e2e/vue-start/basic-auth/src/routes/index.tsx (8)
e2e/vue-start/basic-auth/src/routes/_authed/posts.tsx (1)
  • Route (35-38)
e2e/vue-start/basic-auth/src/routes/_authed.tsx (1)
  • Route (48-61)
e2e/vue-start/basic-auth/src/routes/__root.tsx (1)
  • Route (33-83)
e2e/vue-start/basic-auth/src/routes/_authed/posts.$postId.tsx (1)
  • Route (11-18)
e2e/vue-start/basic-auth/src/routes/signup.tsx (1)
  • Route (106-108)
e2e/vue-start/basic-auth/src/routes/_authed/posts.index.tsx (1)
  • Route (7-9)
e2e/vue-start/basic-auth/src/routes/login.tsx (1)
  • Route (4-6)
e2e/vue-start/basic-auth/src/routes/logout.tsx (1)
  • Route (16-19)
e2e/vue-start/basic-cloudflare/src/routes/__root.tsx (6)
e2e/vue-start/basic-cloudflare/src/routes/index.tsx (1)
  • Route (5-8)
e2e/vue-start/basic-cloudflare/src/routes/static.tsx (1)
  • Route (5-8)
e2e/vue-start/basic-cloudflare/src/utils/seo.ts (1)
  • seo (1-33)
e2e/vue-start/basic-cloudflare/src/components/DefaultCatchBoundary.tsx (1)
  • DefaultCatchBoundary (10-53)
e2e/vue-start/basic-cloudflare/src/components/NotFound.tsx (1)
  • NotFound (3-25)
e2e/vue-start/website/src/routes/__root.tsx (1)
  • RootComponent (60-73)
e2e/vue-start/basic-cloudflare/tests/setup/global.teardown.ts (2)
e2e/vue-router/basic-virtual-named-export-config-file-based/tests/setup/global.teardown.ts (1)
  • teardown (4-6)
e2e/vue-router/basic-vue-query-file-based/tests/setup/global.teardown.ts (1)
  • teardown (4-6)
e2e/solid-start/basic-auth/tests/mock-db-setup.test.ts (1)
e2e/solid-start/basic-auth/src/utils/prisma.ts (2)
  • prismaClient (8-8)
  • hashPassword (10-20)
e2e/vue-start/basic-auth/src/routes/signup.tsx (4)
e2e/vue-start/basic-auth/src/utils/prisma.ts (2)
  • prismaClient (8-8)
  • hashPassword (10-20)
e2e/vue-start/basic-auth/src/utils/session.ts (1)
  • useAppSession (9-13)
e2e/vue-start/basic-auth/src/hooks/useMutation.ts (1)
  • useMutation (3-40)
e2e/vue-start/basic-auth/src/components/Auth.tsx (1)
  • Auth (3-65)
e2e/vue-start/basic-cloudflare/src/components/DefaultCatchBoundary.tsx (2)
e2e/vue-start/website/src/components/DefaultCatchBoundary.tsx (2)
  • DefaultCatchBoundary (10-53)
  • e (42-45)
e2e/vue-start/server-routes/src/components/DefaultCatchBoundary.tsx (1)
  • DefaultCatchBoundary (10-53)
e2e/vue-start/basic-auth/src/prisma-generated/client.ts (4)
e2e/vue-start/basic-auth/src/prisma-generated/internal/class.ts (1)
  • PrismaClient (105-238)
e2e/vue-start/basic-auth/src/prisma-generated/browser.ts (2)
  • Prisma (16-16)
  • User (23-23)
e2e/vue-start/basic-auth/src/prisma-generated/internal/prismaNamespace.ts (2)
  • LogLevel (679-679)
  • PrismaClientOptions (603-673)
e2e/vue-start/basic-auth/src/prisma-generated/models/User.ts (1)
  • UserModel (18-19)
e2e/vue-start/basic-auth/src/prisma-generated/internal/class.ts (3)
e2e/vue-start/basic-auth/src/prisma-generated/client.ts (3)
  • Prisma (45-45)
  • PrismaClient (37-37)
  • PrismaClient (38-44)
e2e/vue-start/basic-auth/src/prisma-generated/internal/prismaNamespace.ts (6)
  • PrismaClientOptions (603-673)
  • LogLevel (679-679)
  • LogDefinition (680-683)
  • GetEvents (691-692)
  • TransactionIsolationLevel (546-548)
  • TransactionIsolationLevel (550-551)
e2e/vue-start/basic-auth/src/prisma-generated/internal/prismaNamespaceBrowser.ts (2)
  • TransactionIsolationLevel (66-68)
  • TransactionIsolationLevel (70-71)
e2e/solid-start/basic-auth/src/components/Login.tsx (3)
e2e/solid-start/basic-auth/src/routes/_authed.tsx (1)
  • loginFn (8-46)
examples/solid/start-basic-auth/src/routes/_authed.tsx (1)
  • loginFn (7-43)
e2e/solid-start/basic-auth/src/hooks/useMutation.ts (1)
  • useMutation (3-41)
e2e/vue-start/basic-auth/src/routes/_authed/posts.$postId.tsx (3)
e2e/vue-start/basic-auth/src/routes/_authed.tsx (1)
  • Route (48-61)
e2e/vue-start/basic-auth/src/utils/posts.ts (1)
  • fetchPost (11-27)
e2e/vue-start/basic-auth/src/components/NotFound.tsx (1)
  • NotFound (3-25)
e2e/vue-start/basic-cloudflare/src/routes/index.tsx (2)
e2e/vue-start/basic-cloudflare/src/routes/static.tsx (1)
  • Route (5-8)
e2e/vue-start/basic-cloudflare/worker-configuration.d.ts (1)
  • env (9629-9629)
e2e/vue-start/basic-auth/src/prisma-generated/browser.ts (2)
e2e/vue-start/basic-auth/src/prisma-generated/client.ts (2)
  • User (51-51)
  • Prisma (45-45)
e2e/vue-start/basic-auth/src/prisma-generated/models/User.ts (1)
  • UserModel (18-19)
e2e/vue-start/basic-auth/tests/mock-db-teardown.test.ts (1)
e2e/vue-start/basic-auth/src/utils/prisma.ts (2)
  • prismaClient (8-8)
  • hashPassword (10-20)
e2e/vue-start/basic-auth/src/routes/logout.tsx (9)
e2e/vue-start/basic-auth/src/utils/session.ts (1)
  • useAppSession (9-13)
e2e/vue-start/basic-auth/src/routes/_authed/posts.tsx (1)
  • Route (35-38)
e2e/vue-start/basic-auth/src/routes/_authed.tsx (1)
  • Route (48-61)
e2e/vue-start/basic-auth/src/routes/__root.tsx (1)
  • Route (33-83)
e2e/vue-start/basic-auth/src/routes/_authed/posts.$postId.tsx (1)
  • Route (11-18)
e2e/vue-start/basic-auth/src/routes/signup.tsx (1)
  • Route (106-108)
e2e/vue-start/basic-auth/src/routes/_authed/posts.index.tsx (1)
  • Route (7-9)
e2e/vue-start/basic-auth/src/routes/index.tsx (1)
  • Route (3-5)
e2e/vue-start/basic-auth/src/routes/login.tsx (1)
  • Route (4-6)
e2e/vue-start/basic-cloudflare/src/components/NotFound.tsx (4)
e2e/vue-start/server-routes/src/components/NotFound.tsx (1)
  • NotFound (3-25)
e2e/vue-start/website/src/components/NotFound.tsx (1)
  • NotFound (3-25)
e2e/vue-start/scroll-restoration/src/components/NotFound.tsx (1)
  • NotFound (3-25)
e2e/vue-start/server-functions/src/components/NotFound.tsx (1)
  • NotFound (3-25)
e2e/vue-start/basic-auth/src/routes/_authed/posts.tsx (9)
e2e/vue-start/basic-auth/src/routes/_authed.tsx (1)
  • Route (48-61)
e2e/vue-start/basic-auth/src/routes/__root.tsx (1)
  • Route (33-83)
e2e/vue-start/basic-auth/src/routes/_authed/posts.$postId.tsx (1)
  • Route (11-18)
e2e/vue-start/basic-auth/src/routes/signup.tsx (1)
  • Route (106-108)
e2e/vue-start/basic-auth/src/routes/_authed/posts.index.tsx (1)
  • Route (7-9)
e2e/vue-start/basic-auth/src/routes/index.tsx (1)
  • Route (3-5)
e2e/vue-start/basic-auth/src/routes/login.tsx (1)
  • Route (4-6)
e2e/vue-start/basic-auth/src/routes/logout.tsx (1)
  • Route (16-19)
e2e/vue-start/basic-auth/src/utils/posts.ts (1)
  • fetchPosts (29-37)
e2e/vue-start/basic-cloudflare/src/routeTree.gen.ts (1)
e2e/vue-start/basic-cloudflare/src/router.tsx (1)
  • getRouter (6-16)
e2e/vue-start/basic-auth/tests/mock-db-setup.test.ts (1)
e2e/vue-start/basic-auth/src/utils/prisma.ts (2)
  • prismaClient (8-8)
  • hashPassword (10-20)
e2e/vue-start/basic-auth/src/routes/login.tsx (3)
e2e/vue-start/basic-auth/src/routes/signup.tsx (1)
  • Route (106-108)
e2e/vue-start/basic-auth/src/routes/index.tsx (1)
  • Route (3-5)
e2e/vue-start/basic-auth/src/components/Login.tsx (1)
  • Login (9-79)
e2e/vue-start/basic-auth/src/prisma-generated/internal/prismaNamespace.ts (1)
e2e/vue-start/basic-auth/src/prisma-generated/internal/class.ts (1)
  • PrismaClient (105-238)
e2e/vue-start/basic-auth/src/prisma-generated/models/User.ts (3)
e2e/vue-start/basic-auth/src/prisma-generated/internal/prismaNamespace.ts (7)
  • GetScalarType (359-363)
  • UserScalarFieldEnum (553-556)
  • UserScalarFieldEnum (558-559)
  • SortOrder (561-564)
  • SortOrder (566-566)
  • Or (346-355)
  • FieldRef (408-408)
e2e/vue-start/basic-auth/src/prisma-generated/internal/prismaNamespaceBrowser.ts (4)
  • UserScalarFieldEnum (73-76)
  • UserScalarFieldEnum (78-79)
  • SortOrder (81-84)
  • SortOrder (86-86)
e2e/vue-start/basic-auth/src/prisma-generated/commonInputTypes.ts (2)
  • StringFilter (15-27)
  • StringWithAggregatesFilter (29-44)
🪛 dotenv-linter (4.0.0)
e2e/vue-start/basic-auth/.env

[warning] 7-7: [EndingBlankLine] No blank line at the end of the file

(EndingBlankLine)


[warning] 7-7: [QuoteCharacter] The value has quote characters (', ")

(QuoteCharacter)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Test

Comment on lines 5 to 16
teardown('create new database', async () => {
if (
await prismaClient.user.findUnique({
where: {
email: 'test2@gmail.com',
},
})
) {
await prismaClient.user.delete({
where: {
email: 'test2@gmail.com',
},
})
}
await prismaClient.user.deleteMany()

const email = 'test@gmail.com'
const password = await hashPassword('test')
await prismaClient.user.create({
data: {
email,
password,
},
})
})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Test description is misleading.

The teardown test is named "create new database" but it's performing cleanup operations. While the logic (deleting all users and recreating the test user) may be intentional to reset to a known state, the test name should reflect its teardown purpose more accurately.

🔎 Consider renaming the test:
-teardown('create new database', async () => {
+teardown('reset database to initial state', async () => {
  await prismaClient.user.deleteMany()
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
teardown('create new database', async () => {
if (
await prismaClient.user.findUnique({
where: {
email: 'test2@gmail.com',
},
})
) {
await prismaClient.user.delete({
where: {
email: 'test2@gmail.com',
},
})
}
await prismaClient.user.deleteMany()
const email = 'test@gmail.com'
const password = await hashPassword('test')
await prismaClient.user.create({
data: {
email,
password,
},
})
})
teardown('reset database to initial state', async () => {
await prismaClient.user.deleteMany()
const email = 'test@gmail.com'
const password = await hashPassword('test')
await prismaClient.user.create({
data: {
email,
password,
},
})
})
🤖 Prompt for AI Agents
In e2e/solid-start/basic-auth/tests/mock-db-teardown.test.ts around lines 5 to
16, the test title "create new database" is misleading because the block
performs teardown/cleanup (deleting users and recreating a test user); rename
the test to reflect its teardown purpose (for example "reset test database" or
"teardown: reset users to known state") so the name matches the actions, and
update any related comments or test suite descriptions accordingly.

Comment on lines +9 to +11
datasource db {
provider = "sqlite"
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Missing required url field in datasource configuration.

The datasource db block is missing the required url field. Prisma needs this to know where to connect to the database. Without it, the Prisma client will fail to initialize at runtime.

🔎 Add the url field to fix this issue:
 datasource db {
   provider = "sqlite"
+  url      = env("DATABASE_URL")
 }

Alternatively, if you want a default fallback:

 datasource db {
   provider = "sqlite"
+  url      = env("DATABASE_URL") || "file:./dev.db"
 }
🤖 Prompt for AI Agents
In e2e/vue-start/basic-auth/prisma/schema.prisma around lines 9 to 11, the
datasource db block is missing the required url field; add a url property
pointing to your SQLite file or environment variable (e.g., datasource db {
provider = "sqlite" url = env("DATABASE_URL") } or a direct file path like
"file:./dev.db") so Prisma can locate the database and initialize the client at
runtime.

Comment on lines +47 to +59
<button
type="button"
class="w-full bg-cyan-600 text-white rounded-sm py-2 font-black uppercase"
disabled={status === 'pending'}
onClick={(event) => {
const form = (event.currentTarget as HTMLButtonElement).form
if (form) {
onSubmit(form)
}
}}
>
{status === 'pending' ? '...' : actionText}
</button>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Use type="submit" for better form UX.

The button is set to type="button" and uses a manual onClick handler to submit the form. This breaks native form behavior:

  • Enter key in form fields won't trigger submission
  • Native HTML5 form validation won't run
  • Non-standard form submission pattern

The form already has an onSubmit handler (lines 19-22) that properly prevents default and calls onSubmit. Remove the button's onClick and change its type to "submit".

🔎 Apply this diff to use standard form submission:
         <button
-          type="button"
+          type="submit"
           class="w-full bg-cyan-600 text-white rounded-sm py-2 font-black uppercase"
           disabled={status === 'pending'}
-          onClick={(event) => {
-            const form = (event.currentTarget as HTMLButtonElement).form
-            if (form) {
-              onSubmit(form)
-            }
-          }}
         >
           {status === 'pending' ? '...' : actionText}
         </button>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<button
type="button"
class="w-full bg-cyan-600 text-white rounded-sm py-2 font-black uppercase"
disabled={status === 'pending'}
onClick={(event) => {
const form = (event.currentTarget as HTMLButtonElement).form
if (form) {
onSubmit(form)
}
}}
>
{status === 'pending' ? '...' : actionText}
</button>
<button
type="submit"
class="w-full bg-cyan-600 text-white rounded-sm py-2 font-black uppercase"
disabled={status === 'pending'}
>
{status === 'pending' ? '...' : actionText}
</button>
🤖 Prompt for AI Agents
In e2e/vue-start/basic-auth/src/components/Auth.tsx around lines 47 to 59, the
submit button is declared as type="button" and manually calls onSubmit in an
onClick handler, which prevents native form behavior; change the button to
type="submit", remove the onClick handler entirely, and keep the
disabled={status === 'pending'} and inner text logic so the form's existing
onSubmit handler (lines 19-22) handles submission, enabling Enter-key submission
and native HTML5 validation.

Comment on lines +38 to +43
loginMutation.mutate({
data: {
email: formData.get('email') as string,
password: formData.get('password') as string,
},
})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Critical: Fix the mutation payload structure.

The mutation is passing { data: { email, password } }, but the loginFn in _authed.tsx expects { email, password } directly (line 11 of _authed.tsx shows the inputValidator expects { email: string; password: string }). This wrapper will cause the server function to fail at runtime.

🔎 Apply this diff to fix the payload structure:
-          loginMutation.mutate({
-            data: {
-              email: formData.get('email') as string,
-              password: formData.get('password') as string,
-            },
-          })
+          loginMutation.mutate({
+            email: formData.get('email') as string,
+            password: formData.get('password') as string,
+          })
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
loginMutation.mutate({
data: {
email: formData.get('email') as string,
password: formData.get('password') as string,
},
})
loginMutation.mutate({
email: formData.get('email') as string,
password: formData.get('password') as string,
})
🤖 Prompt for AI Agents
In e2e/vue-start/basic-auth/src/components/Login.tsx around lines 38 to 43, the
mutation is sending an object shaped as { data: { email, password } } but the
server-side loginFn/_authed.tsx expects { email, password } directly; remove the
extra data wrapper and call loginMutation.mutate with an object containing email
and password at the top level (ensure values are cast to string as before) so
the payload matches the inputValidator signature.

Comment on lines +55 to +66
onClick={(e) => {
const formData = new FormData(
(e.target as HTMLButtonElement).form!,
)

signupMutation.mutate({
data: {
email: formData.get('email') as string,
password: formData.get('password') as string,
},
})
}}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Critical: Fix the signup mutation payload structure.

Same issue as the login mutation: the payload is wrapped in { data: { ... } } but signupFn expects { email, password, redirectUrl? } directly (line 14 of signup.tsx shows the inputValidator signature).

🔎 Apply this diff to fix the payload structure:
                    onClick={(e) => {
                      const formData = new FormData(
                        (e.target as HTMLButtonElement).form!,
                      )

                      signupMutation.mutate({
-                        data: {
-                          email: formData.get('email') as string,
-                          password: formData.get('password') as string,
-                        },
+                        email: formData.get('email') as string,
+                        password: formData.get('password') as string,
                      })
                    }}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
onClick={(e) => {
const formData = new FormData(
(e.target as HTMLButtonElement).form!,
)
signupMutation.mutate({
data: {
email: formData.get('email') as string,
password: formData.get('password') as string,
},
})
}}
onClick={(e) => {
const formData = new FormData(
(e.target as HTMLButtonElement).form!,
)
signupMutation.mutate({
email: formData.get('email') as string,
password: formData.get('password') as string,
})
}}
🤖 Prompt for AI Agents
In e2e/vue-start/basic-auth/src/components/Login.tsx around lines 55 to 66, the
signup mutation payload is incorrectly wrapped as { data: { email, password } }
but signupFn expects the plain shape { email, password, redirectUrl? }; change
the mutate call to pass the fields directly (e.g., signupMutation.mutate({
email: formData.get('email') as string, password: formData.get('password') as
string })) and include redirectUrl only if needed by your flow.

Comment on lines +10 to +20
export function hashPassword(password: string) {
return new Promise<string>((resolve, reject) => {
crypto.pbkdf2(password, 'salt', 100000, 64, 'sha256', (err, derivedKey) => {
if (err) {
reject(err)
} else {
resolve(derivedKey.toString('hex'))
}
})
})
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Fixed salt is acceptable for e2e tests, but dangerous if reused in production.

Line 12 uses a hard-coded salt 'salt' in the password hashing function. While this is acceptable for deterministic e2e test scenarios, using a fixed salt in production would be a critical security vulnerability (all passwords would share the same salt, making rainbow table attacks trivial).

Since this is test code, this is acceptable, but ensure this utility is never copied to production code.

🤖 Prompt for AI Agents
In e2e/vue-start/basic-auth/src/utils/prisma.ts around lines 10 to 20, the
password hashing currently uses a hard-coded salt ('salt'); replace this with a
per-password salt generated via crypto.randomBytes (e.g., 16 bytes) and
incorporate that salt into the stored output (for example store salt and hex
hash together or return an object {salt,hash}), or alternatively change the
function to accept an explicit salt parameter so callers can supply one; also
add a clear comment that the helper is for e2e only and must not be copied into
production code.

Comment on lines +15 to +25
"dependencies": {
"@tanstack/vue-router": "workspace:^",
"@tanstack/vue-router-devtools": "workspace:^",
"@tanstack/vue-start": "workspace:^",
"vue": "^3.5.25"
},
"devDependencies": {
"@cloudflare/vite-plugin": "^1.15.1",
"@playwright/test": "^1.50.1",
"@tailwindcss/postcss": "^4.1.15",
"@tanstack/router-e2e-utils": "workspace:^",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check workspace protocol usage across e2e packages
echo "=== Checking workspace:* usage in e2e packages ==="
rg 'workspace:\*' e2e/ --include='*.json' | wc -l
echo "---"
echo "=== Checking workspace:^ usage in e2e packages ==="
rg 'workspace:\^' e2e/ --include='*.json' | wc -l
echo "---"
echo "=== Sample of workspace:^ in e2e packages ==="
rg -n 'workspace:\^' e2e/ --include='*.json' | head -10

Repository: TanStack/router

Length of output: 1561


🏁 Script executed:

#!/bin/bash
# Check workspace protocol usage across e2e packages
echo "=== Checking workspace:* usage in e2e packages ==="
rg 'workspace:\*' -g '*.json' e2e/ | wc -l
echo "---"
echo "=== Checking workspace:^ usage in e2e packages ==="
rg 'workspace:\^' -g '*.json' e2e/ | wc -l
echo "---"
echo "=== Sample of workspace:^ in e2e packages ==="
rg -n 'workspace:\^' -g '*.json' e2e/ | head -20
echo "---"
echo "=== Sample of workspace:* in e2e packages (if any) ==="
rg -n 'workspace:\*' -g '*.json' e2e/ | head -20

Repository: TanStack/router

Length of output: 2054


🏁 Script executed:

#!/bin/bash
# Check workspace protocol usage across entire repo
echo "=== All workspace:* usage in repo ==="
rg 'workspace:\*' -g '*.json' | wc -l
echo "---"
echo "=== All workspace:^ usage in repo ==="
rg 'workspace:\^' -g '*.json' | wc -l
echo "---"
echo "=== Non-e2e packages sample (workspace:^) ==="
rg -n 'workspace:\^' -g '*.json' --max-count=20 | grep -v '^e2e/'

Repository: TanStack/router

Length of output: 1297


Refactor to use workspace:* per coding guidelines or update guidelines accordingly.

Internal dependencies use workspace:^ throughout the monorepo (427 instances across all packages), but the coding guidelines specify workspace:*. Either the guideline requires updating to reflect the intended workspace:^ pattern, or all package.json files including this one should be refactored to use workspace:*.

🤖 Prompt for AI Agents
In e2e/vue-start/basic-cloudflare/package.json around lines 15 to 25, internal
workspace dependencies are using the caret form "workspace:^" but the repo
coding guidelines require "workspace:*"; update the internal dependency
specifiers (e.g., "@tanstack/vue-router", "@tanstack/vue-router-devtools",
"@tanstack/vue-start", "@tanstack/router-e2e-utils") to use "workspace:*"
instead of "workspace:^" so the package.json conforms to the guidelines, or if
the intended convention is to keep the caret form then raise a docs change
instead of modifying files.

Comment on lines +42 to +45
onClick={(e) => {
e.preventDefault()
window.history.back()
}}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

Add type annotation for the event parameter.

The onClick event handler's parameter lacks a type annotation. For TypeScript strict mode compliance, explicitly type it as MouseEvent.

🔎 Apply this diff to add the type:
-          onClick={(e) => {
+          onClick={(e: MouseEvent) => {
             e.preventDefault()
             window.history.back()
           }}

As per coding guidelines, TypeScript strict mode with extensive type safety should be used for all code.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
onClick={(e) => {
e.preventDefault()
window.history.back()
}}
onClick={(e: MouseEvent) => {
e.preventDefault()
window.history.back()
}}
🤖 Prompt for AI Agents
e2e/vue-start/basic-cloudflare/src/components/DefaultCatchBoundary.tsx lines
42-45: the onClick handler parameter needs an explicit type for TypeScript
strict mode; change the handler signature to accept a typed event (e:
React.MouseEvent) or more specific (e:
React.MouseEvent<HTMLAnchorElement|HTMLButtonElement>), and ensure you import
the type from React (either import React from 'react' or import type {
MouseEvent } from 'react' and use it as the parameter type) so
e.preventDefault() is type-checked.

Comment on lines +17 to +32
export const Route = createRootRoute({
head: () => ({
meta: [
{
charSet: 'utf-8',
},
{
name: 'viewport',
content: 'width=device-width, initial-scale=1',
},
...seo({
title:
'TanStack Start | Type-Safe, Client-First, Full-Stack Vue Framework',
description: `TanStack Start is a type-safe, client-first, full-stack Vue framework.`,
}),
],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Inconsistent property name: use charset instead of charSet.

Line 21 uses charSet, but the related file e2e/vue-start/basic-auth/src/routes/__root.tsx (line 21 from relevant code snippets) uses charset. This inconsistency may cause the charset meta tag to not render correctly.

🔎 Apply this diff to use the correct property name:
     meta: [
       {
-        charSet: 'utf-8',
+        charset: 'utf-8',
       },
       {
         name: 'viewport',
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export const Route = createRootRoute({
head: () => ({
meta: [
{
charSet: 'utf-8',
},
{
name: 'viewport',
content: 'width=device-width, initial-scale=1',
},
...seo({
title:
'TanStack Start | Type-Safe, Client-First, Full-Stack Vue Framework',
description: `TanStack Start is a type-safe, client-first, full-stack Vue framework.`,
}),
],
export const Route = createRootRoute({
head: () => ({
meta: [
{
charset: 'utf-8',
},
{
name: 'viewport',
content: 'width=device-width, initial-scale=1',
},
...seo({
title:
'TanStack Start | Type-Safe, Client-First, Full-Stack Vue Framework',
description: `TanStack Start is a type-safe, client-first, full-stack Vue framework.`,
}),
],
🤖 Prompt for AI Agents
In e2e/vue-start/basic-cloudflare/src/routes/__root.tsx around lines 17 to 32,
the meta object uses the property name "charSet" which should be "charset" to
match the other route file and ensure the charset meta tag renders correctly;
update the property key from "charSet" to "charset" in that meta entry so it
matches the expected attribute name.

sizes: '16x16',
href: '/favicon-16x16.png',
},
{ rel: 'manifest', href: '/site.webmanifest', color: '#fffff' },
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix invalid hex color in manifest link.

The color value '#fffff' is invalid (5 hex digits instead of 6). This should be '#ffffff' for white or another valid 6-digit hex color.

🔎 Apply this diff to fix the color value:
-      { rel: 'manifest', href: '/site.webmanifest', color: '#fffff' },
+      { rel: 'manifest', href: '/site.webmanifest', color: '#ffffff' },
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{ rel: 'manifest', href: '/site.webmanifest', color: '#fffff' },
{ rel: 'manifest', href: '/site.webmanifest', color: '#ffffff' },
🤖 Prompt for AI Agents
In e2e/vue-start/basic-cloudflare/src/routes/__root.tsx around line 52, the
manifest link's color prop uses an invalid 5-digit hex '#fffff'; update it to a
valid 6-digit hex (e.g. '#ffffff' for white) so the color value is a proper
6-character hex string.

@birkskyum birkskyum merged commit c68aff7 into main Dec 18, 2025
6 checks passed
@birkskyum birkskyum deleted the basic-cloudflare-vue branch December 18, 2025 11:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants