@tanstack/cta-framework-react-cra 0.10.0-alpha.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/ADD-ON-AUTHORING.md +169 -0
  2. package/LICENSE +21 -0
  3. package/add-ons/clerk/README.md +3 -0
  4. package/add-ons/clerk/assets/_dot_env.local.append +2 -0
  5. package/add-ons/clerk/assets/src/integrations/clerk/header-user.tsx +19 -0
  6. package/add-ons/clerk/assets/src/integrations/clerk/provider.tsx +18 -0
  7. package/add-ons/clerk/assets/src/routes/demo.clerk.tsx +20 -0
  8. package/add-ons/clerk/info.json +28 -0
  9. package/add-ons/clerk/logo.svg +6 -0
  10. package/add-ons/clerk/package.json +5 -0
  11. package/add-ons/clerk/small-logo.svg +5 -0
  12. package/add-ons/convex/README.md +4 -0
  13. package/add-ons/convex/assets/_dot_cursorrules.append +93 -0
  14. package/add-ons/convex/assets/_dot_env.local.append +3 -0
  15. package/add-ons/convex/assets/convex/products.ts +8 -0
  16. package/add-ons/convex/assets/convex/schema.ts +10 -0
  17. package/add-ons/convex/assets/src/integrations/convex/provider.tsx +20 -0
  18. package/add-ons/convex/assets/src/routes/demo.convex.tsx +33 -0
  19. package/add-ons/convex/info.json +23 -0
  20. package/add-ons/convex/package.json +6 -0
  21. package/add-ons/convex/small-logo.svg +5 -0
  22. package/add-ons/form/assets/src/components/demo.FormComponents.tsx.ejs +300 -0
  23. package/add-ons/form/assets/src/hooks/demo.form-context.ts +4 -0
  24. package/add-ons/form/assets/src/hooks/demo.form.ts +22 -0
  25. package/add-ons/form/assets/src/routes/demo.form.address.tsx.ejs +213 -0
  26. package/add-ons/form/assets/src/routes/demo.form.simple.tsx.ejs +77 -0
  27. package/add-ons/form/info.json +31 -0
  28. package/add-ons/form/package.json +6 -0
  29. package/add-ons/form/small-logo.svg +1 -0
  30. package/add-ons/module-federation/assets/module-federation.config.js.ejs +31 -0
  31. package/add-ons/module-federation/assets/src/demo-mf-component.tsx +3 -0
  32. package/add-ons/module-federation/assets/src/demo-mf-self-contained.tsx +11 -0
  33. package/add-ons/module-federation/info.json +8 -0
  34. package/add-ons/module-federation/package.json +5 -0
  35. package/add-ons/netlify/README.md +11 -0
  36. package/add-ons/netlify/info.json +8 -0
  37. package/add-ons/netlify/small-logo.svg +1 -0
  38. package/add-ons/sentry/assets/_dot_cursorrules.append +22 -0
  39. package/add-ons/sentry/assets/_dot_env.local.append +11 -0
  40. package/add-ons/sentry/assets/src/app/global-middleware.ts +11 -0
  41. package/add-ons/sentry/assets/src/routes/demo.sentry.testing.tsx +489 -0
  42. package/add-ons/sentry/info.json +17 -0
  43. package/add-ons/sentry/package.json +5 -0
  44. package/add-ons/sentry/small-logo.svg +1 -0
  45. package/add-ons/shadcn/README.md +7 -0
  46. package/add-ons/shadcn/assets/_dot_cursorrules.append +7 -0
  47. package/add-ons/shadcn/assets/components.json +21 -0
  48. package/add-ons/shadcn/assets/src/lib/utils.ts +6 -0
  49. package/add-ons/shadcn/assets/src/styles.css +138 -0
  50. package/add-ons/shadcn/info.json +8 -0
  51. package/add-ons/shadcn/package.json +9 -0
  52. package/add-ons/shadcn/small-logo.svg +1 -0
  53. package/add-ons/start/assets/_dot_gitignore.append +2 -0
  54. package/add-ons/start/assets/app.config.ts.ejs +32 -0
  55. package/add-ons/start/assets/src/api.ts +6 -0
  56. package/add-ons/start/assets/src/client.tsx.ejs +33 -0
  57. package/add-ons/start/assets/src/router.tsx.ejs +48 -0
  58. package/add-ons/start/assets/src/routes/api.demo-names.ts +11 -0
  59. package/add-ons/start/assets/src/routes/demo.start.api-request.tsx.ejs +33 -0
  60. package/add-ons/start/assets/src/routes/demo.start.server-funcs.tsx +50 -0
  61. package/add-ons/start/assets/src/ssr.tsx.ejs +30 -0
  62. package/add-ons/start/info.json +31 -0
  63. package/add-ons/start/package.json +13 -0
  64. package/add-ons/start/small-logo.svg +1 -0
  65. package/add-ons/store/assets/src/lib/demo-store.ts +13 -0
  66. package/add-ons/store/assets/src/routes/demo.store.tsx.ejs +75 -0
  67. package/add-ons/store/info.json +16 -0
  68. package/add-ons/store/package.json +6 -0
  69. package/add-ons/store/small-logo.svg +1 -0
  70. package/add-ons/t3env/README.md +16 -0
  71. package/add-ons/t3env/assets/src/env.ts +39 -0
  72. package/add-ons/t3env/info.json +8 -0
  73. package/add-ons/t3env/package.json +6 -0
  74. package/add-ons/t3env/small-logo.svg +6 -0
  75. package/add-ons/tRPC/assets/src/integrations/trpc/init.ts +9 -0
  76. package/add-ons/tRPC/assets/src/integrations/trpc/react.ts +4 -0
  77. package/add-ons/tRPC/assets/src/integrations/trpc/router.ts +21 -0
  78. package/add-ons/tRPC/assets/src/routes/api.trpc.$.tsx +16 -0
  79. package/add-ons/tRPC/info.json +9 -0
  80. package/add-ons/tRPC/package.json +9 -0
  81. package/add-ons/tRPC/small-logo.svg +1 -0
  82. package/add-ons/table/assets/src/data/demo-table-data.ts +50 -0
  83. package/add-ons/table/assets/src/routes/demo.table.tsx.ejs +373 -0
  84. package/add-ons/table/info.json +16 -0
  85. package/add-ons/table/package.json +7 -0
  86. package/add-ons/table/small-logo.svg +1 -0
  87. package/add-ons/tanstack-query/assets/src/integrations/tanstack-query/layout.tsx +5 -0
  88. package/add-ons/tanstack-query/assets/src/integrations/tanstack-query/root-provider.tsx.ejs +70 -0
  89. package/add-ons/tanstack-query/assets/src/routes/demo.tanstack-query.tsx.ejs +53 -0
  90. package/add-ons/tanstack-query/info.json +28 -0
  91. package/add-ons/tanstack-query/package.json +6 -0
  92. package/add-ons/tanstack-query/small-logo.svg +1 -0
  93. package/dist/index.js +18 -0
  94. package/dist/types/index.d.ts +1 -0
  95. package/examples/tanchat/README.md +37 -0
  96. package/examples/tanchat/assets/_dot_env.local.append +2 -0
  97. package/examples/tanchat/assets/public/example-guitar-flowers.jpg +0 -0
  98. package/examples/tanchat/assets/public/example-guitar-motherboard.jpg +0 -0
  99. package/examples/tanchat/assets/public/example-guitar-racing.jpg +0 -0
  100. package/examples/tanchat/assets/public/example-guitar-steamer-trunk.jpg +0 -0
  101. package/examples/tanchat/assets/public/example-guitar-superhero.jpg +0 -0
  102. package/examples/tanchat/assets/public/example-guitar-traveling.jpg +0 -0
  103. package/examples/tanchat/assets/public/example-guitar-video-games.jpg +0 -0
  104. package/examples/tanchat/assets/src/components/example-AIAssistant.tsx +173 -0
  105. package/examples/tanchat/assets/src/components/example-GuitarRecommendation.tsx +47 -0
  106. package/examples/tanchat/assets/src/data/example-guitars.ts +83 -0
  107. package/examples/tanchat/assets/src/demo.index.css +220 -0
  108. package/examples/tanchat/assets/src/integrations/tanchat/header-user.tsx +5 -0
  109. package/examples/tanchat/assets/src/routes/api.messages.ts +24 -0
  110. package/examples/tanchat/assets/src/routes/api.sse.ts +23 -0
  111. package/examples/tanchat/assets/src/routes/example.chat.tsx +159 -0
  112. package/examples/tanchat/assets/src/routes/example.guitars/$guitarId.tsx +50 -0
  113. package/examples/tanchat/assets/src/routes/example.guitars/index.tsx +54 -0
  114. package/examples/tanchat/assets/src/store/example-assistant.ts +3 -0
  115. package/examples/tanchat/assets/src/utils/demo.ai.ts +62 -0
  116. package/examples/tanchat/assets/src/utils/demo.sse.ts +31 -0
  117. package/examples/tanchat/assets/src/utils/demo.tools.ts +47 -0
  118. package/examples/tanchat/info.json +35 -0
  119. package/examples/tanchat/package.json +16 -0
  120. package/examples/tanchat/small-logo.svg +1 -0
  121. package/package.json +34 -0
  122. package/project/base/README.md.ejs +558 -0
  123. package/project/base/_dot_gitignore +5 -0
  124. package/project/base/_dot_vscode/settings.json.ejs +35 -0
  125. package/project/base/index.html.ejs +20 -0
  126. package/project/base/package.json +30 -0
  127. package/project/base/public/favicon.ico +0 -0
  128. package/project/base/public/logo192.png +0 -0
  129. package/project/base/public/logo512.png +0 -0
  130. package/project/base/public/manifest.json +25 -0
  131. package/project/base/public/robots.txt +3 -0
  132. package/project/base/src/App.css.ejs +38 -0
  133. package/project/base/src/App.test.tsx.ejs +10 -0
  134. package/project/base/src/App.tsx.ejs +63 -0
  135. package/project/base/src/components/Header.tsx.ejs +27 -0
  136. package/project/base/src/logo.svg +44 -0
  137. package/project/base/src/main.tsx.ejs +155 -0
  138. package/project/base/src/reportWebVitals.ts.ejs +28 -0
  139. package/project/base/src/routes/__root.tsx.ejs +82 -0
  140. package/project/base/src/routes/index.tsx.ejs +67 -0
  141. package/project/base/src/styles.css.ejs +15 -0
  142. package/project/base/tsconfig.json.ejs +29 -0
  143. package/project/base/vite.config.js.ejs +23 -0
  144. package/project/packages.json +20 -0
  145. package/src/index.ts +26 -0
  146. package/tests/react-cra.test.ts +150 -0
  147. package/tests/snapshots/react-cra/cr-js-form-npm.json +29 -0
  148. package/tests/snapshots/react-cra/cr-js-npm.json +23 -0
  149. package/tests/snapshots/react-cra/cr-ts-npm.json +24 -0
  150. package/tests/snapshots/react-cra/cr-ts-start-npm.json +28 -0
  151. package/tests/snapshots/react-cra/cr-ts-start-tanstack-query-npm.json +31 -0
  152. package/tests/snapshots/react-cra/fr-ts-biome-npm.json +26 -0
  153. package/tests/snapshots/react-cra/fr-ts-npm.json +24 -0
  154. package/tests/snapshots/react-cra/fr-ts-tw-npm.json +23 -0
  155. package/tests/test-utilities.ts +44 -0
  156. package/toolchains/biome/assets/biome.json +31 -0
  157. package/toolchains/biome/info.json +8 -0
  158. package/toolchains/biome/package.json +10 -0
  159. package/toolchains/biome/small-logo.svg +5 -0
  160. package/toolchains/eslint/assets/_dot_prettierignore +3 -0
  161. package/toolchains/eslint/assets/eslint.config.js +5 -0
  162. package/toolchains/eslint/assets/prettier.config.js +10 -0
  163. package/toolchains/eslint/info.json +8 -0
  164. package/toolchains/eslint/package.json +11 -0
  165. package/toolchains/eslint/small-logo.svg +7 -0
  166. package/tsconfig.json +17 -0
