From 8dcd0bb9bf1d4d8b9d803ce751163e303e522c86 Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Sun, 29 Mar 2026 20:15:16 +0200 Subject: [PATCH] refactor(web): migrate to file-based routing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit replace code-based route tree with file-based routing using @tanstack/router-plugin: - add tanstackRouter vite plugin with autoCodeSplitting - create src/routes/ directory mirroring the URL structure - each route file uses createFileRoute/createRootRoute - page components stay in src/pages/, route files just wire them up - App.tsx now imports the generated routeTree from routeTree.gen.ts - move CodePageSearch type to the route file where validateSearch lives - ignore routeTree.gen.ts from linter and formatter route structure: __root.tsx → Shell + ErrorPage index.tsx → RepoPickerPage auth/select-identity.tsx → IdentitySelectPage $repo.tsx → RepoShell layout $repo/index.tsx → CodePage (with search params) $repo/issues/ → BugListPage, NewBugPage, BugDetailPage $repo/user/$id.tsx → UserProfilePage $repo/commit/$hash.tsx → CommitPage Co-Authored-By: Claude Opus 4.6 (1M context) --- webui2/.oxfmtrc.json | 2 +- webui2/.oxlintrc.json | 2 +- webui2/package.json | 1 + webui2/pnpm-lock.yaml | 581 ++++++++++++++++++++- webui2/src/App.tsx | 107 +--- webui2/src/pages/CodePage.tsx | 2 +- webui2/src/routeTree.gen.ts | 237 +++++++++ webui2/src/routes/$repo.tsx | 7 + webui2/src/routes/$repo/commit/$hash.tsx | 7 + webui2/src/routes/$repo/index.tsx | 20 + webui2/src/routes/$repo/issues/$id.tsx | 7 + webui2/src/routes/$repo/issues/index.tsx | 7 + webui2/src/routes/$repo/issues/new.tsx | 7 + webui2/src/routes/$repo/user/$id.tsx | 7 + webui2/src/routes/__root.tsx | 9 + webui2/src/routes/auth/select-identity.tsx | 7 + webui2/src/routes/index.tsx | 7 + webui2/vite.config.ts | 3 +- 18 files changed, 907 insertions(+), 113 deletions(-) create mode 100644 webui2/src/routeTree.gen.ts create mode 100644 webui2/src/routes/$repo.tsx create mode 100644 webui2/src/routes/$repo/commit/$hash.tsx create mode 100644 webui2/src/routes/$repo/index.tsx create mode 100644 webui2/src/routes/$repo/issues/$id.tsx create mode 100644 webui2/src/routes/$repo/issues/index.tsx create mode 100644 webui2/src/routes/$repo/issues/new.tsx create mode 100644 webui2/src/routes/$repo/user/$id.tsx create mode 100644 webui2/src/routes/__root.tsx create mode 100644 webui2/src/routes/auth/select-identity.tsx create mode 100644 webui2/src/routes/index.tsx diff --git a/webui2/.oxfmtrc.json b/webui2/.oxfmtrc.json index 850af8b4c096f561614b655b9c81734101b3e70f..f00a6b81c558b6695c5a5b6be2c4ddefad788249 100644 --- a/webui2/.oxfmtrc.json +++ b/webui2/.oxfmtrc.json @@ -8,5 +8,5 @@ "trailingComma": "all", "sortImports": {}, "sortTailwindcss": {}, - "ignorePatterns": ["src/__generated__/**"] + "ignorePatterns": ["src/__generated__/**", "src/routeTree.gen.ts"] } diff --git a/webui2/.oxlintrc.json b/webui2/.oxlintrc.json index a73c6bf43533b258f827be17e2d575b3879eef20..addf78786e901b7dd696f2b587a4792ee32c3e55 100644 --- a/webui2/.oxlintrc.json +++ b/webui2/.oxlintrc.json @@ -19,5 +19,5 @@ "typeAware": true, "typeCheck": true }, - "ignorePatterns": ["src/__generated__/**"] + "ignorePatterns": ["src/__generated__/**", "src/routeTree.gen.ts"] } diff --git a/webui2/package.json b/webui2/package.json index 347b178d009f0518d56f2228c23e4657eb706d36..8a02e60af0c8f86886c11b5e2f2ee61ea41eefa6 100644 --- a/webui2/package.json +++ b/webui2/package.json @@ -45,6 +45,7 @@ "@graphql-codegen/typescript-react-apollo": "^4.3.2", "@tailwindcss/typography": "^0.5.19", "@tailwindcss/vite": "^4.2.2", + "@tanstack/router-plugin": "^1.167.9", "@types/react": "^19.1.0", "@types/react-dom": "^19.1.0", "@vitejs/plugin-react": "^6.0.1", diff --git a/webui2/pnpm-lock.yaml b/webui2/pnpm-lock.yaml index 3129899040a9bc69ceb2b6c305a4c2802f59928a..824b80831acc2d73067aa7008756917565bb5e1e 100644 --- a/webui2/pnpm-lock.yaml +++ b/webui2/pnpm-lock.yaml @@ -92,7 +92,10 @@ importers: version: 0.5.19(tailwindcss@4.2.2) '@tailwindcss/vite': specifier: ^4.2.2 - version: 4.2.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.3)) + version: 4.2.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) + '@tanstack/router-plugin': + specifier: ^1.167.9 + version: 1.167.9(@tanstack/react-router@1.168.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) '@types/react': specifier: ^19.1.0 version: 19.2.14 @@ -101,7 +104,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.3)) + version: 6.0.1(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) oxfmt: specifier: ^0.42.0 version: 0.42.0 @@ -119,7 +122,7 @@ importers: version: 6.0.2 vite: specifier: ^8.0.3 - version: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.3) + version: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) packages: @@ -212,6 +215,18 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime@7.29.2': resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} @@ -249,6 +264,162 @@ packages: resolution: {integrity: sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg==} engines: {node: '>=18.0.0'} + '@esbuild/aix-ppc64@0.27.4': + resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.4': + resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.4': + resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.4': + resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.4': + resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.4': + resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.4': + resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.4': + resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.4': + resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.4': + resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.4': + resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.4': + resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.4': + resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.4': + resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.4': + resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.4': + resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.4': + resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.4': + resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.4': + resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.4': + resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.4': + resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.4': + resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.4': + resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.4': + resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.4': + resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.4': + resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@fastify/busboy@3.2.0': resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} @@ -1869,9 +2040,44 @@ packages: engines: {node: '>=20.19'} hasBin: true + '@tanstack/router-generator@1.166.22': + resolution: {integrity: sha512-wQ7H8/Q2rmSPuaxWnurJ3DATNnqWV2tajxri9TSiW4QHsG7cWPD34+goeIinKG+GajJyEdfVpz6w/gRJXfbAPw==} + engines: {node: '>=20.19'} + + '@tanstack/router-plugin@1.167.9': + resolution: {integrity: sha512-h/VV05FEHd4PVyc5Zy8B3trWLcdLt/Pmp+mfifmBKGRw+MUtvdQKbBHhmy4ouOf67s5zDJMc+n8R3xgU7bDwFA==} + engines: {node: '>=20.19'} + hasBin: true + peerDependencies: + '@rsbuild/core': '>=1.0.2' + '@tanstack/react-router': ^1.168.8 + vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' + vite-plugin-solid: ^2.11.10 + webpack: '>=5.92.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@tanstack/react-router': + optional: true + vite: + optional: true + vite-plugin-solid: + optional: true + webpack: + optional: true + + '@tanstack/router-utils@1.161.6': + resolution: {integrity: sha512-nRcYw+w2OEgK6VfjirYvGyPLOK+tZQz1jkYcmH5AjMamQ9PycnlxZF2aEZtPpNoUsaceX2bHptn6Ub5hGXqNvw==} + engines: {node: '>=20.19'} + '@tanstack/store@0.9.3': resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} + '@tanstack/virtual-file-routes@1.161.7': + resolution: {integrity: sha512-olW33+Cn+bsCsZKPwEGhlkqS6w3M2slFv11JIobdnCFKMLG97oAI2kWKdx5/zsywTL8flpnoIgaZZPlQTFYhdQ==} + engines: {node: '>=20.19'} + hasBin: true + '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -1961,6 +2167,11 @@ packages: resolution: {integrity: sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==} engines: {node: '>=8'} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} @@ -1981,6 +2192,14 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1992,10 +2211,17 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + auto-bind@4.0.0: resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} engines: {node: '>=8'} + babel-dead-code-elimination@1.0.12: + resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -2008,6 +2234,10 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + brace-expansion@5.0.5: resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} engines: {node: 18 || 20 || >=22} @@ -2066,6 +2296,10 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -2193,6 +2427,10 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -2234,6 +2472,11 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + esbuild@0.27.4: + resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -2242,6 +2485,11 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} @@ -2300,6 +2548,9 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-tsconfig@4.13.7: + resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} + github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -2442,6 +2693,10 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -2851,6 +3106,10 @@ packages: resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} engines: {node: '>=0.10.0'} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} @@ -2920,6 +3179,9 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2939,6 +3201,11 @@ packages: resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} @@ -3003,6 +3270,14 @@ packages: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + rehype-autolink-headings@7.1.0: resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} @@ -3055,6 +3330,9 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} @@ -3131,6 +3409,14 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -3194,6 +3480,9 @@ packages: resolution: {integrity: sha512-YBGpG4bWsHoPvofT6y/5iqulfXIiIErl5B0LdtHT1mGXDFTAhhRrbUpTvBgYbovr+3cKblya2WAOcpoy90XguA==} engines: {node: '>=16'} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -3224,6 +3513,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + tw-animate-css@1.4.0: resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} @@ -3265,6 +3559,10 @@ packages: resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} engines: {node: '>=0.10.0'} + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true @@ -3367,6 +3665,9 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} @@ -3423,6 +3724,9 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -3535,6 +3839,16 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/runtime@7.29.2': {} '@babel/template@7.28.6': @@ -3593,6 +3907,84 @@ snapshots: '@whatwg-node/promise-helpers': 1.3.2 tslib: 2.8.1 + '@esbuild/aix-ppc64@0.27.4': + optional: true + + '@esbuild/android-arm64@0.27.4': + optional: true + + '@esbuild/android-arm@0.27.4': + optional: true + + '@esbuild/android-x64@0.27.4': + optional: true + + '@esbuild/darwin-arm64@0.27.4': + optional: true + + '@esbuild/darwin-x64@0.27.4': + optional: true + + '@esbuild/freebsd-arm64@0.27.4': + optional: true + + '@esbuild/freebsd-x64@0.27.4': + optional: true + + '@esbuild/linux-arm64@0.27.4': + optional: true + + '@esbuild/linux-arm@0.27.4': + optional: true + + '@esbuild/linux-ia32@0.27.4': + optional: true + + '@esbuild/linux-loong64@0.27.4': + optional: true + + '@esbuild/linux-mips64el@0.27.4': + optional: true + + '@esbuild/linux-ppc64@0.27.4': + optional: true + + '@esbuild/linux-riscv64@0.27.4': + optional: true + + '@esbuild/linux-s390x@0.27.4': + optional: true + + '@esbuild/linux-x64@0.27.4': + optional: true + + '@esbuild/netbsd-arm64@0.27.4': + optional: true + + '@esbuild/netbsd-x64@0.27.4': + optional: true + + '@esbuild/openbsd-arm64@0.27.4': + optional: true + + '@esbuild/openbsd-x64@0.27.4': + optional: true + + '@esbuild/openharmony-arm64@0.27.4': + optional: true + + '@esbuild/sunos-x64@0.27.4': + optional: true + + '@esbuild/win32-arm64@0.27.4': + optional: true + + '@esbuild/win32-ia32@0.27.4': + optional: true + + '@esbuild/win32-x64@0.27.4': + optional: true + '@fastify/busboy@3.2.0': {} '@floating-ui/core@1.7.5': @@ -5181,12 +5573,12 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.2.2 - '@tailwindcss/vite@4.2.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.3))': + '@tailwindcss/vite@4.2.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@tailwindcss/node': 4.2.2 '@tailwindcss/oxide': 4.2.2 tailwindcss: 4.2.2 - vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.3) + vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) '@tanstack/history@1.161.6': {} @@ -5213,8 +5605,58 @@ snapshots: seroval: 1.5.1 seroval-plugins: 1.5.1(seroval@1.5.1) + '@tanstack/router-generator@1.166.22': + dependencies: + '@tanstack/router-core': 1.168.7 + '@tanstack/router-utils': 1.161.6 + '@tanstack/virtual-file-routes': 1.161.7 + prettier: 3.8.1 + recast: 0.23.11 + source-map: 0.7.6 + tsx: 4.21.0 + zod: 3.25.76 + transitivePeerDependencies: + - supports-color + + '@tanstack/router-plugin@1.167.9(@tanstack/react-router@1.168.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.168.7 + '@tanstack/router-generator': 1.166.22 + '@tanstack/router-utils': 1.161.6 + '@tanstack/virtual-file-routes': 1.161.7 + chokidar: 3.6.0 + unplugin: 2.3.11 + zod: 3.25.76 + optionalDependencies: + '@tanstack/react-router': 1.168.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) + transitivePeerDependencies: + - supports-color + + '@tanstack/router-utils@1.161.6': + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + ansis: 4.2.0 + babel-dead-code-elimination: 1.0.12 + diff: 8.0.4 + pathe: 2.0.3 + tinyglobby: 0.2.15 + transitivePeerDependencies: + - supports-color + '@tanstack/store@0.9.3': {} + '@tanstack/virtual-file-routes@1.161.7': {} + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 @@ -5262,10 +5704,10 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@6.0.1(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.3))': + '@vitejs/plugin-react@6.0.1(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 - vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.3) + vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) '@whatwg-node/disposablestack@0.0.6': dependencies: @@ -5304,6 +5746,8 @@ snapshots: dependencies: tslib: 2.8.1 + acorn@8.16.0: {} + ansi-escapes@7.3.0: dependencies: environment: 1.1.0 @@ -5318,6 +5762,13 @@ snapshots: ansi-styles@6.2.3: {} + ansis@4.2.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + argparse@2.0.1: {} aria-hidden@1.2.6: @@ -5326,14 +5777,29 @@ snapshots: array-union@2.1.0: {} + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + auto-bind@4.0.0: {} + babel-dead-code-elimination@1.0.12: + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.2 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + bail@2.0.2: {} balanced-match@4.0.4: {} baseline-browser-mapping@2.10.12: {} + binary-extensions@2.3.0: {} + brace-expansion@5.0.5: dependencies: balanced-match: 4.0.4 @@ -5412,6 +5878,18 @@ snapshots: chardet@2.1.1: {} + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -5513,6 +5991,8 @@ snapshots: dependencies: dequal: 2.0.3 + diff@8.0.4: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -5547,10 +6027,41 @@ snapshots: dependencies: is-arrayish: 0.2.1 + esbuild@0.27.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.4 + '@esbuild/android-arm': 0.27.4 + '@esbuild/android-arm64': 0.27.4 + '@esbuild/android-x64': 0.27.4 + '@esbuild/darwin-arm64': 0.27.4 + '@esbuild/darwin-x64': 0.27.4 + '@esbuild/freebsd-arm64': 0.27.4 + '@esbuild/freebsd-x64': 0.27.4 + '@esbuild/linux-arm': 0.27.4 + '@esbuild/linux-arm64': 0.27.4 + '@esbuild/linux-ia32': 0.27.4 + '@esbuild/linux-loong64': 0.27.4 + '@esbuild/linux-mips64el': 0.27.4 + '@esbuild/linux-ppc64': 0.27.4 + '@esbuild/linux-riscv64': 0.27.4 + '@esbuild/linux-s390x': 0.27.4 + '@esbuild/linux-x64': 0.27.4 + '@esbuild/netbsd-arm64': 0.27.4 + '@esbuild/netbsd-x64': 0.27.4 + '@esbuild/openbsd-arm64': 0.27.4 + '@esbuild/openbsd-x64': 0.27.4 + '@esbuild/openharmony-arm64': 0.27.4 + '@esbuild/sunos-x64': 0.27.4 + '@esbuild/win32-arm64': 0.27.4 + '@esbuild/win32-ia32': 0.27.4 + '@esbuild/win32-x64': 0.27.4 + escalade@3.2.0: {} escape-string-regexp@5.0.0: {} + esprima@4.0.1: {} + estree-util-is-identifier-name@3.0.0: {} eventemitter3@5.0.4: {} @@ -5597,6 +6108,10 @@ snapshots: get-nonce@1.0.1: {} + get-tsconfig@4.13.7: + dependencies: + resolve-pkg-maps: 1.0.0 + github-slugger@2.0.0: {} glob-parent@5.1.2: @@ -5790,6 +6305,10 @@ snapshots: is-arrayish@0.2.1: {} + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + is-decimal@2.0.1: {} is-extglob@2.1.1: {} @@ -6359,6 +6878,8 @@ snapshots: dependencies: remove-trailing-separator: 1.1.0 + normalize-path@3.0.0: {} + onetime@7.0.0: dependencies: mimic-function: 5.0.1 @@ -6484,6 +7005,8 @@ snapshots: path-type@4.0.0: {} + pathe@2.0.3: {} + picocolors@1.1.1: {} picomatch@2.3.2: {} @@ -6501,6 +7024,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + prettier@3.8.1: {} + property-information@7.1.0: {} queue-microtask@1.2.3: {} @@ -6620,6 +7145,18 @@ snapshots: react@19.2.4: {} + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + rehype-autolink-headings@7.1.0: dependencies: '@types/hast': 3.0.4 @@ -6711,6 +7248,8 @@ snapshots: resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} + restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -6797,6 +7336,10 @@ snapshots: source-map-js@1.2.1: {} + source-map@0.6.1: {} + + source-map@0.7.6: {} + space-separated-tokens@2.0.2: {} sponge-case@1.0.1: @@ -6865,6 +7408,8 @@ snapshots: timeout-signal@2.0.0: {} + tiny-invariant@1.3.3: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.4) @@ -6890,6 +7435,13 @@ snapshots: tslib@2.8.1: {} + tsx@4.21.0: + dependencies: + esbuild: 0.27.4 + get-tsconfig: 4.13.7 + optionalDependencies: + fsevents: 2.3.3 + tw-animate-css@1.4.0: {} typescript@6.0.2: {} @@ -6937,6 +7489,13 @@ snapshots: dependencies: normalize-path: 2.1.1 + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.16.0 + picomatch: 4.0.4 + webpack-virtual-modules: 0.6.2 + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: browserslist: 4.28.1 @@ -6989,7 +7548,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(jiti@2.6.1)(yaml@2.8.3): + vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -6998,8 +7557,10 @@ snapshots: tinyglobby: 0.2.15 optionalDependencies: '@types/node': 25.5.0 + esbuild: 0.27.4 fsevents: 2.3.3 jiti: 2.6.1 + tsx: 4.21.0 yaml: 2.8.3 transitivePeerDependencies: - '@emnapi/core' @@ -7009,6 +7570,8 @@ snapshots: web-streams-polyfill@3.3.3: {} + webpack-virtual-modules@0.6.2: {} + whatwg-mimetype@4.0.0: {} wrap-ansi@6.2.0: @@ -7053,4 +7616,6 @@ snapshots: yoctocolors-cjs@2.1.3: {} + zod@3.25.76: {} + zwitch@2.0.4: {} diff --git a/webui2/src/App.tsx b/webui2/src/App.tsx index 790dabc4ffc2507ac816846e923fb24f74a19666..3f8dcf795a618d45affc702be754fcfb3726502b 100644 --- a/webui2/src/App.tsx +++ b/webui2/src/App.tsx @@ -1,108 +1,13 @@ -import { createRootRoute, createRoute, createRouter, RouterProvider } from "@tanstack/react-router"; +import { createRouter, RouterProvider } from "@tanstack/react-router"; -import { Shell } from "@/components/layout/Shell"; -import { RepoShell } from "@/lib/repo"; -import { BugDetailPage } from "@/pages/BugDetailPage"; -import { BugListPage } from "@/pages/BugListPage"; -import { CodePage } from "@/pages/CodePage"; -import { CommitPage } from "@/pages/CommitPage"; -import { ErrorPage } from "@/pages/ErrorPage"; -import { IdentitySelectPage } from "@/pages/IdentitySelectPage"; -import { NewBugPage } from "@/pages/NewBugPage"; -import { RepoPickerPage } from "@/pages/RepoPickerPage"; -import { UserProfilePage } from "@/pages/UserProfilePage"; +import { routeTree } from "./routeTree.gen"; -// ── Route tree ─────────────────────────────────────────────────────────────── - -const rootRoute = createRootRoute({ - component: Shell, - errorComponent: ErrorPage, -}); - -const indexRoute = createRoute({ - getParentRoute: () => rootRoute, - path: "/", - component: RepoPickerPage, -}); - -const authSelectIdentityRoute = createRoute({ - getParentRoute: () => rootRoute, - path: "/auth/select-identity", - component: IdentitySelectPage, -}); - -const repoRoute = createRoute({ - getParentRoute: () => rootRoute, - path: "/$repo", - component: RepoShell, -}); - -export type CodePageSearch = { - ref: string; - path: string; - type: "tree" | "blob" | "commits"; -}; - -const repoIndexRoute = createRoute({ - getParentRoute: () => repoRoute, - path: "/", - component: CodePage, - validateSearch: (search: Record): CodePageSearch => ({ - ref: (search.ref as string) ?? "", - path: (search.path as string) ?? "", - type: ["tree", "blob", "commits"].includes(search.type as string) - ? (search.type as CodePageSearch["type"]) - : "tree", - }), -}); - -const bugListRoute = createRoute({ - getParentRoute: () => repoRoute, - path: "/issues", - component: BugListPage, +const router = createRouter({ + routeTree, + defaultPreload: "intent", + scrollRestoration: true, }); -const newBugRoute = createRoute({ - getParentRoute: () => repoRoute, - path: "/issues/new", - component: NewBugPage, -}); - -const bugDetailRoute = createRoute({ - getParentRoute: () => repoRoute, - path: "/issues/$id", - component: BugDetailPage, -}); - -const userProfileRoute = createRoute({ - getParentRoute: () => repoRoute, - path: "/user/$id", - component: UserProfilePage, -}); - -const commitRoute = createRoute({ - getParentRoute: () => repoRoute, - path: "/commit/$hash", - component: CommitPage, -}); - -const routeTree = rootRoute.addChildren([ - indexRoute, - authSelectIdentityRoute, - repoRoute.addChildren([ - repoIndexRoute, - bugListRoute, - newBugRoute, - bugDetailRoute, - userProfileRoute, - commitRoute, - ]), -]); - -// ── Router instance ────────────────────────────────────────────────────────── - -const router = createRouter({ routeTree }); - declare module "@tanstack/react-router" { interface Register { router: typeof router; diff --git a/webui2/src/pages/CodePage.tsx b/webui2/src/pages/CodePage.tsx index aa95ab6a1adbb07a204184db9c3a740d1717f341..64b981454ec761a070ecf5a3564fe0b21516ef28 100644 --- a/webui2/src/pages/CodePage.tsx +++ b/webui2/src/pages/CodePage.tsx @@ -104,7 +104,7 @@ interface BlobQueryData { } | null; } -import type { CodePageSearch } from "@/App"; +import type { CodePageSearch } from "@/routes/$repo/index"; type ViewMode = CodePageSearch["type"]; diff --git a/webui2/src/routeTree.gen.ts b/webui2/src/routeTree.gen.ts new file mode 100644 index 0000000000000000000000000000000000000000..7850f91393ea55bf88339175f23bcb95561cc6ec --- /dev/null +++ b/webui2/src/routeTree.gen.ts @@ -0,0 +1,237 @@ +/* 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 RepoRouteImport } from './routes/$repo' +import { Route as IndexRouteImport } from './routes/index' +import { Route as RepoIndexRouteImport } from './routes/$repo/index' +import { Route as AuthSelectIdentityRouteImport } from './routes/auth/select-identity' +import { Route as RepoIssuesIndexRouteImport } from './routes/$repo/issues/index' +import { Route as RepoUserIdRouteImport } from './routes/$repo/user/$id' +import { Route as RepoIssuesNewRouteImport } from './routes/$repo/issues/new' +import { Route as RepoIssuesIdRouteImport } from './routes/$repo/issues/$id' +import { Route as RepoCommitHashRouteImport } from './routes/$repo/commit/$hash' + +const RepoRoute = RepoRouteImport.update({ + id: '/$repo', + path: '/$repo', + getParentRoute: () => rootRouteImport, +} as any) +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) +const RepoIndexRoute = RepoIndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => RepoRoute, +} as any) +const AuthSelectIdentityRoute = AuthSelectIdentityRouteImport.update({ + id: '/auth/select-identity', + path: '/auth/select-identity', + getParentRoute: () => rootRouteImport, +} as any) +const RepoIssuesIndexRoute = RepoIssuesIndexRouteImport.update({ + id: '/issues/', + path: '/issues/', + getParentRoute: () => RepoRoute, +} as any) +const RepoUserIdRoute = RepoUserIdRouteImport.update({ + id: '/user/$id', + path: '/user/$id', + getParentRoute: () => RepoRoute, +} as any) +const RepoIssuesNewRoute = RepoIssuesNewRouteImport.update({ + id: '/issues/new', + path: '/issues/new', + getParentRoute: () => RepoRoute, +} as any) +const RepoIssuesIdRoute = RepoIssuesIdRouteImport.update({ + id: '/issues/$id', + path: '/issues/$id', + getParentRoute: () => RepoRoute, +} as any) +const RepoCommitHashRoute = RepoCommitHashRouteImport.update({ + id: '/commit/$hash', + path: '/commit/$hash', + getParentRoute: () => RepoRoute, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/$repo': typeof RepoRouteWithChildren + '/auth/select-identity': typeof AuthSelectIdentityRoute + '/$repo/': typeof RepoIndexRoute + '/$repo/commit/$hash': typeof RepoCommitHashRoute + '/$repo/issues/$id': typeof RepoIssuesIdRoute + '/$repo/issues/new': typeof RepoIssuesNewRoute + '/$repo/user/$id': typeof RepoUserIdRoute + '/$repo/issues/': typeof RepoIssuesIndexRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/auth/select-identity': typeof AuthSelectIdentityRoute + '/$repo': typeof RepoIndexRoute + '/$repo/commit/$hash': typeof RepoCommitHashRoute + '/$repo/issues/$id': typeof RepoIssuesIdRoute + '/$repo/issues/new': typeof RepoIssuesNewRoute + '/$repo/user/$id': typeof RepoUserIdRoute + '/$repo/issues': typeof RepoIssuesIndexRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute + '/$repo': typeof RepoRouteWithChildren + '/auth/select-identity': typeof AuthSelectIdentityRoute + '/$repo/': typeof RepoIndexRoute + '/$repo/commit/$hash': typeof RepoCommitHashRoute + '/$repo/issues/$id': typeof RepoIssuesIdRoute + '/$repo/issues/new': typeof RepoIssuesNewRoute + '/$repo/user/$id': typeof RepoUserIdRoute + '/$repo/issues/': typeof RepoIssuesIndexRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '/$repo' + | '/auth/select-identity' + | '/$repo/' + | '/$repo/commit/$hash' + | '/$repo/issues/$id' + | '/$repo/issues/new' + | '/$repo/user/$id' + | '/$repo/issues/' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '/auth/select-identity' + | '/$repo' + | '/$repo/commit/$hash' + | '/$repo/issues/$id' + | '/$repo/issues/new' + | '/$repo/user/$id' + | '/$repo/issues' + id: + | '__root__' + | '/' + | '/$repo' + | '/auth/select-identity' + | '/$repo/' + | '/$repo/commit/$hash' + | '/$repo/issues/$id' + | '/$repo/issues/new' + | '/$repo/user/$id' + | '/$repo/issues/' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + RepoRoute: typeof RepoRouteWithChildren + AuthSelectIdentityRoute: typeof AuthSelectIdentityRoute +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/$repo': { + id: '/$repo' + path: '/$repo' + fullPath: '/$repo' + preLoaderRoute: typeof RepoRouteImport + parentRoute: typeof rootRouteImport + } + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + '/$repo/': { + id: '/$repo/' + path: '/' + fullPath: '/$repo/' + preLoaderRoute: typeof RepoIndexRouteImport + parentRoute: typeof RepoRoute + } + '/auth/select-identity': { + id: '/auth/select-identity' + path: '/auth/select-identity' + fullPath: '/auth/select-identity' + preLoaderRoute: typeof AuthSelectIdentityRouteImport + parentRoute: typeof rootRouteImport + } + '/$repo/issues/': { + id: '/$repo/issues/' + path: '/issues' + fullPath: '/$repo/issues/' + preLoaderRoute: typeof RepoIssuesIndexRouteImport + parentRoute: typeof RepoRoute + } + '/$repo/user/$id': { + id: '/$repo/user/$id' + path: '/user/$id' + fullPath: '/$repo/user/$id' + preLoaderRoute: typeof RepoUserIdRouteImport + parentRoute: typeof RepoRoute + } + '/$repo/issues/new': { + id: '/$repo/issues/new' + path: '/issues/new' + fullPath: '/$repo/issues/new' + preLoaderRoute: typeof RepoIssuesNewRouteImport + parentRoute: typeof RepoRoute + } + '/$repo/issues/$id': { + id: '/$repo/issues/$id' + path: '/issues/$id' + fullPath: '/$repo/issues/$id' + preLoaderRoute: typeof RepoIssuesIdRouteImport + parentRoute: typeof RepoRoute + } + '/$repo/commit/$hash': { + id: '/$repo/commit/$hash' + path: '/commit/$hash' + fullPath: '/$repo/commit/$hash' + preLoaderRoute: typeof RepoCommitHashRouteImport + parentRoute: typeof RepoRoute + } + } +} + +interface RepoRouteChildren { + RepoIndexRoute: typeof RepoIndexRoute + RepoCommitHashRoute: typeof RepoCommitHashRoute + RepoIssuesIdRoute: typeof RepoIssuesIdRoute + RepoIssuesNewRoute: typeof RepoIssuesNewRoute + RepoUserIdRoute: typeof RepoUserIdRoute + RepoIssuesIndexRoute: typeof RepoIssuesIndexRoute +} + +const RepoRouteChildren: RepoRouteChildren = { + RepoIndexRoute: RepoIndexRoute, + RepoCommitHashRoute: RepoCommitHashRoute, + RepoIssuesIdRoute: RepoIssuesIdRoute, + RepoIssuesNewRoute: RepoIssuesNewRoute, + RepoUserIdRoute: RepoUserIdRoute, + RepoIssuesIndexRoute: RepoIssuesIndexRoute, +} + +const RepoRouteWithChildren = RepoRoute._addFileChildren(RepoRouteChildren) + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + RepoRoute: RepoRouteWithChildren, + AuthSelectIdentityRoute: AuthSelectIdentityRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() diff --git a/webui2/src/routes/$repo.tsx b/webui2/src/routes/$repo.tsx new file mode 100644 index 0000000000000000000000000000000000000000..77cd795d8ba5d770bea08291e828df410b4c9135 --- /dev/null +++ b/webui2/src/routes/$repo.tsx @@ -0,0 +1,7 @@ +import { createFileRoute } from "@tanstack/react-router"; + +import { RepoShell } from "@/lib/repo"; + +export const Route = createFileRoute("/$repo")({ + component: RepoShell, +}); diff --git a/webui2/src/routes/$repo/commit/$hash.tsx b/webui2/src/routes/$repo/commit/$hash.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4419edec0a13f5374e01f2f2c31d29908f7c163d --- /dev/null +++ b/webui2/src/routes/$repo/commit/$hash.tsx @@ -0,0 +1,7 @@ +import { createFileRoute } from "@tanstack/react-router"; + +import { CommitPage } from "@/pages/CommitPage"; + +export const Route = createFileRoute("/$repo/commit/$hash")({ + component: CommitPage, +}); diff --git a/webui2/src/routes/$repo/index.tsx b/webui2/src/routes/$repo/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..9766d3f633059beaa6b1d7b084a9e79e5e17f91f --- /dev/null +++ b/webui2/src/routes/$repo/index.tsx @@ -0,0 +1,20 @@ +import { createFileRoute } from "@tanstack/react-router"; + +import { CodePage } from "@/pages/CodePage"; + +export type CodePageSearch = { + ref: string; + path: string; + type: "tree" | "blob" | "commits"; +}; + +export const Route = createFileRoute("/$repo/")({ + component: CodePage, + validateSearch: (search: Record): CodePageSearch => ({ + ref: (search.ref as string) ?? "", + path: (search.path as string) ?? "", + type: ["tree", "blob", "commits"].includes(search.type as string) + ? (search.type as CodePageSearch["type"]) + : "tree", + }), +}); diff --git a/webui2/src/routes/$repo/issues/$id.tsx b/webui2/src/routes/$repo/issues/$id.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e63c4075547114f228bcf89e3f82f2ab534f297a --- /dev/null +++ b/webui2/src/routes/$repo/issues/$id.tsx @@ -0,0 +1,7 @@ +import { createFileRoute } from "@tanstack/react-router"; + +import { BugDetailPage } from "@/pages/BugDetailPage"; + +export const Route = createFileRoute("/$repo/issues/$id")({ + component: BugDetailPage, +}); diff --git a/webui2/src/routes/$repo/issues/index.tsx b/webui2/src/routes/$repo/issues/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3a1e3bab7a8abff1b226603ade63a2e3562c958e --- /dev/null +++ b/webui2/src/routes/$repo/issues/index.tsx @@ -0,0 +1,7 @@ +import { createFileRoute } from "@tanstack/react-router"; + +import { BugListPage } from "@/pages/BugListPage"; + +export const Route = createFileRoute("/$repo/issues/")({ + component: BugListPage, +}); diff --git a/webui2/src/routes/$repo/issues/new.tsx b/webui2/src/routes/$repo/issues/new.tsx new file mode 100644 index 0000000000000000000000000000000000000000..55f1fe277b6128b17383fec35e27485d31787d4a --- /dev/null +++ b/webui2/src/routes/$repo/issues/new.tsx @@ -0,0 +1,7 @@ +import { createFileRoute } from "@tanstack/react-router"; + +import { NewBugPage } from "@/pages/NewBugPage"; + +export const Route = createFileRoute("/$repo/issues/new")({ + component: NewBugPage, +}); diff --git a/webui2/src/routes/$repo/user/$id.tsx b/webui2/src/routes/$repo/user/$id.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c2d042eeee036ac326c7b4aed4fca0c5906971be --- /dev/null +++ b/webui2/src/routes/$repo/user/$id.tsx @@ -0,0 +1,7 @@ +import { createFileRoute } from "@tanstack/react-router"; + +import { UserProfilePage } from "@/pages/UserProfilePage"; + +export const Route = createFileRoute("/$repo/user/$id")({ + component: UserProfilePage, +}); diff --git a/webui2/src/routes/__root.tsx b/webui2/src/routes/__root.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d8a6fd2f45db5ab0c398ff9a76b6910a7e2aca74 --- /dev/null +++ b/webui2/src/routes/__root.tsx @@ -0,0 +1,9 @@ +import { createRootRoute } from "@tanstack/react-router"; + +import { Shell } from "@/components/layout/Shell"; +import { ErrorPage } from "@/pages/ErrorPage"; + +export const Route = createRootRoute({ + component: Shell, + errorComponent: ErrorPage, +}); diff --git a/webui2/src/routes/auth/select-identity.tsx b/webui2/src/routes/auth/select-identity.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f9be91e8b96d869b4c6d01ca10e5d62daf7d9e8a --- /dev/null +++ b/webui2/src/routes/auth/select-identity.tsx @@ -0,0 +1,7 @@ +import { createFileRoute } from "@tanstack/react-router"; + +import { IdentitySelectPage } from "@/pages/IdentitySelectPage"; + +export const Route = createFileRoute("/auth/select-identity")({ + component: IdentitySelectPage, +}); diff --git a/webui2/src/routes/index.tsx b/webui2/src/routes/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..5f41f721e06c2e6a2660c73ce52f3dd6df65e31b --- /dev/null +++ b/webui2/src/routes/index.tsx @@ -0,0 +1,7 @@ +import { createFileRoute } from "@tanstack/react-router"; + +import { RepoPickerPage } from "@/pages/RepoPickerPage"; + +export const Route = createFileRoute("/")({ + component: RepoPickerPage, +}); diff --git a/webui2/vite.config.ts b/webui2/vite.config.ts index 77adbaa278aace569fc9cc5e57f3e895964103ba..392c9917a48dfdf7c7d7a1a37a3cab0126d2de41 100644 --- a/webui2/vite.config.ts +++ b/webui2/vite.config.ts @@ -1,6 +1,7 @@ import path from "path"; import tailwindcss from "@tailwindcss/vite"; +import { tanstackRouter } from "@tanstack/router-plugin/vite"; import react from "@vitejs/plugin-react"; import { defineConfig } from "vite"; @@ -8,7 +9,7 @@ import { defineConfig } from "vite"; const API_URL = process.env.VITE_API_URL || "http://localhost:3000"; export default defineConfig({ - plugins: [tailwindcss(), react()], + plugins: [tanstackRouter({ target: "react", autoCodeSplitting: true }), tailwindcss(), react()], resolve: { alias: { "@": path.resolve(__dirname, "./src"),