WIP. A little custom music server
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: plug realase group into covers of album page

+358 -324
+4 -1
backend/src/api.ts
··· 170 170 const AlbumWithArtists = Schema.Struct({ 171 171 ...Album.fields, 172 172 artists: Schema.Array(Artist), 173 + musicbrainz: Schema.optional(Musicbrainz), 173 174 }); 174 175 175 176 const rows = yield* db.query.albumTable 176 177 .findMany({ 177 178 with: { 179 + musicbrainz: true, 178 180 artists: { 179 181 with: { 180 182 artist: true, ··· 192 194 return yield* Schema.decodeUnknown(AlbumWithArtists)({ 193 195 ...row, 194 196 artists, 197 + musicbrainz: row.musicbrainz ?? undefined, 195 198 }); 196 199 }), 197 200 ); ··· 361 364 const layers = Layer.mergeAll(BunContext.layer, EnvLive, DatabaseLive.Default, ApiService.Default); 362 365 const runtime = ManagedRuntime.make(layers); 363 366 364 - export type ApiType = ReturnType<typeof startApi>; 367 + export type ApiType = ReturnType<typeof startApi>["server"] & {};
+14
bun.lock
··· 75 75 "@tanstack/react-router-ssr-query": "^1.131.7", 76 76 "@tanstack/react-start": "^1.132.0", 77 77 "@tanstack/router-plugin": "^1.132.0", 78 + "@unpic/react": "^1.0.2", 78 79 "class-variance-authority": "^0.7.1", 79 80 "clsx": "^2.1.1", 80 81 "date-fns": "^4.1.0", 81 82 "effect": "^3.19.0", 83 + "elysia": "^1.4.15", 82 84 "lucide-react": "^0.544.0", 83 85 "react": "^19.2.0", 84 86 "react-dom": "^19.2.0", ··· 748 750 "@typescript-eslint/utils": ["@typescript-eslint/utils@8.46.3", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.46.3", "@typescript-eslint/types": "8.46.3", "@typescript-eslint/typescript-estree": "8.46.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g=="], 749 751 750 752 "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.46.3", "", { "dependencies": { "@typescript-eslint/types": "8.46.3", "eslint-visitor-keys": "^4.2.1" } }, "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg=="], 753 + 754 + "@unpic/core": ["@unpic/core@1.0.3", "", { "dependencies": { "unpic": "^4.2.2" } }, "sha512-aum9YNVUGso7MjGLD0Rp/08kywCGLqZ03/q6VQBFFakDBOXWEc8D4kPGcZ8v5wEnGRex3lE+++bOuucBp3KJ/w=="], 755 + 756 + "@unpic/react": ["@unpic/react@1.0.2", "", { "dependencies": { "@unpic/core": "^1.0.3" }, "peerDependencies": { "next": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["next"] }, "sha512-5RmRfELwTF8w+4zjtQGqjpvX+RU2VLvis3xDCS1O2uWk0PZN2cvatL+3/KAR3mshAuRrkFGTX1XwyAezSXaoCA=="], 751 757 752 758 "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.11.1", "", { "os": "android", "cpu": "arm" }, "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw=="], 753 759 ··· 1521 1527 1522 1528 "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], 1523 1529 1530 + "unpic": ["unpic@4.2.2", "", {}, "sha512-z6T2ScMgRV2y2H8MwwhY5xHZWXhUx/YxtOCGJwfURSl7ypVy4HpLIMWoIZKnnxQa/RKzM0kg8hUh0paIrpLfvw=="], 1531 + 1524 1532 "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], 1525 1533 1526 1534 "unplugin": ["unplugin@2.3.10", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw=="], ··· 1689 1697 1690 1698 "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], 1691 1699 1700 + "web-tanstack/elysia": ["elysia@1.4.19", "", { "dependencies": { "cookie": "^1.1.1", "exact-mirror": "0.2.5", "fast-decode-uri-component": "^1.0.1", "memoirist": "^0.4.0" }, "peerDependencies": { "@sinclair/typebox": ">= 0.34.0 < 1", "@types/bun": ">= 1.2.0", "file-type": ">= 20.0.0", "openapi-types": ">= 12.0.0", "typescript": ">= 5.0.0" }, "optionalPeers": ["@types/bun", "typescript"] }, "sha512-DZb9y8FnWyX5IuqY44SvqAV0DjJ15NeCWHrLdgXrKgTPDPsl3VNwWHqrEr9bmnOCpg1vh6QUvAX/tcxNj88jLA=="], 1701 + 1692 1702 "web-tanstack/vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.4", "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="], 1693 1703 1694 1704 "web-tanstack/zod": ["zod@4.1.11", "", {}, "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg=="], ··· 1764 1774 "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], 1765 1775 1766 1776 "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], 1777 + 1778 + "web-tanstack/elysia/cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], 1779 + 1780 + "web-tanstack/elysia/exact-mirror": ["exact-mirror@0.2.5", "", { "peerDependencies": { "@sinclair/typebox": "^0.34.15" }, "optionalPeers": ["@sinclair/typebox"] }, "sha512-u8Wu2lO8nio5lKSJubOydsdNtQmH8ENba5m0nbQYmTvsjksXKYIS1nSShdDlO8Uem+kbo+N6eD5I03cpZ+QsRQ=="], 1767 1781 1768 1782 "web-tanstack/vitest/@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], 1769 1783
+2
web/package.json
··· 25 25 "@tanstack/react-router-ssr-query": "^1.131.7", 26 26 "@tanstack/react-start": "^1.132.0", 27 27 "@tanstack/router-plugin": "^1.132.0", 28 + "@unpic/react": "^1.0.2", 28 29 "class-variance-authority": "^0.7.1", 29 30 "clsx": "^2.1.1", 30 31 "date-fns": "^4.1.0", 31 32 "effect": "^3.19.0", 33 + "elysia": "^1.4.15", 32 34 "lucide-react": "^0.544.0", 33 35 "react": "^19.2.0", 34 36 "react-dom": "^19.2.0",
+14 -1
web/src/components/album-card.tsx
··· 1 1 import { Link } from "@tanstack/react-router"; 2 + import { Image } from "@unpic/react"; 2 3 3 4 type Props = { 4 5 album: Readonly<{ ··· 8 9 id: string; 9 10 name: string; 10 11 }>; 12 + musicbrainz?: 13 + | { 14 + releaseGroupId?: string; 15 + } 16 + | undefined; 11 17 }>; 12 18 }; 13 19 14 20 const mockCover = "https://writteninmusic.com/wp-content/uploads/2025/09/TOP-Breach.jpg"; 21 + 22 + const musicbrainzCover = (rgId: string) => `http://coverartarchive.org/release-group/${rgId}/front`; 23 + 15 24 export function AlbumCard(props: Props) { 16 25 const { id, title, artists } = props.album; 17 26 27 + const rgId = props.album.musicbrainz?.releaseGroupId; 28 + 29 + const cover = rgId ? musicbrainzCover(rgId) : mockCover; 30 + 18 31 return ( 19 32 //TODO Update to tanstack link 20 33 <a href={`/album/${id}`} className="space-y-px p-3 transition duration-100 hover:bg-black/10 h-fit rounded-lg"> 21 34 <div className="aspect-square rounded-md overflow-hidden"> 22 - <img width={900} height={900} src={mockCover} className="object-cover w-full h-full" /> 35 + <Image width={900} height={900} src={cover} className="object-cover w-full h-full" /> 23 36 </div> 24 37 <p className="text-md font-medium">{title}</p> 25 38 <p className="text-sm opacity-70">{artists.at(0)?.name}</p>
+1
web/src/data/get-album-by-id.ts
··· 18 18 }), 19 19 }), 20 20 Effect.map((x) => x.data), 21 + Effect.tap(Effect.log), 21 22 Effect.flatMap(Effect.fromNullable), 22 23 Effect.runPromise, 23 24 ),
-1
web/src/lib/api.ts
··· 1 1 import { treaty } from "@elysiajs/eden"; 2 2 import type { ApiType } from "../../../backend/src/api"; 3 3 4 - //@ts-expect-error 5 4 export const client = treaty<ApiType>("localhost:3003");
+323 -321
web/src/routeTree.gen.ts
··· 8 8 // You should NOT make any changes in this file as it will be overwritten. 9 9 // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. 10 10 11 - import { Route as rootRouteImport } from "./routes/__root"; 12 - import { Route as McpRouteImport } from "./routes/mcp"; 13 - import { Route as IndexRouteImport } from "./routes/index"; 14 - import { Route as AlbumIndexRouteImport } from "./routes/album/index"; 15 - import { Route as DemoTanstackQueryRouteImport } from "./routes/demo/tanstack-query"; 16 - import { Route as DemoMcpTodosRouteImport } from "./routes/demo/mcp-todos"; 17 - import { Route as AlbumAlbumIdRouteImport } from "./routes/album/$albumId"; 18 - import { Route as DemoStartServerFuncsRouteImport } from "./routes/demo/start.server-funcs"; 19 - import { Route as DemoStartApiRequestRouteImport } from "./routes/demo/start.api-request"; 20 - import { Route as DemoApiTqTodosRouteImport } from "./routes/demo/api.tq-todos"; 21 - import { Route as DemoApiNamesRouteImport } from "./routes/demo/api.names"; 22 - import { Route as DemoApiMcpTodosRouteImport } from "./routes/demo/api.mcp-todos"; 23 - import { Route as DemoStartSsrIndexRouteImport } from "./routes/demo/start.ssr.index"; 24 - import { Route as DemoStartSsrSpaModeRouteImport } from "./routes/demo/start.ssr.spa-mode"; 25 - import { Route as DemoStartSsrFullSsrRouteImport } from "./routes/demo/start.ssr.full-ssr"; 26 - import { Route as DemoStartSsrDataOnlyRouteImport } from "./routes/demo/start.ssr.data-only"; 11 + import { Route as rootRouteImport } from './routes/__root' 12 + import { Route as McpRouteImport } from './routes/mcp' 13 + import { Route as IndexRouteImport } from './routes/index' 14 + import { Route as AlbumIndexRouteImport } from './routes/album/index' 15 + import { Route as DemoTanstackQueryRouteImport } from './routes/demo/tanstack-query' 16 + import { Route as DemoMcpTodosRouteImport } from './routes/demo/mcp-todos' 17 + import { Route as AlbumAlbumIdRouteImport } from './routes/album/$albumId' 18 + import { Route as DemoStartServerFuncsRouteImport } from './routes/demo/start.server-funcs' 19 + import { Route as DemoStartApiRequestRouteImport } from './routes/demo/start.api-request' 20 + import { Route as DemoApiTqTodosRouteImport } from './routes/demo/api.tq-todos' 21 + import { Route as DemoApiNamesRouteImport } from './routes/demo/api.names' 22 + import { Route as DemoApiMcpTodosRouteImport } from './routes/demo/api.mcp-todos' 23 + import { Route as DemoStartSsrIndexRouteImport } from './routes/demo/start.ssr.index' 24 + import { Route as DemoStartSsrSpaModeRouteImport } from './routes/demo/start.ssr.spa-mode' 25 + import { Route as DemoStartSsrFullSsrRouteImport } from './routes/demo/start.ssr.full-ssr' 26 + import { Route as DemoStartSsrDataOnlyRouteImport } from './routes/demo/start.ssr.data-only' 27 27 28 28 const McpRoute = McpRouteImport.update({ 29 - id: "/mcp", 30 - path: "/mcp", 31 - getParentRoute: () => rootRouteImport, 32 - } as any); 29 + id: '/mcp', 30 + path: '/mcp', 31 + getParentRoute: () => rootRouteImport, 32 + } as any) 33 33 const IndexRoute = IndexRouteImport.update({ 34 - id: "/", 35 - path: "/", 36 - getParentRoute: () => rootRouteImport, 37 - } as any); 34 + id: '/', 35 + path: '/', 36 + getParentRoute: () => rootRouteImport, 37 + } as any) 38 38 const AlbumIndexRoute = AlbumIndexRouteImport.update({ 39 - id: "/album/", 40 - path: "/album/", 41 - getParentRoute: () => rootRouteImport, 42 - } as any); 39 + id: '/album/', 40 + path: '/album/', 41 + getParentRoute: () => rootRouteImport, 42 + } as any) 43 43 const DemoTanstackQueryRoute = DemoTanstackQueryRouteImport.update({ 44 - id: "/demo/tanstack-query", 45 - path: "/demo/tanstack-query", 46 - getParentRoute: () => rootRouteImport, 47 - } as any); 44 + id: '/demo/tanstack-query', 45 + path: '/demo/tanstack-query', 46 + getParentRoute: () => rootRouteImport, 47 + } as any) 48 48 const DemoMcpTodosRoute = DemoMcpTodosRouteImport.update({ 49 - id: "/demo/mcp-todos", 50 - path: "/demo/mcp-todos", 51 - getParentRoute: () => rootRouteImport, 52 - } as any); 49 + id: '/demo/mcp-todos', 50 + path: '/demo/mcp-todos', 51 + getParentRoute: () => rootRouteImport, 52 + } as any) 53 53 const AlbumAlbumIdRoute = AlbumAlbumIdRouteImport.update({ 54 - id: "/album/$albumId", 55 - path: "/album/$albumId", 56 - getParentRoute: () => rootRouteImport, 57 - } as any); 54 + id: '/album/$albumId', 55 + path: '/album/$albumId', 56 + getParentRoute: () => rootRouteImport, 57 + } as any) 58 58 const DemoStartServerFuncsRoute = DemoStartServerFuncsRouteImport.update({ 59 - id: "/demo/start/server-funcs", 60 - path: "/demo/start/server-funcs", 61 - getParentRoute: () => rootRouteImport, 62 - } as any); 59 + id: '/demo/start/server-funcs', 60 + path: '/demo/start/server-funcs', 61 + getParentRoute: () => rootRouteImport, 62 + } as any) 63 63 const DemoStartApiRequestRoute = DemoStartApiRequestRouteImport.update({ 64 - id: "/demo/start/api-request", 65 - path: "/demo/start/api-request", 66 - getParentRoute: () => rootRouteImport, 67 - } as any); 64 + id: '/demo/start/api-request', 65 + path: '/demo/start/api-request', 66 + getParentRoute: () => rootRouteImport, 67 + } as any) 68 68 const DemoApiTqTodosRoute = DemoApiTqTodosRouteImport.update({ 69 - id: "/demo/api/tq-todos", 70 - path: "/demo/api/tq-todos", 71 - getParentRoute: () => rootRouteImport, 72 - } as any); 69 + id: '/demo/api/tq-todos', 70 + path: '/demo/api/tq-todos', 71 + getParentRoute: () => rootRouteImport, 72 + } as any) 73 73 const DemoApiNamesRoute = DemoApiNamesRouteImport.update({ 74 - id: "/demo/api/names", 75 - path: "/demo/api/names", 76 - getParentRoute: () => rootRouteImport, 77 - } as any); 74 + id: '/demo/api/names', 75 + path: '/demo/api/names', 76 + getParentRoute: () => rootRouteImport, 77 + } as any) 78 78 const DemoApiMcpTodosRoute = DemoApiMcpTodosRouteImport.update({ 79 - id: "/demo/api/mcp-todos", 80 - path: "/demo/api/mcp-todos", 81 - getParentRoute: () => rootRouteImport, 82 - } as any); 79 + id: '/demo/api/mcp-todos', 80 + path: '/demo/api/mcp-todos', 81 + getParentRoute: () => rootRouteImport, 82 + } as any) 83 83 const DemoStartSsrIndexRoute = DemoStartSsrIndexRouteImport.update({ 84 - id: "/demo/start/ssr/", 85 - path: "/demo/start/ssr/", 86 - getParentRoute: () => rootRouteImport, 87 - } as any); 84 + id: '/demo/start/ssr/', 85 + path: '/demo/start/ssr/', 86 + getParentRoute: () => rootRouteImport, 87 + } as any) 88 88 const DemoStartSsrSpaModeRoute = DemoStartSsrSpaModeRouteImport.update({ 89 - id: "/demo/start/ssr/spa-mode", 90 - path: "/demo/start/ssr/spa-mode", 91 - getParentRoute: () => rootRouteImport, 92 - } as any); 89 + id: '/demo/start/ssr/spa-mode', 90 + path: '/demo/start/ssr/spa-mode', 91 + getParentRoute: () => rootRouteImport, 92 + } as any) 93 93 const DemoStartSsrFullSsrRoute = DemoStartSsrFullSsrRouteImport.update({ 94 - id: "/demo/start/ssr/full-ssr", 95 - path: "/demo/start/ssr/full-ssr", 96 - getParentRoute: () => rootRouteImport, 97 - } as any); 94 + id: '/demo/start/ssr/full-ssr', 95 + path: '/demo/start/ssr/full-ssr', 96 + getParentRoute: () => rootRouteImport, 97 + } as any) 98 98 const DemoStartSsrDataOnlyRoute = DemoStartSsrDataOnlyRouteImport.update({ 99 - id: "/demo/start/ssr/data-only", 100 - path: "/demo/start/ssr/data-only", 101 - getParentRoute: () => rootRouteImport, 102 - } as any); 99 + id: '/demo/start/ssr/data-only', 100 + path: '/demo/start/ssr/data-only', 101 + getParentRoute: () => rootRouteImport, 102 + } as any) 103 103 104 104 export interface FileRoutesByFullPath { 105 - "/": typeof IndexRoute; 106 - "/mcp": typeof McpRoute; 107 - "/album/$albumId": typeof AlbumAlbumIdRoute; 108 - "/demo/mcp-todos": typeof DemoMcpTodosRoute; 109 - "/demo/tanstack-query": typeof DemoTanstackQueryRoute; 110 - "/album": typeof AlbumIndexRoute; 111 - "/demo/api/mcp-todos": typeof DemoApiMcpTodosRoute; 112 - "/demo/api/names": typeof DemoApiNamesRoute; 113 - "/demo/api/tq-todos": typeof DemoApiTqTodosRoute; 114 - "/demo/start/api-request": typeof DemoStartApiRequestRoute; 115 - "/demo/start/server-funcs": typeof DemoStartServerFuncsRoute; 116 - "/demo/start/ssr/data-only": typeof DemoStartSsrDataOnlyRoute; 117 - "/demo/start/ssr/full-ssr": typeof DemoStartSsrFullSsrRoute; 118 - "/demo/start/ssr/spa-mode": typeof DemoStartSsrSpaModeRoute; 119 - "/demo/start/ssr": typeof DemoStartSsrIndexRoute; 105 + '/': typeof IndexRoute 106 + '/mcp': typeof McpRoute 107 + '/album/$albumId': typeof AlbumAlbumIdRoute 108 + '/demo/mcp-todos': typeof DemoMcpTodosRoute 109 + '/demo/tanstack-query': typeof DemoTanstackQueryRoute 110 + '/album': typeof AlbumIndexRoute 111 + '/demo/api/mcp-todos': typeof DemoApiMcpTodosRoute 112 + '/demo/api/names': typeof DemoApiNamesRoute 113 + '/demo/api/tq-todos': typeof DemoApiTqTodosRoute 114 + '/demo/start/api-request': typeof DemoStartApiRequestRoute 115 + '/demo/start/server-funcs': typeof DemoStartServerFuncsRoute 116 + '/demo/start/ssr/data-only': typeof DemoStartSsrDataOnlyRoute 117 + '/demo/start/ssr/full-ssr': typeof DemoStartSsrFullSsrRoute 118 + '/demo/start/ssr/spa-mode': typeof DemoStartSsrSpaModeRoute 119 + '/demo/start/ssr': typeof DemoStartSsrIndexRoute 120 120 } 121 121 export interface FileRoutesByTo { 122 - "/": typeof IndexRoute; 123 - "/mcp": typeof McpRoute; 124 - "/album/$albumId": typeof AlbumAlbumIdRoute; 125 - "/demo/mcp-todos": typeof DemoMcpTodosRoute; 126 - "/demo/tanstack-query": typeof DemoTanstackQueryRoute; 127 - "/album": typeof AlbumIndexRoute; 128 - "/demo/api/mcp-todos": typeof DemoApiMcpTodosRoute; 129 - "/demo/api/names": typeof DemoApiNamesRoute; 130 - "/demo/api/tq-todos": typeof DemoApiTqTodosRoute; 131 - "/demo/start/api-request": typeof DemoStartApiRequestRoute; 132 - "/demo/start/server-funcs": typeof DemoStartServerFuncsRoute; 133 - "/demo/start/ssr/data-only": typeof DemoStartSsrDataOnlyRoute; 134 - "/demo/start/ssr/full-ssr": typeof DemoStartSsrFullSsrRoute; 135 - "/demo/start/ssr/spa-mode": typeof DemoStartSsrSpaModeRoute; 136 - "/demo/start/ssr": typeof DemoStartSsrIndexRoute; 122 + '/': typeof IndexRoute 123 + '/mcp': typeof McpRoute 124 + '/album/$albumId': typeof AlbumAlbumIdRoute 125 + '/demo/mcp-todos': typeof DemoMcpTodosRoute 126 + '/demo/tanstack-query': typeof DemoTanstackQueryRoute 127 + '/album': typeof AlbumIndexRoute 128 + '/demo/api/mcp-todos': typeof DemoApiMcpTodosRoute 129 + '/demo/api/names': typeof DemoApiNamesRoute 130 + '/demo/api/tq-todos': typeof DemoApiTqTodosRoute 131 + '/demo/start/api-request': typeof DemoStartApiRequestRoute 132 + '/demo/start/server-funcs': typeof DemoStartServerFuncsRoute 133 + '/demo/start/ssr/data-only': typeof DemoStartSsrDataOnlyRoute 134 + '/demo/start/ssr/full-ssr': typeof DemoStartSsrFullSsrRoute 135 + '/demo/start/ssr/spa-mode': typeof DemoStartSsrSpaModeRoute 136 + '/demo/start/ssr': typeof DemoStartSsrIndexRoute 137 137 } 138 138 export interface FileRoutesById { 139 - __root__: typeof rootRouteImport; 140 - "/": typeof IndexRoute; 141 - "/mcp": typeof McpRoute; 142 - "/album/$albumId": typeof AlbumAlbumIdRoute; 143 - "/demo/mcp-todos": typeof DemoMcpTodosRoute; 144 - "/demo/tanstack-query": typeof DemoTanstackQueryRoute; 145 - "/album/": typeof AlbumIndexRoute; 146 - "/demo/api/mcp-todos": typeof DemoApiMcpTodosRoute; 147 - "/demo/api/names": typeof DemoApiNamesRoute; 148 - "/demo/api/tq-todos": typeof DemoApiTqTodosRoute; 149 - "/demo/start/api-request": typeof DemoStartApiRequestRoute; 150 - "/demo/start/server-funcs": typeof DemoStartServerFuncsRoute; 151 - "/demo/start/ssr/data-only": typeof DemoStartSsrDataOnlyRoute; 152 - "/demo/start/ssr/full-ssr": typeof DemoStartSsrFullSsrRoute; 153 - "/demo/start/ssr/spa-mode": typeof DemoStartSsrSpaModeRoute; 154 - "/demo/start/ssr/": typeof DemoStartSsrIndexRoute; 139 + __root__: typeof rootRouteImport 140 + '/': typeof IndexRoute 141 + '/mcp': typeof McpRoute 142 + '/album/$albumId': typeof AlbumAlbumIdRoute 143 + '/demo/mcp-todos': typeof DemoMcpTodosRoute 144 + '/demo/tanstack-query': typeof DemoTanstackQueryRoute 145 + '/album/': typeof AlbumIndexRoute 146 + '/demo/api/mcp-todos': typeof DemoApiMcpTodosRoute 147 + '/demo/api/names': typeof DemoApiNamesRoute 148 + '/demo/api/tq-todos': typeof DemoApiTqTodosRoute 149 + '/demo/start/api-request': typeof DemoStartApiRequestRoute 150 + '/demo/start/server-funcs': typeof DemoStartServerFuncsRoute 151 + '/demo/start/ssr/data-only': typeof DemoStartSsrDataOnlyRoute 152 + '/demo/start/ssr/full-ssr': typeof DemoStartSsrFullSsrRoute 153 + '/demo/start/ssr/spa-mode': typeof DemoStartSsrSpaModeRoute 154 + '/demo/start/ssr/': typeof DemoStartSsrIndexRoute 155 155 } 156 156 export interface FileRouteTypes { 157 - fileRoutesByFullPath: FileRoutesByFullPath; 158 - fullPaths: 159 - | "/" 160 - | "/mcp" 161 - | "/album/$albumId" 162 - | "/demo/mcp-todos" 163 - | "/demo/tanstack-query" 164 - | "/album" 165 - | "/demo/api/mcp-todos" 166 - | "/demo/api/names" 167 - | "/demo/api/tq-todos" 168 - | "/demo/start/api-request" 169 - | "/demo/start/server-funcs" 170 - | "/demo/start/ssr/data-only" 171 - | "/demo/start/ssr/full-ssr" 172 - | "/demo/start/ssr/spa-mode" 173 - | "/demo/start/ssr"; 174 - fileRoutesByTo: FileRoutesByTo; 175 - to: 176 - | "/" 177 - | "/mcp" 178 - | "/album/$albumId" 179 - | "/demo/mcp-todos" 180 - | "/demo/tanstack-query" 181 - | "/album" 182 - | "/demo/api/mcp-todos" 183 - | "/demo/api/names" 184 - | "/demo/api/tq-todos" 185 - | "/demo/start/api-request" 186 - | "/demo/start/server-funcs" 187 - | "/demo/start/ssr/data-only" 188 - | "/demo/start/ssr/full-ssr" 189 - | "/demo/start/ssr/spa-mode" 190 - | "/demo/start/ssr"; 191 - id: 192 - | "__root__" 193 - | "/" 194 - | "/mcp" 195 - | "/album/$albumId" 196 - | "/demo/mcp-todos" 197 - | "/demo/tanstack-query" 198 - | "/album/" 199 - | "/demo/api/mcp-todos" 200 - | "/demo/api/names" 201 - | "/demo/api/tq-todos" 202 - | "/demo/start/api-request" 203 - | "/demo/start/server-funcs" 204 - | "/demo/start/ssr/data-only" 205 - | "/demo/start/ssr/full-ssr" 206 - | "/demo/start/ssr/spa-mode" 207 - | "/demo/start/ssr/"; 208 - fileRoutesById: FileRoutesById; 157 + fileRoutesByFullPath: FileRoutesByFullPath 158 + fullPaths: 159 + | '/' 160 + | '/mcp' 161 + | '/album/$albumId' 162 + | '/demo/mcp-todos' 163 + | '/demo/tanstack-query' 164 + | '/album' 165 + | '/demo/api/mcp-todos' 166 + | '/demo/api/names' 167 + | '/demo/api/tq-todos' 168 + | '/demo/start/api-request' 169 + | '/demo/start/server-funcs' 170 + | '/demo/start/ssr/data-only' 171 + | '/demo/start/ssr/full-ssr' 172 + | '/demo/start/ssr/spa-mode' 173 + | '/demo/start/ssr' 174 + fileRoutesByTo: FileRoutesByTo 175 + to: 176 + | '/' 177 + | '/mcp' 178 + | '/album/$albumId' 179 + | '/demo/mcp-todos' 180 + | '/demo/tanstack-query' 181 + | '/album' 182 + | '/demo/api/mcp-todos' 183 + | '/demo/api/names' 184 + | '/demo/api/tq-todos' 185 + | '/demo/start/api-request' 186 + | '/demo/start/server-funcs' 187 + | '/demo/start/ssr/data-only' 188 + | '/demo/start/ssr/full-ssr' 189 + | '/demo/start/ssr/spa-mode' 190 + | '/demo/start/ssr' 191 + id: 192 + | '__root__' 193 + | '/' 194 + | '/mcp' 195 + | '/album/$albumId' 196 + | '/demo/mcp-todos' 197 + | '/demo/tanstack-query' 198 + | '/album/' 199 + | '/demo/api/mcp-todos' 200 + | '/demo/api/names' 201 + | '/demo/api/tq-todos' 202 + | '/demo/start/api-request' 203 + | '/demo/start/server-funcs' 204 + | '/demo/start/ssr/data-only' 205 + | '/demo/start/ssr/full-ssr' 206 + | '/demo/start/ssr/spa-mode' 207 + | '/demo/start/ssr/' 208 + fileRoutesById: FileRoutesById 209 209 } 210 210 export interface RootRouteChildren { 211 - IndexRoute: typeof IndexRoute; 212 - McpRoute: typeof McpRoute; 213 - AlbumAlbumIdRoute: typeof AlbumAlbumIdRoute; 214 - DemoMcpTodosRoute: typeof DemoMcpTodosRoute; 215 - DemoTanstackQueryRoute: typeof DemoTanstackQueryRoute; 216 - AlbumIndexRoute: typeof AlbumIndexRoute; 217 - DemoApiMcpTodosRoute: typeof DemoApiMcpTodosRoute; 218 - DemoApiNamesRoute: typeof DemoApiNamesRoute; 219 - DemoApiTqTodosRoute: typeof DemoApiTqTodosRoute; 220 - DemoStartApiRequestRoute: typeof DemoStartApiRequestRoute; 221 - DemoStartServerFuncsRoute: typeof DemoStartServerFuncsRoute; 222 - DemoStartSsrDataOnlyRoute: typeof DemoStartSsrDataOnlyRoute; 223 - DemoStartSsrFullSsrRoute: typeof DemoStartSsrFullSsrRoute; 224 - DemoStartSsrSpaModeRoute: typeof DemoStartSsrSpaModeRoute; 225 - DemoStartSsrIndexRoute: typeof DemoStartSsrIndexRoute; 211 + IndexRoute: typeof IndexRoute 212 + McpRoute: typeof McpRoute 213 + AlbumAlbumIdRoute: typeof AlbumAlbumIdRoute 214 + DemoMcpTodosRoute: typeof DemoMcpTodosRoute 215 + DemoTanstackQueryRoute: typeof DemoTanstackQueryRoute 216 + AlbumIndexRoute: typeof AlbumIndexRoute 217 + DemoApiMcpTodosRoute: typeof DemoApiMcpTodosRoute 218 + DemoApiNamesRoute: typeof DemoApiNamesRoute 219 + DemoApiTqTodosRoute: typeof DemoApiTqTodosRoute 220 + DemoStartApiRequestRoute: typeof DemoStartApiRequestRoute 221 + DemoStartServerFuncsRoute: typeof DemoStartServerFuncsRoute 222 + DemoStartSsrDataOnlyRoute: typeof DemoStartSsrDataOnlyRoute 223 + DemoStartSsrFullSsrRoute: typeof DemoStartSsrFullSsrRoute 224 + DemoStartSsrSpaModeRoute: typeof DemoStartSsrSpaModeRoute 225 + DemoStartSsrIndexRoute: typeof DemoStartSsrIndexRoute 226 226 } 227 227 228 - declare module "@tanstack/react-router" { 229 - interface FileRoutesByPath { 230 - "/mcp": { 231 - id: "/mcp"; 232 - path: "/mcp"; 233 - fullPath: "/mcp"; 234 - preLoaderRoute: typeof McpRouteImport; 235 - parentRoute: typeof rootRouteImport; 236 - }; 237 - "/": { 238 - id: "/"; 239 - path: "/"; 240 - fullPath: "/"; 241 - preLoaderRoute: typeof IndexRouteImport; 242 - parentRoute: typeof rootRouteImport; 243 - }; 244 - "/album/": { 245 - id: "/album/"; 246 - path: "/album"; 247 - fullPath: "/album"; 248 - preLoaderRoute: typeof AlbumIndexRouteImport; 249 - parentRoute: typeof rootRouteImport; 250 - }; 251 - "/demo/tanstack-query": { 252 - id: "/demo/tanstack-query"; 253 - path: "/demo/tanstack-query"; 254 - fullPath: "/demo/tanstack-query"; 255 - preLoaderRoute: typeof DemoTanstackQueryRouteImport; 256 - parentRoute: typeof rootRouteImport; 257 - }; 258 - "/demo/mcp-todos": { 259 - id: "/demo/mcp-todos"; 260 - path: "/demo/mcp-todos"; 261 - fullPath: "/demo/mcp-todos"; 262 - preLoaderRoute: typeof DemoMcpTodosRouteImport; 263 - parentRoute: typeof rootRouteImport; 264 - }; 265 - "/album/$albumId": { 266 - id: "/album/$albumId"; 267 - path: "/album/$albumId"; 268 - fullPath: "/album/$albumId"; 269 - preLoaderRoute: typeof AlbumAlbumIdRouteImport; 270 - parentRoute: typeof rootRouteImport; 271 - }; 272 - "/demo/start/server-funcs": { 273 - id: "/demo/start/server-funcs"; 274 - path: "/demo/start/server-funcs"; 275 - fullPath: "/demo/start/server-funcs"; 276 - preLoaderRoute: typeof DemoStartServerFuncsRouteImport; 277 - parentRoute: typeof rootRouteImport; 278 - }; 279 - "/demo/start/api-request": { 280 - id: "/demo/start/api-request"; 281 - path: "/demo/start/api-request"; 282 - fullPath: "/demo/start/api-request"; 283 - preLoaderRoute: typeof DemoStartApiRequestRouteImport; 284 - parentRoute: typeof rootRouteImport; 285 - }; 286 - "/demo/api/tq-todos": { 287 - id: "/demo/api/tq-todos"; 288 - path: "/demo/api/tq-todos"; 289 - fullPath: "/demo/api/tq-todos"; 290 - preLoaderRoute: typeof DemoApiTqTodosRouteImport; 291 - parentRoute: typeof rootRouteImport; 292 - }; 293 - "/demo/api/names": { 294 - id: "/demo/api/names"; 295 - path: "/demo/api/names"; 296 - fullPath: "/demo/api/names"; 297 - preLoaderRoute: typeof DemoApiNamesRouteImport; 298 - parentRoute: typeof rootRouteImport; 299 - }; 300 - "/demo/api/mcp-todos": { 301 - id: "/demo/api/mcp-todos"; 302 - path: "/demo/api/mcp-todos"; 303 - fullPath: "/demo/api/mcp-todos"; 304 - preLoaderRoute: typeof DemoApiMcpTodosRouteImport; 305 - parentRoute: typeof rootRouteImport; 306 - }; 307 - "/demo/start/ssr/": { 308 - id: "/demo/start/ssr/"; 309 - path: "/demo/start/ssr"; 310 - fullPath: "/demo/start/ssr"; 311 - preLoaderRoute: typeof DemoStartSsrIndexRouteImport; 312 - parentRoute: typeof rootRouteImport; 313 - }; 314 - "/demo/start/ssr/spa-mode": { 315 - id: "/demo/start/ssr/spa-mode"; 316 - path: "/demo/start/ssr/spa-mode"; 317 - fullPath: "/demo/start/ssr/spa-mode"; 318 - preLoaderRoute: typeof DemoStartSsrSpaModeRouteImport; 319 - parentRoute: typeof rootRouteImport; 320 - }; 321 - "/demo/start/ssr/full-ssr": { 322 - id: "/demo/start/ssr/full-ssr"; 323 - path: "/demo/start/ssr/full-ssr"; 324 - fullPath: "/demo/start/ssr/full-ssr"; 325 - preLoaderRoute: typeof DemoStartSsrFullSsrRouteImport; 326 - parentRoute: typeof rootRouteImport; 327 - }; 328 - "/demo/start/ssr/data-only": { 329 - id: "/demo/start/ssr/data-only"; 330 - path: "/demo/start/ssr/data-only"; 331 - fullPath: "/demo/start/ssr/data-only"; 332 - preLoaderRoute: typeof DemoStartSsrDataOnlyRouteImport; 333 - parentRoute: typeof rootRouteImport; 334 - }; 335 - } 228 + declare module '@tanstack/react-router' { 229 + interface FileRoutesByPath { 230 + '/mcp': { 231 + id: '/mcp' 232 + path: '/mcp' 233 + fullPath: '/mcp' 234 + preLoaderRoute: typeof McpRouteImport 235 + parentRoute: typeof rootRouteImport 236 + } 237 + '/': { 238 + id: '/' 239 + path: '/' 240 + fullPath: '/' 241 + preLoaderRoute: typeof IndexRouteImport 242 + parentRoute: typeof rootRouteImport 243 + } 244 + '/album/': { 245 + id: '/album/' 246 + path: '/album' 247 + fullPath: '/album' 248 + preLoaderRoute: typeof AlbumIndexRouteImport 249 + parentRoute: typeof rootRouteImport 250 + } 251 + '/demo/tanstack-query': { 252 + id: '/demo/tanstack-query' 253 + path: '/demo/tanstack-query' 254 + fullPath: '/demo/tanstack-query' 255 + preLoaderRoute: typeof DemoTanstackQueryRouteImport 256 + parentRoute: typeof rootRouteImport 257 + } 258 + '/demo/mcp-todos': { 259 + id: '/demo/mcp-todos' 260 + path: '/demo/mcp-todos' 261 + fullPath: '/demo/mcp-todos' 262 + preLoaderRoute: typeof DemoMcpTodosRouteImport 263 + parentRoute: typeof rootRouteImport 264 + } 265 + '/album/$albumId': { 266 + id: '/album/$albumId' 267 + path: '/album/$albumId' 268 + fullPath: '/album/$albumId' 269 + preLoaderRoute: typeof AlbumAlbumIdRouteImport 270 + parentRoute: typeof rootRouteImport 271 + } 272 + '/demo/start/server-funcs': { 273 + id: '/demo/start/server-funcs' 274 + path: '/demo/start/server-funcs' 275 + fullPath: '/demo/start/server-funcs' 276 + preLoaderRoute: typeof DemoStartServerFuncsRouteImport 277 + parentRoute: typeof rootRouteImport 278 + } 279 + '/demo/start/api-request': { 280 + id: '/demo/start/api-request' 281 + path: '/demo/start/api-request' 282 + fullPath: '/demo/start/api-request' 283 + preLoaderRoute: typeof DemoStartApiRequestRouteImport 284 + parentRoute: typeof rootRouteImport 285 + } 286 + '/demo/api/tq-todos': { 287 + id: '/demo/api/tq-todos' 288 + path: '/demo/api/tq-todos' 289 + fullPath: '/demo/api/tq-todos' 290 + preLoaderRoute: typeof DemoApiTqTodosRouteImport 291 + parentRoute: typeof rootRouteImport 292 + } 293 + '/demo/api/names': { 294 + id: '/demo/api/names' 295 + path: '/demo/api/names' 296 + fullPath: '/demo/api/names' 297 + preLoaderRoute: typeof DemoApiNamesRouteImport 298 + parentRoute: typeof rootRouteImport 299 + } 300 + '/demo/api/mcp-todos': { 301 + id: '/demo/api/mcp-todos' 302 + path: '/demo/api/mcp-todos' 303 + fullPath: '/demo/api/mcp-todos' 304 + preLoaderRoute: typeof DemoApiMcpTodosRouteImport 305 + parentRoute: typeof rootRouteImport 306 + } 307 + '/demo/start/ssr/': { 308 + id: '/demo/start/ssr/' 309 + path: '/demo/start/ssr' 310 + fullPath: '/demo/start/ssr' 311 + preLoaderRoute: typeof DemoStartSsrIndexRouteImport 312 + parentRoute: typeof rootRouteImport 313 + } 314 + '/demo/start/ssr/spa-mode': { 315 + id: '/demo/start/ssr/spa-mode' 316 + path: '/demo/start/ssr/spa-mode' 317 + fullPath: '/demo/start/ssr/spa-mode' 318 + preLoaderRoute: typeof DemoStartSsrSpaModeRouteImport 319 + parentRoute: typeof rootRouteImport 320 + } 321 + '/demo/start/ssr/full-ssr': { 322 + id: '/demo/start/ssr/full-ssr' 323 + path: '/demo/start/ssr/full-ssr' 324 + fullPath: '/demo/start/ssr/full-ssr' 325 + preLoaderRoute: typeof DemoStartSsrFullSsrRouteImport 326 + parentRoute: typeof rootRouteImport 327 + } 328 + '/demo/start/ssr/data-only': { 329 + id: '/demo/start/ssr/data-only' 330 + path: '/demo/start/ssr/data-only' 331 + fullPath: '/demo/start/ssr/data-only' 332 + preLoaderRoute: typeof DemoStartSsrDataOnlyRouteImport 333 + parentRoute: typeof rootRouteImport 334 + } 335 + } 336 336 } 337 337 338 338 const rootRouteChildren: RootRouteChildren = { 339 - IndexRoute: IndexRoute, 340 - McpRoute: McpRoute, 341 - AlbumAlbumIdRoute: AlbumAlbumIdRoute, 342 - DemoMcpTodosRoute: DemoMcpTodosRoute, 343 - DemoTanstackQueryRoute: DemoTanstackQueryRoute, 344 - AlbumIndexRoute: AlbumIndexRoute, 345 - DemoApiMcpTodosRoute: DemoApiMcpTodosRoute, 346 - DemoApiNamesRoute: DemoApiNamesRoute, 347 - DemoApiTqTodosRoute: DemoApiTqTodosRoute, 348 - DemoStartApiRequestRoute: DemoStartApiRequestRoute, 349 - DemoStartServerFuncsRoute: DemoStartServerFuncsRoute, 350 - DemoStartSsrDataOnlyRoute: DemoStartSsrDataOnlyRoute, 351 - DemoStartSsrFullSsrRoute: DemoStartSsrFullSsrRoute, 352 - DemoStartSsrSpaModeRoute: DemoStartSsrSpaModeRoute, 353 - DemoStartSsrIndexRoute: DemoStartSsrIndexRoute, 354 - }; 355 - export const routeTree = rootRouteImport._addFileChildren(rootRouteChildren)._addFileTypes<FileRouteTypes>(); 339 + IndexRoute: IndexRoute, 340 + McpRoute: McpRoute, 341 + AlbumAlbumIdRoute: AlbumAlbumIdRoute, 342 + DemoMcpTodosRoute: DemoMcpTodosRoute, 343 + DemoTanstackQueryRoute: DemoTanstackQueryRoute, 344 + AlbumIndexRoute: AlbumIndexRoute, 345 + DemoApiMcpTodosRoute: DemoApiMcpTodosRoute, 346 + DemoApiNamesRoute: DemoApiNamesRoute, 347 + DemoApiTqTodosRoute: DemoApiTqTodosRoute, 348 + DemoStartApiRequestRoute: DemoStartApiRequestRoute, 349 + DemoStartServerFuncsRoute: DemoStartServerFuncsRoute, 350 + DemoStartSsrDataOnlyRoute: DemoStartSsrDataOnlyRoute, 351 + DemoStartSsrFullSsrRoute: DemoStartSsrFullSsrRoute, 352 + DemoStartSsrSpaModeRoute: DemoStartSsrSpaModeRoute, 353 + DemoStartSsrIndexRoute: DemoStartSsrIndexRoute, 354 + } 355 + export const routeTree = rootRouteImport 356 + ._addFileChildren(rootRouteChildren) 357 + ._addFileTypes<FileRouteTypes>() 356 358 357 - import type { getRouter } from "./router.tsx"; 358 - import type { createStart } from "@tanstack/react-start"; 359 - declare module "@tanstack/react-start" { 360 - interface Register { 361 - ssr: true; 362 - router: Awaited<ReturnType<typeof getRouter>>; 363 - } 359 + import type { getRouter } from './router.tsx' 360 + import type { createStart } from '@tanstack/react-start' 361 + declare module '@tanstack/react-start' { 362 + interface Register { 363 + ssr: true 364 + router: Awaited<ReturnType<typeof getRouter>> 365 + } 364 366 }