vinext 0.0.26 → 0.0.27

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 (196) hide show
  1. package/README.md +89 -85
  2. package/dist/build/static-export.d.ts.map +1 -1
  3. package/dist/build/static-export.js +3 -8
  4. package/dist/build/static-export.js.map +1 -1
  5. package/dist/check.d.ts.map +1 -1
  6. package/dist/check.js +152 -48
  7. package/dist/check.js.map +1 -1
  8. package/dist/cli.js +10 -11
  9. package/dist/cli.js.map +1 -1
  10. package/dist/cloudflare/kv-cache-handler.d.ts +32 -1
  11. package/dist/cloudflare/kv-cache-handler.d.ts.map +1 -1
  12. package/dist/cloudflare/kv-cache-handler.js +47 -21
  13. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  14. package/dist/cloudflare/tpr.d.ts.map +1 -1
  15. package/dist/cloudflare/tpr.js +15 -4
  16. package/dist/cloudflare/tpr.js.map +1 -1
  17. package/dist/config/config-matchers.d.ts +27 -0
  18. package/dist/config/config-matchers.d.ts.map +1 -1
  19. package/dist/config/config-matchers.js +306 -60
  20. package/dist/config/config-matchers.js.map +1 -1
  21. package/dist/config/dotenv.d.ts.map +1 -1
  22. package/dist/config/dotenv.js +1 -6
  23. package/dist/config/dotenv.js.map +1 -1
  24. package/dist/config/next-config.d.ts +7 -0
  25. package/dist/config/next-config.d.ts.map +1 -1
  26. package/dist/config/next-config.js +44 -19
  27. package/dist/config/next-config.js.map +1 -1
  28. package/dist/deploy.d.ts.map +1 -1
  29. package/dist/deploy.js +36 -19
  30. package/dist/deploy.js.map +1 -1
  31. package/dist/entries/app-rsc-entry.d.ts.map +1 -1
  32. package/dist/entries/app-rsc-entry.js +89 -38
  33. package/dist/entries/app-rsc-entry.js.map +1 -1
  34. package/dist/entries/pages-client-entry.d.ts.map +1 -1
  35. package/dist/entries/pages-client-entry.js +5 -3
  36. package/dist/entries/pages-client-entry.js.map +1 -1
  37. package/dist/entries/pages-server-entry.d.ts.map +1 -1
  38. package/dist/entries/pages-server-entry.js +32 -10
  39. package/dist/entries/pages-server-entry.js.map +1 -1
  40. package/dist/index.d.ts +1 -1
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +204 -118
  43. package/dist/index.js.map +1 -1
  44. package/dist/init.d.ts.map +1 -1
  45. package/dist/init.js +6 -5
  46. package/dist/init.js.map +1 -1
  47. package/dist/routing/app-router.d.ts +2 -0
  48. package/dist/routing/app-router.d.ts.map +1 -1
  49. package/dist/routing/app-router.js +10 -18
  50. package/dist/routing/app-router.js.map +1 -1
  51. package/dist/routing/file-matcher.d.ts.map +1 -1
  52. package/dist/routing/file-matcher.js.map +1 -1
  53. package/dist/routing/pages-router.d.ts +2 -0
  54. package/dist/routing/pages-router.d.ts.map +1 -1
  55. package/dist/routing/pages-router.js +8 -5
  56. package/dist/routing/pages-router.js.map +1 -1
  57. package/dist/routing/utils.d.ts.map +1 -1
  58. package/dist/routing/utils.js.map +1 -1
  59. package/dist/server/api-handler.d.ts.map +1 -1
  60. package/dist/server/api-handler.js +7 -2
  61. package/dist/server/api-handler.js.map +1 -1
  62. package/dist/server/app-router-entry.d.ts +3 -2
  63. package/dist/server/app-router-entry.d.ts.map +1 -1
  64. package/dist/server/app-router-entry.js +8 -4
  65. package/dist/server/app-router-entry.js.map +1 -1
  66. package/dist/server/dev-module-runner.d.ts.map +1 -1
  67. package/dist/server/dev-module-runner.js +1 -1
  68. package/dist/server/dev-module-runner.js.map +1 -1
  69. package/dist/server/dev-origin-check.d.ts.map +1 -1
  70. package/dist/server/dev-origin-check.js.map +1 -1
  71. package/dist/server/dev-server.d.ts.map +1 -1
  72. package/dist/server/dev-server.js +30 -18
  73. package/dist/server/dev-server.js.map +1 -1
  74. package/dist/server/image-optimization.d.ts.map +1 -1
  75. package/dist/server/image-optimization.js.map +1 -1
  76. package/dist/server/instrumentation.js +1 -1
  77. package/dist/server/instrumentation.js.map +1 -1
  78. package/dist/server/isr-cache.d.ts +13 -1
  79. package/dist/server/isr-cache.d.ts.map +1 -1
  80. package/dist/server/isr-cache.js +10 -1
  81. package/dist/server/isr-cache.js.map +1 -1
  82. package/dist/server/metadata-routes.d.ts.map +1 -1
  83. package/dist/server/metadata-routes.js +6 -18
  84. package/dist/server/metadata-routes.js.map +1 -1
  85. package/dist/server/middleware-codegen.d.ts.map +1 -1
  86. package/dist/server/middleware-codegen.js +12 -10
  87. package/dist/server/middleware-codegen.js.map +1 -1
  88. package/dist/server/middleware-request-headers.d.ts +9 -0
  89. package/dist/server/middleware-request-headers.d.ts.map +1 -0
  90. package/dist/server/middleware-request-headers.js +77 -0
  91. package/dist/server/middleware-request-headers.js.map +1 -0
  92. package/dist/server/middleware.d.ts.map +1 -1
  93. package/dist/server/middleware.js +38 -19
  94. package/dist/server/middleware.js.map +1 -1
  95. package/dist/server/normalize-path.js.map +1 -1
  96. package/dist/server/prod-server.d.ts +1 -1
  97. package/dist/server/prod-server.d.ts.map +1 -1
  98. package/dist/server/prod-server.js +53 -38
  99. package/dist/server/prod-server.js.map +1 -1
  100. package/dist/server/request-pipeline.d.ts +2 -1
  101. package/dist/server/request-pipeline.d.ts.map +1 -1
  102. package/dist/server/request-pipeline.js +5 -7
  103. package/dist/server/request-pipeline.js.map +1 -1
  104. package/dist/shims/cache-runtime.d.ts.map +1 -1
  105. package/dist/shims/cache-runtime.js +21 -16
  106. package/dist/shims/cache-runtime.js.map +1 -1
  107. package/dist/shims/cache.d.ts.map +1 -1
  108. package/dist/shims/cache.js +18 -17
  109. package/dist/shims/cache.js.map +1 -1
  110. package/dist/shims/constants.d.ts.map +1 -1
  111. package/dist/shims/constants.js +1 -6
  112. package/dist/shims/constants.js.map +1 -1
  113. package/dist/shims/dynamic.d.ts.map +1 -1
  114. package/dist/shims/dynamic.js +1 -1
  115. package/dist/shims/dynamic.js.map +1 -1
  116. package/dist/shims/error-boundary.d.ts.map +1 -1
  117. package/dist/shims/error-boundary.js +2 -3
  118. package/dist/shims/error-boundary.js.map +1 -1
  119. package/dist/shims/error.d.ts.map +1 -1
  120. package/dist/shims/error.js +1 -3
  121. package/dist/shims/error.js.map +1 -1
  122. package/dist/shims/fetch-cache.d.ts.map +1 -1
  123. package/dist/shims/fetch-cache.js +53 -29
  124. package/dist/shims/fetch-cache.js.map +1 -1
  125. package/dist/shims/font-google-base.d.ts.map +1 -1
  126. package/dist/shims/font-google-base.js +16 -4
  127. package/dist/shims/font-google-base.js.map +1 -1
  128. package/dist/shims/font-google.d.ts +1 -1
  129. package/dist/shims/font-google.d.ts.map +1 -1
  130. package/dist/shims/font-google.generated.d.ts.map +1 -1
  131. package/dist/shims/font-google.generated.js +412 -206
  132. package/dist/shims/font-google.generated.js.map +1 -1
  133. package/dist/shims/font-google.js +1 -1
  134. package/dist/shims/font-google.js.map +1 -1
  135. package/dist/shims/font-local.d.ts.map +1 -1
  136. package/dist/shims/font-local.js +13 -3
  137. package/dist/shims/font-local.js.map +1 -1
  138. package/dist/shims/form.d.ts.map +1 -1
  139. package/dist/shims/form.js +2 -2
  140. package/dist/shims/form.js.map +1 -1
  141. package/dist/shims/head.d.ts.map +1 -1
  142. package/dist/shims/head.js +10 -8
  143. package/dist/shims/head.js.map +1 -1
  144. package/dist/shims/headers.d.ts +23 -5
  145. package/dist/shims/headers.d.ts.map +1 -1
  146. package/dist/shims/headers.js +97 -37
  147. package/dist/shims/headers.js.map +1 -1
  148. package/dist/shims/image.d.ts.map +1 -1
  149. package/dist/shims/image.js +35 -8
  150. package/dist/shims/image.js.map +1 -1
  151. package/dist/shims/legacy-image.d.ts.map +1 -1
  152. package/dist/shims/legacy-image.js +1 -1
  153. package/dist/shims/legacy-image.js.map +1 -1
  154. package/dist/shims/link.d.ts.map +1 -1
  155. package/dist/shims/link.js +29 -15
  156. package/dist/shims/link.js.map +1 -1
  157. package/dist/shims/metadata.d.ts +12 -2
  158. package/dist/shims/metadata.d.ts.map +1 -1
  159. package/dist/shims/metadata.js +10 -8
  160. package/dist/shims/metadata.js.map +1 -1
  161. package/dist/shims/navigation-state.d.ts.map +1 -1
  162. package/dist/shims/navigation-state.js +3 -2
  163. package/dist/shims/navigation-state.js.map +1 -1
  164. package/dist/shims/navigation.d.ts.map +1 -1
  165. package/dist/shims/navigation.js +26 -19
  166. package/dist/shims/navigation.js.map +1 -1
  167. package/dist/shims/request-context.d.ts +50 -0
  168. package/dist/shims/request-context.d.ts.map +1 -0
  169. package/dist/shims/request-context.js +59 -0
  170. package/dist/shims/request-context.js.map +1 -0
  171. package/dist/shims/router-state.d.ts.map +1 -1
  172. package/dist/shims/router-state.js +2 -1
  173. package/dist/shims/router-state.js.map +1 -1
  174. package/dist/shims/router.d.ts.map +1 -1
  175. package/dist/shims/router.js +18 -25
  176. package/dist/shims/router.js.map +1 -1
  177. package/dist/shims/script.d.ts.map +1 -1
  178. package/dist/shims/script.js.map +1 -1
  179. package/dist/shims/server.d.ts +13 -0
  180. package/dist/shims/server.d.ts.map +1 -1
  181. package/dist/shims/server.js +100 -34
  182. package/dist/shims/server.js.map +1 -1
  183. package/dist/shims/url-utils.d.ts.map +1 -1
  184. package/dist/shims/url-utils.js +1 -3
  185. package/dist/shims/url-utils.js.map +1 -1
  186. package/dist/utils/base-path.d.ts +17 -0
  187. package/dist/utils/base-path.d.ts.map +1 -0
  188. package/dist/utils/base-path.js +25 -0
  189. package/dist/utils/base-path.js.map +1 -0
  190. package/dist/utils/project.d.ts.map +1 -1
  191. package/dist/utils/project.js +2 -4
  192. package/dist/utils/project.js.map +1 -1
  193. package/dist/utils/query.d.ts.map +1 -1
  194. package/dist/utils/query.js +3 -1
  195. package/dist/utils/query.js.map +1 -1
  196. package/package.json +47 -33
