@tanstack/create 0.49.3 → 0.59.4

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 (225) hide show
  1. package/CHANGELOG.md +597 -0
  2. package/dist/add-ons.js +42 -2
  3. package/dist/add-to-app.js +36 -7
  4. package/dist/custom-add-ons/add-on.js +2 -26
  5. package/dist/custom-add-ons/starter.js +1 -2
  6. package/dist/file-helpers.js +11 -10
  7. package/dist/frameworks/react/add-ons/ai/info.json +1 -1
  8. package/dist/frameworks/react/add-ons/apollo-client/info.json +1 -1
  9. package/dist/frameworks/react/add-ons/better-auth/info.json +0 -2
  10. package/dist/frameworks/react/add-ons/clerk/info.json +0 -1
  11. package/dist/frameworks/react/add-ons/db/info.json +1 -1
  12. package/dist/frameworks/react/add-ons/drizzle/info.json +1 -1
  13. package/dist/frameworks/react/add-ons/drizzle/package.json.ejs +4 -0
  14. package/dist/frameworks/react/add-ons/mcp/info.json +1 -2
  15. package/dist/frameworks/react/add-ons/neon/assets/neon-vite-plugin.ts +1 -1
  16. package/dist/frameworks/react/add-ons/neon/info.json +1 -2
  17. package/dist/frameworks/react/add-ons/oRPC/info.json +1 -1
  18. package/dist/frameworks/react/add-ons/paraglide/info.json +1 -1
  19. package/dist/frameworks/react/add-ons/prisma/info.json +1 -1
  20. package/dist/frameworks/react/add-ons/prisma/package.json.ejs +4 -0
  21. package/dist/frameworks/react/add-ons/sentry/info.json +1 -2
  22. package/dist/frameworks/react/add-ons/tRPC/info.json +1 -1
  23. package/dist/frameworks/react/add-ons/tanstack-query/assets/src/integrations/tanstack-query/root-provider.tsx.ejs +1 -29
  24. package/dist/frameworks/react/add-ons/workos/info.json +0 -1
  25. package/dist/frameworks/react/hosts/cloudflare/info.json +0 -1
  26. package/dist/frameworks/react/hosts/netlify/info.json +0 -1
  27. package/dist/frameworks/react/hosts/nitro/info.json +0 -1
  28. package/dist/frameworks/react/hosts/railway/info.json +0 -1
  29. package/dist/frameworks/react/index.js +1 -6
  30. package/dist/frameworks/react/project/base/README.md.ejs +86 -436
  31. package/dist/frameworks/react/project/base/_dot_gitignore +4 -0
  32. package/dist/frameworks/react/project/base/package.json +8 -5
  33. package/dist/frameworks/react/project/base/src/components/Header.tsx.ejs +2 -32
  34. package/dist/frameworks/react/project/base/src/routes/__root.tsx.ejs +4 -44
  35. package/dist/frameworks/react/project/base/src/routes/index.tsx.ejs +99 -61
  36. package/dist/frameworks/react/project/base/src/styles.css.ejs +3 -3
  37. package/dist/frameworks/react/project/base/tsconfig.json.ejs +1 -1
  38. package/dist/frameworks/react/project/base/vite.config.ts.ejs +33 -27
  39. package/dist/frameworks/react/project/packages.json +2 -2
  40. package/dist/frameworks/solid/add-ons/better-auth/info.json +1 -1
  41. package/dist/frameworks/solid/hosts/cloudflare/info.json +0 -1
  42. package/dist/frameworks/solid/hosts/netlify/info.json +0 -1
  43. package/dist/frameworks/solid/hosts/nitro/info.json +0 -1
  44. package/dist/frameworks/solid/hosts/railway/info.json +0 -1
  45. package/dist/frameworks/solid/index.js +1 -6
  46. package/dist/frameworks/solid/project/base/README.md.ejs +43 -117
  47. package/dist/frameworks/solid/project/base/_dot_gitignore +4 -0
  48. package/dist/frameworks/solid/project/base/package.json +8 -3
  49. package/dist/frameworks/solid/project/base/src/components/Header.tsx.ejs +2 -25
  50. package/dist/frameworks/solid/project/base/src/routes/__root.tsx.ejs +3 -30
  51. package/dist/frameworks/solid/project/base/src/routes/index.tsx.ejs +97 -35
  52. package/dist/frameworks/solid/project/base/tsconfig.json.ejs +1 -1
  53. package/dist/frameworks/solid/project/base/vite.config.ts.ejs +15 -20
  54. package/dist/frameworks/solid/project/packages.json +2 -2
  55. package/dist/frameworks.js +0 -1
  56. package/dist/package-json.js +6 -10
  57. package/dist/template-file.js +21 -7
  58. package/dist/types/custom-add-ons/add-on.d.ts +1 -1
  59. package/dist/types/file-helpers.d.ts +0 -1
  60. package/dist/types/types.d.ts +12 -12
  61. package/dist/types.js +1 -2
  62. package/package.json +1 -1
  63. package/src/add-ons.ts +54 -2
  64. package/src/add-to-app.ts +42 -7
  65. package/src/custom-add-ons/add-on.ts +2 -33
  66. package/src/custom-add-ons/starter.ts +1 -2
  67. package/src/file-helpers.ts +11 -10
  68. package/src/frameworks/react/add-ons/ai/info.json +1 -1
  69. package/src/frameworks/react/add-ons/apollo-client/info.json +1 -1
  70. package/src/frameworks/react/add-ons/better-auth/info.json +0 -2
  71. package/src/frameworks/react/add-ons/clerk/info.json +0 -1
  72. package/src/frameworks/react/add-ons/db/info.json +1 -1
  73. package/src/frameworks/react/add-ons/drizzle/info.json +1 -1
  74. package/src/frameworks/react/add-ons/drizzle/package.json.ejs +4 -0
  75. package/src/frameworks/react/add-ons/mcp/info.json +1 -2
  76. package/src/frameworks/react/add-ons/neon/assets/neon-vite-plugin.ts +1 -1
  77. package/src/frameworks/react/add-ons/neon/info.json +1 -2
  78. package/src/frameworks/react/add-ons/oRPC/info.json +1 -1
  79. package/src/frameworks/react/add-ons/paraglide/info.json +1 -1
  80. package/src/frameworks/react/add-ons/prisma/info.json +1 -1
  81. package/src/frameworks/react/add-ons/prisma/package.json.ejs +4 -0
  82. package/src/frameworks/react/add-ons/sentry/info.json +1 -2
  83. package/src/frameworks/react/add-ons/tRPC/info.json +1 -1
  84. package/src/frameworks/react/add-ons/tanstack-query/assets/src/integrations/tanstack-query/root-provider.tsx.ejs +1 -29
  85. package/src/frameworks/react/add-ons/workos/info.json +0 -1
  86. package/src/frameworks/react/hosts/cloudflare/info.json +0 -1
  87. package/src/frameworks/react/hosts/netlify/info.json +0 -1
  88. package/src/frameworks/react/hosts/nitro/info.json +0 -1
  89. package/src/frameworks/react/hosts/railway/info.json +0 -1
  90. package/src/frameworks/react/index.ts +1 -6
  91. package/src/frameworks/react/project/base/README.md.ejs +86 -436
  92. package/src/frameworks/react/project/base/_dot_gitignore +4 -0
  93. package/src/frameworks/react/project/base/package.json +8 -5
  94. package/src/frameworks/react/project/base/src/components/Header.tsx.ejs +2 -32
  95. package/src/frameworks/react/project/base/src/routes/__root.tsx.ejs +4 -44
  96. package/src/frameworks/react/project/base/src/routes/index.tsx.ejs +99 -61
  97. package/src/frameworks/react/project/base/src/styles.css.ejs +3 -3
  98. package/src/frameworks/react/project/base/tsconfig.json.ejs +1 -1
  99. package/src/frameworks/react/project/base/vite.config.ts.ejs +33 -27
  100. package/src/frameworks/react/project/packages.json +2 -2
  101. package/src/frameworks/solid/add-ons/better-auth/info.json +1 -1
  102. package/src/frameworks/solid/hosts/cloudflare/info.json +0 -1
  103. package/src/frameworks/solid/hosts/netlify/info.json +0 -1
  104. package/src/frameworks/solid/hosts/nitro/info.json +0 -1
  105. package/src/frameworks/solid/hosts/railway/info.json +0 -1
  106. package/src/frameworks/solid/index.ts +1 -6
  107. package/src/frameworks/solid/project/base/README.md.ejs +43 -117
  108. package/src/frameworks/solid/project/base/_dot_gitignore +4 -0
  109. package/src/frameworks/solid/project/base/package.json +8 -3
  110. package/src/frameworks/solid/project/base/src/components/Header.tsx.ejs +2 -25
  111. package/src/frameworks/solid/project/base/src/routes/__root.tsx.ejs +3 -30
  112. package/src/frameworks/solid/project/base/src/routes/index.tsx.ejs +97 -35
  113. package/src/frameworks/solid/project/base/tsconfig.json.ejs +1 -1
  114. package/src/frameworks/solid/project/base/vite.config.ts.ejs +15 -20
  115. package/src/frameworks/solid/project/packages.json +2 -2
  116. package/src/frameworks.ts +0 -1
  117. package/src/package-json.ts +6 -10
  118. package/src/template-file.ts +27 -8
  119. package/src/types.ts +1 -2
  120. package/tests/add-to-app.test.ts +37 -0
  121. package/tests/file-helper.test.ts +23 -2
  122. package/tests/package-json.test.ts +32 -0
  123. package/tests/template-file.test.ts +28 -0
  124. package/dist/frameworks/react/add-ons/module-federation/assets/module-federation.config.js.ejs +0 -31
  125. package/dist/frameworks/react/add-ons/module-federation/assets/src/demo-mf-component.tsx +0 -3
  126. package/dist/frameworks/react/add-ons/module-federation/assets/src/demo-mf-self-contained.tsx +0 -11
  127. package/dist/frameworks/react/add-ons/module-federation/info.json +0 -11
  128. package/dist/frameworks/react/add-ons/module-federation/package.json +0 -5
  129. package/dist/frameworks/react/add-ons/module-federation/small-logo.svg +0 -87
  130. package/dist/frameworks/react/add-ons/start/assets/_dot_gitignore.append +0 -3
  131. package/dist/frameworks/react/add-ons/start/assets/src/data/demo.punk-songs.ts +0 -13
  132. package/dist/frameworks/react/add-ons/start/assets/src/router.tsx.ejs +0 -77
  133. package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/api.names.ts +0 -10
  134. package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/api.tq-todos.ts.ejs +0 -35
  135. package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/start.api-request.tsx.ejs +0 -68
  136. package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/start.css.ejs +0 -43
  137. package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/start.server-funcs.tsx.ejs +0 -183
  138. package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/start.ssr.data-only.tsx.ejs +0 -55
  139. package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/start.ssr.full-ssr.tsx.ejs +0 -55
  140. package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/start.ssr.index.tsx.ejs +0 -62
  141. package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/start.ssr.spa-mode.tsx.ejs +0 -62
  142. package/dist/frameworks/react/add-ons/start/assets/src/routes/index.tsx.ejs +0 -142
  143. package/dist/frameworks/react/add-ons/start/assets/src/server.ts.ejs +0 -9
  144. package/dist/frameworks/react/add-ons/start/assets/vite.config.ts.ejs +0 -40
  145. package/dist/frameworks/react/add-ons/start/info.json +0 -61
  146. package/dist/frameworks/react/add-ons/start/package.json +0 -12
  147. package/dist/frameworks/react/add-ons/start/small-logo.svg +0 -1
  148. package/dist/frameworks/react/project/base/index.html.ejs +0 -20
  149. package/dist/frameworks/react/project/base/src/App.css.ejs +0 -38
  150. package/dist/frameworks/react/project/base/src/App.tsx.ejs +0 -63
  151. package/dist/frameworks/react/project/base/src/components/Header.css.ejs +0 -18
  152. package/dist/frameworks/react/project/base/src/logo.svg +0 -12
  153. package/dist/frameworks/react/project/base/src/main.tsx.ejs +0 -166
  154. package/dist/frameworks/react/project/base/src/reportWebVitals.ts.ejs +0 -28
  155. package/dist/frameworks/solid/add-ons/module-federation/assets/module-federation.config.js.ejs +0 -27
  156. package/dist/frameworks/solid/add-ons/module-federation/assets/src/demo-mf-component.tsx +0 -3
  157. package/dist/frameworks/solid/add-ons/module-federation/assets/src/demo-mf-self-contained.tsx +0 -9
  158. package/dist/frameworks/solid/add-ons/module-federation/info.json +0 -10
  159. package/dist/frameworks/solid/add-ons/module-federation/package.json +0 -5
  160. package/dist/frameworks/solid/add-ons/module-federation/small-logo.svg +0 -87
  161. package/dist/frameworks/solid/add-ons/start/assets/public/tanstack-circle-logo.png +0 -0
  162. package/dist/frameworks/solid/add-ons/start/assets/public/tanstack-word-logo-white.svg +0 -1
  163. package/dist/frameworks/solid/add-ons/start/assets/src/router.tsx.ejs +0 -30
  164. package/dist/frameworks/solid/add-ons/start/assets/src/routes/demo.start.server-funcs.tsx +0 -49
  165. package/dist/frameworks/solid/add-ons/start/assets/src/routes/index.tsx.ejs +0 -138
  166. package/dist/frameworks/solid/add-ons/start/assets/vite.config.ts.ejs +0 -22
  167. package/dist/frameworks/solid/add-ons/start/info.json +0 -18
  168. package/dist/frameworks/solid/add-ons/start/package.json +0 -15
  169. package/dist/frameworks/solid/add-ons/start/small-logo.svg +0 -1
  170. package/dist/frameworks/solid/project/base/index.html.ejs +0 -20
  171. package/dist/frameworks/solid/project/base/src/App.css.ejs +0 -38
  172. package/dist/frameworks/solid/project/base/src/App.tsx.ejs +0 -34
  173. package/dist/frameworks/solid/project/base/src/logo.svg +0 -120
  174. package/dist/frameworks/solid/project/base/src/main.tsx.ejs +0 -126
  175. package/src/frameworks/react/add-ons/module-federation/assets/module-federation.config.js.ejs +0 -31
  176. package/src/frameworks/react/add-ons/module-federation/assets/src/demo-mf-component.tsx +0 -3
  177. package/src/frameworks/react/add-ons/module-federation/assets/src/demo-mf-self-contained.tsx +0 -11
  178. package/src/frameworks/react/add-ons/module-federation/info.json +0 -11
  179. package/src/frameworks/react/add-ons/module-federation/package.json +0 -5
  180. package/src/frameworks/react/add-ons/module-federation/small-logo.svg +0 -87
  181. package/src/frameworks/react/add-ons/start/assets/_dot_gitignore.append +0 -3
  182. package/src/frameworks/react/add-ons/start/assets/src/data/demo.punk-songs.ts +0 -13
  183. package/src/frameworks/react/add-ons/start/assets/src/router.tsx.ejs +0 -77
  184. package/src/frameworks/react/add-ons/start/assets/src/routes/demo/api.names.ts +0 -10
  185. package/src/frameworks/react/add-ons/start/assets/src/routes/demo/api.tq-todos.ts.ejs +0 -35
  186. package/src/frameworks/react/add-ons/start/assets/src/routes/demo/start.api-request.tsx.ejs +0 -68
  187. package/src/frameworks/react/add-ons/start/assets/src/routes/demo/start.css.ejs +0 -43
  188. package/src/frameworks/react/add-ons/start/assets/src/routes/demo/start.server-funcs.tsx.ejs +0 -183
  189. package/src/frameworks/react/add-ons/start/assets/src/routes/demo/start.ssr.data-only.tsx.ejs +0 -55
  190. package/src/frameworks/react/add-ons/start/assets/src/routes/demo/start.ssr.full-ssr.tsx.ejs +0 -55
  191. package/src/frameworks/react/add-ons/start/assets/src/routes/demo/start.ssr.index.tsx.ejs +0 -62
  192. package/src/frameworks/react/add-ons/start/assets/src/routes/demo/start.ssr.spa-mode.tsx.ejs +0 -62
  193. package/src/frameworks/react/add-ons/start/assets/src/routes/index.tsx.ejs +0 -142
  194. package/src/frameworks/react/add-ons/start/assets/src/server.ts.ejs +0 -9
  195. package/src/frameworks/react/add-ons/start/assets/vite.config.ts.ejs +0 -40
  196. package/src/frameworks/react/add-ons/start/info.json +0 -61
  197. package/src/frameworks/react/add-ons/start/package.json +0 -12
  198. package/src/frameworks/react/add-ons/start/small-logo.svg +0 -1
  199. package/src/frameworks/react/project/base/index.html.ejs +0 -20
  200. package/src/frameworks/react/project/base/src/App.css.ejs +0 -38
  201. package/src/frameworks/react/project/base/src/App.tsx.ejs +0 -63
  202. package/src/frameworks/react/project/base/src/components/Header.css.ejs +0 -18
  203. package/src/frameworks/react/project/base/src/logo.svg +0 -12
  204. package/src/frameworks/react/project/base/src/main.tsx.ejs +0 -166
  205. package/src/frameworks/react/project/base/src/reportWebVitals.ts.ejs +0 -28
  206. package/src/frameworks/solid/add-ons/module-federation/assets/module-federation.config.js.ejs +0 -27
  207. package/src/frameworks/solid/add-ons/module-federation/assets/src/demo-mf-component.tsx +0 -3
  208. package/src/frameworks/solid/add-ons/module-federation/assets/src/demo-mf-self-contained.tsx +0 -9
  209. package/src/frameworks/solid/add-ons/module-federation/info.json +0 -10
  210. package/src/frameworks/solid/add-ons/module-federation/package.json +0 -5
  211. package/src/frameworks/solid/add-ons/module-federation/small-logo.svg +0 -87
  212. package/src/frameworks/solid/add-ons/start/assets/public/tanstack-circle-logo.png +0 -0
  213. package/src/frameworks/solid/add-ons/start/assets/public/tanstack-word-logo-white.svg +0 -1
  214. package/src/frameworks/solid/add-ons/start/assets/src/router.tsx.ejs +0 -30
  215. package/src/frameworks/solid/add-ons/start/assets/src/routes/demo.start.server-funcs.tsx +0 -49
  216. package/src/frameworks/solid/add-ons/start/assets/src/routes/index.tsx.ejs +0 -138
  217. package/src/frameworks/solid/add-ons/start/assets/vite.config.ts.ejs +0 -22
  218. package/src/frameworks/solid/add-ons/start/info.json +0 -18
  219. package/src/frameworks/solid/add-ons/start/package.json +0 -15
  220. package/src/frameworks/solid/add-ons/start/small-logo.svg +0 -1
  221. package/src/frameworks/solid/project/base/index.html.ejs +0 -20
  222. package/src/frameworks/solid/project/base/src/App.css.ejs +0 -38
  223. package/src/frameworks/solid/project/base/src/App.tsx.ejs +0 -34
  224. package/src/frameworks/solid/project/base/src/logo.svg +0 -120
  225. package/src/frameworks/solid/project/base/src/main.tsx.ejs +0 -126
