@tanstack/create 0.62.1 → 0.63.0

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 (167) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/create-app.js +3 -1
  3. package/dist/frameworks/react/add-ons/ai/package.json +3 -3
  4. package/dist/frameworks/react/add-ons/apollo-client/package.json +2 -2
  5. package/dist/frameworks/react/add-ons/better-auth/package.json +1 -1
  6. package/dist/frameworks/react/add-ons/clerk/package.json +1 -1
  7. package/dist/frameworks/react/add-ons/convex/package.json +2 -2
  8. package/dist/frameworks/react/add-ons/db/package.json +3 -3
  9. package/dist/frameworks/react/add-ons/drizzle/package.json.ejs +5 -5
  10. package/dist/frameworks/react/add-ons/form/package.json +2 -2
  11. package/dist/frameworks/react/add-ons/mcp/package.json +2 -2
  12. package/dist/frameworks/react/add-ons/neon/package.json +2 -2
  13. package/dist/frameworks/react/add-ons/oRPC/package.json +7 -7
  14. package/dist/frameworks/react/add-ons/paraglide/package.json +1 -1
  15. package/dist/frameworks/react/add-ons/posthog/package.json +2 -2
  16. package/dist/frameworks/react/add-ons/prisma/package.json.ejs +7 -7
  17. package/dist/frameworks/react/add-ons/sentry/package.json +1 -1
  18. package/dist/frameworks/react/add-ons/shadcn/package.json +1 -1
  19. package/dist/frameworks/react/add-ons/store/package.json +3 -3
  20. package/dist/frameworks/react/add-ons/storybook/package.json +2 -2
  21. package/dist/frameworks/react/add-ons/strapi/package.json +2 -2
  22. package/dist/frameworks/react/add-ons/t3env/package.json +2 -2
  23. package/dist/frameworks/react/add-ons/tRPC/package.json +4 -4
  24. package/dist/frameworks/react/add-ons/table/package.json +3 -3
  25. package/dist/frameworks/react/add-ons/tanstack-query/package.json +2 -2
  26. package/dist/frameworks/react/add-ons/workos/package.json +2 -2
  27. package/dist/frameworks/react/examples/events/package.json +3 -3
  28. package/dist/frameworks/react/examples/resume/package.json +2 -2
  29. package/dist/frameworks/react/hosts/cloudflare/package.json.ejs +2 -2
  30. package/dist/frameworks/react/hosts/netlify/package.json +1 -1
  31. package/dist/frameworks/react/project/base/package.json +17 -20
  32. package/dist/frameworks/react/project/base/src/components/Header.tsx.ejs +0 -7
  33. package/dist/frameworks/react/project/base/src/routes/about.tsx.ejs +3 -8
  34. package/dist/frameworks/react/project/base/src/routes/index.tsx.ejs +7 -7
  35. package/dist/frameworks/react/project/base/src/styles.css.ejs +0 -18
  36. package/dist/frameworks/react/project/base/tsconfig.json.ejs +0 -1
  37. package/dist/frameworks/react/project/base/vite.config.ts.ejs +0 -2
  38. package/dist/frameworks/react/toolchains/biome/package.json +1 -1
  39. package/dist/frameworks/react/toolchains/eslint/package.json +2 -2
  40. package/dist/frameworks/solid/add-ons/better-auth/package.json +1 -1
  41. package/dist/frameworks/solid/add-ons/convex/package.json +3 -3
  42. package/dist/frameworks/solid/add-ons/form/package.json +1 -1
  43. package/dist/frameworks/solid/add-ons/sentry/package.json +1 -1
  44. package/dist/frameworks/solid/add-ons/store/package.json +2 -2
  45. package/dist/frameworks/solid/add-ons/strapi/package.json +2 -2
  46. package/dist/frameworks/solid/add-ons/t3env/package.json +2 -2
  47. package/dist/frameworks/solid/add-ons/tanstack-query/package.json +2 -2
  48. package/dist/frameworks/solid/examples/tanchat/assets/ai-streaming-server/package.json +3 -3
  49. package/dist/frameworks/solid/examples/tanchat/package.json +2 -2
  50. package/dist/frameworks/solid/hosts/cloudflare/package.json.ejs +2 -2
  51. package/dist/frameworks/solid/hosts/netlify/package.json +1 -1
  52. package/dist/frameworks/solid/project/base/package.json +11 -10
  53. package/dist/frameworks/solid/project/base/src/components/Header.tsx.ejs +51 -138
  54. package/dist/frameworks/solid/project/base/src/routes/__root.tsx.ejs +2 -5
  55. package/dist/frameworks/solid/project/base/src/routes/about.tsx.ejs +22 -0
  56. package/dist/frameworks/solid/project/base/src/routes/index.tsx.ejs +59 -94
  57. package/dist/frameworks/solid/project/base/src/styles.css.ejs +187 -7
  58. package/dist/frameworks/solid/project/base/vite.config.ts.ejs +1 -2
  59. package/dist/frameworks/solid/toolchains/biome/package.json +1 -1
  60. package/dist/frameworks/solid/toolchains/eslint/package.json +2 -2
  61. package/dist/npm-resolver.js +56 -0
  62. package/dist/package-json.js +25 -3
  63. package/dist/types/npm-resolver.d.ts +18 -0
  64. package/dist/types/package-json.d.ts +1 -5
  65. package/package.json +1 -1
  66. package/src/create-app.ts +3 -1
  67. package/src/frameworks/react/add-ons/ai/package.json +3 -3
  68. package/src/frameworks/react/add-ons/apollo-client/package.json +2 -2
  69. package/src/frameworks/react/add-ons/better-auth/package.json +1 -1
  70. package/src/frameworks/react/add-ons/clerk/package.json +1 -1
  71. package/src/frameworks/react/add-ons/convex/package.json +2 -2
  72. package/src/frameworks/react/add-ons/db/package.json +3 -3
  73. package/src/frameworks/react/add-ons/drizzle/package.json.ejs +5 -5
  74. package/src/frameworks/react/add-ons/form/package.json +2 -2
  75. package/src/frameworks/react/add-ons/mcp/package.json +2 -2
  76. package/src/frameworks/react/add-ons/neon/package.json +2 -2
  77. package/src/frameworks/react/add-ons/oRPC/package.json +7 -7
  78. package/src/frameworks/react/add-ons/paraglide/package.json +1 -1
  79. package/src/frameworks/react/add-ons/posthog/package.json +2 -2
  80. package/src/frameworks/react/add-ons/prisma/package.json.ejs +7 -7
  81. package/src/frameworks/react/add-ons/sentry/package.json +1 -1
  82. package/src/frameworks/react/add-ons/shadcn/package.json +1 -1
  83. package/src/frameworks/react/add-ons/store/package.json +3 -3
  84. package/src/frameworks/react/add-ons/storybook/package.json +2 -2
  85. package/src/frameworks/react/add-ons/strapi/package.json +2 -2
  86. package/src/frameworks/react/add-ons/t3env/package.json +2 -2
  87. package/src/frameworks/react/add-ons/tRPC/package.json +4 -4
  88. package/src/frameworks/react/add-ons/table/package.json +3 -3
  89. package/src/frameworks/react/add-ons/tanstack-query/package.json +2 -2
  90. package/src/frameworks/react/add-ons/workos/package.json +2 -2
  91. package/src/frameworks/react/examples/events/package.json +3 -3
  92. package/src/frameworks/react/examples/resume/package.json +2 -2
  93. package/src/frameworks/react/hosts/cloudflare/package.json.ejs +2 -2
  94. package/src/frameworks/react/hosts/netlify/package.json +1 -1
  95. package/src/frameworks/react/project/base/package.json +17 -20
  96. package/src/frameworks/react/project/base/src/components/Header.tsx.ejs +0 -7
  97. package/src/frameworks/react/project/base/src/routes/about.tsx.ejs +3 -8
  98. package/src/frameworks/react/project/base/src/routes/index.tsx.ejs +7 -7
  99. package/src/frameworks/react/project/base/src/styles.css.ejs +0 -18
  100. package/src/frameworks/react/project/base/tsconfig.json.ejs +0 -1
  101. package/src/frameworks/react/project/base/vite.config.ts.ejs +0 -2
  102. package/src/frameworks/react/toolchains/biome/package.json +1 -1
  103. package/src/frameworks/react/toolchains/eslint/package.json +2 -2
  104. package/src/frameworks/solid/add-ons/better-auth/package.json +1 -1
  105. package/src/frameworks/solid/add-ons/convex/package.json +3 -3
  106. package/src/frameworks/solid/add-ons/form/package.json +1 -1
  107. package/src/frameworks/solid/add-ons/sentry/package.json +1 -1
  108. package/src/frameworks/solid/add-ons/store/package.json +2 -2
  109. package/src/frameworks/solid/add-ons/strapi/package.json +2 -2
  110. package/src/frameworks/solid/add-ons/t3env/package.json +2 -2
  111. package/src/frameworks/solid/add-ons/tanstack-query/package.json +2 -2
  112. package/src/frameworks/solid/examples/tanchat/assets/ai-streaming-server/package.json +3 -3
  113. package/src/frameworks/solid/examples/tanchat/package.json +2 -2
  114. package/src/frameworks/solid/hosts/cloudflare/package.json.ejs +2 -2
  115. package/src/frameworks/solid/hosts/netlify/package.json +1 -1
  116. package/src/frameworks/solid/project/base/package.json +11 -10
  117. package/src/frameworks/solid/project/base/src/components/Header.tsx.ejs +51 -138
  118. package/src/frameworks/solid/project/base/src/routes/__root.tsx.ejs +2 -5
  119. package/src/frameworks/solid/project/base/src/routes/about.tsx.ejs +22 -0
  120. package/src/frameworks/solid/project/base/src/routes/index.tsx.ejs +59 -94
  121. package/src/frameworks/solid/project/base/src/styles.css.ejs +187 -7
  122. package/src/frameworks/solid/project/base/vite.config.ts.ejs +1 -2
  123. package/src/frameworks/solid/toolchains/biome/package.json +1 -1
  124. package/src/frameworks/solid/toolchains/eslint/package.json +2 -2
  125. package/src/npm-resolver.ts +65 -0
  126. package/src/package-json.ts +34 -3
  127. package/tests/package-json.test.ts +32 -0
  128. package/dist/frameworks/react/project/base/content/blog/fifth-post.mdx.ejs +0 -54
  129. package/dist/frameworks/react/project/base/content/blog/first-post.md.ejs +0 -47
  130. package/dist/frameworks/react/project/base/content/blog/fourth-post.md.ejs +0 -42
  131. package/dist/frameworks/react/project/base/content/blog/second-post.mdx.ejs +0 -46
  132. package/dist/frameworks/react/project/base/content/blog/third-post.md.ejs +0 -49
  133. package/dist/frameworks/react/project/base/content-collections.ts.ejs +0 -37
  134. package/dist/frameworks/react/project/base/public/images/lagoon-1.svg +0 -13
  135. package/dist/frameworks/react/project/base/public/images/lagoon-2.svg +0 -12
  136. package/dist/frameworks/react/project/base/public/images/lagoon-3.svg +0 -12
  137. package/dist/frameworks/react/project/base/public/images/lagoon-4.svg +0 -12
  138. package/dist/frameworks/react/project/base/public/images/lagoon-5.svg +0 -12
  139. package/dist/frameworks/react/project/base/public/images/lagoon-about.svg +0 -14
  140. package/dist/frameworks/react/project/base/public/tanstack-circle-logo.png +0 -0
  141. package/dist/frameworks/react/project/base/public/tanstack-word-logo-white.svg +0 -1
  142. package/dist/frameworks/react/project/base/src/components/MdxCallout.tsx.ejs +0 -16
  143. package/dist/frameworks/react/project/base/src/components/MdxMetrics.tsx.ejs +0 -23
  144. package/dist/frameworks/react/project/base/src/lib/site.ts.ejs +0 -4
  145. package/dist/frameworks/react/project/base/src/routes/blog.$slug.tsx.ejs +0 -71
  146. package/dist/frameworks/react/project/base/src/routes/blog.index.tsx.ejs +0 -93
  147. package/dist/frameworks/react/project/base/src/routes/rss[.]xml.ts.ejs +0 -35
  148. package/src/frameworks/react/project/base/content/blog/fifth-post.mdx.ejs +0 -54
  149. package/src/frameworks/react/project/base/content/blog/first-post.md.ejs +0 -47
  150. package/src/frameworks/react/project/base/content/blog/fourth-post.md.ejs +0 -42
  151. package/src/frameworks/react/project/base/content/blog/second-post.mdx.ejs +0 -46
  152. package/src/frameworks/react/project/base/content/blog/third-post.md.ejs +0 -49
  153. package/src/frameworks/react/project/base/content-collections.ts.ejs +0 -37
  154. package/src/frameworks/react/project/base/public/images/lagoon-1.svg +0 -13
  155. package/src/frameworks/react/project/base/public/images/lagoon-2.svg +0 -12
  156. package/src/frameworks/react/project/base/public/images/lagoon-3.svg +0 -12
  157. package/src/frameworks/react/project/base/public/images/lagoon-4.svg +0 -12
  158. package/src/frameworks/react/project/base/public/images/lagoon-5.svg +0 -12
  159. package/src/frameworks/react/project/base/public/images/lagoon-about.svg +0 -14
  160. package/src/frameworks/react/project/base/public/tanstack-circle-logo.png +0 -0
  161. package/src/frameworks/react/project/base/public/tanstack-word-logo-white.svg +0 -1
  162. package/src/frameworks/react/project/base/src/components/MdxCallout.tsx.ejs +0 -16
  163. package/src/frameworks/react/project/base/src/components/MdxMetrics.tsx.ejs +0 -23
  164. package/src/frameworks/react/project/base/src/lib/site.ts.ejs +0 -4
  165. package/src/frameworks/react/project/base/src/routes/blog.$slug.tsx.ejs +0 -71
  166. package/src/frameworks/react/project/base/src/routes/blog.index.tsx.ejs +0 -93
  167. package/src/frameworks/react/project/base/src/routes/rss[.]xml.ts.ejs +0 -35