package/dist/check.js CHANGED
@@ -9,26 +9,38 @@ import fs from "node:fs";
9
9
  import path from "node:path";
10
10
  // ── Import support map ─────────────────────────────────────────────────────
11
11
  const IMPORT_SUPPORT = {
12
- "next": { status: "supported", detail: "type-only exports (Metadata, NextPage, etc.)" },
12
+ next: { status: "supported", detail: "type-only exports (Metadata, NextPage, etc.)" },
13
13
  "next/link": { status: "supported" },
14
14
  "next/image": { status: "supported", detail: "uses @unpic/react (no local optimization yet)" },
15
15
  "next/router": { status: "supported" },
16
16
  "next/navigation": { status: "supported" },
17
17
  "next/headers": { status: "supported" },
18
18
  "next/server": { status: "supported", detail: "NextRequest/NextResponse shimmed" },
19
- "next/cache": { status: "supported", detail: "revalidateTag, revalidatePath, unstable_cache, cacheLife, cacheTag" },
19
+ "next/cache": {
20
+ status: "supported",
21
+ detail: "revalidateTag, revalidatePath, unstable_cache, cacheLife, cacheTag",
22
+ },
20
23
  "next/dynamic": { status: "supported" },
21
24
  "next/head": { status: "supported" },
22
25
  "next/script": { status: "supported" },
23
- "next/font/google": { status: "partial", detail: "fonts loaded from CDN, not self-hosted at build time" },
24
- "next/font/local": { status: "supported", detail: "className and variable modes both work; no build-time subsetting" },
26
+ "next/font/google": {
27
+ status: "partial",
28
+ detail: "fonts loaded from CDN, not self-hosted at build time",
29
+ },
30
+ "next/font/local": {
31
+ status: "supported",
32
+ detail: "className and variable modes both work; no build-time subsetting",
33
+ },
25
34
  "next/og": { status: "supported", detail: "ImageResponse via @vercel/og" },
26
35
  "next/config": { status: "supported" },
27
36
  "next/amp": { status: "unsupported", detail: "AMP is not supported" },
28
37
  "next/document": { status: "supported", detail: "custom _document.tsx" },
29
38
  "next/app": { status: "supported", detail: "custom _app.tsx" },
30
39
  "next/error": { status: "supported" },
31
- "next/third-parties/google": { status: "unsupported", detail: "third-party script optimization not implemented" },
40
+ "next/third-parties/google": {
41
+ status: "unsupported",
42
+ detail: "third-party script optimization not implemented",
43
+ },
32
44
  "server-only": { status: "supported" },
33
45
  "client-only": { status: "supported" },
34
46
  };
@@ -45,13 +57,22 @@ const CONFIG_SUPPORT = {
45
57
  allowedDevOrigins: { status: "supported", detail: "dev server cross-origin allowlist" },
46
58
  output: { status: "supported", detail: "'export' and 'standalone' modes" },
47
59
  transpilePackages: { status: "supported", detail: "Vite handles this natively" },
48
- webpack: { status: "unsupported", detail: "Vite replaces webpack — custom webpack configs need migration" },
60
+ webpack: {
61
+ status: "unsupported",
62
+ detail: "Vite replaces webpack — custom webpack configs need migration",
63
+ },
49
64
  "experimental.ppr": { status: "unsupported", detail: "partial prerendering not yet implemented" },
50
65
  "experimental.typedRoutes": { status: "unsupported", detail: "typed routes not implemented" },
51
- "experimental.serverActions": { status: "supported", detail: "server actions via 'use server' directive" },
66
+ "experimental.serverActions": {
67
+ status: "supported",
68
+ detail: "server actions via 'use server' directive",
69
+ },
52
70
  "i18n.domains": { status: "unsupported", detail: "domain-based i18n routing not implemented" },
53
71
  reactStrictMode: { status: "supported", detail: "always enabled" },
54
- poweredByHeader: { status: "supported", detail: "not sent (matching Next.js default when disabled)" },
72
+ poweredByHeader: {
73
+ status: "supported",
74
+ detail: "not sent (matching Next.js default when disabled)",
75
+ },
55
76
  };
56
77
  // ── Library support map ────────────────────────────────────────────────────
