Introduces a role-gated /admin section (sidebar layout, requireAdmin checked both in route loaders and independently in every admin server function) with three sections: - Orders: every order across all customers, and an admin-only order detail view nested under /admin so the sidebar persists and admin access bypasses the guest-token check. - Menu: create/edit/delete menu items, their options, and their preparation steps; deleting an item with past orders is refused (protected by the orderItems FK) instead of crashing. - Kitchen: read-only live view of every machine's busy/idle status and per-tag queue depth, with a manual refresh. Also: - Adds a `role` field to the user table (Better Auth additionalFields, input:false so it can't be self-assigned) and a db:seed-admin script to create/promote an admin account. - Fixes a real bug found while building this: src/server/auth.ts's shared session helpers were plain exported functions using a server-only import, which the framework couldn't tree-shake out of the client bundle once shared across multiple server/*.ts modules — this silently broke hydration app-wide. Fixed with createServerOnlyFn. - Removes the now-fully-unused @tanstack/devtools-vite plugin. - Disables view transitions for in-admin navigation so the persistent sidebar doesn't cross-fade/shift on every click. - Gives the "your orders" empty state the same visual treatment as the basket page's. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
394 lines
12 KiB
TypeScript
394 lines
12 KiB
TypeScript
/* eslint-disable */
|
|
|
|
// @ts-nocheck
|
|
|
|
// noinspection JSUnusedGlobalSymbols
|
|
|
|
// This file was automatically generated by TanStack Router.
|
|
// You should NOT make any changes in this file as it will be overwritten.
|
|
// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
|
|
|
|
import { Route as rootRouteImport } from './routes/__root'
|
|
import { Route as IndexRouteImport } from './routes/index'
|
|
import { Route as AdminRouteImport } from './routes/admin'
|
|
import { Route as BasketRouteImport } from './routes/basket'
|
|
import { Route as LoginRouteImport } from './routes/login'
|
|
import { Route as SignupRouteImport } from './routes/signup'
|
|
import { Route as AdminIndexRouteImport } from './routes/admin/index'
|
|
import { Route as AdminKitchenRouteImport } from './routes/admin/kitchen'
|
|
import { Route as ItemsMenuItemIdRouteImport } from './routes/items/$menuItemId'
|
|
import { Route as OrdersIndexRouteImport } from './routes/orders/index'
|
|
import { Route as OrdersOrderIdRouteImport } from './routes/orders/$orderId'
|
|
import { Route as AdminMenuIndexRouteImport } from './routes/admin/menu/index'
|
|
import { Route as AdminMenuMenuItemIdRouteImport } from './routes/admin/menu/$menuItemId'
|
|
import { Route as AdminMenuNewRouteImport } from './routes/admin/menu/new'
|
|
import { Route as AdminOrdersIndexRouteImport } from './routes/admin/orders/index'
|
|
import { Route as AdminOrdersOrderIdRouteImport } from './routes/admin/orders/$orderId'
|
|
import { Route as ApiAuthSplatRouteImport } from './routes/api/auth/$'
|
|
|
|
const IndexRoute = IndexRouteImport.update({
|
|
id: '/',
|
|
path: '/',
|
|
getParentRoute: () => rootRouteImport,
|
|
} as any)
|
|
const AdminRoute = AdminRouteImport.update({
|
|
id: '/admin',
|
|
path: '/admin',
|
|
getParentRoute: () => rootRouteImport,
|
|
} as any)
|
|
const BasketRoute = BasketRouteImport.update({
|
|
id: '/basket',
|
|
path: '/basket',
|
|
getParentRoute: () => rootRouteImport,
|
|
} as any)
|
|
const LoginRoute = LoginRouteImport.update({
|
|
id: '/login',
|
|
path: '/login',
|
|
getParentRoute: () => rootRouteImport,
|
|
} as any)
|
|
const SignupRoute = SignupRouteImport.update({
|
|
id: '/signup',
|
|
path: '/signup',
|
|
getParentRoute: () => rootRouteImport,
|
|
} as any)
|
|
const AdminIndexRoute = AdminIndexRouteImport.update({
|
|
id: '/',
|
|
path: '/',
|
|
getParentRoute: () => AdminRoute,
|
|
} as any)
|
|
const AdminKitchenRoute = AdminKitchenRouteImport.update({
|
|
id: '/kitchen',
|
|
path: '/kitchen',
|
|
getParentRoute: () => AdminRoute,
|
|
} as any)
|
|
const ItemsMenuItemIdRoute = ItemsMenuItemIdRouteImport.update({
|
|
id: '/items/$menuItemId',
|
|
path: '/items/$menuItemId',
|
|
getParentRoute: () => rootRouteImport,
|
|
} as any)
|
|
const OrdersIndexRoute = OrdersIndexRouteImport.update({
|
|
id: '/orders/',
|
|
path: '/orders/',
|
|
getParentRoute: () => rootRouteImport,
|
|
} as any)
|
|
const OrdersOrderIdRoute = OrdersOrderIdRouteImport.update({
|
|
id: '/orders/$orderId',
|
|
path: '/orders/$orderId',
|
|
getParentRoute: () => rootRouteImport,
|
|
} as any)
|
|
const AdminMenuIndexRoute = AdminMenuIndexRouteImport.update({
|
|
id: '/menu/',
|
|
path: '/menu/',
|
|
getParentRoute: () => AdminRoute,
|
|
} as any)
|
|
const AdminMenuMenuItemIdRoute = AdminMenuMenuItemIdRouteImport.update({
|
|
id: '/menu/$menuItemId',
|
|
path: '/menu/$menuItemId',
|
|
getParentRoute: () => AdminRoute,
|
|
} as any)
|
|
const AdminMenuNewRoute = AdminMenuNewRouteImport.update({
|
|
id: '/menu/new',
|
|
path: '/menu/new',
|
|
getParentRoute: () => AdminRoute,
|
|
} as any)
|
|
const AdminOrdersIndexRoute = AdminOrdersIndexRouteImport.update({
|
|
id: '/orders/',
|
|
path: '/orders/',
|
|
getParentRoute: () => AdminRoute,
|
|
} as any)
|
|
const AdminOrdersOrderIdRoute = AdminOrdersOrderIdRouteImport.update({
|
|
id: '/orders/$orderId',
|
|
path: '/orders/$orderId',
|
|
getParentRoute: () => AdminRoute,
|
|
} as any)
|
|
const ApiAuthSplatRoute = ApiAuthSplatRouteImport.update({
|
|
id: '/api/auth/$',
|
|
path: '/api/auth/$',
|
|
getParentRoute: () => rootRouteImport,
|
|
} as any)
|
|
|
|
export interface FileRoutesByFullPath {
|
|
'/': typeof IndexRoute
|
|
'/admin': typeof AdminRouteWithChildren
|
|
'/basket': typeof BasketRoute
|
|
'/login': typeof LoginRoute
|
|
'/signup': typeof SignupRoute
|
|
'/admin/kitchen': typeof AdminKitchenRoute
|
|
'/items/$menuItemId': typeof ItemsMenuItemIdRoute
|
|
'/orders/$orderId': typeof OrdersOrderIdRoute
|
|
'/admin/': typeof AdminIndexRoute
|
|
'/orders/': typeof OrdersIndexRoute
|
|
'/admin/menu/$menuItemId': typeof AdminMenuMenuItemIdRoute
|
|
'/admin/menu/new': typeof AdminMenuNewRoute
|
|
'/admin/orders/$orderId': typeof AdminOrdersOrderIdRoute
|
|
'/api/auth/$': typeof ApiAuthSplatRoute
|
|
'/admin/menu/': typeof AdminMenuIndexRoute
|
|
'/admin/orders/': typeof AdminOrdersIndexRoute
|
|
}
|
|
export interface FileRoutesByTo {
|
|
'/': typeof IndexRoute
|
|
'/basket': typeof BasketRoute
|
|
'/login': typeof LoginRoute
|
|
'/signup': typeof SignupRoute
|
|
'/admin/kitchen': typeof AdminKitchenRoute
|
|
'/items/$menuItemId': typeof ItemsMenuItemIdRoute
|
|
'/orders/$orderId': typeof OrdersOrderIdRoute
|
|
'/admin': typeof AdminIndexRoute
|
|
'/orders': typeof OrdersIndexRoute
|
|
'/admin/menu/$menuItemId': typeof AdminMenuMenuItemIdRoute
|
|
'/admin/menu/new': typeof AdminMenuNewRoute
|
|
'/admin/orders/$orderId': typeof AdminOrdersOrderIdRoute
|
|
'/api/auth/$': typeof ApiAuthSplatRoute
|
|
'/admin/menu': typeof AdminMenuIndexRoute
|
|
'/admin/orders': typeof AdminOrdersIndexRoute
|
|
}
|
|
export interface FileRoutesById {
|
|
__root__: typeof rootRouteImport
|
|
'/': typeof IndexRoute
|
|
'/admin': typeof AdminRouteWithChildren
|
|
'/basket': typeof BasketRoute
|
|
'/login': typeof LoginRoute
|
|
'/signup': typeof SignupRoute
|
|
'/admin/kitchen': typeof AdminKitchenRoute
|
|
'/items/$menuItemId': typeof ItemsMenuItemIdRoute
|
|
'/orders/$orderId': typeof OrdersOrderIdRoute
|
|
'/admin/': typeof AdminIndexRoute
|
|
'/orders/': typeof OrdersIndexRoute
|
|
'/admin/menu/$menuItemId': typeof AdminMenuMenuItemIdRoute
|
|
'/admin/menu/new': typeof AdminMenuNewRoute
|
|
'/admin/orders/$orderId': typeof AdminOrdersOrderIdRoute
|
|
'/api/auth/$': typeof ApiAuthSplatRoute
|
|
'/admin/menu/': typeof AdminMenuIndexRoute
|
|
'/admin/orders/': typeof AdminOrdersIndexRoute
|
|
}
|
|
export interface FileRouteTypes {
|
|
fileRoutesByFullPath: FileRoutesByFullPath
|
|
fullPaths:
|
|
| '/'
|
|
| '/admin'
|
|
| '/basket'
|
|
| '/login'
|
|
| '/signup'
|
|
| '/admin/kitchen'
|
|
| '/items/$menuItemId'
|
|
| '/orders/$orderId'
|
|
| '/admin/'
|
|
| '/orders/'
|
|
| '/admin/menu/$menuItemId'
|
|
| '/admin/menu/new'
|
|
| '/admin/orders/$orderId'
|
|
| '/api/auth/$'
|
|
| '/admin/menu/'
|
|
| '/admin/orders/'
|
|
fileRoutesByTo: FileRoutesByTo
|
|
to:
|
|
| '/'
|
|
| '/basket'
|
|
| '/login'
|
|
| '/signup'
|
|
| '/admin/kitchen'
|
|
| '/items/$menuItemId'
|
|
| '/orders/$orderId'
|
|
| '/admin'
|
|
| '/orders'
|
|
| '/admin/menu/$menuItemId'
|
|
| '/admin/menu/new'
|
|
| '/admin/orders/$orderId'
|
|
| '/api/auth/$'
|
|
| '/admin/menu'
|
|
| '/admin/orders'
|
|
id:
|
|
| '__root__'
|
|
| '/'
|
|
| '/admin'
|
|
| '/basket'
|
|
| '/login'
|
|
| '/signup'
|
|
| '/admin/kitchen'
|
|
| '/items/$menuItemId'
|
|
| '/orders/$orderId'
|
|
| '/admin/'
|
|
| '/orders/'
|
|
| '/admin/menu/$menuItemId'
|
|
| '/admin/menu/new'
|
|
| '/admin/orders/$orderId'
|
|
| '/api/auth/$'
|
|
| '/admin/menu/'
|
|
| '/admin/orders/'
|
|
fileRoutesById: FileRoutesById
|
|
}
|
|
export interface RootRouteChildren {
|
|
IndexRoute: typeof IndexRoute
|
|
AdminRoute: typeof AdminRouteWithChildren
|
|
BasketRoute: typeof BasketRoute
|
|
LoginRoute: typeof LoginRoute
|
|
SignupRoute: typeof SignupRoute
|
|
ItemsMenuItemIdRoute: typeof ItemsMenuItemIdRoute
|
|
OrdersOrderIdRoute: typeof OrdersOrderIdRoute
|
|
OrdersIndexRoute: typeof OrdersIndexRoute
|
|
ApiAuthSplatRoute: typeof ApiAuthSplatRoute
|
|
}
|
|
|
|
declare module '@tanstack/react-router' {
|
|
interface FileRoutesByPath {
|
|
'/': {
|
|
id: '/'
|
|
path: '/'
|
|
fullPath: '/'
|
|
preLoaderRoute: typeof IndexRouteImport
|
|
parentRoute: typeof rootRouteImport
|
|
}
|
|
'/admin': {
|
|
id: '/admin'
|
|
path: '/admin'
|
|
fullPath: '/admin'
|
|
preLoaderRoute: typeof AdminRouteImport
|
|
parentRoute: typeof rootRouteImport
|
|
}
|
|
'/basket': {
|
|
id: '/basket'
|
|
path: '/basket'
|
|
fullPath: '/basket'
|
|
preLoaderRoute: typeof BasketRouteImport
|
|
parentRoute: typeof rootRouteImport
|
|
}
|
|
'/login': {
|
|
id: '/login'
|
|
path: '/login'
|
|
fullPath: '/login'
|
|
preLoaderRoute: typeof LoginRouteImport
|
|
parentRoute: typeof rootRouteImport
|
|
}
|
|
'/signup': {
|
|
id: '/signup'
|
|
path: '/signup'
|
|
fullPath: '/signup'
|
|
preLoaderRoute: typeof SignupRouteImport
|
|
parentRoute: typeof rootRouteImport
|
|
}
|
|
'/admin/': {
|
|
id: '/admin/'
|
|
path: '/'
|
|
fullPath: '/admin/'
|
|
preLoaderRoute: typeof AdminIndexRouteImport
|
|
parentRoute: typeof AdminRoute
|
|
}
|
|
'/admin/kitchen': {
|
|
id: '/admin/kitchen'
|
|
path: '/kitchen'
|
|
fullPath: '/admin/kitchen'
|
|
preLoaderRoute: typeof AdminKitchenRouteImport
|
|
parentRoute: typeof AdminRoute
|
|
}
|
|
'/items/$menuItemId': {
|
|
id: '/items/$menuItemId'
|
|
path: '/items/$menuItemId'
|
|
fullPath: '/items/$menuItemId'
|
|
preLoaderRoute: typeof ItemsMenuItemIdRouteImport
|
|
parentRoute: typeof rootRouteImport
|
|
}
|
|
'/orders/': {
|
|
id: '/orders/'
|
|
path: '/orders'
|
|
fullPath: '/orders/'
|
|
preLoaderRoute: typeof OrdersIndexRouteImport
|
|
parentRoute: typeof rootRouteImport
|
|
}
|
|
'/orders/$orderId': {
|
|
id: '/orders/$orderId'
|
|
path: '/orders/$orderId'
|
|
fullPath: '/orders/$orderId'
|
|
preLoaderRoute: typeof OrdersOrderIdRouteImport
|
|
parentRoute: typeof rootRouteImport
|
|
}
|
|
'/admin/menu/': {
|
|
id: '/admin/menu/'
|
|
path: '/menu'
|
|
fullPath: '/admin/menu/'
|
|
preLoaderRoute: typeof AdminMenuIndexRouteImport
|
|
parentRoute: typeof AdminRoute
|
|
}
|
|
'/admin/menu/$menuItemId': {
|
|
id: '/admin/menu/$menuItemId'
|
|
path: '/menu/$menuItemId'
|
|
fullPath: '/admin/menu/$menuItemId'
|
|
preLoaderRoute: typeof AdminMenuMenuItemIdRouteImport
|
|
parentRoute: typeof AdminRoute
|
|
}
|
|
'/admin/menu/new': {
|
|
id: '/admin/menu/new'
|
|
path: '/menu/new'
|
|
fullPath: '/admin/menu/new'
|
|
preLoaderRoute: typeof AdminMenuNewRouteImport
|
|
parentRoute: typeof AdminRoute
|
|
}
|
|
'/admin/orders/': {
|
|
id: '/admin/orders/'
|
|
path: '/orders'
|
|
fullPath: '/admin/orders/'
|
|
preLoaderRoute: typeof AdminOrdersIndexRouteImport
|
|
parentRoute: typeof AdminRoute
|
|
}
|
|
'/admin/orders/$orderId': {
|
|
id: '/admin/orders/$orderId'
|
|
path: '/orders/$orderId'
|
|
fullPath: '/admin/orders/$orderId'
|
|
preLoaderRoute: typeof AdminOrdersOrderIdRouteImport
|
|
parentRoute: typeof AdminRoute
|
|
}
|
|
'/api/auth/$': {
|
|
id: '/api/auth/$'
|
|
path: '/api/auth/$'
|
|
fullPath: '/api/auth/$'
|
|
preLoaderRoute: typeof ApiAuthSplatRouteImport
|
|
parentRoute: typeof rootRouteImport
|
|
}
|
|
}
|
|
}
|
|
|
|
interface AdminRouteChildren {
|
|
AdminKitchenRoute: typeof AdminKitchenRoute
|
|
AdminIndexRoute: typeof AdminIndexRoute
|
|
AdminMenuMenuItemIdRoute: typeof AdminMenuMenuItemIdRoute
|
|
AdminMenuNewRoute: typeof AdminMenuNewRoute
|
|
AdminOrdersOrderIdRoute: typeof AdminOrdersOrderIdRoute
|
|
AdminMenuIndexRoute: typeof AdminMenuIndexRoute
|
|
AdminOrdersIndexRoute: typeof AdminOrdersIndexRoute
|
|
}
|
|
|
|
const AdminRouteChildren: AdminRouteChildren = {
|
|
AdminKitchenRoute: AdminKitchenRoute,
|
|
AdminIndexRoute: AdminIndexRoute,
|
|
AdminMenuMenuItemIdRoute: AdminMenuMenuItemIdRoute,
|
|
AdminMenuNewRoute: AdminMenuNewRoute,
|
|
AdminOrdersOrderIdRoute: AdminOrdersOrderIdRoute,
|
|
AdminMenuIndexRoute: AdminMenuIndexRoute,
|
|
AdminOrdersIndexRoute: AdminOrdersIndexRoute,
|
|
}
|
|
|
|
const AdminRouteWithChildren = AdminRoute._addFileChildren(AdminRouteChildren)
|
|
|
|
const rootRouteChildren: RootRouteChildren = {
|
|
IndexRoute: IndexRoute,
|
|
AdminRoute: AdminRouteWithChildren,
|
|
BasketRoute: BasketRoute,
|
|
LoginRoute: LoginRoute,
|
|
SignupRoute: SignupRoute,
|
|
ItemsMenuItemIdRoute: ItemsMenuItemIdRoute,
|
|
OrdersOrderIdRoute: OrdersOrderIdRoute,
|
|
OrdersIndexRoute: OrdersIndexRoute,
|
|
ApiAuthSplatRoute: ApiAuthSplatRoute,
|
|
}
|
|
export const routeTree = rootRouteImport
|
|
._addFileChildren(rootRouteChildren)
|
|
._addFileTypes<FileRouteTypes>()
|
|
|
|
import type { getRouter } from './router.tsx'
|
|
import type { createStart } from '@tanstack/react-start'
|
|
declare module '@tanstack/react-start' {
|
|
interface Register {
|
|
ssr: true
|
|
router: Awaited<ReturnType<typeof getRouter>>
|
|
}
|
|
}
|