@@ -0,0 +1,7 @@
1
+ ## Shadcn
2
+
3
+ Add components using the latest version of [Shadcn](https://ui.shadcn.com/).
4
+
5
+ ```bash
6
+ pnpx shadcn@latest add button
7
+ ```
@@ -0,0 +1,7 @@
1
+ # shadcn instructions
2
+
3
+ Use the latest version of Shadcn to install new components, like this command to add a button component:
4
+
5
+ ```bash
6
+ pnpx shadcn@latest add button
7
+ ```
@@ -0,0 +1,21 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema.json",
3
+ "style": "new-york",
4
+ "rsc": false,
5
+ "tsx": true,
6
+ "tailwind": {
7
+ "config": "",
8
+ "css": "src/styles.css",
9
+ "baseColor": "zinc",
10
+ "cssVariables": true,
11
+ "prefix": ""
12
+ },
13
+ "aliases": {
14
+ "components": "@/components",
15
+ "utils": "@/lib/utils",
16
+ "ui": "@/components/ui",
17
+ "lib": "@/lib",
18
+ "hooks": "@/hooks"
19
+ },
20
+ "iconLibrary": "lucide"
21
+ }
@@ -0,0 +1,6 @@
1
+ import { clsx, type ClassValue } from "clsx"
2
+ import { twMerge } from "tailwind-merge"
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs))
6
+ }
@@ -0,0 +1,138 @@
1
+ @import 'tailwindcss';
2
+
3
+ @plugin "tailwindcss-animate";
4
+
5
+ @custom-variant dark (&:is(.dark *));
6
+
7
+ body {
8
+ @apply m-0;
9
+ font-family:
10
+ -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',
11
+ 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
12
+ -webkit-font-smoothing: antialiased;
13
+ -moz-osx-font-smoothing: grayscale;
14
+ }
15
+
16
+ code {
17
+ font-family:
18
+ source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;
19
+ }
20
+
21
+ :root {
22
+ --background: oklch(1 0 0);
23
+ --foreground: oklch(0.141 0.005 285.823);
24
+ --card: oklch(1 0 0);
25
+ --card-foreground: oklch(0.141 0.005 285.823);
26
+ --popover: oklch(1 0 0);
27
+ --popover-foreground: oklch(0.141 0.005 285.823);
28
+ --primary: oklch(0.21 0.006 285.885);
29
+ --primary-foreground: oklch(0.985 0 0);
30
+ --secondary: oklch(0.967 0.001 286.375);
31
+ --secondary-foreground: oklch(0.21 0.006 285.885);
32
+ --muted: oklch(0.967 0.001 286.375);
33
+ --muted-foreground: oklch(0.552 0.016 285.938);
34
+ --accent: oklch(0.967 0.001 286.375);
35
+ --accent-foreground: oklch(0.21 0.006 285.885);
36
+ --destructive: oklch(0.577 0.245 27.325);
37
+ --destructive-foreground: oklch(0.577 0.245 27.325);
38
+ --border: oklch(0.92 0.004 286.32);
39
+ --input: oklch(0.92 0.004 286.32);
40
+ --ring: oklch(0.871 0.006 286.286);
41
+ --chart-1: oklch(0.646 0.222 41.116);
42
+ --chart-2: oklch(0.6 0.118 184.704);
43
+ --chart-3: oklch(0.398 0.07 227.392);
44
+ --chart-4: oklch(0.828 0.189 84.429);
45
+ --chart-5: oklch(0.769 0.188 70.08);
46
+ --radius: 0.625rem;
47
+ --sidebar: oklch(0.985 0 0);
48
+ --sidebar-foreground: oklch(0.141 0.005 285.823);
49
+ --sidebar-primary: oklch(0.21 0.006 285.885);
50
+ --sidebar-primary-foreground: oklch(0.985 0 0);
51
+ --sidebar-accent: oklch(0.967 0.001 286.375);
52
+ --sidebar-accent-foreground: oklch(0.21 0.006 285.885);
53
+ --sidebar-border: oklch(0.92 0.004 286.32);
54
+ --sidebar-ring: oklch(0.871 0.006 286.286);
55
+ }
56
+
57
+ .dark {
58
+ --background: oklch(0.141 0.005 285.823);
59
+ --foreground: oklch(0.985 0 0);
60
+ --card: oklch(0.141 0.005 285.823);
61
+ --card-foreground: oklch(0.985 0 0);
62
+ --popover: oklch(0.141 0.005 285.823);
63
+ --popover-foreground: oklch(0.985 0 0);
64
+ --primary: oklch(0.985 0 0);
65
+ --primary-foreground: oklch(0.21 0.006 285.885);
66
+ --secondary: oklch(0.274 0.006 286.033);
67
+ --secondary-foreground: oklch(0.985 0 0);
68
+ --muted: oklch(0.274 0.006 286.033);
69
+ --muted-foreground: oklch(0.705 0.015 286.067);
70
+ --accent: oklch(0.274 0.006 286.033);
71
+ --accent-foreground: oklch(0.985 0 0);
72
+ --destructive: oklch(0.396 0.141 25.723);
73
+ --destructive-foreground: oklch(0.637 0.237 25.331);
74
+ --border: oklch(0.274 0.006 286.033);
75
+ --input: oklch(0.274 0.006 286.033);
76
+ --ring: oklch(0.442 0.017 285.786);
77
+ --chart-1: oklch(0.488 0.243 264.376);
78
+ --chart-2: oklch(0.696 0.17 162.48);
79
+ --chart-3: oklch(0.769 0.188 70.08);
80
+ --chart-4: oklch(0.627 0.265 303.9);
81
+ --chart-5: oklch(0.645 0.246 16.439);
82
+ --sidebar: oklch(0.21 0.006 285.885);
83
+ --sidebar-foreground: oklch(0.985 0 0);
84
+ --sidebar-primary: oklch(0.488 0.243 264.376);
85
+ --sidebar-primary-foreground: oklch(0.985 0 0);
86
+ --sidebar-accent: oklch(0.274 0.006 286.033);
87
+ --sidebar-accent-foreground: oklch(0.985 0 0);
88
+ --sidebar-border: oklch(0.274 0.006 286.033);
89
+ --sidebar-ring: oklch(0.442 0.017 285.786);
90
+ }
91
+
92
+ @theme inline {
93
+ --color-background: var(--background);
94
+ --color-foreground: var(--foreground);
95
+ --color-card: var(--card);
96
+ --color-card-foreground: var(--card-foreground);
97
+ --color-popover: var(--popover);
98
+ --color-popover-foreground: var(--popover-foreground);
99
+ --color-primary: var(--primary);
100
+ --color-primary-foreground: var(--primary-foreground);
101
+ --color-secondary: var(--secondary);
102
+ --color-secondary-foreground: var(--secondary-foreground);
103
+ --color-muted: var(--muted);
104
+ --color-muted-foreground: var(--muted-foreground);
105
+ --color-accent: var(--accent);
106
+ --color-accent-foreground: var(--accent-foreground);
107
+ --color-destructive: var(--destructive);
108
+ --color-destructive-foreground: var(--destructive-foreground);
109
+ --color-border: var(--border);
110
+ --color-input: var(--input);
111
+ --color-ring: var(--ring);
112
+ --color-chart-1: var(--chart-1);
113
+ --color-chart-2: var(--chart-2);
114
+ --color-chart-3: var(--chart-3);
115
+ --color-chart-4: var(--chart-4);
116
+ --color-chart-5: var(--chart-5);
117
+ --radius-sm: calc(var(--radius) - 4px);
118
+ --radius-md: calc(var(--radius) - 2px);
119
+ --radius-lg: var(--radius);
120
+ --radius-xl: calc(var(--radius) + 4px);
121
+ --color-sidebar: var(--sidebar);
122
+ --color-sidebar-foreground: var(--sidebar-foreground);
123
+ --color-sidebar-primary: var(--sidebar-primary);
124
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
125
+ --color-sidebar-accent: var(--sidebar-accent);
126
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
127
+ --color-sidebar-border: var(--sidebar-border);
128
+ --color-sidebar-ring: var(--sidebar-ring);
129
+ }
130
+
131
+ @layer base {
132
+ * {
133
+ @apply border-border outline-ring/50;
134
+ }
135
+ body {
136
+ @apply bg-background text-foreground;
137
+ }
138
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "Shadcn",
3
+ "description": "Add Shadcn UI to your application.",
4
+ "phase": "add-on",
5
+ "modes": ["file-router", "code-router"],
6
+ "link": "https://ui.shadcn.com/",
7
+ "type": "add-on"
8
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "dependencies": {
3
+ "class-variance-authority": "^0.7.1",
4
+ "clsx": "^2.1.1",
5
+ "lucide-react": "^0.476.0",
6
+ "tailwind-merge": "^3.0.2",
7
+ "tailwindcss-animate": "^1.0.7"
8
+ }
9
+ }
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path fill="none" d="M0 0h256v256H0z"/><path fill="none" stroke="#fff" stroke-width="25" stroke-linecap="round" d="M208 128l-80 80M192 40L40 192"/></svg>
@@ -0,0 +1,2 @@
1
+ .output
2
+ .vinxi
@@ -0,0 +1,32 @@
1
+ import { defineConfig } from '@tanstack/react-start/config'
2
+ import viteTsConfigPaths from 'vite-tsconfig-paths'<% if (tailwind) { %>
3
+ import tailwindcss from "@tailwindcss/vite"
4
+ <% } %><% if (addOnEnabled.sentry) { %>
5
+ import { wrapVinxiConfigWithSentry } from "@sentry/tanstackstart-react";
6
+ <% } %>
7
+ const config = defineConfig({
8
+ tsr: {
9
+ appDirectory: 'src',
10
+ },
11
+ vite: {
12
+ plugins: [
13
+ // this is the plugin that enables path aliases
14
+ viteTsConfigPaths({
15
+ projects: ['./tsconfig.json'],
16
+ }),
17
+ <% if (tailwind) { %>tailwindcss(),<% } %>
18
+ ],
19
+ },
20
+ })
21
+
22
+ <% if (addOnEnabled.sentry) { %>
23
+ export default wrapVinxiConfigWithSentry(config, {
24
+ org: process.env.VITE_SENTRY_ORG,
25
+ project: process.env.VITE_SENTRY_PROJECT,
26
+ authToken: process.env.SENTRY_AUTH_TOKEN,
27
+ // Only print logs for uploading source maps in CI
28
+ // Set to `true` to suppress logs
29
+ silent: !process.env.CI,
30
+ });<% } else { %>
31
+ export default config
32
+ <% } %>
@@ -0,0 +1,6 @@
1
+ import {
2
+ createStartAPIHandler,
3
+ defaultAPIFileRouteHandler,
4
+ } from '@tanstack/react-start/api'
5
+
6
+ export default createStartAPIHandler(defaultAPIFileRouteHandler)
@@ -0,0 +1,33 @@
1
+ import { hydrateRoot } from 'react-dom/client'
2
+ import { StartClient } from '@tanstack/react-start'
3
+ <% if (addOnEnabled.sentry) { %>
4
+ import * as Sentry from "@sentry/tanstackstart-react";
5
+ <% } %>
6
+ import { createRouter } from './router'
7
+
8
+ const router = createRouter()
9
+
10
+ <% if (addOnEnabled.sentry) { %>
11
+ Sentry.init({
12
+ dsn: import.meta.env.VITE_SENTRY_DSN,
13
+ integrations: [
14
+ Sentry.tanstackRouterBrowserTracingIntegration(router),
15
+ Sentry.replayIntegration({
16
+ maskAllText: false,
17
+ blockAllMedia: false,
18
+ }),
19
+ ],
20
+ // Set tracesSampleRate to 1.0 to capture 100%
21
+ // of transactions for tracing.
22
+ // We recommend adjusting this value in production.
23
+ // Learn more at https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate
24
+ tracesSampleRate: 1.0,
25
+ // Capture Replay for 10% of all sessions,
26
+ // plus for 100% of sessions with an error.
27
+ // Learn more at https://docs.sentry.io/platforms/javascript/session-replay/configuration/#general-integration-configuration
28
+ replaysSessionSampleRate: 0.1,
29
+ replaysOnErrorSampleRate: 1.0,
30
+ });
31
+ <% } %>
32
+
33
+ hydrateRoot(document, <StartClient router={router} />)
@@ -0,0 +1,48 @@
1
+ import { createRouter as createTanstackRouter } from '@tanstack/react-router'<% if (addOnEnabled['tanstack-query']) { %>
2
+ import { routerWithQueryClient } from '@tanstack/react-router-with-query'
3
+ import * as TanstackQuery from './integrations/tanstack-query/root-provider'
4
+ <% } %>
5
+
6
+ // Import the generated route tree
7
+ import { routeTree } from './routeTree.gen'
8
+
9
+ import './styles.css'
10
+
11
+ // Create a new router instance
12
+ export const createRouter = () => {
13
+ <% if (addOnEnabled['tanstack-query']) { %>
14
+ const router = routerWithQueryClient(createTanstackRouter({
15
+ routeTree,
16
+ context: {
17
+ <% if (addOnEnabled['tanstack-query']) { %>
18
+ ...TanstackQuery.getContext(),
19
+ <% } %>
20
+ },
21
+ scrollRestoration: true,
22
+ defaultPreloadStaleTime: 0,
23
+ <% if (addOnEnabled.tRPC) { %>
24
+ Wrap: (props: { children: React.ReactNode }) => {
25
+ return (
26
+ <TanstackQuery.Provider>
27
+ {props.children}
28
+ </TanstackQuery.Provider>
29
+ );
30
+ },
31
+ <% } %>
32
+ }), TanstackQuery.getContext().queryClient)
33
+ <% } else { %>
34
+ const router = createTanstackRouter({
35
+ routeTree,
36
+ scrollRestoration: true,
37
+ defaultPreloadStaleTime: 0,
38
+ })
39
+ <% } %>
40
+ return router
41
+ }
42
+
43
+ // Register the router instance for type safety
44
+ declare module '@tanstack/react-router' {
45
+ interface Register {
46
+ router: ReturnType<typeof createRouter>
47
+ }
48
+ }
@@ -0,0 +1,11 @@
1
+ import { createAPIFileRoute } from '@tanstack/react-start/api'
2
+
3
+ export const APIRoute = createAPIFileRoute('/demo/start/api/names')({
4
+ GET: async ({ request }) => {
5
+ return new Response(JSON.stringify(['Alice', 'Bob', 'Charlie']), {
6
+ headers: {
7
+ 'Content-Type': 'application/json',
8
+ },
9
+ })
10
+ },
11
+ })
@@ -0,0 +1,33 @@
1
+ <% if (addOnEnabled['react-query']) { %>
2
+ import { useQuery } from '@tanstack/react-query'
3
+ <% } else { %>
4
+ import { useEffect, useState } from 'react'
5
+ <% } %>
6
+ import { createFileRoute } from '@tanstack/react-router'
7
+
8
+ function getNames() {
9
+ return fetch('/api/demo-names').then((res) => res.json())
10
+ }
11
+
12
+ export const Route = createFileRoute('/demo/start/api-request')({
13
+ component: Home,
14
+ })
15
+
16
+ function Home() {
17
+ <% if (addOnEnabled['react-query']) { %>
18
+ const { data: names = [] } = useQuery({
19
+ queryKey: ['names'],
20
+ queryFn: getNames,
21
+ })
22
+ <% } else { %>
23
+ const [names, setNames] = useState<Array<string>>([])
24
+ useEffect(() => {
25
+ getNames().then(setNames)
26
+ }, [])
27
+ <% } %>
28
+ return (
29
+ <div className="p-4">
30
+ <div>{names.join(', ')}</div>
31
+ </div>
32
+ )
33
+ }
@@ -0,0 +1,50 @@
1
+ import * as fs from 'node:fs'
2
+ import { createFileRoute, useRouter } from '@tanstack/react-router'
3
+ import { createServerFn } from '@tanstack/react-start'
4
+
5
+ const filePath = 'count.txt'
6
+
7
+ async function readCount() {
8
+ return parseInt(
9
+ await fs.promises.readFile(filePath, 'utf-8').catch(() => '0'),
10
+ )
11
+ }
12
+
13
+ const getCount = createServerFn({
14
+ method: 'GET',
15
+ }).handler(() => {
16
+ return readCount()
17
+ })
18
+
19
+ const updateCount = createServerFn({ method: 'POST' })
20
+ .validator((d: number) => d)
21
+ .handler(async ({ data }) => {
22
+ const count = await readCount()
23
+ await fs.promises.writeFile(filePath, `${count + data}`)
24
+ })
25
+
26
+ export const Route = createFileRoute('/demo/start/server-funcs')({
27
+ component: Home,
28
+ loader: async () => await getCount(),
29
+ })
30
+
31
+ function Home() {
32
+ const router = useRouter()
33
+ const state = Route.useLoaderData()
34
+
35
+ return (
36
+ <div className="p-4">
37
+ <button
38
+ type="button"
39
+ onClick={() => {
40
+ updateCount({ data: 1 }).then(() => {
41
+ router.invalidate()
42
+ })
43
+ }}
44
+ className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"
45
+ >
46
+ Add 1 to {state}?
47
+ </button>
48
+ </div>
49
+ )
50
+ }
@@ -0,0 +1,30 @@
1
+ import {
2
+ createStartHandler,
3
+ defaultStreamHandler,
4
+ } from '@tanstack/react-start/server'
5
+ import { getRouterManifest } from '@tanstack/react-start/router-manifest'
6
+
7
+ import { createRouter } from './router'
8
+
9
+ <% if (addOnEnabled.sentry) { %>
10
+ import * as Sentry from "@sentry/tanstackstart-react";
11
+ Sentry.init({
12
+ dsn: process.env.VITE_SENTRY_DSN,
13
+ // Set tracesSampleRate to 1.0 to capture 100%
14
+ // of transactions for tracing.
15
+ // We recommend adjusting this value in production
16
+ // Learn more at
17
+ // https://docs.sentry.io/platforms/javascript/configuration/options/#traces-sample-rate
18
+ tracesSampleRate: 1.0,
19
+ });
20
+ <% } %>
21
+
22
+ let streamHandler = defaultStreamHandler
23
+ <% if (addOnEnabled.sentry) { %>
24
+ streamHandler = Sentry.wrapStreamHandlerWithSentry(defaultStreamHandler)
25
+ <% } %>
26
+
27
+ export default createStartHandler({
28
+ createRouter,
29
+ getRouterManifest,
30
+ })(streamHandler)
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "Start",
3
+ "phase": "setup",
4
+ "description": "Add TanStack Start for SSR, API endpoints, and more.",
5
+ "link": "https://tanstack.com/start/latest",
6
+ "modes": ["file-router"],
7
+ "type": "add-on",
8
+ "warning": "TanStack Start is not yet at 1.0 and may change significantly or not be compatible with other add-ons.\nMigrating to Start might require deleting node_modules and re-installing.",
9
+ "routes": [
10
+ {
11
+ "url": "/demo/start/server-funcs",
12
+ "name": "Start - Server Functions",
13
+ "path": "src/routes/demo.start.server-funcs.tsx",
14
+ "jsName": "StartServerFuncsDemo"
15
+ },
16
+ {
17
+ "url": "/demo/start/api-request",
18
+ "name": "Start - API Request",
19
+ "path": "src/routes/demo.start.api-request.tsx",
20
+ "jsName": "StartApiRequestDemo"
21
+ }
22
+ ],
23
+ "deletedFiles": [
24
+ "./vite.config.js",
25
+ "./vite.config.ts",
26
+ "./index.html",
27
+ "./src/main.tsx",
28
+ "./src/App.css"
29
+ ],
30
+ "addOnSpecialSteps": ["rimraf-node-modules"]
31
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "scripts": {
3
+ "dev": "vinxi dev",
4
+ "build": "vinxi build",
5
+ "start": "vinxi start"
6
+ },
7
+ "dependencies": {
8
+ "@tanstack/react-router-with-query": "^1.114.3",
9
+ "@tanstack/react-start": "^1.114.3",
10
+ "vinxi": "^0.5.3",
11
+ "vite-tsconfig-paths": "^5.1.4"
12
+ }
13
+ }
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 633 633"><defs><linearGradient id="b" x1="50%" x2="50%" y1="0%" y2="71.65%"><stop offset="0%" stop-color="#6BDAFF"/><stop offset="31.922%" stop-color="#F9FFB5"/><stop offset="70.627%" stop-color="#FFA770"/><stop offset="100%" stop-color="#FF7373"/></linearGradient><linearGradient id="d" x1="43.996%" x2="53.441%" y1="8.54%" y2="93.872%"><stop offset="0%" stop-color="#673800"/><stop offset="100%" stop-color="#B65E00"/></linearGradient><linearGradient id="e" x1="50%" x2="50%" y1="0%" y2="100%"><stop offset="0%" stop-color="#2F8A00"/><stop offset="100%" stop-color="#90FF57"/></linearGradient><linearGradient id="f" x1="50%" x2="50%" y1="0%" y2="100%"><stop offset="0%" stop-color="#2F8A00"/><stop offset="100%" stop-color="#90FF57"/></linearGradient><linearGradient id="g" x1="50%" x2="50%" y1="0%" y2="100%"><stop offset="0%" stop-color="#2F8A00"/><stop offset="100%" stop-color="#90FF57"/></linearGradient><linearGradient id="h" x1="50%" x2="50%" y1="0%" y2="100%"><stop offset="0%" stop-color="#2F8A00"/><stop offset="100%" stop-color="#90FF57"/></linearGradient><linearGradient id="i" x1="50%" x2="50%" y1="0%" y2="100%"><stop offset="0%" stop-color="#2F8A00"/><stop offset="100%" stop-color="#90FF57"/></linearGradient><linearGradient id="j" x1="50%" x2="50%" y1="0%" y2="100%"><stop offset="0%" stop-color="#2F8A00"/><stop offset="100%" stop-color="#90FF57"/></linearGradient><linearGradient id="k" x1="92.9%" x2="8.641%" y1="45.768%" y2="54.892%"><stop offset="0%" stop-color="#EE2700"/><stop offset="100%" stop-color="#FF008E"/></linearGradient><linearGradient id="l" x1="61.109%" x2="43.717%" y1="3.633%" y2="43.072%"><stop offset="0%" stop-color="#FFF400"/><stop offset="100%" stop-color="#3C8700"/></linearGradient><linearGradient id="m" x1="50%" x2="50%" y1="0%" y2="100%"><stop offset="0%" stop-color="#FFDF00"/><stop offset="100%" stop-color="#FF9D00"/></linearGradient><linearGradient id="n" x1="127.279%" x2="0%" y1="49.778%" y2="50.222%"><stop offset="0%" stop-color="#FFA400"/><stop offset="100%" stop-color="#FF5E00"/></linearGradient><linearGradient id="o" x1="127.279%" x2="0%" y1="47.531%" y2="52.469%"><stop offset="0%" stop-color="#FFA400"/><stop offset="100%" stop-color="#FF5E00"/></linearGradient><linearGradient id="p" x1="127.279%" x2="0%" y1="46.195%" y2="53.805%"><stop offset="0%" stop-color="#FFA400"/><stop offset="100%" stop-color="#FF5E00"/></linearGradient><linearGradient id="q" x1="127.279%" x2="0%" y1="35.33%" y2="64.67%"><stop offset="0%" stop-color="#FFA400"/><stop offset="100%" stop-color="#FF5E00"/></linearGradient><linearGradient id="r" x1="127.279%" x2="0%" y1="4.875%" y2="95.125%"><stop offset="0%" stop-color="#FFA400"/><stop offset="100%" stop-color="#FF5E00"/></linearGradient><linearGradient id="s" x1="78.334%" x2="31.668%" y1="0%" y2="100%"><stop offset="0%" stop-color="#FFA400"/><stop offset="100%" stop-color="#FF5E00"/></linearGradient><linearGradient id="t" x1="57.913%" x2="44.88%" y1="0%" y2="100%"><stop offset="0%" stop-color="#FFA400"/><stop offset="100%" stop-color="#FF5E00"/></linearGradient><linearGradient id="u" x1="50.495%" x2="49.68%" y1="0%" y2="100%"><stop offset="0%" stop-color="#FFA400"/><stop offset="100%" stop-color="#FF5E00"/></linearGradient><circle id="a" cx="308.5" cy="308.5" r="308.5"/><circle id="v" cx="307.5" cy="308.5" r="316.5"/></defs><g fill="none" fill-rule="evenodd" transform="translate(9 8)"><mask id="c" fill="#fff"><use xlink:href="#a"/></mask><use xlink:href="#a" fill="url(#b)"/><ellipse cx="81.5" cy="602.5" fill="#015064" stroke="#00CFE2" stroke-width="25" mask="url(#c)" rx="214.5" ry="185.968"/><ellipse cx="535.5" cy="602.5" fill="#015064" stroke="#00CFE2" stroke-width="25" mask="url(#c)" rx="214.5" ry="185.968"/><ellipse cx="81.5" cy="640.5" fill="#015064" stroke="#00A8B8" stroke-width="25" mask="url(#c)" rx="214.5" ry="185.968"/><ellipse cx="535.5" cy="640.5" fill="#015064" stroke="#00A8B8" stroke-width="25" mask="url(#c)" rx="214.5" ry="185.968"/><ellipse cx="81.5" cy="676.5" fill="#015064" stroke="#007782" stroke-width="25" mask="url(#c)" rx="214.5" ry="185.968"/><ellipse cx="535.5" cy="676.5" fill="#015064" stroke="#007782" stroke-width="25" mask="url(#c)" rx="214.5" ry="185.968"/><g mask="url(#c)"><path fill="url(#d)" stroke="#6E3A00" stroke-width="6.088" d="M98.318 88.007c7.691 37.104 16.643 72.442 26.856 106.013 10.212 33.571 25.57 68.934 46.07 106.088l-51.903 11.67c-10.057-60.01-17.232-99.172-21.525-117.487-4.293-18.315-10.989-51.434-20.089-99.357l20.591-6.927" transform="scale(-1 1) rotate(25 -300.37 -553.013)"/><g stroke="#2F8A00"><path fill="url(#e)" stroke-width="9.343" d="M108.544 66.538s-13.54-21.305-37.417-27.785c-15.917-4.321-33.933.31-54.048 13.892C33.464 65.975 47.24 73.52 58.405 75.28c16.749 2.64 50.14-8.74 50.14-8.74Z" transform="rotate(1 -6061.691 5926.397)"/><path fill="url(#f)" stroke-width="9.343" d="M108.544 67.138s-47.187-5.997-81.077 19.936C4.873 104.362-3.782 137.794 1.502 187.369c28.42-29.22 48.758-50.836 61.016-64.846 18.387-21.016 46.026-55.385 46.026-55.385Z" transform="rotate(1 -6061.691 5926.397)"/><path fill="url(#g)" stroke-width="9.343" d="M108.544 66.538c-1.96-21.705 3.98-38.018 17.82-48.94C140.203 6.674 154.85.808 170.303 0c-4.865 21.527-12.373 36.314-22.524 44.361-10.151 8.048-23.23 15.44-39.236 22.177Z" transform="rotate(1 -6061.691 5926.397)"/><path fill="url(#h)" stroke-width="9.343" d="M108.544 67.138c29.838-31.486 61.061-42.776 93.669-33.869C234.82 42.176 253.749 60.785 259 89.096c-34.898-3.657-59.974-6.343-75.228-8.058-15.254-1.716-40.33-6.349-75.228-13.9Z" transform="rotate(1 -6061.691 5926.397)"/><path fill="url(#i)" stroke-width="9.343" d="M108.544 67.138c34.868-9.381 64.503-3.658 88.905 17.17 24.402 20.829 39.656 46.686 45.762 77.571-39.626-7.574-68.4-20.115-86.322-37.624a395.051 395.051 0 0 1-48.345-57.117Z" transform="rotate(1 -6061.691 5926.397)"/><path fill="url(#j)" stroke-width="9.343" d="M108.544 67.138C76.206 82.6 57.608 105.366 52.75 135.436c-4.858 30.07-.292 62.89 13.698 98.462 24.873-41.418 38.905-71.368 42.096-89.849 3.191-18.48 3.191-44.118 0-76.91Z" transform="rotate(1 -6061.691 5926.397)"/><path stroke-linecap="round" stroke-width="5.91" d="M211.284 173.477c-13.851 21.992-23.291 42.022-28.32 60.093-5.03 18.071-8.175 33.143-9.436 45.216"/><path stroke-linecap="round" stroke-width="5.91" d="M209.814 176.884c-23.982 2.565-42.792 10.469-56.428 23.714-13.639 13.245-23.483 26.136-29.536 38.674M219.045 167.299c29.028-7.723 50.972-10.173 65.831-7.352 14.859 2.822 26.807 7.659 35.842 14.51M211.31 172.618c20.29 9.106 38.353 19.052 54.186 29.837 15.833 10.786 27.714 20.99 35.643 30.617"/></g><path stroke="#830305" stroke-linecap="round" stroke-linejoin="bevel" stroke-width="6.937" d="m409.379 398.157-23.176 18.556M328.04 375.516l-22.313 28.398M312.904 353.698l53.18 59.816"/><path fill="url(#k)" d="M67.585 27.463H5.68C1.893 28.148 0 30.38 0 34.16c0 3.78 1.893 6.211 5.68 7.293h67.17l41.751-30.356c2.488-2.646 2.794-5.315.92-8.006s-4.6-3.626-8.177-2.803l-39.76 27.174Z" transform="scale(-1 1) rotate(-9 2092.128 2856.854)"/><path fill="#D8D8D8" stroke="#FFF" stroke-linecap="round" stroke-linejoin="bevel" stroke-width="4.414" d="m402.861 391.51.471-4.088M382.21 388.752l.472-4.087M361.546 385.404l.485-3.845M337.59 371.883l2.56-2.498M324.276 359.567l2.56-2.497"/></g><ellipse cx="308.5" cy="720.5" fill="url(#l)" mask="url(#c)" rx="266" ry="316.5"/><ellipse cx="308.5" cy="720.5" stroke="#6DA300" stroke-opacity=".502" stroke-width="26" mask="url(#c)" rx="253" ry="303.5"/><g mask="url(#c)"><g transform="translate(389 -32)"><circle cx="168.5" cy="113.5" r="113.5" fill="url(#m)"/><circle cx="168.5" cy="113.5" r="106" stroke="#FFC900" stroke-opacity=".529" stroke-width="15"/><path stroke="url(#n)" stroke-linecap="round" stroke-linejoin="bevel" stroke-width="12" d="M30 113H0"/><path stroke="url(#o)" stroke-linecap="round" stroke-linejoin="bevel" stroke-width="12" d="M33.5 79.5 7 74"/><path stroke="url(#p)" stroke-linecap="round" stroke-linejoin="bevel" stroke-width="12" d="m34 146-29 8"/><path stroke="url(#q)" stroke-linecap="round" stroke-linejoin="bevel" stroke-width="12" d="m45 177-24 13"/><path stroke="url(#r)" stroke-linecap="round" stroke-linejoin="bevel" stroke-width="12" d="m67 204-20 19"/><path stroke="url(#s)" stroke-linecap="round" stroke-linejoin="bevel" stroke-width="12" d="m94.373 227-13.834 22.847"/><path stroke="url(#t)" stroke-linecap="round" stroke-linejoin="bevel" stroke-width="12" d="M127.5 243.5 120 268"/><path stroke="url(#u)" stroke-linecap="round" stroke-linejoin="bevel" stroke-width="12" d="m167.5 252.5.5 24.5"/></g></g><circle cx="307.5" cy="308.5" r="304" stroke="#000" stroke-width="25"/></g></svg>
@@ -0,0 +1,13 @@
1
+ import { Derived, Store } from '@tanstack/store'
2
+
3
+ export const store = new Store({
4
+ firstName: 'Jane',
5
+ lastName: 'Smith',
6
+ })
7
+
8
+ export const fullName = new Derived({
9
+ fn: () => `${store.state.firstName} ${store.state.lastName}`,
10
+ deps: [store],
11
+ })
12
+
13
+ fullName.mount()
@@ -0,0 +1,75 @@
1
+ import { <% if (fileRouter) { %>createFileRoute<% } else { %>createRoute<% } %> } from '@tanstack/react-router'
2
+ import { useStore } from '@tanstack/react-store'
3
+
4
+ import { fullName, store } from '../lib/demo-store'
5
+ <% if (codeRouter) { %>
6
+ import type { RootRoute } from '@tanstack/react-router'
7
+ <% } else { %>
8
+ export const Route = createFileRoute('/demo/store')({
9
+ component: DemoStore,
10
+ })
11
+ <% } %>
12
+
13
+ function FirstName() {
14
+ const firstName = useStore(store, (state) => state.firstName)
15
+ return (
16
+ <input
17
+ type="text"
18
+ value={firstName}
19
+ onChange={(e) =>
20
+ store.setState((state) => ({ ...state, firstName: e.target.value }))
21
+ }
22
+ className="bg-white/10 rounded-lg px-4 py-2 outline-none border border-white/20 hover:border-white/40 focus:border-white/60 transition-colors duration-200 placeholder-white/40"
23
+ />
24
+ )
25
+ }
26
+
27
+ function LastName() {
28
+ const lastName = useStore(store, (state) => state.lastName)
29
+ return (
30
+ <input
31
+ type="text"
32
+ value={lastName}
33
+ onChange={(e) =>
34
+ store.setState((state) => ({ ...state, lastName: e.target.value }))
35
+ }
36
+ className="bg-white/10 rounded-lg px-4 py-2 outline-none border border-white/20 hover:border-white/40 focus:border-white/60 transition-colors duration-200 placeholder-white/40"
37
+ />
38
+ )
39
+ }
40
+
41
+ function FullName() {
42
+ const fName = useStore(fullName)
43
+ return (
44
+ <div className="bg-white/10 rounded-lg px-4 py-2 outline-none ">
45
+ {fName}
46
+ </div>
47
+ )
48
+ }
49
+
50
+ function DemoStore() {
51
+ return (
52
+ <div
53
+ className="min-h-[calc(100vh-32px)] text-white p-8 flex items-center justify-center w-full h-full"
54
+ style={{
55
+ backgroundImage:
56
+ 'radial-gradient(50% 50% at 80% 80%, #f4a460 0%, #8b4513 70%, #1a0f0a 100%)',
57
+ }}
58
+ >
59
+ <div className="bg-white/10 backdrop-blur-lg rounded-xl p-8 shadow-lg flex flex-col gap-4 text-3xl min-w-1/2">
60
+ <h1 className="text-4xl font-bold mb-5">Store Example</h1>
61
+ <FirstName />
62
+ <LastName />
63
+ <FullName />
64
+ </div>
65
+ </div>
66
+ )
67
+ }
68
+
69
+ <% if (codeRouter) { %>
70
+ export default (parentRoute: RootRoute) => createRoute({
71
+ path: '/demo/store',
72
+ component: DemoStore,
73
+ getParentRoute: () => parentRoute,
74
+ })
75
+ <% } %>
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "Store",
3
+ "description": "Add TanStack Store to your application.",
4
+ "phase": "add-on",
5
+ "link": "https://tanstack.com/store/latest",
6
+ "type": "add-on",
7
+ "modes": ["file-router", "code-router"],
8
+ "routes": [
9
+ {
10
+ "url": "/demo/store",
11
+ "name": "Store",
12
+ "path": "src/routes/demo.store.tsx",
13
+ "jsName": "StoreDemo"
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "dependencies": {
3
+ "@tanstack/store": "^0.7.0",
4
+ "@tanstack/react-store": "^0.7.0"
5
+ }
6
+ }