57
78
  const LIBRARY_SUPPORT = {
@@ -59,14 +80,32 @@ const LIBRARY_SUPPORT = {
59
80
  nuqs: { status: "supported" },
60
81
  "next-view-transitions": { status: "supported" },
61
82
  "@vercel/analytics": { status: "supported", detail: "analytics script injected client-side" },
62
- "next-intl": { status: "supported", detail: "auto-detected from i18n/request.{ts,tsx,js,jsx}; createNextIntlPlugin wrapper not needed" },
63
- "@clerk/nextjs": { status: "unsupported", detail: "deep Next.js middleware integration not compatible" },
64
- "@auth/nextjs": { status: "unsupported", detail: "relies on Next.js internal auth handlers; consider migrating to better-auth" },
65
- "next-auth": { status: "unsupported", detail: "relies on Next.js API route internals; consider migrating to better-auth (see https://authjs.dev/getting-started/migrate-to-better-auth)" },
66
- "better-auth": { status: "supported", detail: "uses only public next/* APIs (headers, cookies, NextRequest/NextResponse)" },
67
- "@sentry/nextjs": { status: "partial", detail: "client-side works, server integration needs manual setup" },
83
+ "next-intl": {
84
+ status: "supported",
85
+ detail: "auto-detected from i18n/request.{ts,tsx,js,jsx}; createNextIntlPlugin wrapper not needed",
86
+ },
87
+ "@clerk/nextjs": {
88
+ status: "unsupported",
89
+ detail: "deep Next.js middleware integration not compatible",
90
+ },
91
+ "@auth/nextjs": {
92
+ status: "unsupported",
93
+ detail: "relies on Next.js internal auth handlers; consider migrating to better-auth",
94
+ },
95
+ "next-auth": {
96
+ status: "unsupported",
97
+ detail: "relies on Next.js API route internals; consider migrating to better-auth (see https://authjs.dev/getting-started/migrate-to-better-auth)",
98
+ },
99
+ "better-auth": {
100
+ status: "supported",
101
+ detail: "uses only public next/* APIs (headers, cookies, NextRequest/NextResponse)",
102
+ },
103
+ "@sentry/nextjs": {
104
+ status: "partial",
105
+ detail: "client-side works, server integration needs manual setup",
106
+ },
68
107
  "@t3-oss/env-nextjs": { status: "supported" },
69
- "tailwindcss": { status: "supported" },
108
+ tailwindcss: { status: "supported" },
70
109
  "styled-components": { status: "supported", detail: "SSR via useServerInsertedHTML" },
71
110
  "@emotion/react": { status: "supported", detail: "SSR via useServerInsertedHTML" },
72
111
  "lucide-react": { status: "supported" },
@@ -90,11 +129,14 @@ function findSourceFiles(dir, extensions = [".ts", ".tsx", ".js", ".jsx", ".mjs"
90
129
  for (const entry of entries) {
91
130
  const fullPath = path.join(dir, entry.name);
92
131
  if (entry.isDirectory()) {
93
- if (entry.name === "node_modules" || entry.name === ".next" || entry.name === "dist" || entry.name === ".git")
132
+ if (entry.name === "node_modules" ||
133
+ entry.name === ".next" ||
134
+ entry.name === "dist" ||
135
+ entry.name === ".git")
94
136
  continue;
95
137
  results.push(...findSourceFiles(fullPath, extensions));
96
138
  }
97
- else if (extensions.some(ext => entry.name.endsWith(ext))) {
139
+ else if (extensions.some((ext) => entry.name.endsWith(ext))) {
98
140
  results.push(fullPath);
99
141
  }
100
142
  }
@@ -120,7 +162,10 @@ export function scanImports(root) {
120
162
  if (typeOnlyImportRegex.test(line))
121
163
  continue;
122
164
  // Only track next/* imports and server-only/client-only
123
- if (mod.startsWith("next/") || mod === "next" || mod === "server-only" || mod === "client-only") {
165
+ if (mod.startsWith("next/") ||
166
+ mod === "next" ||
167
+ mod === "server-only" ||
168
+ mod === "client-only") {
124
169
  // Normalize: next/font/google -> next/font/google
125
170
  const normalized = mod === "next" ? "next" : mod;
126
171
  if (!importUsage.has(normalized))
@@ -173,15 +218,32 @@ export function analyzeConfig(root) {
173
218
  }
174
219
  }
175
220
  if (!configPath) {
176
- return [{ name: "next.config", status: "supported", detail: "no config file found (defaults are fine)" }];
221
+ return [
222
+ {
223
+ name: "next.config",
224
+ status: "supported",
225
+ detail: "no config file found (defaults are fine)",
226
+ },
227
+ ];
177
228
  }
178
229
  const content = fs.readFileSync(configPath, "utf-8");
179
230
  const items = [];
180
231
  // Check for known config options by searching for property names in the config file
181
232
  const configOptions = [
182
- "basePath", "trailingSlash", "redirects", "rewrites", "headers",
183
- "i18n", "env", "images", "allowedDevOrigins", "output", "transpilePackages", "webpack",
184
- "reactStrictMode", "poweredByHeader",
233
+ "basePath",
234
+ "trailingSlash",
235
+ "redirects",
236
+ "rewrites",
237
+ "headers",
238
+ "i18n",
239
+ "env",
240
+ "images",
241
+ "allowedDevOrigins",
242
+ "output",
243
+ "transpilePackages",
244
+ "webpack",
245
+ "reactStrictMode",
246
+ "poweredByHeader",
185
247
  ];
186
248
  for (const opt of configOptions) {
187
249
  // Simple heuristic: check if the option name appears as a property in the config
@@ -202,10 +264,16 @@ export function analyzeConfig(root) {
202
264
  items.push({ name: "experimental.ppr", ...CONFIG_SUPPORT["experimental.ppr"] });
203
265
  }
204
266
  if (/\btypedRoutes\b/.test(content)) {
205
- items.push({ name: "experimental.typedRoutes", ...CONFIG_SUPPORT["experimental.typedRoutes"] });
267
+ items.push({
268
+ name: "experimental.typedRoutes",
269
+ ...CONFIG_SUPPORT["experimental.typedRoutes"],
270
+ });
206
271
  }
207
272
  if (/\bserverActions\b/.test(content)) {
208
- items.push({ name: "experimental.serverActions", ...CONFIG_SUPPORT["experimental.serverActions"] });
273
+ items.push({
274
+ name: "experimental.serverActions",
275
+ ...CONFIG_SUPPORT["experimental.serverActions"],
276
+ });
209
277
  }
210
278
  }
211
279
  // Check for i18n.domains
@@ -264,36 +332,52 @@ export function checkConventions(root) {
264
332
  const hasPages = pagesDir !== null;
265
333
  const hasApp = appDirPath !== null;
266
334
  const hasProxy = fs.existsSync(path.join(root, "proxy.ts")) || fs.existsSync(path.join(root, "proxy.js"));
267
- const hasMiddleware = fs.existsSync(path.join(root, "middleware.ts")) || fs.existsSync(path.join(root, "middleware.js"));
335
+ const hasMiddleware = fs.existsSync(path.join(root, "middleware.ts")) ||
336
+ fs.existsSync(path.join(root, "middleware.js"));
268
337
  if (hasPages) {
269
338
  const isSrc = pagesDir.includes(path.join("src", "pages"));
270
- items.push({ name: isSrc ? "Pages Router (src/pages/)" : "Pages Router (pages/)", status: "supported" });
339
+ items.push({
340
+ name: isSrc ? "Pages Router (src/pages/)" : "Pages Router (pages/)",
341
+ status: "supported",
342
+ });
271
343
  // Count pages
272
344
  const pageFiles = findSourceFiles(pagesDir);
273
- const pages = pageFiles.filter(f => !f.includes("/api/") && !f.includes("_app") && !f.includes("_document") && !f.includes("_error"));
274
- const apiRoutes = pageFiles.filter(f => f.includes("/api/"));
345
+ const pages = pageFiles.filter((f) => !f.includes("/api/") &&
346
+ !f.includes("_app") &&
347
+ !f.includes("_document") &&
348
+ !f.includes("_error"));
349
+ const apiRoutes = pageFiles.filter((f) => f.includes("/api/"));
275
350
  items.push({ name: `${pages.length} page(s)`, status: "supported" });
276
351
  if (apiRoutes.length) {
277
352
  items.push({ name: `${apiRoutes.length} API route(s)`, status: "supported" });
278
353
  }
279
354
  // Check for _app, _document
280
- if (pageFiles.some(f => f.includes("_app"))) {
355
+ if (pageFiles.some((f) => f.includes("_app"))) {
281
356
  items.push({ name: "Custom _app", status: "supported" });
282
357
  }
283
- if (pageFiles.some(f => f.includes("_document"))) {
358
+ if (pageFiles.some((f) => f.includes("_document"))) {
284
359
  items.push({ name: "Custom _document", status: "supported" });
285
360
  }
286
361
  }
287
362
  if (hasApp) {
288
363
  const isSrc = appDirPath.includes(path.join("src", "app"));
289
- items.push({ name: isSrc ? "App Router (src/app/)" : "App Router (app/)", status: "supported" });
364
+ items.push({
365
+ name: isSrc ? "App Router (src/app/)" : "App Router (app/)",
366
+ status: "supported",
367
+ });
290
368
  const appFiles = findSourceFiles(appDirPath);
291
- const pages = appFiles.filter(f => f.endsWith("page.tsx") || f.endsWith("page.jsx") || f.endsWith("page.ts") || f.endsWith("page.js"));
292
- const layouts = appFiles.filter(f => f.endsWith("layout.tsx") || f.endsWith("layout.jsx") || f.endsWith("layout.ts") || f.endsWith("layout.js"));
293
- const routes = appFiles.filter(f => f.endsWith("route.tsx") || f.endsWith("route.ts") || f.endsWith("route.js"));
294
- const loadings = appFiles.filter(f => f.endsWith("loading.tsx") || f.endsWith("loading.jsx"));
295
- const errors = appFiles.filter(f => f.endsWith("error.tsx") || f.endsWith("error.jsx"));
296
- const notFounds = appFiles.filter(f => f.endsWith("not-found.tsx") || f.endsWith("not-found.jsx"));
369
+ const pages = appFiles.filter((f) => f.endsWith("page.tsx") ||
370
+ f.endsWith("page.jsx") ||
371
+ f.endsWith("page.ts") ||
372
+ f.endsWith("page.js"));
373
+ const layouts = appFiles.filter((f) => f.endsWith("layout.tsx") ||
374
+ f.endsWith("layout.jsx") ||
375
+ f.endsWith("layout.ts") ||
376
+ f.endsWith("layout.js"));
377
+ const routes = appFiles.filter((f) => f.endsWith("route.tsx") || f.endsWith("route.ts") || f.endsWith("route.js"));
378
+ const loadings = appFiles.filter((f) => f.endsWith("loading.tsx") || f.endsWith("loading.jsx"));
379
+ const errors = appFiles.filter((f) => f.endsWith("error.tsx") || f.endsWith("error.jsx"));
380
+ const notFounds = appFiles.filter((f) => f.endsWith("not-found.tsx") || f.endsWith("not-found.jsx"));
297
381
  items.push({ name: `${pages.length} page(s)`, status: "supported" });
298
382
  if (layouts.length)
299
383
  items.push({ name: `${layouts.length} layout(s)`, status: "supported" });
@@ -313,7 +397,11 @@ export function checkConventions(root) {
313
397
  items.push({ name: "middleware.ts (deprecated in Next.js 16)", status: "supported" });
314
398
  }
315
399
  if (!hasPages && !hasApp) {
316
- items.push({ name: "No pages/ or app/ directory found", status: "unsupported", detail: "vinext requires a pages/ or app/ directory" });
400
+ items.push({
401
+ name: "No pages/ or app/ directory found",
402
+ status: "unsupported",
403
+ detail: "vinext requires a pages/ or app/ directory",
404
+ });
317
405
  }
318
406
  // Check for "type": "module" in package.json
319
407
  const pkgPath = path.join(root, "package.json");
@@ -380,9 +468,9 @@ export function runCheck(root) {
380
468
  const libraries = checkLibraries(root);
381
469
  const conventions = checkConventions(root);
382
470
  const allItems = [...imports, ...config, ...libraries, ...conventions];
383
- const supported = allItems.filter(i => i.status === "supported").length;
384
- const partial = allItems.filter(i => i.status === "partial").length;
385
- const unsupported = allItems.filter(i => i.status === "unsupported").length;
471
+ const supported = allItems.filter((i) => i.status === "supported").length;
472
+ const partial = allItems.filter((i) => i.status === "partial").length;
473
+ const unsupported = allItems.filter((i) => i.status === "unsupported").length;
386
474
  const total = allItems.length;
387
475
  // Score: supported = 1, partial = 0.5, unsupported = 0
388
476
  const score = total > 0 ? Math.round(((supported + partial * 0.5) / total) * 100) : 100;
@@ -399,25 +487,31 @@ export function runCheck(root) {
399
487
  */
400
488
  export function formatReport(result, opts) {
401
489
  const lines = [];
402
- const statusIcon = (s) => s === "supported" ? "\x1b[32m✓\x1b[0m" : s === "partial" ? "\x1b[33m~\x1b[0m" : "\x1b[31m✗\x1b[0m";
490
+ const statusIcon = (s) => s === "supported"
491
+ ? "\x1b[32m✓\x1b[0m"
492
+ : s === "partial"
493
+ ? "\x1b[33m~\x1b[0m"
494
+ : "\x1b[31m✗\x1b[0m";
403
495
  lines.push("");
404
496
  lines.push(" \x1b[1mvinext compatibility report\x1b[0m");
405
497
  lines.push(" " + "=".repeat(40));
406
498
  lines.push("");
407
499
  // Imports
408
500
  if (result.imports.length > 0) {
409
- const importSupported = result.imports.filter(i => i.status === "supported").length;
501
+ const importSupported = result.imports.filter((i) => i.status === "supported").length;
410
502
  lines.push(` \x1b[1mImports\x1b[0m: ${importSupported}/${result.imports.length} fully supported`);
411
503
  for (const item of result.imports) {
412
504
  const suffix = item.detail ? ` \x1b[90m— ${item.detail}\x1b[0m` : "";
413
- const fileCount = item.files ? ` \x1b[90m(${item.files.length} file${item.files.length === 1 ? "" : "s"})\x1b[0m` : "";
505
+ const fileCount = item.files
506
+ ? ` \x1b[90m(${item.files.length} file${item.files.length === 1 ? "" : "s"})\x1b[0m`
507
+ : "";
414
508
  lines.push(` ${statusIcon(item.status)} ${item.name}${fileCount}${suffix}`);
415
509
  }
416
510
  lines.push("");
417
511
  }
418
512
  // Config
419
513
  if (result.config.length > 0) {
420
- const configSupported = result.config.filter(i => i.status === "supported").length;
514
+ const configSupported = result.config.filter((i) => i.status === "supported").length;
421
515
  lines.push(` \x1b[1mConfig\x1b[0m: ${configSupported}/${result.config.length} options supported`);
422
516
  for (const item of result.config) {
423
517
  const suffix = item.detail ? ` \x1b[90m— ${item.detail}\x1b[0m` : "";
@@ -427,7 +521,7 @@ export function formatReport(result, opts) {
427
521
  }
428
522
  // Libraries
429
523
  if (result.libraries.length > 0) {
430
- const libSupported = result.libraries.filter(i => i.status === "supported").length;
524
+ const libSupported = result.libraries.filter((i) => i.status === "supported").length;
431
525
  lines.push(` \x1b[1mLibraries\x1b[0m: ${libSupported}/${result.libraries.length} compatible`);
432
526
  for (const item of result.libraries) {
433
527
  const suffix = item.detail ? ` \x1b[90m— ${item.detail}\x1b[0m` : "";
@@ -452,7 +546,12 @@ export function formatReport(result, opts) {
452
546
  if (unsupported > 0) {
453
547
  lines.push("");
454
548
  lines.push(" \x1b[1mIssues to address:\x1b[0m");
455
- const allItems = [...result.imports, ...result.config, ...result.libraries, ...result.conventions];
549
+ const allItems = [
550
+ ...result.imports,
551
+ ...result.config,
552
+ ...result.libraries,
553
+ ...result.conventions,
554
+ ];
456
555
  for (const item of allItems) {
457
556
  if (item.status === "unsupported") {
458
557
  lines.push(` \x1b[31m✗\x1b[0m ${item.name}${item.detail ? ` — ${item.detail}` : ""}`);
@@ -462,7 +561,12 @@ export function formatReport(result, opts) {
462
561
  if (result.summary.partial > 0) {
463
562
  lines.push("");
464
563
  lines.push(" \x1b[1mPartial support (may need attention):\x1b[0m");
465
- const allItems = [...result.imports, ...result.config, ...result.libraries, ...result.conventions];
564
+ const allItems = [
565
+ ...result.imports,
566
+ ...result.config,
567
+ ...result.libraries,
568
+ ...result.conventions,
569
+ ];
466
570
  for (const item of allItems) {
467
571
  if (item.status === "partial") {
468
572
  lines.push(` \x1b[33m~\x1b[0m ${item.name}${item.detail ? ` — ${item.detail}` : ""}`);
package/dist/check.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * vinext check — compatibility scanner for Next.js apps\n *\n * Scans an existing Next.js app and produces a compatibility report\n * showing what will work, what needs changes, and an overall score.\n */\n\nimport { detectPackageManager } from \"./utils/project.js\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\n// ── Support status definitions ─────────────────────────────────────────────\n\ntype Status = \"supported\" | \"partial\" | \"unsupported\";\n\ninterface CheckItem {\n name: string;\n status: Status;\n detail?: string;\n files?: string[];\n}\n\nexport interface CheckResult {\n imports: CheckItem[];\n config: CheckItem[];\n libraries: CheckItem[];\n conventions: CheckItem[];\n summary: {\n supported: number;\n partial: number;\n unsupported: number;\n total: number;\n score: number;\n };\n}\n\n// ── Import support map ─────────────────────────────────────────────────────\n\nconst IMPORT_SUPPORT: Record<string, { status: Status; detail?: string }> = {\n \"next\": { status: \"supported\", detail: \"type-only exports (Metadata, NextPage, etc.)\" },\n \"next/link\": { status: \"supported\" },\n \"next/image\": { status: \"supported\", detail: \"uses @unpic/react (no local optimization yet)\" },\n \"next/router\": { status: \"supported\" },\n \"next/navigation\": { status: \"supported\" },\n \"next/headers\": { status: \"supported\" },\n \"next/server\": { status: \"supported\", detail: \"NextRequest/NextResponse shimmed\" },\n \"next/cache\": { status: \"supported\", detail: \"revalidateTag, revalidatePath, unstable_cache, cacheLife, cacheTag\" },\n \"next/dynamic\": { status: \"supported\" },\n \"next/head\": { status: \"supported\" },\n \"next/script\": { status: \"supported\" },\n \"next/font/google\": { status: \"partial\", detail: \"fonts loaded from CDN, not self-hosted at build time\" },\n \"next/font/local\": { status: \"supported\", detail: \"className and variable modes both work; no build-time subsetting\" },\n \"next/og\": { status: \"supported\", detail: \"ImageResponse via @vercel/og\" },\n \"next/config\": { status: \"supported\" },\n \"next/amp\": { status: \"unsupported\", detail: \"AMP is not supported\" },\n \"next/document\": { status: \"supported\", detail: \"custom _document.tsx\" },\n \"next/app\": { status: \"supported\", detail: \"custom _app.tsx\" },\n \"next/error\": { status: \"supported\" },\n \"next/third-parties/google\": { status: \"unsupported\", detail: \"third-party script optimization not implemented\" },\n \"server-only\": { status: \"supported\" },\n \"client-only\": { status: \"supported\" },\n};\n\n// ── Config support map ─────────────────────────────────────────────────────\n\nconst CONFIG_SUPPORT: Record<string, { status: Status; detail?: string }> = {\n basePath: { status: \"supported\" },\n trailingSlash: { status: \"supported\" },\n redirects: { status: \"supported\" },\n rewrites: { status: \"supported\" },\n headers: { status: \"supported\" },\n i18n: { status: \"supported\", detail: \"path-prefix routing (domains not yet supported)\" },\n env: { status: \"supported\" },\n images: { status: \"partial\", detail: \"remotePatterns validated, no local optimization\" },\n allowedDevOrigins: { status: \"supported\", detail: \"dev server cross-origin allowlist\" },\n output: { status: \"supported\", detail: \"'export' and 'standalone' modes\" },\n transpilePackages: { status: \"supported\", detail: \"Vite handles this natively\" },\n webpack: { status: \"unsupported\", detail: \"Vite replaces webpack — custom webpack configs need migration\" },\n \"experimental.ppr\": { status: \"unsupported\", detail: \"partial prerendering not yet implemented\" },\n \"experimental.typedRoutes\": { status: \"unsupported\", detail: \"typed routes not implemented\" },\n \"experimental.serverActions\": { status: \"supported\", detail: \"server actions via 'use server' directive\" },\n \"i18n.domains\": { status: \"unsupported\", detail: \"domain-based i18n routing not implemented\" },\n reactStrictMode: { status: \"supported\", detail: \"always enabled\" },\n poweredByHeader: { status: \"supported\", detail: \"not sent (matching Next.js default when disabled)\" },\n};\n\n// ── Library support map ────────────────────────────────────────────────────\n\nconst LIBRARY_SUPPORT: Record<string, { status: Status; detail?: string }> = {\n \"next-themes\": { status: \"supported\" },\n nuqs: { status: \"supported\" },\n \"next-view-transitions\": { status: \"supported\" },\n \"@vercel/analytics\": { status: \"supported\", detail: \"analytics script injected client-side\" },\n \"next-intl\": { status: \"supported\", detail: \"auto-detected from i18n/request.{ts,tsx,js,jsx}; createNextIntlPlugin wrapper not needed\" },\n \"@clerk/nextjs\": { status: \"unsupported\", detail: \"deep Next.js middleware integration not compatible\" },\n \"@auth/nextjs\": { status: \"unsupported\", detail: \"relies on Next.js internal auth handlers; consider migrating to better-auth\" },\n \"next-auth\": { status: \"unsupported\", detail: \"relies on Next.js API route internals; consider migrating to better-auth (see https://authjs.dev/getting-started/migrate-to-better-auth)\" },\n \"better-auth\": { status: \"supported\", detail: \"uses only public next/* APIs (headers, cookies, NextRequest/NextResponse)\" },\n \"@sentry/nextjs\": { status: \"partial\", detail: \"client-side works, server integration needs manual setup\" },\n \"@t3-oss/env-nextjs\": { status: \"supported\" },\n \"tailwindcss\": { status: \"supported\" },\n \"styled-components\": { status: \"supported\", detail: \"SSR via useServerInsertedHTML\" },\n \"@emotion/react\": { status: \"supported\", detail: \"SSR via useServerInsertedHTML\" },\n \"lucide-react\": { status: \"supported\" },\n \"framer-motion\": { status: \"supported\" },\n \"@radix-ui/react-dialog\": { status: \"supported\" },\n \"shadcn-ui\": { status: \"supported\" },\n zod: { status: \"supported\" },\n \"react-hook-form\": { status: \"supported\" },\n prisma: { status: \"supported\", detail: \"works on Cloudflare Workers with Prisma Accelerate\" },\n drizzle: { status: \"supported\", detail: \"works with D1 on Cloudflare Workers\" },\n};\n\n// ── Scanning functions ─────────────────────────────────────────────────────\n\n/**\n * Recursively find all source files in a directory.\n */\nfunction findSourceFiles(dir: string, extensions = [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\"]): string[] {\n const results: string[] = [];\n if (!fs.existsSync(dir)) return results;\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\" || entry.name === \".next\" || entry.name === \"dist\" || entry.name === \".git\") continue;\n results.push(...findSourceFiles(fullPath, extensions));\n } else if (extensions.some(ext => entry.name.endsWith(ext))) {\n results.push(fullPath);\n }\n }\n return results;\n}\n\n/**\n * Scan source files for `import ... from 'next/...'` statements.\n */\nexport function scanImports(root: string): CheckItem[] {\n const files = findSourceFiles(root);\n const importUsage = new Map<string, string[]>();\n\n const importRegex = /(?:import\\s+(?:[\\w{},\\s*]+\\s+from\\s+)?|require\\s*\\()['\"]([^'\"]+)['\"]\\)?/g;\n // Skip `import type` and `import { type ... }` — they're erased at compile time\n const typeOnlyImportRegex = /import\\s+type\\s+/;\n\n for (const file of files) {\n const content = fs.readFileSync(file, \"utf-8\");\n let match;\n while ((match = importRegex.exec(content)) !== null) {\n const mod = match[1];\n // Skip type-only imports (no runtime effect)\n const lineStart = content.lastIndexOf(\"\\n\", match.index) + 1;\n const line = content.slice(lineStart, match.index + match[0].length);\n if (typeOnlyImportRegex.test(line)) continue;\n // Only track next/* imports and server-only/client-only\n if (mod.startsWith(\"next/\") || mod === \"next\" || mod === \"server-only\" || mod === \"client-only\") {\n // Normalize: next/font/google -> next/font/google\n const normalized = mod === \"next\" ? \"next\" : mod;\n if (!importUsage.has(normalized)) importUsage.set(normalized, []);\n const relFile = path.relative(root, file);\n if (!importUsage.get(normalized)!.includes(relFile)) {\n importUsage.get(normalized)!.push(relFile);\n }\n }\n }\n }\n\n const items: CheckItem[] = [];\n for (const [mod, usedFiles] of importUsage) {\n const support = IMPORT_SUPPORT[mod];\n if (support) {\n items.push({\n name: mod,\n status: support.status,\n detail: support.detail,\n files: usedFiles,\n });\n } else {\n items.push({\n name: mod,\n status: \"unsupported\",\n detail: \"not recognized by vinext\",\n files: usedFiles,\n });\n }\n }\n\n // Sort: unsupported first, then partial, then supported\n items.sort((a, b) => {\n const order: Record<Status, number> = { unsupported: 0, partial: 1, supported: 2 };\n return order[a.status] - order[b.status];\n });\n\n return items;\n}\n\n/**\n * Analyze next.config.js/mjs/ts for supported and unsupported options.\n */\nexport function analyzeConfig(root: string): CheckItem[] {\n const configFiles = [\"next.config.ts\", \"next.config.mjs\", \"next.config.js\", \"next.config.cjs\"];\n let configPath: string | null = null;\n for (const f of configFiles) {\n const p = path.join(root, f);\n if (fs.existsSync(p)) { configPath = p; break; }\n }\n\n if (!configPath) {\n return [{ name: \"next.config\", status: \"supported\", detail: \"no config file found (defaults are fine)\" }];\n }\n\n const content = fs.readFileSync(configPath, \"utf-8\");\n const items: CheckItem[] = [];\n\n // Check for known config options by searching for property names in the config file\n const configOptions = [\n \"basePath\", \"trailingSlash\", \"redirects\", \"rewrites\", \"headers\",\n \"i18n\", \"env\", \"images\", \"allowedDevOrigins\", \"output\", \"transpilePackages\", \"webpack\",\n \"reactStrictMode\", \"poweredByHeader\",\n ];\n\n for (const opt of configOptions) {\n // Simple heuristic: check if the option name appears as a property in the config\n const regex = new RegExp(`\\\\b${opt}\\\\b`);\n if (regex.test(content)) {\n const support = CONFIG_SUPPORT[opt];\n if (support) {\n items.push({ name: opt, status: support.status, detail: support.detail });\n } else {\n items.push({ name: opt, status: \"unsupported\", detail: \"not recognized\" });\n }\n }\n }\n\n // Check for experimental options\n if (/experimental\\s*[:=]\\s*\\{/.test(content)) {\n if (/\\bppr\\b/.test(content)) {\n items.push({ name: \"experimental.ppr\", ...CONFIG_SUPPORT[\"experimental.ppr\"]! });\n }\n if (/\\btypedRoutes\\b/.test(content)) {\n items.push({ name: \"experimental.typedRoutes\", ...CONFIG_SUPPORT[\"experimental.typedRoutes\"]! });\n }\n if (/\\bserverActions\\b/.test(content)) {\n items.push({ name: \"experimental.serverActions\", ...CONFIG_SUPPORT[\"experimental.serverActions\"]! });\n }\n }\n\n // Check for i18n.domains\n if (/domains\\s*:/.test(content) && /i18n/.test(content)) {\n items.push({ name: \"i18n.domains\", ...CONFIG_SUPPORT[\"i18n.domains\"]! });\n }\n\n // Sort: unsupported first\n items.sort((a, b) => {\n const order: Record<Status, number> = { unsupported: 0, partial: 1, supported: 2 };\n return order[a.status] - order[b.status];\n });\n\n return items;\n}\n\n/**\n * Check package.json dependencies for known libraries.\n */\nexport function checkLibraries(root: string): CheckItem[] {\n const pkgPath = path.join(root, \"package.json\");\n if (!fs.existsSync(pkgPath)) return [];\n\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n const items: CheckItem[] = [];\n\n for (const [lib, support] of Object.entries(LIBRARY_SUPPORT)) {\n if (allDeps[lib]) {\n items.push({\n name: lib,\n status: support.status,\n detail: support.detail,\n });\n }\n }\n\n // Sort: unsupported first\n items.sort((a, b) => {\n const order: Record<Status, number> = { unsupported: 0, partial: 1, supported: 2 };\n return order[a.status] - order[b.status];\n });\n\n return items;\n}\n\n/**\n * Check file conventions (pages, app directory, middleware, etc.)\n */\nexport function checkConventions(root: string): CheckItem[] {\n const items: CheckItem[] = [];\n\n // Check for pages/ and app/ at root level, then fall back to src/\n const pagesDir = fs.existsSync(path.join(root, \"pages\"))\n ? path.join(root, \"pages\")\n : fs.existsSync(path.join(root, \"src\", \"pages\"))\n ? path.join(root, \"src\", \"pages\")\n : null;\n const appDirPath = fs.existsSync(path.join(root, \"app\"))\n ? path.join(root, \"app\")\n : fs.existsSync(path.join(root, \"src\", \"app\"))\n ? path.join(root, \"src\", \"app\")\n : null;\n\n const hasPages = pagesDir !== null;\n const hasApp = appDirPath !== null;\n const hasProxy = fs.existsSync(path.join(root, \"proxy.ts\")) || fs.existsSync(path.join(root, \"proxy.js\"));\n const hasMiddleware = fs.existsSync(path.join(root, \"middleware.ts\")) || fs.existsSync(path.join(root, \"middleware.js\"));\n\n if (hasPages) {\n const isSrc = pagesDir!.includes(path.join(\"src\", \"pages\"));\n items.push({ name: isSrc ? \"Pages Router (src/pages/)\" : \"Pages Router (pages/)\", status: \"supported\" });\n\n // Count pages\n const pageFiles = findSourceFiles(pagesDir!);\n const pages = pageFiles.filter(f => !f.includes(\"/api/\") && !f.includes(\"_app\") && !f.includes(\"_document\") && !f.includes(\"_error\"));\n const apiRoutes = pageFiles.filter(f => f.includes(\"/api/\"));\n items.push({ name: `${pages.length} page(s)`, status: \"supported\" });\n if (apiRoutes.length) {\n items.push({ name: `${apiRoutes.length} API route(s)`, status: \"supported\" });\n }\n\n // Check for _app, _document\n if (pageFiles.some(f => f.includes(\"_app\"))) {\n items.push({ name: \"Custom _app\", status: \"supported\" });\n }\n if (pageFiles.some(f => f.includes(\"_document\"))) {\n items.push({ name: \"Custom _document\", status: \"supported\" });\n }\n }\n\n if (hasApp) {\n const isSrc = appDirPath!.includes(path.join(\"src\", \"app\"));\n items.push({ name: isSrc ? \"App Router (src/app/)\" : \"App Router (app/)\", status: \"supported\" });\n\n const appFiles = findSourceFiles(appDirPath!);\n const pages = appFiles.filter(f => f.endsWith(\"page.tsx\") || f.endsWith(\"page.jsx\") || f.endsWith(\"page.ts\") || f.endsWith(\"page.js\"));\n const layouts = appFiles.filter(f => f.endsWith(\"layout.tsx\") || f.endsWith(\"layout.jsx\") || f.endsWith(\"layout.ts\") || f.endsWith(\"layout.js\"));\n const routes = appFiles.filter(f => f.endsWith(\"route.tsx\") || f.endsWith(\"route.ts\") || f.endsWith(\"route.js\"));\n const loadings = appFiles.filter(f => f.endsWith(\"loading.tsx\") || f.endsWith(\"loading.jsx\"));\n const errors = appFiles.filter(f => f.endsWith(\"error.tsx\") || f.endsWith(\"error.jsx\"));\n const notFounds = appFiles.filter(f => f.endsWith(\"not-found.tsx\") || f.endsWith(\"not-found.jsx\"));\n\n items.push({ name: `${pages.length} page(s)`, status: \"supported\" });\n if (layouts.length) items.push({ name: `${layouts.length} layout(s)`, status: \"supported\" });\n if (routes.length) items.push({ name: `${routes.length} route handler(s)`, status: \"supported\" });\n if (loadings.length) items.push({ name: `${loadings.length} loading boundary(ies)`, status: \"supported\" });\n if (errors.length) items.push({ name: `${errors.length} error boundary(ies)`, status: \"supported\" });\n if (notFounds.length) items.push({ name: `${notFounds.length} not-found page(s)`, status: \"supported\" });\n }\n\n if (hasProxy) {\n items.push({ name: \"proxy.ts (Next.js 16)\", status: \"supported\" });\n } else if (hasMiddleware) {\n items.push({ name: \"middleware.ts (deprecated in Next.js 16)\", status: \"supported\" });\n }\n\n if (!hasPages && !hasApp) {\n items.push({ name: \"No pages/ or app/ directory found\", status: \"unsupported\", detail: \"vinext requires a pages/ or app/ directory\" });\n }\n\n // Check for \"type\": \"module\" in package.json\n const pkgPath = path.join(root, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n if (pkg.type !== \"module\") {\n items.push({\n name: 'Missing \"type\": \"module\" in package.json',\n status: \"unsupported\",\n detail: \"required for Vite — vinext init will add it automatically\",\n });\n }\n }\n\n // Scan for ViewTransition import from react\n const allSourceFiles = findSourceFiles(root);\n const viewTransitionRegex = /import\\s+\\{[^}]*\\bViewTransition\\b[^}]*\\}\\s+from\\s+['\"]react['\"]/;\n const viewTransitionFiles: string[] = [];\n for (const file of allSourceFiles) {\n const content = fs.readFileSync(file, \"utf-8\");\n if (viewTransitionRegex.test(content)) {\n viewTransitionFiles.push(path.relative(root, file));\n }\n }\n if (viewTransitionFiles.length > 0) {\n items.push({\n name: \"ViewTransition (React canary API)\",\n status: \"partial\",\n detail: \"vinext auto-shims with a passthrough fallback, view transitions won't animate\",\n files: viewTransitionFiles,\n });\n }\n\n // Check PostCSS config for string-form plugins\n const postcssConfigs = [\"postcss.config.mjs\", \"postcss.config.js\", \"postcss.config.cjs\"];\n for (const configFile of postcssConfigs) {\n const configPath = path.join(root, configFile);\n if (fs.existsSync(configPath)) {\n const content = fs.readFileSync(configPath, \"utf-8\");\n // Detect string-form plugins: plugins: [\"...\"] or plugins: ['...']\n const stringPluginRegex = /plugins\\s*:\\s*\\[[\\s\\S]*?(['\"][^'\"]+['\"])[\\s\\S]*?\\]/;\n const match = stringPluginRegex.exec(content);\n if (match) {\n // Check it's not require() or import() form — just bare string literals in the array\n const pluginsBlock = match[0];\n // If plugins array contains string literals not wrapped in require()\n if (/plugins\\s*:\\s*\\[[\\s\\n]*['\"]/.test(pluginsBlock)) {\n items.push({\n name: `PostCSS string-form plugins (${configFile})`,\n status: \"partial\",\n detail: \"string-form PostCSS plugins need resolution — vinext handles this automatically\",\n });\n }\n }\n break; // Only check the first config file found\n }\n }\n\n return items;\n}\n\n/**\n * Run the full compatibility check.\n */\nexport function runCheck(root: string): CheckResult {\n const imports = scanImports(root);\n const config = analyzeConfig(root);\n const libraries = checkLibraries(root);\n const conventions = checkConventions(root);\n\n const allItems = [...imports, ...config, ...libraries, ...conventions];\n const supported = allItems.filter(i => i.status === \"supported\").length;\n const partial = allItems.filter(i => i.status === \"partial\").length;\n const unsupported = allItems.filter(i => i.status === \"unsupported\").length;\n const total = allItems.length;\n // Score: supported = 1, partial = 0.5, unsupported = 0\n const score = total > 0 ? Math.round(((supported + partial * 0.5) / total) * 100) : 100;\n\n return {\n imports,\n config,\n libraries,\n conventions,\n summary: { supported, partial, unsupported, total, score },\n };\n}\n\n/**\n * Format the check result as a colored terminal report.\n */\nexport function formatReport(result: CheckResult, opts?: { calledFromInit?: boolean }): string {\n const lines: string[] = [];\n const statusIcon = (s: Status) => s === \"supported\" ? \"\\x1b[32m✓\\x1b[0m\" : s === \"partial\" ? \"\\x1b[33m~\\x1b[0m\" : \"\\x1b[31m✗\\x1b[0m\";\n\n lines.push(\"\");\n lines.push(\" \\x1b[1mvinext compatibility report\\x1b[0m\");\n lines.push(\" \" + \"=\".repeat(40));\n lines.push(\"\");\n\n // Imports\n if (result.imports.length > 0) {\n const importSupported = result.imports.filter(i => i.status === \"supported\").length;\n lines.push(` \\x1b[1mImports\\x1b[0m: ${importSupported}/${result.imports.length} fully supported`);\n for (const item of result.imports) {\n const suffix = item.detail ? ` \\x1b[90m— ${item.detail}\\x1b[0m` : \"\";\n const fileCount = item.files ? ` \\x1b[90m(${item.files.length} file${item.files.length === 1 ? \"\" : \"s\"})\\x1b[0m` : \"\";\n lines.push(` ${statusIcon(item.status)} ${item.name}${fileCount}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Config\n if (result.config.length > 0) {\n const configSupported = result.config.filter(i => i.status === \"supported\").length;\n lines.push(` \\x1b[1mConfig\\x1b[0m: ${configSupported}/${result.config.length} options supported`);\n for (const item of result.config) {\n const suffix = item.detail ? ` \\x1b[90m— ${item.detail}\\x1b[0m` : \"\";\n lines.push(` ${statusIcon(item.status)} ${item.name}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Libraries\n if (result.libraries.length > 0) {\n const libSupported = result.libraries.filter(i => i.status === \"supported\").length;\n lines.push(` \\x1b[1mLibraries\\x1b[0m: ${libSupported}/${result.libraries.length} compatible`);\n for (const item of result.libraries) {\n const suffix = item.detail ? ` \\x1b[90m— ${item.detail}\\x1b[0m` : \"\";\n lines.push(` ${statusIcon(item.status)} ${item.name}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Conventions\n if (result.conventions.length > 0) {\n lines.push(` \\x1b[1mProject structure\\x1b[0m:`);\n for (const item of result.conventions) {\n const suffix = item.detail ? ` \\x1b[90m— ${item.detail}\\x1b[0m` : \"\";\n lines.push(` ${statusIcon(item.status)} ${item.name}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Summary\n const { score, supported, partial, unsupported } = result.summary;\n const scoreColor = score >= 90 ? \"\\x1b[32m\" : score >= 70 ? \"\\x1b[33m\" : \"\\x1b[31m\";\n lines.push(\" \" + \"-\".repeat(40));\n lines.push(` \\x1b[1mOverall\\x1b[0m: ${scoreColor}${score}% compatible\\x1b[0m (${supported} supported, ${partial} partial, ${unsupported} issues)`);\n\n if (unsupported > 0) {\n lines.push(\"\");\n lines.push(\" \\x1b[1mIssues to address:\\x1b[0m\");\n const allItems = [...result.imports, ...result.config, ...result.libraries, ...result.conventions];\n for (const item of allItems) {\n if (item.status === \"unsupported\") {\n lines.push(` \\x1b[31m✗\\x1b[0m ${item.name}${item.detail ? ` — ${item.detail}` : \"\"}`);\n }\n }\n }\n\n if (result.summary.partial > 0) {\n lines.push(\"\");\n lines.push(\" \\x1b[1mPartial support (may need attention):\\x1b[0m\");\n const allItems = [...result.imports, ...result.config, ...result.libraries, ...result.conventions];\n for (const item of allItems) {\n if (item.status === \"partial\") {\n lines.push(` \\x1b[33m~\\x1b[0m ${item.name}${item.detail ? ` — ${item.detail}` : \"\"}`);\n }\n }\n }\n\n // Actionable next steps (skip when called from init — it prints its own summary)\n if (!opts?.calledFromInit) {\n lines.push(\"\");\n lines.push(\" \\x1b[1mRecommended next steps:\\x1b[0m\");\n lines.push(` Run \\x1b[36mvinext init\\x1b[0m to set up your project automatically`);\n lines.push(\"\");\n lines.push(\" Or manually:\");\n lines.push(` 1. Add \\x1b[36m\"type\": \"module\"\\x1b[0m to package.json`);\n lines.push(` 2. Install: \\x1b[36m${detectPackageManager(process.cwd())} vinext vite @vitejs/plugin-rsc\\x1b[0m`);\n lines.push(` 3. Create vite.config.ts (see docs)`);\n lines.push(` 4. Run: \\x1b[36mnpx vite dev\\x1b[0m`);\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * vinext check — compatibility scanner for Next.js apps\n *\n * Scans an existing Next.js app and produces a compatibility report\n * showing what will work, what needs changes, and an overall score.\n */\n\nimport { detectPackageManager } from \"./utils/project.js\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\n// ── Support status definitions ─────────────────────────────────────────────\n\ntype Status = \"supported\" | \"partial\" | \"unsupported\";\n\ninterface CheckItem {\n name: string;\n status: Status;\n detail?: string;\n files?: string[];\n}\n\nexport interface CheckResult {\n imports: CheckItem[];\n config: CheckItem[];\n libraries: CheckItem[];\n conventions: CheckItem[];\n summary: {\n supported: number;\n partial: number;\n unsupported: number;\n total: number;\n score: number;\n };\n}\n\n// ── Import support map ─────────────────────────────────────────────────────\n\nconst IMPORT_SUPPORT: Record<string, { status: Status; detail?: string }> = {\n next: { status: \"supported\", detail: \"type-only exports (Metadata, NextPage, etc.)\" },\n \"next/link\": { status: \"supported\" },\n \"next/image\": { status: \"supported\", detail: \"uses @unpic/react (no local optimization yet)\" },\n \"next/router\": { status: \"supported\" },\n \"next/navigation\": { status: \"supported\" },\n \"next/headers\": { status: \"supported\" },\n \"next/server\": { status: \"supported\", detail: \"NextRequest/NextResponse shimmed\" },\n \"next/cache\": {\n status: \"supported\",\n detail: \"revalidateTag, revalidatePath, unstable_cache, cacheLife, cacheTag\",\n },\n \"next/dynamic\": { status: \"supported\" },\n \"next/head\": { status: \"supported\" },\n \"next/script\": { status: \"supported\" },\n \"next/font/google\": {\n status: \"partial\",\n detail: \"fonts loaded from CDN, not self-hosted at build time\",\n },\n \"next/font/local\": {\n status: \"supported\",\n detail: \"className and variable modes both work; no build-time subsetting\",\n },\n \"next/og\": { status: \"supported\", detail: \"ImageResponse via @vercel/og\" },\n \"next/config\": { status: \"supported\" },\n \"next/amp\": { status: \"unsupported\", detail: \"AMP is not supported\" },\n \"next/document\": { status: \"supported\", detail: \"custom _document.tsx\" },\n \"next/app\": { status: \"supported\", detail: \"custom _app.tsx\" },\n \"next/error\": { status: \"supported\" },\n \"next/third-parties/google\": {\n status: \"unsupported\",\n detail: \"third-party script optimization not implemented\",\n },\n \"server-only\": { status: \"supported\" },\n \"client-only\": { status: \"supported\" },\n};\n\n// ── Config support map ─────────────────────────────────────────────────────\n\nconst CONFIG_SUPPORT: Record<string, { status: Status; detail?: string }> = {\n basePath: { status: \"supported\" },\n trailingSlash: { status: \"supported\" },\n redirects: { status: \"supported\" },\n rewrites: { status: \"supported\" },\n headers: { status: \"supported\" },\n i18n: { status: \"supported\", detail: \"path-prefix routing (domains not yet supported)\" },\n env: { status: \"supported\" },\n images: { status: \"partial\", detail: \"remotePatterns validated, no local optimization\" },\n allowedDevOrigins: { status: \"supported\", detail: \"dev server cross-origin allowlist\" },\n output: { status: \"supported\", detail: \"'export' and 'standalone' modes\" },\n transpilePackages: { status: \"supported\", detail: \"Vite handles this natively\" },\n webpack: {\n status: \"unsupported\",\n detail: \"Vite replaces webpack — custom webpack configs need migration\",\n },\n \"experimental.ppr\": { status: \"unsupported\", detail: \"partial prerendering not yet implemented\" },\n \"experimental.typedRoutes\": { status: \"unsupported\", detail: \"typed routes not implemented\" },\n \"experimental.serverActions\": {\n status: \"supported\",\n detail: \"server actions via 'use server' directive\",\n },\n \"i18n.domains\": { status: \"unsupported\", detail: \"domain-based i18n routing not implemented\" },\n reactStrictMode: { status: \"supported\", detail: \"always enabled\" },\n poweredByHeader: {\n status: \"supported\",\n detail: \"not sent (matching Next.js default when disabled)\",\n },\n};\n\n// ── Library support map ────────────────────────────────────────────────────\n\nconst LIBRARY_SUPPORT: Record<string, { status: Status; detail?: string }> = {\n \"next-themes\": { status: \"supported\" },\n nuqs: { status: \"supported\" },\n \"next-view-transitions\": { status: \"supported\" },\n \"@vercel/analytics\": { status: \"supported\", detail: \"analytics script injected client-side\" },\n \"next-intl\": {\n status: \"supported\",\n detail:\n \"auto-detected from i18n/request.{ts,tsx,js,jsx}; createNextIntlPlugin wrapper not needed\",\n },\n \"@clerk/nextjs\": {\n status: \"unsupported\",\n detail: \"deep Next.js middleware integration not compatible\",\n },\n \"@auth/nextjs\": {\n status: \"unsupported\",\n detail: \"relies on Next.js internal auth handlers; consider migrating to better-auth\",\n },\n \"next-auth\": {\n status: \"unsupported\",\n detail:\n \"relies on Next.js API route internals; consider migrating to better-auth (see https://authjs.dev/getting-started/migrate-to-better-auth)\",\n },\n \"better-auth\": {\n status: \"supported\",\n detail: \"uses only public next/* APIs (headers, cookies, NextRequest/NextResponse)\",\n },\n \"@sentry/nextjs\": {\n status: \"partial\",\n detail: \"client-side works, server integration needs manual setup\",\n },\n \"@t3-oss/env-nextjs\": { status: \"supported\" },\n tailwindcss: { status: \"supported\" },\n \"styled-components\": { status: \"supported\", detail: \"SSR via useServerInsertedHTML\" },\n \"@emotion/react\": { status: \"supported\", detail: \"SSR via useServerInsertedHTML\" },\n \"lucide-react\": { status: \"supported\" },\n \"framer-motion\": { status: \"supported\" },\n \"@radix-ui/react-dialog\": { status: \"supported\" },\n \"shadcn-ui\": { status: \"supported\" },\n zod: { status: \"supported\" },\n \"react-hook-form\": { status: \"supported\" },\n prisma: { status: \"supported\", detail: \"works on Cloudflare Workers with Prisma Accelerate\" },\n drizzle: { status: \"supported\", detail: \"works with D1 on Cloudflare Workers\" },\n};\n\n// ── Scanning functions ─────────────────────────────────────────────────────\n\n/**\n * Recursively find all source files in a directory.\n */\nfunction findSourceFiles(\n dir: string,\n extensions = [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\"],\n): string[] {\n const results: string[] = [];\n if (!fs.existsSync(dir)) return results;\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (\n entry.name === \"node_modules\" ||\n entry.name === \".next\" ||\n entry.name === \"dist\" ||\n entry.name === \".git\"\n )\n continue;\n results.push(...findSourceFiles(fullPath, extensions));\n } else if (extensions.some((ext) => entry.name.endsWith(ext))) {\n results.push(fullPath);\n }\n }\n return results;\n}\n\n/**\n * Scan source files for `import ... from 'next/...'` statements.\n */\nexport function scanImports(root: string): CheckItem[] {\n const files = findSourceFiles(root);\n const importUsage = new Map<string, string[]>();\n\n const importRegex = /(?:import\\s+(?:[\\w{},\\s*]+\\s+from\\s+)?|require\\s*\\()['\"]([^'\"]+)['\"]\\)?/g;\n // Skip `import type` and `import { type ... }` — they're erased at compile time\n const typeOnlyImportRegex = /import\\s+type\\s+/;\n\n for (const file of files) {\n const content = fs.readFileSync(file, \"utf-8\");\n let match;\n while ((match = importRegex.exec(content)) !== null) {\n const mod = match[1];\n // Skip type-only imports (no runtime effect)\n const lineStart = content.lastIndexOf(\"\\n\", match.index) + 1;\n const line = content.slice(lineStart, match.index + match[0].length);\n if (typeOnlyImportRegex.test(line)) continue;\n // Only track next/* imports and server-only/client-only\n if (\n mod.startsWith(\"next/\") ||\n mod === \"next\" ||\n mod === \"server-only\" ||\n mod === \"client-only\"\n ) {\n // Normalize: next/font/google -> next/font/google\n const normalized = mod === \"next\" ? \"next\" : mod;\n if (!importUsage.has(normalized)) importUsage.set(normalized, []);\n const relFile = path.relative(root, file);\n if (!importUsage.get(normalized)!.includes(relFile)) {\n importUsage.get(normalized)!.push(relFile);\n }\n }\n }\n }\n\n const items: CheckItem[] = [];\n for (const [mod, usedFiles] of importUsage) {\n const support = IMPORT_SUPPORT[mod];\n if (support) {\n items.push({\n name: mod,\n status: support.status,\n detail: support.detail,\n files: usedFiles,\n });\n } else {\n items.push({\n name: mod,\n status: \"unsupported\",\n detail: \"not recognized by vinext\",\n files: usedFiles,\n });\n }\n }\n\n // Sort: unsupported first, then partial, then supported\n items.sort((a, b) => {\n const order: Record<Status, number> = { unsupported: 0, partial: 1, supported: 2 };\n return order[a.status] - order[b.status];\n });\n\n return items;\n}\n\n/**\n * Analyze next.config.js/mjs/ts for supported and unsupported options.\n */\nexport function analyzeConfig(root: string): CheckItem[] {\n const configFiles = [\"next.config.ts\", \"next.config.mjs\", \"next.config.js\", \"next.config.cjs\"];\n let configPath: string | null = null;\n for (const f of configFiles) {\n const p = path.join(root, f);\n if (fs.existsSync(p)) {\n configPath = p;\n break;\n }\n }\n\n if (!configPath) {\n return [\n {\n name: \"next.config\",\n status: \"supported\",\n detail: \"no config file found (defaults are fine)\",\n },\n ];\n }\n\n const content = fs.readFileSync(configPath, \"utf-8\");\n const items: CheckItem[] = [];\n\n // Check for known config options by searching for property names in the config file\n const configOptions = [\n \"basePath\",\n \"trailingSlash\",\n \"redirects\",\n \"rewrites\",\n \"headers\",\n \"i18n\",\n \"env\",\n \"images\",\n \"allowedDevOrigins\",\n \"output\",\n \"transpilePackages\",\n \"webpack\",\n \"reactStrictMode\",\n \"poweredByHeader\",\n ];\n\n for (const opt of configOptions) {\n // Simple heuristic: check if the option name appears as a property in the config\n const regex = new RegExp(`\\\\b${opt}\\\\b`);\n if (regex.test(content)) {\n const support = CONFIG_SUPPORT[opt];\n if (support) {\n items.push({ name: opt, status: support.status, detail: support.detail });\n } else {\n items.push({ name: opt, status: \"unsupported\", detail: \"not recognized\" });\n }\n }\n }\n\n // Check for experimental options\n if (/experimental\\s*[:=]\\s*\\{/.test(content)) {\n if (/\\bppr\\b/.test(content)) {\n items.push({ name: \"experimental.ppr\", ...CONFIG_SUPPORT[\"experimental.ppr\"]! });\n }\n if (/\\btypedRoutes\\b/.test(content)) {\n items.push({\n name: \"experimental.typedRoutes\",\n ...CONFIG_SUPPORT[\"experimental.typedRoutes\"]!,\n });\n }\n if (/\\bserverActions\\b/.test(content)) {\n items.push({\n name: \"experimental.serverActions\",\n ...CONFIG_SUPPORT[\"experimental.serverActions\"]!,\n });\n }\n }\n\n // Check for i18n.domains\n if (/domains\\s*:/.test(content) && /i18n/.test(content)) {\n items.push({ name: \"i18n.domains\", ...CONFIG_SUPPORT[\"i18n.domains\"]! });\n }\n\n // Sort: unsupported first\n items.sort((a, b) => {\n const order: Record<Status, number> = { unsupported: 0, partial: 1, supported: 2 };\n return order[a.status] - order[b.status];\n });\n\n return items;\n}\n\n/**\n * Check package.json dependencies for known libraries.\n */\nexport function checkLibraries(root: string): CheckItem[] {\n const pkgPath = path.join(root, \"package.json\");\n if (!fs.existsSync(pkgPath)) return [];\n\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n const items: CheckItem[] = [];\n\n for (const [lib, support] of Object.entries(LIBRARY_SUPPORT)) {\n if (allDeps[lib]) {\n items.push({\n name: lib,\n status: support.status,\n detail: support.detail,\n });\n }\n }\n\n // Sort: unsupported first\n items.sort((a, b) => {\n const order: Record<Status, number> = { unsupported: 0, partial: 1, supported: 2 };\n return order[a.status] - order[b.status];\n });\n\n return items;\n}\n\n/**\n * Check file conventions (pages, app directory, middleware, etc.)\n */\nexport function checkConventions(root: string): CheckItem[] {\n const items: CheckItem[] = [];\n\n // Check for pages/ and app/ at root level, then fall back to src/\n const pagesDir = fs.existsSync(path.join(root, \"pages\"))\n ? path.join(root, \"pages\")\n : fs.existsSync(path.join(root, \"src\", \"pages\"))\n ? path.join(root, \"src\", \"pages\")\n : null;\n const appDirPath = fs.existsSync(path.join(root, \"app\"))\n ? path.join(root, \"app\")\n : fs.existsSync(path.join(root, \"src\", \"app\"))\n ? path.join(root, \"src\", \"app\")\n : null;\n\n const hasPages = pagesDir !== null;\n const hasApp = appDirPath !== null;\n const hasProxy =\n fs.existsSync(path.join(root, \"proxy.ts\")) || fs.existsSync(path.join(root, \"proxy.js\"));\n const hasMiddleware =\n fs.existsSync(path.join(root, \"middleware.ts\")) ||\n fs.existsSync(path.join(root, \"middleware.js\"));\n\n if (hasPages) {\n const isSrc = pagesDir!.includes(path.join(\"src\", \"pages\"));\n items.push({\n name: isSrc ? \"Pages Router (src/pages/)\" : \"Pages Router (pages/)\",\n status: \"supported\",\n });\n\n // Count pages\n const pageFiles = findSourceFiles(pagesDir!);\n const pages = pageFiles.filter(\n (f) =>\n !f.includes(\"/api/\") &&\n !f.includes(\"_app\") &&\n !f.includes(\"_document\") &&\n !f.includes(\"_error\"),\n );\n const apiRoutes = pageFiles.filter((f) => f.includes(\"/api/\"));\n items.push({ name: `${pages.length} page(s)`, status: \"supported\" });\n if (apiRoutes.length) {\n items.push({ name: `${apiRoutes.length} API route(s)`, status: \"supported\" });\n }\n\n // Check for _app, _document\n if (pageFiles.some((f) => f.includes(\"_app\"))) {\n items.push({ name: \"Custom _app\", status: \"supported\" });\n }\n if (pageFiles.some((f) => f.includes(\"_document\"))) {\n items.push({ name: \"Custom _document\", status: \"supported\" });\n }\n }\n\n if (hasApp) {\n const isSrc = appDirPath!.includes(path.join(\"src\", \"app\"));\n items.push({\n name: isSrc ? \"App Router (src/app/)\" : \"App Router (app/)\",\n status: \"supported\",\n });\n\n const appFiles = findSourceFiles(appDirPath!);\n const pages = appFiles.filter(\n (f) =>\n f.endsWith(\"page.tsx\") ||\n f.endsWith(\"page.jsx\") ||\n f.endsWith(\"page.ts\") ||\n f.endsWith(\"page.js\"),\n );\n const layouts = appFiles.filter(\n (f) =>\n f.endsWith(\"layout.tsx\") ||\n f.endsWith(\"layout.jsx\") ||\n f.endsWith(\"layout.ts\") ||\n f.endsWith(\"layout.js\"),\n );\n const routes = appFiles.filter(\n (f) => f.endsWith(\"route.tsx\") || f.endsWith(\"route.ts\") || f.endsWith(\"route.js\"),\n );\n const loadings = appFiles.filter((f) => f.endsWith(\"loading.tsx\") || f.endsWith(\"loading.jsx\"));\n const errors = appFiles.filter((f) => f.endsWith(\"error.tsx\") || f.endsWith(\"error.jsx\"));\n const notFounds = appFiles.filter(\n (f) => f.endsWith(\"not-found.tsx\") || f.endsWith(\"not-found.jsx\"),\n );\n\n items.push({ name: `${pages.length} page(s)`, status: \"supported\" });\n if (layouts.length) items.push({ name: `${layouts.length} layout(s)`, status: \"supported\" });\n if (routes.length)\n items.push({ name: `${routes.length} route handler(s)`, status: \"supported\" });\n if (loadings.length)\n items.push({ name: `${loadings.length} loading boundary(ies)`, status: \"supported\" });\n if (errors.length)\n items.push({ name: `${errors.length} error boundary(ies)`, status: \"supported\" });\n if (notFounds.length)\n items.push({ name: `${notFounds.length} not-found page(s)`, status: \"supported\" });\n }\n\n if (hasProxy) {\n items.push({ name: \"proxy.ts (Next.js 16)\", status: \"supported\" });\n } else if (hasMiddleware) {\n items.push({ name: \"middleware.ts (deprecated in Next.js 16)\", status: \"supported\" });\n }\n\n if (!hasPages && !hasApp) {\n items.push({\n name: \"No pages/ or app/ directory found\",\n status: \"unsupported\",\n detail: \"vinext requires a pages/ or app/ directory\",\n });\n }\n\n // Check for \"type\": \"module\" in package.json\n const pkgPath = path.join(root, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n if (pkg.type !== \"module\") {\n items.push({\n name: 'Missing \"type\": \"module\" in package.json',\n status: \"unsupported\",\n detail: \"required for Vite — vinext init will add it automatically\",\n });\n }\n }\n\n // Scan for ViewTransition import from react\n const allSourceFiles = findSourceFiles(root);\n const viewTransitionRegex = /import\\s+\\{[^}]*\\bViewTransition\\b[^}]*\\}\\s+from\\s+['\"]react['\"]/;\n const viewTransitionFiles: string[] = [];\n for (const file of allSourceFiles) {\n const content = fs.readFileSync(file, \"utf-8\");\n if (viewTransitionRegex.test(content)) {\n viewTransitionFiles.push(path.relative(root, file));\n }\n }\n if (viewTransitionFiles.length > 0) {\n items.push({\n name: \"ViewTransition (React canary API)\",\n status: \"partial\",\n detail: \"vinext auto-shims with a passthrough fallback, view transitions won't animate\",\n files: viewTransitionFiles,\n });\n }\n\n // Check PostCSS config for string-form plugins\n const postcssConfigs = [\"postcss.config.mjs\", \"postcss.config.js\", \"postcss.config.cjs\"];\n for (const configFile of postcssConfigs) {\n const configPath = path.join(root, configFile);\n if (fs.existsSync(configPath)) {\n const content = fs.readFileSync(configPath, \"utf-8\");\n // Detect string-form plugins: plugins: [\"...\"] or plugins: ['...']\n const stringPluginRegex = /plugins\\s*:\\s*\\[[\\s\\S]*?(['\"][^'\"]+['\"])[\\s\\S]*?\\]/;\n const match = stringPluginRegex.exec(content);\n if (match) {\n // Check it's not require() or import() form — just bare string literals in the array\n const pluginsBlock = match[0];\n // If plugins array contains string literals not wrapped in require()\n if (/plugins\\s*:\\s*\\[[\\s\\n]*['\"]/.test(pluginsBlock)) {\n items.push({\n name: `PostCSS string-form plugins (${configFile})`,\n status: \"partial\",\n detail:\n \"string-form PostCSS plugins need resolution — vinext handles this automatically\",\n });\n }\n }\n break; // Only check the first config file found\n }\n }\n\n return items;\n}\n\n/**\n * Run the full compatibility check.\n */\nexport function runCheck(root: string): CheckResult {\n const imports = scanImports(root);\n const config = analyzeConfig(root);\n const libraries = checkLibraries(root);\n const conventions = checkConventions(root);\n\n const allItems = [...imports, ...config, ...libraries, ...conventions];\n const supported = allItems.filter((i) => i.status === \"supported\").length;\n const partial = allItems.filter((i) => i.status === \"partial\").length;\n const unsupported = allItems.filter((i) => i.status === \"unsupported\").length;\n const total = allItems.length;\n // Score: supported = 1, partial = 0.5, unsupported = 0\n const score = total > 0 ? Math.round(((supported + partial * 0.5) / total) * 100) : 100;\n\n return {\n imports,\n config,\n libraries,\n conventions,\n summary: { supported, partial, unsupported, total, score },\n };\n}\n\n/**\n * Format the check result as a colored terminal report.\n */\nexport function formatReport(result: CheckResult, opts?: { calledFromInit?: boolean }): string {\n const lines: string[] = [];\n const statusIcon = (s: Status) =>\n s === \"supported\"\n ? \"\\x1b[32m✓\\x1b[0m\"\n : s === \"partial\"\n ? \"\\x1b[33m~\\x1b[0m\"\n : \"\\x1b[31m✗\\x1b[0m\";\n\n lines.push(\"\");\n lines.push(\" \\x1b[1mvinext compatibility report\\x1b[0m\");\n lines.push(\" \" + \"=\".repeat(40));\n lines.push(\"\");\n\n // Imports\n if (result.imports.length > 0) {\n const importSupported = result.imports.filter((i) => i.status === \"supported\").length;\n lines.push(\n ` \\x1b[1mImports\\x1b[0m: ${importSupported}/${result.imports.length} fully supported`,\n );\n for (const item of result.imports) {\n const suffix = item.detail ? ` \\x1b[90m— ${item.detail}\\x1b[0m` : \"\";\n const fileCount = item.files\n ? ` \\x1b[90m(${item.files.length} file${item.files.length === 1 ? \"\" : \"s\"})\\x1b[0m`\n : \"\";\n lines.push(` ${statusIcon(item.status)} ${item.name}${fileCount}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Config\n if (result.config.length > 0) {\n const configSupported = result.config.filter((i) => i.status === \"supported\").length;\n lines.push(\n ` \\x1b[1mConfig\\x1b[0m: ${configSupported}/${result.config.length} options supported`,\n );\n for (const item of result.config) {\n const suffix = item.detail ? ` \\x1b[90m— ${item.detail}\\x1b[0m` : \"\";\n lines.push(` ${statusIcon(item.status)} ${item.name}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Libraries\n if (result.libraries.length > 0) {\n const libSupported = result.libraries.filter((i) => i.status === \"supported\").length;\n lines.push(` \\x1b[1mLibraries\\x1b[0m: ${libSupported}/${result.libraries.length} compatible`);\n for (const item of result.libraries) {\n const suffix = item.detail ? ` \\x1b[90m— ${item.detail}\\x1b[0m` : \"\";\n lines.push(` ${statusIcon(item.status)} ${item.name}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Conventions\n if (result.conventions.length > 0) {\n lines.push(` \\x1b[1mProject structure\\x1b[0m:`);\n for (const item of result.conventions) {\n const suffix = item.detail ? ` \\x1b[90m— ${item.detail}\\x1b[0m` : \"\";\n lines.push(` ${statusIcon(item.status)} ${item.name}${suffix}`);\n }\n lines.push(\"\");\n }\n\n // Summary\n const { score, supported, partial, unsupported } = result.summary;\n const scoreColor = score >= 90 ? \"\\x1b[32m\" : score >= 70 ? \"\\x1b[33m\" : \"\\x1b[31m\";\n lines.push(\" \" + \"-\".repeat(40));\n lines.push(\n ` \\x1b[1mOverall\\x1b[0m: ${scoreColor}${score}% compatible\\x1b[0m (${supported} supported, ${partial} partial, ${unsupported} issues)`,\n );\n\n if (unsupported > 0) {\n lines.push(\"\");\n lines.push(\" \\x1b[1mIssues to address:\\x1b[0m\");\n const allItems = [\n ...result.imports,\n ...result.config,\n ...result.libraries,\n ...result.conventions,\n ];\n for (const item of allItems) {\n if (item.status === \"unsupported\") {\n lines.push(` \\x1b[31m✗\\x1b[0m ${item.name}${item.detail ? ` — ${item.detail}` : \"\"}`);\n }\n }\n }\n\n if (result.summary.partial > 0) {\n lines.push(\"\");\n lines.push(\" \\x1b[1mPartial support (may need attention):\\x1b[0m\");\n const allItems = [\n ...result.imports,\n ...result.config,\n ...result.libraries,\n ...result.conventions,\n ];\n for (const item of allItems) {\n if (item.status === \"partial\") {\n lines.push(` \\x1b[33m~\\x1b[0m ${item.name}${item.detail ? ` — ${item.detail}` : \"\"}`);\n }\n }\n }\n\n // Actionable next steps (skip when called from init — it prints its own summary)\n if (!opts?.calledFromInit) {\n lines.push(\"\");\n lines.push(\" \\x1b[1mRecommended next steps:\\x1b[0m\");\n lines.push(` Run \\x1b[36mvinext init\\x1b[0m to set up your project automatically`);\n lines.push(\"\");\n lines.push(\" Or manually:\");\n lines.push(` 1. Add \\x1b[36m\"type\": \"module\"\\x1b[0m to package.json`);\n lines.push(\n ` 2. Install: \\x1b[36m${detectPackageManager(process.cwd())} vinext vite @vitejs/plugin-rsc\\x1b[0m`,\n );\n lines.push(` 3. Create vite.config.ts (see docs)`);\n lines.push(` 4. Run: \\x1b[36mnpx vite dev\\x1b[0m`);\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n"]}