@@ -1,15 +1,195 @@
1
- @import "tailwindcss";
1
+ @import url('https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,500;9..144,700&family=Manrope:wght@400;500;600;700;800&display=swap');
2
+ @import 'tailwindcss';
3
+
4
+ :root {
5
+ --sea-ink: #173a40;
6
+ --sea-ink-soft: #416166;
7
+ --lagoon: #4fb8b2;
8
+ --lagoon-deep: #328f97;
9
+ --palm: #2f6a4a;
10
+ --sand: #e7f0e8;
11
+ --foam: #f3faf5;
12
+ --surface: rgba(255, 255, 255, 0.74);
13
+ --surface-strong: rgba(255, 255, 255, 0.9);
14
+ --line: rgba(23, 58, 64, 0.14);
15
+ --inset-glint: rgba(255, 255, 255, 0.82);
16
+ --kicker: rgba(47, 106, 74, 0.9);
17
+ --bg-base: #e7f3ec;
18
+ --header-bg: rgba(251, 255, 248, 0.84);
19
+ --chip-bg: rgba(255, 255, 255, 0.8);
20
+ --chip-line: rgba(47, 106, 74, 0.18);
21
+ --link-bg-hover: rgba(255, 255, 255, 0.9);
22
+ --hero-a: rgba(79, 184, 178, 0.36);
23
+ --hero-b: rgba(47, 106, 74, 0.2);
24
+ }
25
+
26
+ * {
27
+ box-sizing: border-box;
28
+ }
29
+
30
+ html,
31
+ body,
32
+ #app {
33
+ min-height: 100%;
34
+ }
2
35
 
