From 8836fa5333db26a31b567edb11ac7159dd127b8a Mon Sep 17 00:00:00 2001 From: Danijel Martinek Date: Mon, 6 Apr 2026 14:50:16 +0200 Subject: [PATCH] feat(web-tanstack): add TanStack Start app shell with tRPC client --- apps/web-tanstack/package.json | 13 ++- apps/web-tanstack/src/routes/__root.tsx | 10 +++ apps/web-tanstack/src/routes/index.tsx | 14 +++ pnpm-lock.yaml | 109 ++++++++++++++++++++++++ 4 files changed, 143 insertions(+), 3 deletions(-) create mode 100644 apps/web-tanstack/src/routes/__root.tsx create mode 100644 apps/web-tanstack/src/routes/index.tsx diff --git a/apps/web-tanstack/package.json b/apps/web-tanstack/package.json index e82f651..b3abd43 100644 --- a/apps/web-tanstack/package.json +++ b/apps/web-tanstack/package.json @@ -4,17 +4,24 @@ "version": "0.0.0", "type": "module", "scripts": { - "build": "echo 'placeholder'", + "build": "echo 'placeholder — TanStack Start build configured in later plan'", "dev": "echo 'placeholder'", "lint": "eslint .", "typecheck": "tsc --noEmit" }, "dependencies": { + "@repo/api": "workspace:*", "@repo/api-client": "workspace:*", - "@repo/ui": "workspace:*" + "@repo/ui": "workspace:*", + "@tanstack/react-router": "^1.120.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" }, "devDependencies": { "@repo/eslint-config": "workspace:*", - "@repo/typescript-config": "workspace:*" + "@repo/typescript-config": "workspace:*", + "@types/node": "^22.0.0", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0" } } diff --git a/apps/web-tanstack/src/routes/__root.tsx b/apps/web-tanstack/src/routes/__root.tsx new file mode 100644 index 0000000..dee54ac --- /dev/null +++ b/apps/web-tanstack/src/routes/__root.tsx @@ -0,0 +1,10 @@ +import { Outlet, createRootRoute } from "@tanstack/react-router"; +import { ApiProvider } from "@repo/api-client"; + +export const Route = createRootRoute({ + component: () => ( + + + + ), +}); diff --git a/apps/web-tanstack/src/routes/index.tsx b/apps/web-tanstack/src/routes/index.tsx new file mode 100644 index 0000000..2a07297 --- /dev/null +++ b/apps/web-tanstack/src/routes/index.tsx @@ -0,0 +1,14 @@ +import { createFileRoute } from "@tanstack/react-router"; + +export const Route = createFileRoute("/")({ + component: Home, +}); + +function Home() { + return ( +
+

Template — TanStack Start

+

Clean Architecture Monorepo Template

+
+ ); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 283bd7f..11cde20 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -113,12 +113,24 @@ importers: apps/web-tanstack: dependencies: + '@repo/api': + specifier: workspace:* + version: link:../../packages/api '@repo/api-client': specifier: workspace:* version: link:../../packages/api-client '@repo/ui': specifier: workspace:* version: link:../../packages/ui + '@tanstack/react-router': + specifier: ^1.120.0 + version: 1.168.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: + specifier: ^19.0.0 + version: 19.2.4 + react-dom: + specifier: ^19.0.0 + version: 19.2.4(react@19.2.4) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -126,6 +138,15 @@ importers: '@repo/typescript-config': specifier: workspace:* version: link:../../packages/typescript-config + '@types/node': + specifier: ^22.0.0 + version: 22.19.17 + '@types/react': + specifier: ^19.0.0 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.0.0 + version: 19.2.3(@types/react@19.2.14) packages/api: dependencies: @@ -1592,6 +1613,10 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@tanstack/history@1.161.6': + resolution: {integrity: sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg==} + engines: {node: '>=20.19'} + '@tanstack/query-core@5.96.2': resolution: {integrity: sha512-hzI6cTVh4KNRk8UtoIBS7Lv9g6BnJPXvBKsvYH1aGWvv0347jT3BnSvztOE+kD76XGvZnRC/t6qdW1CaIfwCeA==} @@ -1600,6 +1625,27 @@ packages: peerDependencies: react: ^18 || ^19 + '@tanstack/react-router@1.168.10': + resolution: {integrity: sha512-/RmDlOwDkCug609KdPB3U+U1zmrtadJpvsmRg2zEn8TRCKRNri7dYZIjQZbNg8PgUiRL4T6njrZBV1ChzblNaA==} + engines: {node: '>=20.19'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-store@0.9.3': + resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/router-core@1.168.9': + resolution: {integrity: sha512-18oeEwEDyXOIuO1VBP9ACaK7tYHZUjynGDCoUh/5c/BNhia9vCJCp9O0LfhZXOorDc/PmLSgvmweFhVmIxF10g==} + engines: {node: '>=20.19'} + hasBin: true + + '@tanstack/store@0.9.3': + resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} + '@tokenizer/inflate@0.4.1': resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} engines: {node: '>=18'} @@ -1991,6 +2037,9 @@ packages: convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + cookie-es@2.0.1: + resolution: {integrity: sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA==} + cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} @@ -2478,6 +2527,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + isbot@5.1.37: + resolution: {integrity: sha512-5bcicX81xf6NlTEV8rWdg7Pk01LFizDetuYGHx6d/f6y3lR2/oo8IfxjzJqn1UdDEyCcwT9e7NRloj8DwCYujQ==} + engines: {node: '>=18'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -3073,6 +3126,16 @@ packages: engines: {node: '>=10'} hasBin: true + seroval-plugins@1.5.2: + resolution: {integrity: sha512-qpY0Cl+fKYFn4GOf3cMiq6l72CpuVaawb6ILjubOQ+diJ54LfOWaSSPsaswN8DRPIPW4Yq+tE1k5aKd7ILyaFg==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.5.2: + resolution: {integrity: sha512-xcRN39BdsnO9Tf+VzsE7b3JyTJASItIV1FVFewJKCFcW4s4haIKS3e6vj8PGB9qBwC7tnuOywQMdv5N4qkzi7Q==} + engines: {node: '>=10'} + sharp@0.33.5: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3321,6 +3384,11 @@ packages: '@types/react': optional: true + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + utf8-byte-length@1.0.5: resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} @@ -4757,6 +4825,8 @@ snapshots: dependencies: tslib: 2.8.1 + '@tanstack/history@1.161.6': {} + '@tanstack/query-core@5.96.2': {} '@tanstack/react-query@5.96.2(react@19.2.4)': @@ -4764,6 +4834,31 @@ snapshots: '@tanstack/query-core': 5.96.2 react: 19.2.4 + '@tanstack/react-router@1.168.10(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@tanstack/history': 1.161.6 + '@tanstack/react-store': 0.9.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tanstack/router-core': 1.168.9 + isbot: 5.1.37 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@tanstack/react-store@0.9.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@tanstack/store': 0.9.3 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + use-sync-external-store: 1.6.0(react@19.2.4) + + '@tanstack/router-core@1.168.9': + dependencies: + '@tanstack/history': 1.161.6 + cookie-es: 2.0.1 + seroval: 1.5.2 + seroval-plugins: 1.5.2(seroval@1.5.2) + + '@tanstack/store@0.9.3': {} + '@tokenizer/inflate@0.4.1': dependencies: debug: 4.4.3 @@ -5174,6 +5269,8 @@ snapshots: convert-source-map@1.9.0: {} + cookie-es@2.0.1: {} + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 @@ -5623,6 +5720,8 @@ snapshots: is-number@7.0.0: {} + isbot@5.1.37: {} + isexe@2.0.0: {} isomorphic.js@0.2.5: {} @@ -6398,6 +6497,12 @@ snapshots: semver@7.7.4: {} + seroval-plugins@1.5.2(seroval@1.5.2): + dependencies: + seroval: 1.5.2 + + seroval@1.5.2: {} + sharp@0.33.5: dependencies: color: 4.2.3 @@ -6666,6 +6771,10 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + use-sync-external-store@1.6.0(react@19.2.4): + dependencies: + react: 19.2.4 + utf8-byte-length@1.0.5: {} uuid@10.0.0: {}