@@ -45,13 +45,41 @@ export async function getCurrentConfiguration(environment, cwd) {
45
45
  return persistedOptions;
46
46
  }
47
47
  export async function writeFiles(environment, cwd, output, forced) {
48
+ const toRelativePath = (filePath) => {
49
+ const normalizedFilePath = filePath.replace(/\\/g, '/');
50
+ const normalizedCwd = cwd.replace(/\\/g, '/');
51
+ const cwdWithoutDrive = normalizedCwd.replace(/^[a-zA-Z]:/, '');
52
+ const cwdWithoutDriveNoLeading = cwdWithoutDrive.replace(/^\/+/, '');
53
+ if (normalizedFilePath === normalizedCwd) {
54
+ return '';
55
+ }
56
+ if (normalizedFilePath.startsWith(`${normalizedCwd}/`)) {
57
+ return normalizedFilePath.slice(normalizedCwd.length + 1);
58
+ }
59
+ if (normalizedFilePath === cwdWithoutDrive) {
60
+ return '';
61
+ }
62
+ if (normalizedFilePath.startsWith(`${cwdWithoutDrive}/`)) {
63
+ return normalizedFilePath.slice(cwdWithoutDrive.length + 1);
64
+ }
65
+ if (normalizedFilePath === cwdWithoutDriveNoLeading) {
66
+ return '';
67
+ }
68
+ if (normalizedFilePath.startsWith(`${cwdWithoutDriveNoLeading}/`)) {
69
+ return normalizedFilePath.slice(cwdWithoutDriveNoLeading.length + 1);
70
+ }
71
+ return normalizedFilePath.replace(/^\/+/, '');
72
+ };
73
+ const relativeOutputFiles = Object.keys(output.files).reduce((acc, filePath) => {
74
+ acc[toRelativePath(filePath)] = output.files[filePath];
75
+ return acc;
76
+ }, {});
48
77
  const currentFiles = await recursivelyGatherFilesFromEnvironment(environment, cwd, false);
49
78
  const overwrittenFiles = [];
50
79
  const changedFiles = [];
51
- for (const file of Object.keys(output.files)) {
52
- const relativeFile = file.replace(cwd, '');
80
+ for (const relativeFile of Object.keys(relativeOutputFiles)) {
53
81
  if (currentFiles[relativeFile]) {
54
- if (currentFiles[relativeFile] !== output.files[file]) {
82
+ if (currentFiles[relativeFile] !== relativeOutputFiles[relativeFile]) {
55
83
  overwrittenFiles.push(relativeFile);
56
84
  }
57
85
  }
@@ -66,9 +94,10 @@ export async function writeFiles(environment, cwd, output, forced) {
66
94
  throw new Error('User cancelled');
67
95
  }
68
96
  }
69
- for (const file of output.deletedFiles) {
70
- if (environment.exists(resolve(cwd, file))) {
71
- await environment.deleteFile(resolve(cwd, file));
97
+ for (const filePath of output.deletedFiles) {
98
+ const relativeFilePath = toRelativePath(filePath);
99
+ if (environment.exists(resolve(cwd, relativeFilePath))) {
100
+ await environment.deleteFile(resolve(cwd, relativeFilePath));
72
101
  }
73
102
  }
74
103
  environment.startStep({
@@ -78,7 +107,7 @@ export async function writeFiles(environment, cwd, output, forced) {
78
107
  });
79
108
  for (const file of [...changedFiles, ...overwrittenFiles]) {
80
109
  const fName = basename(file);
81
- const contents = output.files[file];
110
+ const contents = relativeOutputFiles[file];
82
111
  if (fName === 'package.json') {
83
112
  const currentJson = JSON.parse(await environment.readFile(resolve(cwd, file)));
84
113
  const newJSON = mergePackageJSON(currentJson, JSON.parse(contents));
@@ -25,7 +25,7 @@ export function camelCase(str) {
25
25
  export function templatize(routeCode, routeFile) {
26
26
  let code = routeCode;
27
27
  // Replace the import
28
- code = code.replace(/import { createFileRoute } from ['"]@tanstack\/react-router['"]/g, `import { <% if (fileRouter) { %>createFileRoute<% } else { %>createRoute<% } %> } from '@tanstack/react-router'`);
28
+ code = code.replace(/import { createFileRoute } from ['"]@tanstack\/react-router['"]/g, `import { createFileRoute } from '@tanstack/react-router'`);
29
29
  // Extract route path and definition, then transform the route declaration
30
30
  const routeMatch = code.match(/export\s+const\s+Route\s*=\s*createFileRoute\(['"]([^'"]+)['"]\)\s*\(\{([^}]+)\}\)/);
31
31
  let path = '';
@@ -33,21 +33,7 @@ export function templatize(routeCode, routeFile) {
33
33
  const fullMatch = routeMatch[0];
34
34
  path = routeMatch[1];
35
35
  const routeDefinition = routeMatch[2];
36
- code = code.replace(fullMatch, `<% if (codeRouter) { %>
37
- import type { RootRoute } from '@tanstack/react-router'
38
- import tailwind from '@tailwindcss/vite';
39
- <% } else { %>
40
- export const Route = createFileRoute('${path}')({${routeDefinition}})
41
- <% } %>`);
42
- code += `
43
- <% if (codeRouter) { %>
44
- export default (parentRoute: RootRoute) => createRoute({
45
- path: '${path}',
46
- ${routeDefinition}
47
- getParentRoute: () => parentRoute,
48
- })
49
- <% } %>
50
- `;
36
+ code = code.replace(fullMatch, `export const Route = createFileRoute('${path}')({${routeDefinition}})`);
51
37
  }
52
38
  else {
53
39
  console.error(`No route found in the file: ${routeFile}`);
@@ -66,14 +52,6 @@ export async function validateAddOnSetup(environment) {
66
52
  environment.error('This project is using code-router mode.', 'To create an add-on, the project must not use code-router mode.');
67
53
  process.exit(1);
68
54
  }
69
- if (!options.tailwind) {
70
- environment.error('This project is not using Tailwind CSS.', 'To create an add-on, the project must be created with Tailwind CSS.');
71
- process.exit(1);
72
- }
73
- if (!options.typescript) {
74
- environment.error('This project is not using TypeScript.', 'To create an add-on, the project must be created with TypeScript.');
75
- process.exit(1);
76
- }
77
55
  }
78
56
  export async function readOrGenerateAddOnInfo(options) {
79
57
  const info = existsSync(INFO_FILE)
@@ -84,7 +62,6 @@ export async function readOrGenerateAddOnInfo(options) {
84
62
  version: '0.0.1',
85
63
  description: 'Add-on',
86
64
  author: 'Jane Smith <jane.smith@example.com>',
87
- tailwind: options.tailwind || true,
88
65
  license: 'MIT',
89
66
  link: `https://github.com/jane-smith/${options.projectName}-add-on`,
90
67
  shadcnComponents: [],
@@ -101,7 +78,6 @@ export async function readOrGenerateAddOnInfo(options) {
101
78
  },
102
79
  dependsOn: options.chosenAddOns,
103
80
  };
104
- info.tailwind = options.tailwind || true;
105
81
  return info;
106
82
  }
107
83
  export async function generateProject(persistedOptions) {
@@ -29,8 +29,7 @@ export async function readOrGenerateStarterInfo(options) {
29
29
  devDependencies: {},
30
30
  },
31
31
  dependsOn: options.chosenAddOns,
32
- typescript: options.typescript,
33
- tailwind: options.tailwind,
32
+ typescript: true,
34
33
  };
35
34
  }
36
35
  async function loadCurrentStarterInfo(environment) {
@@ -29,24 +29,25 @@ export function getBinaryFile(content) {
29
29
  return null;
30
30
  }
31
31
  /**
32
- * Convert an absolute path to a clean relative path by removing a base directory.
33
32
  * Returns a path without leading ./ or / prefix.
34
33
  */
35
34
  export function toCleanPath(absolutePath, baseDir) {
36
- let cleanPath = absolutePath.replace(baseDir, '');
37
- // Handle both Unix (/) and Windows (\) path separators
38
- if (cleanPath.startsWith('/') || cleanPath.startsWith('\\')) {
35
+ // Normalize both paths to use forward slashes for consistent comparison
36
+ const normalizedPath = absolutePath.replace(/\\/g, '/');
37
+ const normalizedBase = baseDir.replace(/\\/g, '/');
38
+ let cleanPath = normalizedPath.replace(normalizedBase, '');
39
+ // Handle leading path separator
40
+ if (cleanPath.startsWith('/')) {
39
41
  cleanPath = cleanPath.slice(1);
40
42
  }
41
43
  return cleanPath;
42
44
  }
43
45
  export function relativePath(from, to, stripExtension = false) {
44
- const fixedOnWindows = from.startsWith('.\\')
45
- ? from.replace(/\\/g, '/')
46
- : from;
47
- const cleanedFrom = fixedOnWindows.startsWith('./')
48
- ? fixedOnWindows.slice(2)
49
- : from;
46
+ // Always normalize backslashes to forward slashes for Windows compatibility
47
+ const normalized = from.replace(/\\/g, '/');
48
+ const cleanedFrom = normalized.startsWith('./')
49
+ ? normalized.slice(2)
50
+ : normalized;
50
51
  const cleanedTo = to.startsWith('./') ? to.slice(2) : to;
51
52
  const fromSegments = cleanedFrom.split('/');
52
53
  const toSegments = cleanedTo.split('/');
@@ -43,6 +43,6 @@
43
43
  "jsName": "AiDevtools"
44
44
  }
45
45
  ],
46
- "dependsOn": ["start", "store"],
46
+ "dependsOn": ["store"],
47
47
  "variables": []
48
48
  }
@@ -8,7 +8,7 @@
8
8
  "color": "#311C87",
9
9
  "priority": 15,
10
10
  "link": "https://github.com/apollographql/apollo-client-integrations/tree/main/packages/tanstack-start",
11
- "dependsOn": ["start"],
11
+
12
12
  "routes": [
13
13
  {
14
14
  "icon": "Network",
@@ -9,8 +9,6 @@
9
9
  "priority": 26,
10
10
  "link": "https://www.better-auth.com",
11
11
  "modes": ["file-router"],
12
- "tailwind": true,
13
- "dependsOn": ["start"],
14
12
  "routes": [
15
13
  {
16
14
  "url": "/demo/better-auth",
@@ -9,7 +9,6 @@
9
9
  "color": "#6C47FF",
10
10
  "priority": 150,
11
11
  "link": "https://clerk.com",
12
- "tailwind": true,
13
12
  "routes": [
14
13
  {
15
14
  "url": "/demo/clerk",
@@ -8,7 +8,7 @@
8
8
  "priority": 48,
9
9
  "modes": ["file-router"],
10
10
  "link": "https://tanstack.com/db/latest",
11
- "dependsOn": ["tanstack-query", "start"],
11
+ "dependsOn": ["tanstack-query"],
12
12
  "routes": [
13
13
  {
14
14
  "icon": "Database",
@@ -9,7 +9,7 @@
9
9
  "priority": 46,
10
10
  "link": "https://orm.drizzle.team/",
11
11
  "modes": ["file-router"],
12
- "dependsOn": ["start"],
12
+
13
13
  "options": {
14
14
  "database": {
15
15
  "type": "select",
@@ -18,5 +18,9 @@
18
18
  "db:push": "drizzle-kit push",
19
19
  "db:pull": "drizzle-kit pull",
20
20
  "db:studio": "drizzle-kit studio"
21
+ }<% if (addOnOption.drizzle.database === 'sqlite') { %>,
22
+ "pnpm": {
23
+ "onlyBuiltDependencies": ["better-sqlite3"]
21
24
  }
25
+ <% } %>
22
26
  }
@@ -17,6 +17,5 @@
17
17
  "path": "src/routes/demo.mcp-todos.tsx",
18
18
  "jsName": "MCPTodosDemo"
19
19
  }
20
- ],
21
- "dependsOn": ["start"]
20
+ ]
22
21
  }
@@ -1,4 +1,4 @@
1
- import postgresPlugin from '@neondatabase/vite-plugin-postgres'
1
+ import { postgresPlugin } from '@neondatabase/vite-plugin-postgres'
2
2
 
3
3
  export default postgresPlugin({
4
4
  seed: {
@@ -24,6 +24,5 @@
24
24
  "jsName": "neon",
25
25
  "path": "neon-vite-plugin.ts"
26
26
  }
27
- ],
28
- "dependsOn": ["start"]
27
+ ]
29
28
  }
@@ -4,7 +4,7 @@
4
4
  "phase": "add-on",
5
5
  "modes": ["file-router"],
6
6
  "link": "https://orpc.unnoq.com/",
7
- "dependsOn": ["tanstack-query", "start"],
7
+ "dependsOn": ["tanstack-query"],
8
8
  "type": "add-on",
9
9
  "category": "api",
10
10
  "color": "#FF6B6B",
@@ -7,7 +7,7 @@
7
7
  "category": "i18n",
8
8
  "color": "#14B8A6",
9
9
  "priority": 30,
10
- "link": "https://github.com/paraglidejs/paraglide-js",
10
+ "link": "https://github.com/opral/paraglide-js",
11
11
  "routes": [
12
12
  {
13
13
  "icon": "Languages",
@@ -9,7 +9,7 @@
9
9
  "priority": 120,
10
10
  "link": "https://www.prisma.io/",
11
11
  "modes": ["file-router"],
12
- "dependsOn": ["start"],
12
+
13
13
  "postInitSpecialSteps": ["post-init-script"],
14
14
  "options": {
15
15
  "database": {
@@ -17,5 +17,9 @@
17
17
  "db:migrate": "dotenv -e .env.local -- prisma migrate dev",
18
18
  "db:studio": "dotenv -e .env.local -- prisma studio",
19
19
  "db:seed": "dotenv -e .env.local -- prisma db seed"
20
+ }<% if (addOnOption.prisma.database === 'sqlite') { %>,
21
+ "pnpm": {
22
+ "onlyBuiltDependencies": ["better-sqlite3"]
20
23
  }
24
+ <% } %>
21
25
  }
@@ -15,6 +15,5 @@
15
15
  "path": "src/routes/demo.sentry.testing.tsx",
16
16
  "jsName": "SentryDemo"
17
17
  }
18
- ],
19
- "dependsOn": ["start"]
18
+ ]
20
19
  }
@@ -4,7 +4,7 @@
4
4
  "phase": "add-on",
5
5
  "modes": ["file-router"],
6
6
  "link": "https://trpc.io/",
7
- "dependsOn": ["tanstack-query", "start"],
7
+ "dependsOn": ["tanstack-query"],
8
8
  "type": "add-on",
9
9
  "category": "api",
10
10
  "color": "#2596BE",
@@ -6,8 +6,6 @@ import { createTRPCOptionsProxy } from "@trpc/tanstack-react-query";
6
6
 
7
7
  import type { TRPCRouter } from "@/integrations/trpc/router";
8
8
 
9
- import { TRPCProvider } from "@/integrations/trpc/react";
10
-
11
9
  function getUrl() {
12
10
  const base = (() => {
13
11
  if (typeof window !== "undefined") return "";
@@ -42,22 +40,8 @@ export function getContext() {
42
40
  trpc: serverHelpers,
43
41
  };
44
42
  }
45
-
46
- export function Provider({
47
- children,
48
- queryClient,
49
- }: {
50
- children: React.ReactNode;
51
- queryClient: QueryClient;
52
- }) {
53
- return (
54
- <TRPCProvider trpcClient={trpcClient} queryClient={queryClient}>
55
- {children}
56
- </TRPCProvider>
57
- );
58
- }
59
43
  <% } else { %>
60
- import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
44
+ import { QueryClient } from '@tanstack/react-query'
61
45
 
62
46
  export function getContext() {
63
47
  const queryClient = new QueryClient();
@@ -65,16 +49,4 @@ export function getContext() {
65
49
  queryClient,
66
50
  };
67
51
  }
68
-
69
- export function Provider({
70
- children,
71
- queryClient,
72
- }: {
73
- children: React.ReactNode;
74
- queryClient: QueryClient;
75
- }) {
76
- return (
77
- <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
78
- );
79
- }
80
52
  <% } %>
@@ -9,7 +9,6 @@
9
9
  "color": "#6363F1",
10
10
  "priority": 160,
11
11
  "link": "https://workos.com",
12
- "tailwind": true,
13
12
  "routes": [
14
13
  {
15
14
  "icon": "CircleUserRound",
@@ -9,7 +9,6 @@
9
9
  "exclusive": ["deploy"],
10
10
  "color": "#F38020",
11
11
  "priority": 200,
12
- "tailwind": false,
13
12
  "integrations": [
14
13
  {
15
14
  "type": "vite-plugin",
@@ -9,7 +9,6 @@
9
9
  "exclusive": ["deploy"],
10
10
  "color": "#00C7B7",
11
11
  "priority": 180,
12
- "tailwind": false,
13
12
  "integrations": [
14
13
  {
15
14
  "type": "vite-plugin",
@@ -9,7 +9,6 @@
9
9
  "exclusive": ["deploy"],
10
10
  "color": "#ECDC5A",
11
11
  "priority": 0,
12
- "tailwind": false,
13
12
  "integrations": [
14
13
  {
15
14
  "type": "vite-plugin",
@@ -9,7 +9,6 @@
9
9
  "exclusive": ["deploy"],
10
10
  "color": "#9B4DCA",
11
11
  "priority": 160,
12
- "tailwind": false,
13
12
  "integrations": [
14
13
  {
15
14
  "type": "vite-plugin",
@@ -20,14 +20,9 @@ export function createFrameworkDefinition() {
20
20
  basePackageJSON,
21
21
  optionalPackages,
22
22
  supportedModes: {
23
- 'code-router': {
24
- displayName: 'Code Router',
25
- description: 'TanStack Router using code to define routes',
26
- forceTypescript: false,
27
- },
28
23
  'file-router': {
29
24
  displayName: 'File Router',
30
- description: 'TanStack Router using files to define routes',
25
+ description: 'TanStack Start with file-based routing',
31
26
  forceTypescript: true,
32
27
  },
33
28
  },