3
36
  body {
4
- @apply m-0;
5
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
6
- "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
7
- sans-serif;
37
+ margin: 0;
38
+ color: var(--sea-ink);
39
+ font-family: 'Manrope', ui-sans-serif, system-ui, sans-serif;
40
+ background-color: var(--bg-base);
41
+ background:
42
+ radial-gradient(1100px 620px at -8% -10%, var(--hero-a), transparent 58%),
43
+ radial-gradient(1050px 620px at 112% -12%, var(--hero-b), transparent 62%),
44
+ radial-gradient(720px 380px at 50% 115%, rgba(79, 184, 178, 0.1), transparent 68%),
45
+ linear-gradient(
46
+ 180deg,
47
+ color-mix(in oklab, var(--sand) 68%, white) 0%,
48
+ var(--foam) 44%,
49
+ var(--bg-base) 100%
50
+ );
51
+ overflow-x: hidden;
8
52
  -webkit-font-smoothing: antialiased;
9
53
  -moz-osx-font-smoothing: grayscale;
10
54
  }
11
55
 
56
+ a {
57
+ color: var(--lagoon-deep);
58
+ text-decoration-color: rgba(50, 143, 151, 0.4);
59
+ text-decoration-thickness: 1px;
60
+ text-underline-offset: 2px;
61
+ }
62
+
63
+ a:hover {
64
+ color: #246f76;
65
+ }
66
+
12
67
  code {
13
- font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
14
- monospace;
68
+ font-size: 0.9em;
69
+ border: 1px solid var(--line);
70
+ background: color-mix(in oklab, var(--surface-strong) 82%, white 18%);
71
+ border-radius: 7px;
72
+ padding: 2px 7px;
73
+ }
74
+
75
+ .page-wrap {
76
+ width: min(1080px, calc(100% - 2rem));
77
+ margin-inline: auto;
78
+ }
79
+
80
+ .display-title {
81
+ font-family: 'Fraunces', Georgia, serif;
82
+ }
83
+
84
+ .island-shell {
85
+ border: 1px solid var(--line);
86
+ background: linear-gradient(165deg, var(--surface-strong), var(--surface));
87
+ box-shadow:
88
+ 0 1px 0 var(--inset-glint) inset,
89
+ 0 22px 44px rgba(30, 90, 72, 0.1),
90
+ 0 6px 18px rgba(23, 58, 64, 0.08);
91
+ backdrop-filter: blur(4px);
92
+ }
93
+
94
+ .feature-card {
95
+ background: linear-gradient(
96
+ 165deg,
97
+ color-mix(in oklab, var(--surface-strong) 93%, white 7%),
98
+ var(--surface)
99
+ );
100
+ box-shadow:
101
+ 0 1px 0 var(--inset-glint) inset,
102
+ 0 18px 34px rgba(30, 90, 72, 0.1),
103
+ 0 4px 14px rgba(23, 58, 64, 0.06);
104
+ }
105
+
106
+ .site-header {
107
+ position: sticky;
108
+ top: 0;
109
+ z-index: 50;
110
+ border-bottom: 1px solid var(--line);
111
+ background: var(--header-bg);
112
+ backdrop-filter: blur(10px);
113
+ }
114
+
115
+ .nav-shell {
116
+ display: flex;
117
+ flex-wrap: wrap;
118
+ align-items: center;
119
+ gap: 0.5rem 0.75rem;
120
+ padding: 0.75rem 0;
121
+ }
122
+
123
+ .brand-pill {
124
+ display: inline-flex;
125
+ align-items: center;
126
+ gap: 0.5rem;
127
+ border-radius: 999px;
128
+ border: 1px solid var(--chip-line);
129
+ background: var(--chip-bg);
130
+ padding: 0.5rem 0.875rem;
131
+ color: var(--sea-ink);
132
+ text-decoration: none;
133
+ box-shadow: 0 8px 24px rgba(30, 90, 72, 0.08);
134
+ }
135
+
136
+ .brand-dot {
137
+ height: 0.5rem;
138
+ width: 0.5rem;
139
+ border-radius: 999px;
140
+ background: linear-gradient(90deg, #56c6be, #7ed3bf);
141
+ }
142
+
143
+ .island-kicker {
144
+ letter-spacing: 0.16em;
145
+ text-transform: uppercase;
146
+ font-weight: 700;
147
+ font-size: 0.69rem;
148
+ color: var(--kicker);
149
+ }
150
+
151
+ .nav-link {
152
+ position: relative;
153
+ display: inline-flex;
154
+ align-items: center;
155
+ color: var(--sea-ink-soft);
156
+ text-decoration: none;
157
+ }
158
+
159
+ .nav-link::after {
160
+ content: '';
161
+ position: absolute;
162
+ left: 0;
163
+ bottom: -6px;
164
+ width: 100%;
165
+ height: 2px;
166
+ transform: scaleX(0);
167
+ transform-origin: left;
168
+ background: linear-gradient(90deg, var(--lagoon), #7ed3bf);
169
+ transition: transform 170ms ease;
170
+ }
171
+
172
+ .nav-link:hover,
173
+ .nav-link.is-active {
174
+ color: var(--sea-ink);
175
+ }
176
+
177
+ .nav-link:hover::after,
178
+ .nav-link.is-active::after {
179
+ transform: scaleX(1);
180
+ }
181
+
182
+ .rise-in {
183
+ animation: rise-in 700ms cubic-bezier(0.16, 1, 0.3, 1) both;
184
+ }
185
+
186
+ @keyframes rise-in {
187
+ from {
188
+ opacity: 0;
189
+ transform: translateY(12px);
190
+ }
191
+ to {
192
+ opacity: 1;
193
+ transform: translateY(0);
194
+ }
15
195
  }
@@ -10,10 +10,9 @@ import { tanstackStart } from "@tanstack/solid-start/plugin/vite";
10
10
  import solidPlugin from 'vite-plugin-solid';
11
11
  <% for(const integration of integrations.filter(i => i.type === 'vite-plugin')) { %><%- integrationImportContent(integration) %>
12
12
  <% } %>
13
- import lucidePreprocess from "vite-plugin-lucide-preprocess";
14
13
 
15
14
  export default defineConfig({
16
- plugins: [lucidePreprocess(), devtools(), <% for(const integration of integrations.filter(i => i.type === 'vite-plugin')) { %><%- integrationImportCode(integration) %>,<% } %>
15
+ plugins: [devtools(), <% for(const integration of integrations.filter(i => i.type === 'vite-plugin')) { %><%- integrationImportCode(integration) %>,<% } %>
17
16
  // this is the plugin that enables path aliases
18
17
  viteTsConfigPaths({
19
18
  projects: ['./tsconfig.json'],
@@ -5,6 +5,6 @@
5
5
  "check": "biome check"
6
6
  },
7
7
  "devDependencies": {
8
- "@biomejs/biome": "2.2.4"
8
+ "@biomejs/biome": "2.4.5"
9
9
  }
10
10
  }
@@ -5,7 +5,7 @@
5
5
  "check": "prettier --write . && eslint --fix"
6
6
  },
7
7
  "devDependencies": {
8
- "@tanstack/eslint-config": "^0.3.2",
9
- "prettier": "^3.5.3"
8
+ "@tanstack/eslint-config": "latest",
9
+ "prettier": "^3.8.1"
10
10
  }
11
11
  }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Resolves npm package versions at generation time.
3
+ *
4
+ * When a template specifies "latest" for a package, we fetch the actual
5
+ * current version from the npm registry and pin it exactly, so generated
6
+ * projects don't silently drift over time.
7
+ */
8
+ const cache = new Map();
9
+ export async function resolveNpmVersion(pkg) {
10
+ if (cache.has(pkg)) {
11
+ return cache.get(pkg);
12
+ }
13
+ try {
14
+ const res = await fetch(`https://registry.npmjs.org/${pkg}/latest`, {
15
+ headers: { Accept: 'application/vnd.npm.install-v1+json' },
16
+ });
17
+ if (!res.ok)
18
+ return null;
19
+ const data = (await res.json());
20
+ const version = data.version ?? null;
21
+ if (version)
22
+ cache.set(pkg, version);
23
+ return version;
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ /**
30
+ * Walk a deps object and resolve any "latest" values to pinned versions.
31
+ * Non-"latest" values are left untouched.
32
+ */
33
+ export async function resolveLatestVersions(deps) {
34
+ const entries = Object.entries(deps);
35
+ const resolved = await Promise.all(entries.map(async ([name, version]) => {
36
+ if (version !== 'latest')
37
+ return [name, version];
38
+ const pinned = await resolveNpmVersion(name);
39
+ return [name, pinned ?? 'latest'];
40
+ }));
41
+ return Object.fromEntries(resolved);
42
+ }
43
+ /**
44
+ * Resolve all "latest" version specifiers in a package.json object's
45
+ * dependencies and devDependencies in-place, returning a new object.
46
+ */
47
+ export async function resolvePackageJSONLatest(packageJSON) {
48
+ const result = { ...packageJSON };
49
+ if (result.dependencies) {
50
+ result.dependencies = await resolveLatestVersions(result.dependencies);
51
+ }
52
+ if (result.devDependencies) {
53
+ result.devDependencies = await resolveLatestVersions(result.devDependencies);
54
+ }
55
+ return result;
56
+ }
@@ -2,7 +2,7 @@ import { render } from 'ejs';
2
2
  import { formatCommand, sortObject } from './utils.js';
3
3
  import { getPackageManagerExecuteCommand } from './package-manager.js';
4
4
  export function mergePackageJSON(packageJSON, overlayPackageJSON) {
5
- return {
5
+ const mergedPackageJSON = {
6
6
  ...packageJSON,
7
7
  ...(overlayPackageJSON || {}),
8
8
  dependencies: {
@@ -18,6 +18,28 @@ export function mergePackageJSON(packageJSON, overlayPackageJSON) {
18
18
  ...(overlayPackageJSON?.scripts || {}),
19
19
  },
20
20
  };
21
+ const baseOnlyBuiltDependencies = Array.isArray(packageJSON.pnpm?.onlyBuiltDependencies)
22
+ ? packageJSON.pnpm.onlyBuiltDependencies
23
+ : [];
24
+ const overlayOnlyBuiltDependencies = Array.isArray(overlayPackageJSON?.pnpm?.onlyBuiltDependencies)
25
+ ? overlayPackageJSON.pnpm.onlyBuiltDependencies
26
+ : [];
27
+ const onlyBuiltDependencies = [
28
+ ...new Set([
29
+ ...baseOnlyBuiltDependencies,
30
+ ...overlayOnlyBuiltDependencies,
31
+ ]),
32
+ ];
33
+ if (packageJSON.pnpm || overlayPackageJSON?.pnpm) {
34
+ mergedPackageJSON.pnpm = {
35
+ ...packageJSON.pnpm,
36
+ ...overlayPackageJSON?.pnpm,
37
+ };
38
+ if (onlyBuiltDependencies.length) {
39
+ mergedPackageJSON.pnpm.onlyBuiltDependencies = onlyBuiltDependencies;
40
+ }
41
+ }
42
+ return mergedPackageJSON;
21
43
  }
22
44
  export function createPackageJSON(options) {
23
45
  const packageManager = options.packageManager;
@@ -78,7 +100,7 @@ export function createPackageJSON(options) {
78
100
  delete packageJSON.dependencies?.['@tanstack/react-router-ssr-query'];
79
101
  packageJSON.devDependencies = {
80
102
  ...(packageJSON.devDependencies ?? {}),
81
- '@tanstack/router-plugin': packageJSON.devDependencies?.['@tanstack/router-plugin'] ?? '^1.132.0',
103
+ '@tanstack/router-plugin': packageJSON.devDependencies?.['@tanstack/router-plugin'] ?? 'latest',
82
104
  };
83
105
  }
84
106
  if (options.framework.id === 'solid') {
@@ -87,7 +109,7 @@ export function createPackageJSON(options) {
87
109
  delete packageJSON.scripts?.start;
88
110
  packageJSON.devDependencies = {
89
111
  ...(packageJSON.devDependencies ?? {}),
90
- '@tanstack/router-plugin': packageJSON.devDependencies?.['@tanstack/router-plugin'] ?? '^1.133.20',
112
+ '@tanstack/router-plugin': packageJSON.devDependencies?.['@tanstack/router-plugin'] ?? 'latest',
91
113
  };
92
114
  }
93
115
  }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Resolves npm package versions at generation time.
3
+ *
4
+ * When a template specifies "latest" for a package, we fetch the actual
5
+ * current version from the npm registry and pin it exactly, so generated
6
+ * projects don't silently drift over time.
7
+ */
8
+ export declare function resolveNpmVersion(pkg: string): Promise<string | null>;
9
+ /**
10
+ * Walk a deps object and resolve any "latest" values to pinned versions.
11
+ * Non-"latest" values are left untouched.
12
+ */
13
+ export declare function resolveLatestVersions(deps: Record<string, string>): Promise<Record<string, string>>;
14
+ /**
15
+ * Resolve all "latest" version specifiers in a package.json object's
16
+ * dependencies and devDependencies in-place, returning a new object.
17
+ */
18
+ export declare function resolvePackageJSONLatest(packageJSON: Record<string, any>): Promise<Record<string, any>>;
@@ -1,7 +1,3 @@
1
1
  import type { Options } from './types.js';
2
- export declare function mergePackageJSON(packageJSON: Record<string, any>, overlayPackageJSON?: Record<string, any>): {
3
- dependencies: any;
4
- devDependencies: any;
5
- scripts: any;
6
- };
2
+ export declare function mergePackageJSON(packageJSON: Record<string, any>, overlayPackageJSON?: Record<string, any>): Record<string, any>;
7
3
  export declare function createPackageJSON(options: Options): any;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/create",
3
- "version": "0.62.1",
3
+ "version": "0.63.0",
4
4
  "description": "TanStack Application Builder Engine",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
package/src/create-app.ts CHANGED
@@ -9,6 +9,7 @@ import {
9
9
  translateExecuteCommand,
10
10
  } from './package-manager.js'
11
11
  import { createPackageJSON } from './package-json.js'
12
+ import { resolvePackageJSONLatest } from './npm-resolver.js'
12
13
  import { createTemplateFile } from './template-file.js'
13
14
  import { installShadcnComponents } from './integrations/shadcn.js'
14
15
  import { setupGit } from './integrations/git.js'
@@ -130,9 +131,10 @@ async function writeFiles(environment: Environment, options: Options) {
130
131
  type: 'file',
131
132
  message: 'Writing package.json...',
132
133
  })
134
+ const packageJSON = await resolvePackageJSONLatest(createPackageJSON(options))
133
135
  await environment.writeFile(
134
136
  resolve(options.targetDir, './package.json'),
135
- JSON.stringify(createPackageJSON(options), null, 2),
137
+ JSON.stringify(packageJSON, null, 2),
136
138
  )
137
139
  environment.finishStep('write-package-json', 'Package.json written')
138
140
 
@@ -8,8 +8,8 @@
8
8
  "@tanstack/ai-openai": "latest",
9
9
  "@tanstack/ai-react": "latest",
10
10
  "highlight.js": "^11.11.1",
11
- "streamdown": "^1.6.5",
12
- "lucide-react": "^0.544.0",
13
- "zod": "^4.3.5"
11
+ "lucide-react": "^0.577.0",
12
+ "streamdown": "^2.3.0",
13
+ "zod": "^4.3.6"
14
14
  }
15
15
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "dependencies": {
3
- "@apollo/client": "^4.0.0",
4
- "@apollo/client-integration-tanstack-start": "^0.14.2-rc.0",
3
+ "@apollo/client": "^4.1.6",
4
+ "@apollo/client-integration-tanstack-start": "^0.14.4-rc.0",
5
5
  "graphql": "^16.10.0",
6
6
  "rxjs": "^7.8.2"
7
7
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "dependencies": {
3
- "better-auth": "^1.4.12"
3
+ "better-auth": "^1.5.3"
4
4
  }
5
5
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "dependencies": {
3
- "@clerk/clerk-react": "^5.49.0"
3
+ "@clerk/clerk-react": "^5.61.3"
4
4
  }
5
5
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "dependencies": {
3
3
  "@convex-dev/react-query": "0.1.0",
4
- "convex": "^1.27.3",
5
- "lucide-react": "^0.561.0"
4
+ "convex": "^1.32.0",
5
+ "lucide-react": "^0.577.0"
6
6
  }
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "dependencies": {
3
- "@tanstack/query-db-collection": "^1.0.8",
4
- "@tanstack/react-db": "^0.1.1",
5
- "zod": "^4.0.14"
3
+ "@tanstack/query-db-collection": "latest",
4
+ "@tanstack/react-db": "latest",
5
+ "zod": "^4.3.6"
6
6
  }
7
7
  }
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "dependencies": {
3
- "drizzle-orm": "^0.45.0",
4
- "drizzle-kit": "^0.31.8"<% if (addOnOption.drizzle.database === 'postgresql') { %>,
3
+ "drizzle-orm": "^0.45.1",
4
+ "drizzle-kit": "^0.31.9"<% if (addOnOption.drizzle.database === 'postgresql') { %>,
5
5
  "pg": "^8.16.3"<% } %><% if (addOnOption.drizzle.database === 'mysql') { %>,
6
6
  "mysql2": "^3.15.3"<% } %><% if (addOnOption.drizzle.database === 'sqlite') { %>,
7
- "better-sqlite3": "^12.5.0"<% } %>
7
+ "better-sqlite3": "^12.6.2"<% } %>
8
8
  },
9
9
  "devDependencies": {
10
- "dotenv": "^16.0.0",
11
- "tsx": "^4.0.0"<% if (addOnOption.drizzle.database === 'postgresql') { %>,
10
+ "dotenv": "^17.3.1",
11
+ "tsx": "^4.21.0"<% if (addOnOption.drizzle.database === 'postgresql') { %>,
12
12
  "@types/pg": "^8.15.6"<% } %><% if (addOnOption.drizzle.database === 'sqlite') { %>,
13
13
  "@types/better-sqlite3": "^7.6.0"<% } %>
14
14
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "dependencies": {
3
- "@tanstack/react-form": "^1.0.0",
4
- "zod": "^4.1.11"
3
+ "@tanstack/react-form": "latest",
4
+ "zod": "^4.3.6"
5
5
  }
6
6
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "dependencies": {
3
- "@modelcontextprotocol/sdk": "^1.17.0",
4
- "zod": "4.2.1"
3
+ "@modelcontextprotocol/sdk": "^1.27.1",
4
+ "zod": "^4.3.6"
5
5
  }
6
6
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "dependencies": {
3
- "@neondatabase/serverless": "^1.0.0",
4
- "@neondatabase/vite-plugin-postgres": "^0.5.0"
3
+ "@neondatabase/serverless": "^1.0.2",
4
+ "@neondatabase/vite-plugin-postgres": "^0.7.0"
5
5
  }
6
6
  }
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "dependencies": {
3
- "@orpc/client": "^1.13.0",
4
- "@orpc/json-schema": "^1.13.0",
5
- "@orpc/openapi": "^1.13.0",
6
- "@orpc/server": "^1.13.0",
7
- "@orpc/tanstack-query": "^1.13.0",
8
- "@orpc/zod": "^1.13.0",
9
- "zod": "^4.2.1"
3
+ "@orpc/client": "^1.13.6",
4
+ "@orpc/json-schema": "^1.13.6",
5
+ "@orpc/openapi": "^1.13.6",
6
+ "@orpc/server": "^1.13.6",
7
+ "@orpc/tanstack-query": "^1.13.6",
8
+ "@orpc/zod": "^1.13.6",
9
+ "zod": "^4.3.6"
10
10
  }
11
11
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "devDependencies": {
3
- "@inlang/paraglide-js": "^2.8.0"
3
+ "@inlang/paraglide-js": "^2.13.1"
4
4
  }
5
5
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "dependencies": {
3
- "posthog-js": "^1.335.4",
4
- "@posthog/react": "^1.7.0"
3
+ "@posthog/react": "^1.7.0",
4
+ "posthog-js": "^1.358.1"
5
5
  }
6
6
  }
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "dependencies": {
3
- "prisma": "^7.2.0",
4
- "@prisma/client": "^7.2.0"<% if (addOnOption.prisma.database === 'postgres') { %>,
5
- "@prisma/adapter-pg": "^7.2.0"<% } %><% if (addOnOption.prisma.database === 'mysql') { %>,
6
- "@prisma/adapter-mariadb": "^7.2.0"<% } %><% if (addOnOption.prisma.database === 'sqlite') { %>,
7
- "@prisma/adapter-better-sqlite3": "^7.2.0"<% } %>
3
+ "prisma": "^7.4.2",
4
+ "@prisma/client": "^7.4.2"<% if (addOnOption.prisma.database === 'postgres') { %>,
5
+ "@prisma/adapter-pg": "^7.4.2"<% } %><% if (addOnOption.prisma.database === 'mysql') { %>,
6
+ "@prisma/adapter-mariadb": "^7.4.2"<% } %><% if (addOnOption.prisma.database === 'sqlite') { %>,
7
+ "@prisma/adapter-better-sqlite3": "^7.4.2"<% } %>
8
8
  },
9
9
  "devDependencies": {
10
- "dotenv-cli": "^10.0.0",
11
- "tsx": "^4.20.6"
10
+ "dotenv-cli": "^11.0.0",
11
+ "tsx": "^4.21.0"
12
12
  },
13
13
  "scripts": {<% if (addOnOption.prisma.database === 'postgres') { %>
14
14
  "post-cta-init": "<%- getPackageManagerExecuteScript('create-db@latest', ['--user-agent', 'tanstack/tsrouter']) %>",<% } %>
@@ -5,7 +5,7 @@
5
5
  "start": "node --import ./.output/server/instrument.server.mjs .output/server/index.mjs"
6
6
  },
7
7
  "dependencies": {
8
- "@sentry/tanstackstart-react": "^10.34.0",
8
+ "@sentry/tanstackstart-react": "^10.42.0",
9
9
  "dotenv-cli": "^11.0.0"
10
10
  }
11
11
  }
@@ -2,7 +2,7 @@
2
2
  "dependencies": {
3
3
  "class-variance-authority": "^0.7.1",
4
4
  "clsx": "^2.1.1",
5
- "lucide-react": "^0.561.0",
5
+ "lucide-react": "^0.577.0",
6
6
  "tailwind-merge": "^3.0.2",
7
7
  "tw-animate-css": "^1.3.6"
8
8
  }
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "dependencies": {
3
- "@tanstack/store": "^0.9.1",
4
- "@tanstack/react-store": "^0.9.1"
3
+ "@tanstack/react-store": "latest",
4
+ "@tanstack/store": "latest"
5
5
  },
6
6
  "devDependencies": {
7
- "@tanstack/devtools-event-client": "^0.4.0"
7
+ "@tanstack/devtools-event-client": "latest"
8
8
  }
9
9
  }
@@ -4,7 +4,7 @@
4
4
  "build-storybook": "storybook build"
5
5
  },
6
6
  "dependencies": {
7
- "@storybook/react-vite": "^10.1.10",
8
- "storybook": "^10.1.10"
7
+ "@storybook/react-vite": "^10.2.15",
8
+ "storybook": "^10.2.15"
9
9
  }
10
10
  }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "dependencies": {
3
- "@strapi/client": "^1.6.0",
3
+ "@strapi/client": "^1.6.1",
4
4
  "react-markdown": "^9.0.1",
5
5
  "remark-gfm": "^4.0.0",
6
- "use-debounce": "^10.0.0"
6
+ "use-debounce": "^10.1.0"
7
7
  }
8
8
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "dependencies": {
3
- "zod": "^4.1.11",
4
- "@t3-oss/env-core": "^0.13.8"
3
+ "@t3-oss/env-core": "^0.13.10",
4
+ "zod": "^4.3.6"
5
5
  }
6
6
  }