vinext 0.0.25 → 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 (226) hide show
  1. package/README.md +95 -86
  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 +154 -50
  7. package/dist/check.js.map +1 -1
  8. package/dist/cli.js +42 -12
  9. package/dist/cli.js.map +1 -1
  10. package/dist/client/entry.js.map +1 -1
  11. package/dist/client/vinext-next-data.d.ts +22 -0
  12. package/dist/client/vinext-next-data.d.ts.map +1 -0
  13. package/dist/client/vinext-next-data.js +2 -0
  14. package/dist/client/vinext-next-data.js.map +1 -0
  15. package/dist/cloudflare/kv-cache-handler.d.ts +32 -1
  16. package/dist/cloudflare/kv-cache-handler.d.ts.map +1 -1
  17. package/dist/cloudflare/kv-cache-handler.js +47 -21
  18. package/dist/cloudflare/kv-cache-handler.js.map +1 -1
  19. package/dist/cloudflare/tpr.d.ts.map +1 -1
  20. package/dist/cloudflare/tpr.js +15 -4
  21. package/dist/cloudflare/tpr.js.map +1 -1
  22. package/dist/config/config-matchers.d.ts +27 -0
  23. package/dist/config/config-matchers.d.ts.map +1 -1
  24. package/dist/config/config-matchers.js +312 -62
  25. package/dist/config/config-matchers.js.map +1 -1
  26. package/dist/config/dotenv.d.ts.map +1 -1
  27. package/dist/config/dotenv.js +1 -6
  28. package/dist/config/dotenv.js.map +1 -1
  29. package/dist/config/next-config.d.ts +38 -4
  30. package/dist/config/next-config.d.ts.map +1 -1
  31. package/dist/config/next-config.js +194 -31
  32. package/dist/config/next-config.js.map +1 -1
  33. package/dist/deploy.d.ts +11 -0
  34. package/dist/deploy.d.ts.map +1 -1
  35. package/dist/deploy.js +74 -39
  36. package/dist/deploy.js.map +1 -1
  37. package/dist/entries/app-browser-entry.d.ts +9 -0
  38. package/dist/entries/app-browser-entry.d.ts.map +1 -0
  39. package/dist/entries/app-browser-entry.js +340 -0
  40. package/dist/entries/app-browser-entry.js.map +1 -0
  41. package/dist/{server/app-dev-server.d.ts → entries/app-rsc-entry.d.ts} +4 -17
  42. package/dist/entries/app-rsc-entry.d.ts.map +1 -0
  43. package/dist/{server/app-dev-server.js → entries/app-rsc-entry.js} +438 -1232
  44. package/dist/entries/app-rsc-entry.js.map +1 -0
  45. package/dist/entries/app-ssr-entry.d.ts +8 -0
  46. package/dist/entries/app-ssr-entry.d.ts.map +1 -0
  47. package/dist/entries/app-ssr-entry.js +449 -0
  48. package/dist/entries/app-ssr-entry.js.map +1 -0
  49. package/dist/entries/pages-client-entry.d.ts +4 -0
  50. package/dist/entries/pages-client-entry.d.ts.map +1 -0
  51. package/dist/entries/pages-client-entry.js +96 -0
  52. package/dist/entries/pages-client-entry.js.map +1 -0
  53. package/dist/entries/pages-entry-helpers.d.ts +7 -0
  54. package/dist/entries/pages-entry-helpers.d.ts.map +1 -0
  55. package/dist/entries/pages-entry-helpers.js +18 -0
  56. package/dist/entries/pages-entry-helpers.js.map +1 -0
  57. package/dist/entries/pages-server-entry.d.ts +8 -0
  58. package/dist/entries/pages-server-entry.d.ts.map +1 -0
  59. package/dist/entries/pages-server-entry.js +1015 -0
  60. package/dist/entries/pages-server-entry.js.map +1 -0
  61. package/dist/index.d.ts +2 -26
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +407 -1357
  64. package/dist/index.js.map +1 -1
  65. package/dist/init.d.ts.map +1 -1
  66. package/dist/init.js +6 -5
  67. package/dist/init.js.map +1 -1
  68. package/dist/routing/app-router.d.ts +2 -0
  69. package/dist/routing/app-router.d.ts.map +1 -1
  70. package/dist/routing/app-router.js +10 -18
  71. package/dist/routing/app-router.js.map +1 -1
  72. package/dist/routing/file-matcher.d.ts.map +1 -1
  73. package/dist/routing/file-matcher.js.map +1 -1
  74. package/dist/routing/pages-router.d.ts +2 -0
  75. package/dist/routing/pages-router.d.ts.map +1 -1
  76. package/dist/routing/pages-router.js +8 -5
  77. package/dist/routing/pages-router.js.map +1 -1
  78. package/dist/routing/utils.d.ts.map +1 -1
  79. package/dist/routing/utils.js.map +1 -1
  80. package/dist/server/api-handler.d.ts.map +1 -1
  81. package/dist/server/api-handler.js +7 -2
  82. package/dist/server/api-handler.js.map +1 -1
  83. package/dist/server/app-router-entry.d.ts +3 -2
  84. package/dist/server/app-router-entry.d.ts.map +1 -1
  85. package/dist/server/app-router-entry.js +8 -4
  86. package/dist/server/app-router-entry.js.map +1 -1
  87. package/dist/server/dev-module-runner.d.ts.map +1 -1
  88. package/dist/server/dev-module-runner.js +1 -1
  89. package/dist/server/dev-module-runner.js.map +1 -1
  90. package/dist/server/dev-origin-check.d.ts.map +1 -1
  91. package/dist/server/dev-origin-check.js.map +1 -1
  92. package/dist/server/dev-server.d.ts.map +1 -1
  93. package/dist/server/dev-server.js +30 -18
  94. package/dist/server/dev-server.js.map +1 -1
  95. package/dist/server/image-optimization.d.ts.map +1 -1
  96. package/dist/server/image-optimization.js.map +1 -1
  97. package/dist/server/instrumentation.d.ts +1 -1
  98. package/dist/server/instrumentation.js +2 -2
  99. package/dist/server/instrumentation.js.map +1 -1
  100. package/dist/server/isr-cache.d.ts +13 -1
  101. package/dist/server/isr-cache.d.ts.map +1 -1
  102. package/dist/server/isr-cache.js +10 -1
  103. package/dist/server/isr-cache.js.map +1 -1
  104. package/dist/server/metadata-routes.d.ts.map +1 -1
  105. package/dist/server/metadata-routes.js +6 -18
  106. package/dist/server/metadata-routes.js.map +1 -1
  107. package/dist/server/middleware-codegen.d.ts +1 -1
  108. package/dist/server/middleware-codegen.d.ts.map +1 -1
  109. package/dist/server/middleware-codegen.js +13 -11
  110. package/dist/server/middleware-codegen.js.map +1 -1
  111. package/dist/server/middleware-request-headers.d.ts +9 -0
  112. package/dist/server/middleware-request-headers.d.ts.map +1 -0
  113. package/dist/server/middleware-request-headers.js +77 -0
  114. package/dist/server/middleware-request-headers.js.map +1 -0
  115. package/dist/server/middleware.d.ts.map +1 -1
  116. package/dist/server/middleware.js +38 -19
  117. package/dist/server/middleware.js.map +1 -1
  118. package/dist/server/normalize-path.js.map +1 -1
  119. package/dist/server/prod-server.d.ts +1 -1
  120. package/dist/server/prod-server.d.ts.map +1 -1
  121. package/dist/server/prod-server.js +71 -41
  122. package/dist/server/prod-server.js.map +1 -1
  123. package/dist/server/request-pipeline.d.ts +93 -0
  124. package/dist/server/request-pipeline.d.ts.map +1 -0
  125. package/dist/server/request-pipeline.js +200 -0
  126. package/dist/server/request-pipeline.js.map +1 -0
  127. package/dist/shims/cache-runtime.d.ts.map +1 -1
  128. package/dist/shims/cache-runtime.js +21 -16
  129. package/dist/shims/cache-runtime.js.map +1 -1
  130. package/dist/shims/cache.d.ts.map +1 -1
  131. package/dist/shims/cache.js +18 -17
  132. package/dist/shims/cache.js.map +1 -1
  133. package/dist/shims/constants.d.ts +120 -3
  134. package/dist/shims/constants.d.ts.map +1 -1
  135. package/dist/shims/constants.js +165 -3
  136. package/dist/shims/constants.js.map +1 -1
  137. package/dist/shims/dynamic.d.ts.map +1 -1
  138. package/dist/shims/dynamic.js +1 -1
  139. package/dist/shims/dynamic.js.map +1 -1
  140. package/dist/shims/error-boundary.d.ts.map +1 -1
  141. package/dist/shims/error-boundary.js +2 -3
  142. package/dist/shims/error-boundary.js.map +1 -1
  143. package/dist/shims/error.d.ts.map +1 -1
  144. package/dist/shims/error.js +1 -3
  145. package/dist/shims/error.js.map +1 -1
  146. package/dist/shims/fetch-cache.d.ts.map +1 -1
  147. package/dist/shims/fetch-cache.js +53 -29
  148. package/dist/shims/fetch-cache.js.map +1 -1
  149. package/dist/shims/font-google-base.d.ts.map +1 -1
  150. package/dist/shims/font-google-base.js +16 -4
  151. package/dist/shims/font-google-base.js.map +1 -1
  152. package/dist/shims/font-google.d.ts +1 -1
  153. package/dist/shims/font-google.d.ts.map +1 -1
  154. package/dist/shims/font-google.generated.d.ts.map +1 -1
  155. package/dist/shims/font-google.generated.js +412 -206
  156. package/dist/shims/font-google.generated.js.map +1 -1
  157. package/dist/shims/font-google.js +1 -1
  158. package/dist/shims/font-google.js.map +1 -1
  159. package/dist/shims/font-local.d.ts.map +1 -1
  160. package/dist/shims/font-local.js +13 -3
  161. package/dist/shims/font-local.js.map +1 -1
  162. package/dist/shims/form.d.ts.map +1 -1
  163. package/dist/shims/form.js +2 -2
  164. package/dist/shims/form.js.map +1 -1
  165. package/dist/shims/head.d.ts.map +1 -1
  166. package/dist/shims/head.js +10 -8
  167. package/dist/shims/head.js.map +1 -1
  168. package/dist/shims/headers.d.ts +23 -5
  169. package/dist/shims/headers.d.ts.map +1 -1
  170. package/dist/shims/headers.js +98 -37
  171. package/dist/shims/headers.js.map +1 -1
  172. package/dist/shims/image.d.ts.map +1 -1
  173. package/dist/shims/image.js +35 -8
  174. package/dist/shims/image.js.map +1 -1
  175. package/dist/shims/legacy-image.d.ts.map +1 -1
  176. package/dist/shims/legacy-image.js +1 -1
  177. package/dist/shims/legacy-image.js.map +1 -1
  178. package/dist/shims/link.d.ts.map +1 -1
  179. package/dist/shims/link.js +31 -17
  180. package/dist/shims/link.js.map +1 -1
  181. package/dist/shims/metadata.d.ts +19 -3
  182. package/dist/shims/metadata.d.ts.map +1 -1
  183. package/dist/shims/metadata.js +19 -11
  184. package/dist/shims/metadata.js.map +1 -1
  185. package/dist/shims/navigation-state.d.ts.map +1 -1
  186. package/dist/shims/navigation-state.js +3 -2
  187. package/dist/shims/navigation-state.js.map +1 -1
  188. package/dist/shims/navigation.d.ts.map +1 -1
  189. package/dist/shims/navigation.js +26 -19
  190. package/dist/shims/navigation.js.map +1 -1
  191. package/dist/shims/og.d.ts +6 -6
  192. package/dist/shims/og.js +6 -6
  193. package/dist/shims/og.js.map +1 -1
  194. package/dist/shims/request-context.d.ts +50 -0
  195. package/dist/shims/request-context.d.ts.map +1 -0
  196. package/dist/shims/request-context.js +59 -0
  197. package/dist/shims/request-context.js.map +1 -0
  198. package/dist/shims/router-state.d.ts.map +1 -1
  199. package/dist/shims/router-state.js +2 -1
  200. package/dist/shims/router-state.js.map +1 -1
  201. package/dist/shims/router.d.ts.map +1 -1
  202. package/dist/shims/router.js +18 -25
  203. package/dist/shims/router.js.map +1 -1
  204. package/dist/shims/script.d.ts.map +1 -1
  205. package/dist/shims/script.js.map +1 -1
  206. package/dist/shims/server.d.ts +13 -0
  207. package/dist/shims/server.d.ts.map +1 -1
  208. package/dist/shims/server.js +100 -34
  209. package/dist/shims/server.js.map +1 -1
  210. package/dist/shims/url-utils.d.ts.map +1 -1
  211. package/dist/shims/url-utils.js +1 -3
  212. package/dist/shims/url-utils.js.map +1 -1
  213. package/dist/utils/base-path.d.ts +17 -0
  214. package/dist/utils/base-path.d.ts.map +1 -0
  215. package/dist/utils/base-path.js +25 -0
  216. package/dist/utils/base-path.js.map +1 -0
  217. package/dist/utils/project.d.ts +15 -0
  218. package/dist/utils/project.d.ts.map +1 -1
  219. package/dist/utils/project.js +50 -4
  220. package/dist/utils/project.js.map +1 -1
  221. package/dist/utils/query.d.ts.map +1 -1
  222. package/dist/utils/query.js +3 -1
  223. package/dist/utils/query.js.map +1 -1
  224. package/package.json +47 -33
  225. package/dist/server/app-dev-server.d.ts.map +0 -1
  226. package/dist/server/app-dev-server.js.map +0 -1
@@ -5,17 +5,62 @@
5
5
  * Unsupported options are logged as warnings.
6
6
  */
7
7
  import path from "node:path";
8
- import { pathToFileURL } from "node:url";
9
8
  import { createRequire } from "node:module";
10
9
  import fs from "node:fs";
10
+ import { randomUUID } from "node:crypto";
11
11
  import { PHASE_DEVELOPMENT_SERVER } from "../shims/constants.js";
12
12
  import { normalizePageExtensions } from "../routing/file-matcher.js";
13
- const CONFIG_FILES = [
14
- "next.config.ts",
15
- "next.config.mjs",
16
- "next.config.js",
17
- "next.config.cjs",
18
- ];
13
+ /**
14
+ * Parse a body size limit value (string or number) into bytes.
15
+ * Accepts Next.js-style strings like "1mb", "500kb", "10mb", bare number strings like "1048576" (bytes),
16
+ * and numeric values. Supports b, kb, mb, gb, tb, pb units.
17
+ * Returns the default 1MB if the value is not provided or invalid.
18
+ * Throws if the parsed value is less than 1.
19
+ */
20
+ export function parseBodySizeLimit(value) {
21
+ if (value === undefined || value === null)
22
+ return 1 * 1024 * 1024;
23
+ if (typeof value === "number") {
24
+ if (value < 1)
25
+ throw new Error(`Body size limit must be a positive number, got ${value}`);
26
+ return value;
27
+ }
28
+ const trimmed = value.trim();
29
+ const match = trimmed.match(/^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb|tb|pb)?$/i);
30
+ if (!match) {
31
+ console.warn(`[vinext] Invalid bodySizeLimit value: "${value}". Expected a number or a string like "1mb", "500kb". Falling back to 1MB.`);
32
+ return 1 * 1024 * 1024;
33
+ }
34
+ const num = parseFloat(match[1]);
35
+ const unit = (match[2] ?? "b").toLowerCase();
36
+ let bytes;
37
+ switch (unit) {
38
+ case "b":
39
+ bytes = Math.floor(num);
40
+ break;
41
+ case "kb":
42
+ bytes = Math.floor(num * 1024);
43
+ break;
44
+ case "mb":
45
+ bytes = Math.floor(num * 1024 * 1024);
46
+ break;
47
+ case "gb":
48
+ bytes = Math.floor(num * 1024 * 1024 * 1024);
49
+ break;
50
+ case "tb":
51
+ bytes = Math.floor(num * 1024 * 1024 * 1024 * 1024);
52
+ break;
53
+ case "pb":
54
+ bytes = Math.floor(num * 1024 * 1024 * 1024 * 1024 * 1024);
55
+ break;
56
+ default:
57
+ return 1 * 1024 * 1024;
58
+ }
59
+ if (bytes < 1)
60
+ throw new Error(`Body size limit must be a positive number, got ${bytes}`);
61
+ return bytes;
62
+ }
63
+ const CONFIG_FILES = ["next.config.ts", "next.config.mjs", "next.config.js", "next.config.cjs"];
19
64
  /**
20
65
  * Check whether an error indicates a CJS module was loaded in an ESM context
21
66
  * (i.e. the file uses `require()` which is not available in ESM).
@@ -31,6 +76,23 @@ function isCjsError(e) {
31
76
  msg.includes("__dirname is not defined") ||
32
77
  msg.includes("__filename is not defined"));
33
78
  }
79
+ /**
80
+ * Emit a warning when config loading fails, with a targeted hint for
81
+ * known plugin wrappers that are unnecessary in vinext.
82
+ */
83
+ function warnConfigLoadFailure(filename, err) {
84
+ const msg = err.message ?? "";
85
+ const stack = err.stack ?? "";
86
+ const isNextIntlPlugin = msg.includes("next-intl") ||
87
+ stack.includes("next-intl/plugin") ||
88
+ stack.includes("next-intl/dist");
89
+ console.warn(`[vinext] Failed to load ${filename}: ${msg}`);
90
+ if (isNextIntlPlugin) {
91
+ console.warn("[vinext] Hint: createNextIntlPlugin() is not needed with vinext. " +
92
+ "Remove the next-intl/plugin wrapper from your next.config — " +
93
+ "vinext auto-detects next-intl and registers the i18n config alias automatically.");
94
+ }
95
+ }
34
96
  /**
35
97
  * Unwrap the config value from a loaded module, calling it if it's a
36
98
  * function-form config (Next.js supports `module.exports = (phase, opts) => config`).
@@ -49,10 +111,10 @@ async function unwrapConfig(mod, phase = PHASE_DEVELOPMENT_SERVER) {
49
111
  * Find and load the next.config file from the project root.
50
112
  * Returns null if no config file is found.
51
113
  *
52
- * Attempts ESM dynamic `import()` first. If the file uses CJS constructs
53
- * (`require`, `module.exports`) that aren't available in ESM context, falls
54
- * back to loading it via `createRequire` so that CJS config files (common in
55
- * the Next.js ecosystem for plugin wrappers like nextra, @next/mdx, etc.) work.
114
+ * Attempts Vite's module runner first so TS configs and extensionless local
115
+ * imports (e.g. `import "./env"`) resolve consistently. If loading fails due
116
+ * to CJS constructs (`require`, `module.exports`), falls back to `createRequire`
117
+ * so common CJS plugin wrappers (nextra, @next/mdx, etc.) still work.
56
118
  */
57
119
  export async function loadNextConfig(root, phase = PHASE_DEVELOPMENT_SERVER) {
58
120
  for (const filename of CONFIG_FILES) {
@@ -60,9 +122,13 @@ export async function loadNextConfig(root, phase = PHASE_DEVELOPMENT_SERVER) {
60
122
  if (!fs.existsSync(configPath))
61
123
  continue;
62
124
  try {
63
- // Use dynamic import for ESM/TS config files
64
- const fileUrl = pathToFileURL(configPath).href;
65
- const mod = await import(fileUrl);
125
+ // Load config via Vite's module runner (TS + extensionless import support)
126
+ const { runnerImport } = await import("vite");
127
+ const { module: mod } = await runnerImport(configPath, {
128
+ root,
129
+ logLevel: "error",
130
+ clearScreen: false,
131
+ });
66
132
  return await unwrapConfig(mod, phase);
67
133
  }
68
134
  catch (e) {
@@ -75,23 +141,56 @@ export async function loadNextConfig(root, phase = PHASE_DEVELOPMENT_SERVER) {
75
141
  return await unwrapConfig({ default: mod }, phase);
76
142
  }
77
143
  catch (e2) {
78
- console.warn(`[vinext] Failed to load ${filename}: ${e2.message}`);
144
+ warnConfigLoadFailure(filename, e2);
79
145
  return null;
80
146
  }
81
147
  }
82
- console.warn(`[vinext] Failed to load ${filename}: ${e.message}`);
148
+ warnConfigLoadFailure(filename, e);
83
149
  return null;
84
150
  }
85
151
  }
86
152
  return null;
87
153
  }
154
+ /**
155
+ * Generate a UUID that doesn't contain "ad" to avoid false-positive ad-blocker hits.
156
+ * Mirrors Next.js's own nanoid retry loop.
157
+ */
158
+ function safeUUID() {
159
+ let id = randomUUID();
160
+ while (/ad/i.test(id))
161
+ id = randomUUID();
162
+ return id;
163
+ }
164
+ /**
165
+ * Call the user's generateBuildId function and validate its return value.
166
+ * Follows Next.js semantics: null return falls back to a random UUID; any
167
+ * other non-string throws. Leading/trailing whitespace is trimmed.
168
+ *
169
+ * @see https://nextjs.org/docs/app/api-reference/config/next-config-js/generateBuildId
170
+ */
171
+ async function resolveBuildId(generate) {
172
+ if (!generate)
173
+ return safeUUID();
174
+ const result = await generate();
175
+ if (result === null)
176
+ return safeUUID();
177
+ if (typeof result !== "string") {
178
+ throw new Error("generateBuildId did not return a string. https://nextjs.org/docs/messages/generatebuildid-not-a-string");
179
+ }
180
+ const trimmed = result.trim();
181
+ if (trimmed.length === 0) {
182
+ throw new Error("generateBuildId returned an empty string. https://nextjs.org/docs/messages/generatebuildid-not-a-string");
183
+ }
184
+ return trimmed;
185
+ }
88
186
  /**
89
187
  * Resolve a NextConfig into a fully-resolved ResolvedNextConfig.
90
188
  * Awaits async functions for redirects/rewrites/headers.
91
189
  */
92
190
  export async function resolveNextConfig(config, root = process.cwd()) {
93
191
  if (!config) {
94
- return {
192
+ const buildId = await resolveBuildId(undefined);
193
+ const resolved = {
95
194
  env: {},
96
195
  basePath: "",
97
196
  trailingSlash: false,
@@ -107,7 +206,11 @@ export async function resolveNextConfig(config, root = process.cwd()) {
107
206
  aliases: {},
108
207
  allowedDevOrigins: [],
109
208
  serverActionsAllowedOrigins: [],
209
+ serverActionsBodySizeLimit: 1 * 1024 * 1024,
210
+ buildId,
110
211
  };
212
+ detectNextIntlConfig(root, resolved);
213
+ return resolved;
111
214
  }
112
215
  // Resolve redirects
113
216
  let redirects = [];
@@ -147,15 +250,14 @@ export async function resolveNextConfig(config, root = process.cwd()) {
147
250
  ...extractTurboAliases(config, root),
148
251
  ...webpackProbe.aliases,
149
252
  };
150
- const allowedDevOrigins = Array.isArray(config.allowedDevOrigins)
151
- ? config.allowedDevOrigins
152
- : [];
153
- // Resolve serverActions.allowedOrigins from experimental config
253
+ const allowedDevOrigins = Array.isArray(config.allowedDevOrigins) ? config.allowedDevOrigins : [];
254
+ // Resolve serverActions.allowedOrigins and bodySizeLimit from experimental config
154
255
  const experimental = config.experimental;
155
256
  const serverActionsConfig = experimental?.serverActions;
156
257
  const serverActionsAllowedOrigins = Array.isArray(serverActionsConfig?.allowedOrigins)
157
258
  ? serverActionsConfig.allowedOrigins
158
259
  : [];
260
+ const serverActionsBodySizeLimit = parseBodySizeLimit(serverActionsConfig?.bodySizeLimit);
159
261
  // Warn about unsupported webpack usage. We preserve alias injection and
160
262
  // extract MDX settings, but all other webpack customization is still ignored.
161
263
  if (config.webpack !== undefined) {
@@ -182,7 +284,8 @@ export async function resolveNextConfig(config, root = process.cwd()) {
182
284
  domains: config.i18n.domains,
183
285
  };
184
286
  }
185
- return {
287
+ const buildId = await resolveBuildId(config.generateBuildId);
288
+ const resolved = {
186
289
  env: config.env ?? {},
187
290
  basePath: config.basePath ?? "",
188
291
  trailingSlash: config.trailingSlash ?? false,
@@ -198,7 +301,13 @@ export async function resolveNextConfig(config, root = process.cwd()) {
198
301
  aliases,
199
302
  allowedDevOrigins,
200
303
  serverActionsAllowedOrigins,
304
+ serverActionsBodySizeLimit,
305
+ buildId,
201
306
  };
307
+ // Auto-detect next-intl (lowest priority — explicit aliases from
308
+ // webpack/turbopack already in `aliases` take precedence)
309
+ detectNextIntlConfig(root, resolved);
310
+ return resolved;
202
311
  }
203
312
  function normalizeAliasEntries(aliases, root) {
204
313
  if (!aliases)
@@ -261,6 +370,66 @@ async function probeWebpackConfig(config, root) {
261
370
  export async function extractMdxOptions(config, root = process.cwd()) {
262
371
  return (await probeWebpackConfig(config, root)).mdx;
263
372
  }
373
+ /**
374
+ * Probe file candidates relative to root. Returns the first one that exists,
375
+ * or null if none match.
376
+ */
377
+ function probeFiles(root, candidates) {
378
+ for (const candidate of candidates) {
379
+ const abs = path.resolve(root, candidate);
380
+ if (fs.existsSync(abs))
381
+ return abs;
382
+ }
383
+ return null;
384
+ }
385
+ const I18N_REQUEST_CANDIDATES = [
386
+ "i18n/request.ts",
387
+ "i18n/request.tsx",
388
+ "i18n/request.js",
389
+ "i18n/request.jsx",
390
+ "src/i18n/request.ts",
391
+ "src/i18n/request.tsx",
392
+ "src/i18n/request.js",
393
+ "src/i18n/request.jsx",
394
+ ];
395
+ /**
396
+ * Detect next-intl in the project and auto-register the `next-intl/config`
397
+ * alias if needed.
398
+ *
399
+ * next-intl's `createNextIntlPlugin()` crashes in vinext because it calls
400
+ * `require('next/package.json')` to check the Next.js version. Instead,
401
+ * vinext detects next-intl and registers the alias automatically.
402
+ *
403
+ * Note: `require.resolve('next-intl')` walks up to parent `node_modules`
404
+ * directories via standard Node module resolution. In a monorepo, next-intl
405
+ * installed at the workspace root will trigger detection even if not listed
406
+ * in the project's own package.json. This is acceptable since a workspace-root
407
+ * install implies the user wants it available.
408
+ *
409
+ * Mutates `resolved.aliases` and `resolved.env` in place.
410
+ */
411
+ export function detectNextIntlConfig(root, resolved) {
412
+ // Explicit alias wins — user or plugin already set it
413
+ if (resolved.aliases["next-intl/config"])
414
+ return;
415
+ // Check if next-intl is installed (use main entry — some packages
416
+ // don't expose ./package.json in their exports map)
417
+ const require = createRequire(path.join(root, "package.json"));
418
+ try {
419
+ require.resolve("next-intl");
420
+ }
421
+ catch {
422
+ return; // next-intl not installed
423
+ }
424
+ // Probe for the i18n request config file
425
+ const configPath = probeFiles(root, I18N_REQUEST_CANDIDATES);
426
+ if (!configPath)
427
+ return;
428
+ resolved.aliases["next-intl/config"] = configPath;
429
+ if (resolved.trailingSlash) {
430
+ resolved.env._next_intl_trailing_slash = "true";
431
+ }
432
+ }
264
433
  function extractMdxOptionsFromRules(rules) {
265
434
  // Search through webpack rules for the MDX loader injected by @next/mdx
266
435
  for (const rule of rules) {
@@ -310,15 +479,9 @@ function isMdxLoader(loaderPath) {
310
479
  function extractPluginsFromOptions(opts) {
311
480
  if (!opts || typeof opts !== "object")
312
481
  return null;
313
- const remarkPlugins = Array.isArray(opts.remarkPlugins)
314
- ? opts.remarkPlugins
315
- : undefined;
316
- const rehypePlugins = Array.isArray(opts.rehypePlugins)
317
- ? opts.rehypePlugins
318
- : undefined;
319
- const recmaPlugins = Array.isArray(opts.recmaPlugins)
320
- ? opts.recmaPlugins
321
- : undefined;
482
+ const remarkPlugins = Array.isArray(opts.remarkPlugins) ? opts.remarkPlugins : undefined;
483
+ const rehypePlugins = Array.isArray(opts.rehypePlugins) ? opts.rehypePlugins : undefined;
484
+ const recmaPlugins = Array.isArray(opts.recmaPlugins) ? opts.recmaPlugins : undefined;
322
485
  // Only return if at least one plugin array is non-empty
323
486
  if ((remarkPlugins && remarkPlugins.length > 0) ||
324
487
  (rehypePlugins && rehypePlugins.length > 0) ||
@@ -1 +1 @@
1
- {"version":3,"file":"next-config.js","sourceRoot":"","sources":["../../src/config/next-config.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * next.config.js / next.config.mjs / next.config.ts parser\n *\n * Loads the Next.js config file (if present) and extracts supported options.\n * Unsupported options are logged as warnings.\n */\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { createRequire } from \"node:module\";\nimport fs from \"node:fs\";\nimport { PHASE_DEVELOPMENT_SERVER } from \"../shims/constants.js\";\nimport { normalizePageExtensions } from \"../routing/file-matcher.js\";\n\nexport interface HasCondition {\n type: \"header\" | \"cookie\" | \"query\" | \"host\";\n key: string;\n value?: string;\n}\n\nexport interface NextRedirect {\n source: string;\n destination: string;\n permanent: boolean;\n has?: HasCondition[];\n missing?: HasCondition[];\n}\n\nexport interface NextRewrite {\n source: string;\n destination: string;\n has?: HasCondition[];\n missing?: HasCondition[];\n}\n\nexport interface NextHeader {\n source: string;\n has?: HasCondition[];\n missing?: HasCondition[];\n headers: Array<{ key: string; value: string }>;\n}\n\nexport interface NextI18nConfig {\n /** List of supported locales */\n locales: string[];\n /** The default locale (used when no locale prefix is in the URL) */\n defaultLocale: string;\n /**\n * Whether to auto-detect locale from Accept-Language header.\n * Defaults to true in Next.js.\n */\n localeDetection?: boolean;\n /**\n * Domain-based routing. Each domain maps to a specific locale.\n */\n domains?: Array<{\n domain: string;\n defaultLocale: string;\n locales?: string[];\n http?: boolean;\n }>;\n}\n\n/**\n * MDX compilation options extracted from @next/mdx config.\n * These are passed through to @mdx-js/rollup so that custom\n * remark/rehype/recma plugins configured in next.config work with Vite.\n */\nexport interface MdxOptions {\n remarkPlugins?: unknown[];\n rehypePlugins?: unknown[];\n recmaPlugins?: unknown[];\n}\n\nexport interface NextConfig {\n /** Additional env variables */\n env?: Record<string, string>;\n /** Base URL path prefix */\n basePath?: string;\n /** Whether to add trailing slashes */\n trailingSlash?: boolean;\n /** Internationalization routing config */\n i18n?: NextI18nConfig;\n /** URL redirect rules */\n redirects?: () => Promise<NextRedirect[]> | NextRedirect[];\n /** URL rewrite rules */\n rewrites?: () =>\n | Promise<\n | NextRewrite[]\n | {\n beforeFiles: NextRewrite[];\n afterFiles: NextRewrite[];\n fallback: NextRewrite[];\n }\n >\n | NextRewrite[]\n | {\n beforeFiles: NextRewrite[];\n afterFiles: NextRewrite[];\n fallback: NextRewrite[];\n };\n /** Custom response headers */\n headers?: () => Promise<NextHeader[]> | NextHeader[];\n /** Image optimization config */\n images?: {\n remotePatterns?: Array<{\n protocol?: string;\n hostname: string;\n port?: string;\n pathname?: string;\n search?: string;\n }>;\n domains?: string[];\n unoptimized?: boolean;\n /** Allowed device widths for image optimization. Defaults to Next.js defaults: [640, 750, 828, 1080, 1200, 1920, 2048, 3840] */\n deviceSizes?: number[];\n /** Allowed image sizes for fixed-width images. Defaults to Next.js defaults: [16, 32, 48, 64, 96, 128, 256, 384] */\n imageSizes?: number[];\n /** Allow SVG images through the image optimization endpoint. SVG can contain scripts, so only enable if you trust all image sources. */\n dangerouslyAllowSVG?: boolean;\n /** Content-Disposition header for image responses. Defaults to \"inline\". */\n contentDispositionType?: \"inline\" | \"attachment\";\n /** Content-Security-Policy header for image responses. Defaults to \"script-src 'none'; frame-src 'none'; sandbox;\" */\n contentSecurityPolicy?: string;\n };\n /** Build output mode: 'export' for full static export, 'standalone' for single server */\n output?: \"export\" | \"standalone\";\n /** File extensions treated as routable pages/routes (Next.js pageExtensions) */\n pageExtensions?: string[];\n /** Extra origins allowed to access the dev server. */\n allowedDevOrigins?: string[];\n /**\n * Enable Cache Components (Next.js 16).\n * When true, enables the \"use cache\" directive for pages, components, and functions.\n * Replaces the removed experimental.ppr and experimental.dynamicIO flags.\n */\n cacheComponents?: boolean;\n /** Transpile packages (Vite handles this natively) */\n transpilePackages?: string[];\n /** Webpack config (ignored — we use Vite) */\n webpack?: unknown;\n /** Any other options */\n [key: string]: unknown;\n}\n\n/**\n * Resolved configuration with all async values awaited.\n */\nexport interface ResolvedNextConfig {\n env: Record<string, string>;\n basePath: string;\n trailingSlash: boolean;\n output: \"\" | \"export\" | \"standalone\";\n pageExtensions: string[];\n cacheComponents: boolean;\n redirects: NextRedirect[];\n rewrites: {\n beforeFiles: NextRewrite[];\n afterFiles: NextRewrite[];\n fallback: NextRewrite[];\n };\n headers: NextHeader[];\n images: NextConfig[\"images\"];\n i18n: NextI18nConfig | null;\n /** MDX remark/rehype/recma plugins extracted from @next/mdx config */\n mdx: MdxOptions | null;\n /** Explicit module aliases preserved from wrapped next.config plugins. */\n aliases: Record<string, string>;\n /** Extra allowed origins for dev server access (from allowedDevOrigins). */\n allowedDevOrigins: string[];\n /** Extra allowed origins for server action CSRF validation (from experimental.serverActions.allowedOrigins). */\n serverActionsAllowedOrigins: string[];\n}\n\nconst CONFIG_FILES = [\n \"next.config.ts\",\n \"next.config.mjs\",\n \"next.config.js\",\n \"next.config.cjs\",\n];\n\n/**\n * Check whether an error indicates a CJS module was loaded in an ESM context\n * (i.e. the file uses `require()` which is not available in ESM).\n */\nfunction isCjsError(e: unknown): boolean {\n if (!(e instanceof Error)) return false;\n const msg = e.message;\n return (\n msg.includes(\"require is not a function\") ||\n msg.includes(\"require is not defined\") ||\n msg.includes(\"exports is not defined\") ||\n msg.includes(\"module is not defined\") ||\n msg.includes(\"__dirname is not defined\") ||\n msg.includes(\"__filename is not defined\")\n );\n}\n\n/**\n * Unwrap the config value from a loaded module, calling it if it's a\n * function-form config (Next.js supports `module.exports = (phase, opts) => config`).\n */\nasync function unwrapConfig(\n mod: any,\n phase: string = PHASE_DEVELOPMENT_SERVER,\n): Promise<NextConfig> {\n const config = mod.default ?? mod;\n if (typeof config === \"function\") {\n const result = await config(phase, {\n defaultConfig: {},\n });\n return result as NextConfig;\n }\n return config as NextConfig;\n}\n\n/**\n * Find and load the next.config file from the project root.\n * Returns null if no config file is found.\n *\n * Attempts ESM dynamic `import()` first. If the file uses CJS constructs\n * (`require`, `module.exports`) that aren't available in ESM context, falls\n * back to loading it via `createRequire` so that CJS config files (common in\n * the Next.js ecosystem for plugin wrappers like nextra, @next/mdx, etc.) work.\n */\nexport async function loadNextConfig(\n root: string,\n phase: string = PHASE_DEVELOPMENT_SERVER,\n): Promise<NextConfig | null> {\n for (const filename of CONFIG_FILES) {\n const configPath = path.join(root, filename);\n if (!fs.existsSync(configPath)) continue;\n\n try {\n // Use dynamic import for ESM/TS config files\n const fileUrl = pathToFileURL(configPath).href;\n const mod = await import(fileUrl);\n return await unwrapConfig(mod, phase);\n } catch (e) {\n // If the error indicates a CJS file loaded in ESM context, retry with\n // createRequire which provides a proper CommonJS environment.\n if (isCjsError(e) && (filename.endsWith(\".js\") || filename.endsWith(\".cjs\"))) {\n try {\n const require = createRequire(path.join(root, \"package.json\"));\n const mod = require(configPath);\n return await unwrapConfig({ default: mod }, phase);\n } catch (e2) {\n console.warn(\n `[vinext] Failed to load ${filename}: ${(e2 as Error).message}`,\n );\n return null;\n }\n }\n\n console.warn(\n `[vinext] Failed to load ${filename}: ${(e as Error).message}`,\n );\n return null;\n }\n }\n\n return null;\n}\n\n/**\n * Resolve a NextConfig into a fully-resolved ResolvedNextConfig.\n * Awaits async functions for redirects/rewrites/headers.\n */\nexport async function resolveNextConfig(\n config: NextConfig | null,\n root: string = process.cwd(),\n): Promise<ResolvedNextConfig> {\n if (!config) {\n return {\n env: {},\n basePath: \"\",\n trailingSlash: false,\n output: \"\",\n pageExtensions: normalizePageExtensions(),\n cacheComponents: false,\n redirects: [],\n rewrites: { beforeFiles: [], afterFiles: [], fallback: [] },\n headers: [],\n images: undefined,\n i18n: null,\n mdx: null,\n aliases: {},\n allowedDevOrigins: [],\n serverActionsAllowedOrigins: [],\n };\n }\n\n // Resolve redirects\n let redirects: NextRedirect[] = [];\n if (config.redirects) {\n const result = await config.redirects();\n redirects = Array.isArray(result) ? result : [];\n }\n\n // Resolve rewrites\n let rewrites = {\n beforeFiles: [] as NextRewrite[],\n afterFiles: [] as NextRewrite[],\n fallback: [] as NextRewrite[],\n };\n if (config.rewrites) {\n const result = await config.rewrites();\n if (Array.isArray(result)) {\n rewrites.afterFiles = result;\n } else {\n rewrites = {\n beforeFiles: result.beforeFiles ?? [],\n afterFiles: result.afterFiles ?? [],\n fallback: result.fallback ?? [],\n };\n }\n }\n\n // Resolve headers\n let headers: NextHeader[] = [];\n if (config.headers) {\n headers = await config.headers();\n }\n\n // Probe wrapped webpack config once so alias extraction and MDX extraction\n // observe the same mock environment.\n const webpackProbe = await probeWebpackConfig(config, root);\n const mdx = webpackProbe.mdx;\n const aliases = {\n ...extractTurboAliases(config, root),\n ...webpackProbe.aliases,\n };\n\n const allowedDevOrigins = Array.isArray(config.allowedDevOrigins)\n ? config.allowedDevOrigins\n : [];\n\n // Resolve serverActions.allowedOrigins from experimental config\n const experimental = config.experimental as Record<string, unknown> | undefined;\n const serverActionsConfig = experimental?.serverActions as\n | Record<string, unknown>\n | undefined;\n const serverActionsAllowedOrigins = Array.isArray(\n serverActionsConfig?.allowedOrigins,\n )\n ? (serverActionsConfig.allowedOrigins as string[])\n : [];\n\n // Warn about unsupported webpack usage. We preserve alias injection and\n // extract MDX settings, but all other webpack customization is still ignored.\n if (config.webpack !== undefined) {\n if (mdx || Object.keys(webpackProbe.aliases).length > 0) {\n console.warn(\n '[vinext] next.config option \"webpack\" is only partially supported. ' +\n \"vinext preserves resolve.alias entries and MDX loader settings, but other webpack customization is ignored\",\n );\n } else {\n console.warn(\n '[vinext] next.config option \"webpack\" is not yet supported and will be ignored',\n );\n }\n }\n\n const output = config.output ?? \"\";\n if (output && output !== \"export\" && output !== \"standalone\") {\n console.warn(`[vinext] Unknown output mode \"${output as string}\", ignoring`);\n }\n\n const pageExtensions = normalizePageExtensions(config.pageExtensions);\n\n // Parse i18n config\n let i18n: NextI18nConfig | null = null;\n if (config.i18n) {\n i18n = {\n locales: config.i18n.locales,\n defaultLocale: config.i18n.defaultLocale,\n localeDetection: config.i18n.localeDetection ?? true,\n domains: config.i18n.domains,\n };\n }\n\n return {\n env: config.env ?? {},\n basePath: config.basePath ?? \"\",\n trailingSlash: config.trailingSlash ?? false,\n output: output === \"export\" || output === \"standalone\" ? output : \"\",\n pageExtensions,\n cacheComponents: config.cacheComponents ?? false,\n redirects,\n rewrites,\n headers,\n images: config.images,\n i18n,\n mdx,\n aliases,\n allowedDevOrigins,\n serverActionsAllowedOrigins,\n };\n}\n\nfunction normalizeAliasEntries(\n aliases: Record<string, unknown> | undefined,\n root: string,\n): Record<string, string> {\n if (!aliases) return {};\n\n const normalized: Record<string, string> = {};\n for (const [key, value] of Object.entries(aliases)) {\n if (typeof value !== \"string\") continue;\n normalized[key] = path.isAbsolute(value) ? value : path.resolve(root, value);\n }\n return normalized;\n}\n\nfunction extractTurboAliases(\n config: NextConfig,\n root: string,\n): Record<string, string> {\n const experimental = config.experimental as Record<string, unknown> | undefined;\n const experimentalTurbo = experimental?.turbo as Record<string, unknown> | undefined;\n const topLevelTurbopack = config.turbopack as Record<string, unknown> | undefined;\n\n return {\n ...normalizeAliasEntries(\n experimentalTurbo?.resolveAlias as Record<string, unknown> | undefined,\n root,\n ),\n ...normalizeAliasEntries(\n topLevelTurbopack?.resolveAlias as Record<string, unknown> | undefined,\n root,\n ),\n };\n}\n\nasync function probeWebpackConfig(\n config: NextConfig,\n root: string,\n): Promise<{ aliases: Record<string, string>; mdx: MdxOptions | null }> {\n if (typeof config.webpack !== \"function\") {\n return { aliases: {}, mdx: null };\n }\n\n const mockModuleRules: any[] = [];\n const mockConfig = {\n context: root,\n resolve: { alias: {} as Record<string, unknown> },\n module: { rules: mockModuleRules },\n plugins: [] as any[],\n };\n const mockOptions = {\n defaultLoaders: { babel: { loader: \"next-babel-loader\" } },\n isServer: false,\n dev: false,\n dir: root,\n };\n\n try {\n const result = await (config.webpack as Function)(mockConfig, mockOptions);\n const finalConfig = result ?? mockConfig;\n const rules: any[] = finalConfig.module?.rules ?? mockModuleRules;\n return {\n aliases: normalizeAliasEntries(finalConfig.resolve?.alias, root),\n mdx: extractMdxOptionsFromRules(rules),\n };\n } catch {\n return { aliases: {}, mdx: null };\n }\n}\n\n/**\n * Extract MDX compilation options (remark/rehype/recma plugins) from\n * a Next.js config that uses @next/mdx.\n *\n * @next/mdx wraps the config with a webpack function that injects an MDX\n * loader rule. The remark/rehype plugins are captured in that closure.\n * We probe the webpack function with a mock config to extract them.\n */\nexport async function extractMdxOptions(\n config: NextConfig,\n root: string = process.cwd(),\n): Promise<MdxOptions | null> {\n return (await probeWebpackConfig(config, root)).mdx;\n}\n\nfunction extractMdxOptionsFromRules(rules: any[]): MdxOptions | null {\n // Search through webpack rules for the MDX loader injected by @next/mdx\n for (const rule of rules) {\n const loaders = extractMdxLoaders(rule);\n if (loaders) return loaders;\n }\n return null;\n}\n\n/**\n * Recursively search a webpack rule (which may have nested `oneOf` arrays)\n * for an MDX loader and extract its remark/rehype/recma plugin options.\n */\nfunction extractMdxLoaders(rule: any): MdxOptions | null {\n if (!rule) return null;\n\n // Check `oneOf` arrays (Next.js uses these extensively)\n if (Array.isArray(rule.oneOf)) {\n for (const child of rule.oneOf) {\n const result = extractMdxLoaders(child);\n if (result) return result;\n }\n }\n\n // Check `use` array (loader chain)\n const use = Array.isArray(rule.use) ? rule.use : rule.use ? [rule.use] : [];\n for (const loader of use) {\n const loaderPath = typeof loader === \"string\" ? loader : loader?.loader;\n if (typeof loaderPath === \"string\" && isMdxLoader(loaderPath)) {\n const opts = typeof loader === \"object\" ? loader.options : {};\n return extractPluginsFromOptions(opts);\n }\n }\n\n // Check direct `loader` field\n if (typeof rule.loader === \"string\" && isMdxLoader(rule.loader)) {\n return extractPluginsFromOptions(rule.options);\n }\n\n return null;\n}\n\nfunction isMdxLoader(loaderPath: string): boolean {\n return (\n loaderPath.includes(\"mdx\") &&\n (loaderPath.includes(\"@next\") ||\n loaderPath.includes(\"@mdx-js\") ||\n loaderPath.includes(\"mdx-js-loader\") ||\n loaderPath.includes(\"next-mdx\"))\n );\n}\n\nfunction extractPluginsFromOptions(opts: any): MdxOptions | null {\n if (!opts || typeof opts !== \"object\") return null;\n\n const remarkPlugins = Array.isArray(opts.remarkPlugins)\n ? opts.remarkPlugins\n : undefined;\n const rehypePlugins = Array.isArray(opts.rehypePlugins)\n ? opts.rehypePlugins\n : undefined;\n const recmaPlugins = Array.isArray(opts.recmaPlugins)\n ? opts.recmaPlugins\n : undefined;\n\n // Only return if at least one plugin array is non-empty\n if (\n (remarkPlugins && remarkPlugins.length > 0) ||\n (rehypePlugins && rehypePlugins.length > 0) ||\n (recmaPlugins && recmaPlugins.length > 0)\n ) {\n return {\n ...(remarkPlugins && remarkPlugins.length > 0 ? { remarkPlugins } : {}),\n ...(rehypePlugins && rehypePlugins.length > 0 ? { rehypePlugins } : {}),\n ...(recmaPlugins && recmaPlugins.length > 0 ? { recmaPlugins } : {}),\n };\n }\n\n return null;\n}\n"]}
1
+ {"version":3,"file":"next-config.js","sourceRoot":"","sources":["../../src/config/next-config.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * next.config.js / next.config.mjs / next.config.ts parser\n *\n * Loads the Next.js config file (if present) and extracts supported options.\n * Unsupported options are logged as warnings.\n */\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport fs from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { PHASE_DEVELOPMENT_SERVER } from \"../shims/constants.js\";\nimport { normalizePageExtensions } from \"../routing/file-matcher.js\";\n\n/**\n * Parse a body size limit value (string or number) into bytes.\n * Accepts Next.js-style strings like \"1mb\", \"500kb\", \"10mb\", bare number strings like \"1048576\" (bytes),\n * and numeric values. Supports b, kb, mb, gb, tb, pb units.\n * Returns the default 1MB if the value is not provided or invalid.\n * Throws if the parsed value is less than 1.\n */\nexport function parseBodySizeLimit(value: string | number | undefined | null): number {\n if (value === undefined || value === null) return 1 * 1024 * 1024;\n if (typeof value === \"number\") {\n if (value < 1) throw new Error(`Body size limit must be a positive number, got ${value}`);\n return value;\n }\n const trimmed = value.trim();\n const match = trimmed.match(/^(\\d+(?:\\.\\d+)?)\\s*(b|kb|mb|gb|tb|pb)?$/i);\n if (!match) {\n console.warn(\n `[vinext] Invalid bodySizeLimit value: \"${value}\". Expected a number or a string like \"1mb\", \"500kb\". Falling back to 1MB.`,\n );\n return 1 * 1024 * 1024;\n }\n const num = parseFloat(match[1]);\n const unit = (match[2] ?? \"b\").toLowerCase();\n let bytes: number;\n switch (unit) {\n case \"b\":\n bytes = Math.floor(num);\n break;\n case \"kb\":\n bytes = Math.floor(num * 1024);\n break;\n case \"mb\":\n bytes = Math.floor(num * 1024 * 1024);\n break;\n case \"gb\":\n bytes = Math.floor(num * 1024 * 1024 * 1024);\n break;\n case \"tb\":\n bytes = Math.floor(num * 1024 * 1024 * 1024 * 1024);\n break;\n case \"pb\":\n bytes = Math.floor(num * 1024 * 1024 * 1024 * 1024 * 1024);\n break;\n default:\n return 1 * 1024 * 1024;\n }\n if (bytes < 1) throw new Error(`Body size limit must be a positive number, got ${bytes}`);\n return bytes;\n}\n\nexport interface HasCondition {\n type: \"header\" | \"cookie\" | \"query\" | \"host\";\n key: string;\n value?: string;\n}\n\nexport interface NextRedirect {\n source: string;\n destination: string;\n permanent: boolean;\n has?: HasCondition[];\n missing?: HasCondition[];\n}\n\nexport interface NextRewrite {\n source: string;\n destination: string;\n has?: HasCondition[];\n missing?: HasCondition[];\n}\n\nexport interface NextHeader {\n source: string;\n has?: HasCondition[];\n missing?: HasCondition[];\n headers: Array<{ key: string; value: string }>;\n}\n\nexport interface NextI18nConfig {\n /** List of supported locales */\n locales: string[];\n /** The default locale (used when no locale prefix is in the URL) */\n defaultLocale: string;\n /**\n * Whether to auto-detect locale from Accept-Language header.\n * Defaults to true in Next.js.\n */\n localeDetection?: boolean;\n /**\n * Domain-based routing. Each domain maps to a specific locale.\n */\n domains?: Array<{\n domain: string;\n defaultLocale: string;\n locales?: string[];\n http?: boolean;\n }>;\n}\n\n/**\n * MDX compilation options extracted from @next/mdx config.\n * These are passed through to @mdx-js/rollup so that custom\n * remark/rehype/recma plugins configured in next.config work with Vite.\n */\nexport interface MdxOptions {\n remarkPlugins?: unknown[];\n rehypePlugins?: unknown[];\n recmaPlugins?: unknown[];\n}\n\nexport interface NextConfig {\n /** Additional env variables */\n env?: Record<string, string>;\n /** Base URL path prefix */\n basePath?: string;\n /** Whether to add trailing slashes */\n trailingSlash?: boolean;\n /** Internationalization routing config */\n i18n?: NextI18nConfig;\n /** URL redirect rules */\n redirects?: () => Promise<NextRedirect[]> | NextRedirect[];\n /** URL rewrite rules */\n rewrites?: () =>\n | Promise<\n | NextRewrite[]\n | {\n beforeFiles: NextRewrite[];\n afterFiles: NextRewrite[];\n fallback: NextRewrite[];\n }\n >\n | NextRewrite[]\n | {\n beforeFiles: NextRewrite[];\n afterFiles: NextRewrite[];\n fallback: NextRewrite[];\n };\n /** Custom response headers */\n headers?: () => Promise<NextHeader[]> | NextHeader[];\n /** Image optimization config */\n images?: {\n remotePatterns?: Array<{\n protocol?: string;\n hostname: string;\n port?: string;\n pathname?: string;\n search?: string;\n }>;\n domains?: string[];\n unoptimized?: boolean;\n /** Allowed device widths for image optimization. Defaults to Next.js defaults: [640, 750, 828, 1080, 1200, 1920, 2048, 3840] */\n deviceSizes?: number[];\n /** Allowed image sizes for fixed-width images. Defaults to Next.js defaults: [16, 32, 48, 64, 96, 128, 256, 384] */\n imageSizes?: number[];\n /** Allow SVG images through the image optimization endpoint. SVG can contain scripts, so only enable if you trust all image sources. */\n dangerouslyAllowSVG?: boolean;\n /** Content-Disposition header for image responses. Defaults to \"inline\". */\n contentDispositionType?: \"inline\" | \"attachment\";\n /** Content-Security-Policy header for image responses. Defaults to \"script-src 'none'; frame-src 'none'; sandbox;\" */\n contentSecurityPolicy?: string;\n };\n /** Build output mode: 'export' for full static export, 'standalone' for single server */\n output?: \"export\" | \"standalone\";\n /** File extensions treated as routable pages/routes (Next.js pageExtensions) */\n pageExtensions?: string[];\n /** Extra origins allowed to access the dev server. */\n allowedDevOrigins?: string[];\n /**\n * Enable Cache Components (Next.js 16).\n * When true, enables the \"use cache\" directive for pages, components, and functions.\n * Replaces the removed experimental.ppr and experimental.dynamicIO flags.\n */\n cacheComponents?: boolean;\n /** Transpile packages (Vite handles this natively) */\n transpilePackages?: string[];\n /** Webpack config (ignored — we use Vite) */\n webpack?: unknown;\n /**\n * Custom build ID generator. If provided, called once at build/dev start.\n * Must return a non-empty string, or null to use the default random ID.\n */\n generateBuildId?: () => string | null | Promise<string | null>;\n /** Any other options */\n [key: string]: unknown;\n}\n\n/**\n * Resolved configuration with all async values awaited.\n */\nexport interface ResolvedNextConfig {\n env: Record<string, string>;\n basePath: string;\n trailingSlash: boolean;\n output: \"\" | \"export\" | \"standalone\";\n pageExtensions: string[];\n cacheComponents: boolean;\n redirects: NextRedirect[];\n rewrites: {\n beforeFiles: NextRewrite[];\n afterFiles: NextRewrite[];\n fallback: NextRewrite[];\n };\n headers: NextHeader[];\n images: NextConfig[\"images\"];\n i18n: NextI18nConfig | null;\n /** MDX remark/rehype/recma plugins extracted from @next/mdx config */\n mdx: MdxOptions | null;\n /** Explicit module aliases preserved from wrapped next.config plugins. */\n aliases: Record<string, string>;\n /** Extra allowed origins for dev server access (from allowedDevOrigins). */\n allowedDevOrigins: string[];\n /** Extra allowed origins for server action CSRF validation (from experimental.serverActions.allowedOrigins). */\n serverActionsAllowedOrigins: string[];\n /** Parsed body size limit for server actions in bytes (from experimental.serverActions.bodySizeLimit). Defaults to 1MB. */\n serverActionsBodySizeLimit: number;\n /** Resolved build ID (from generateBuildId, or a random UUID if not provided). */\n buildId: string;\n}\n\nconst CONFIG_FILES = [\"next.config.ts\", \"next.config.mjs\", \"next.config.js\", \"next.config.cjs\"];\n\n/**\n * Check whether an error indicates a CJS module was loaded in an ESM context\n * (i.e. the file uses `require()` which is not available in ESM).\n */\nfunction isCjsError(e: unknown): boolean {\n if (!(e instanceof Error)) return false;\n const msg = e.message;\n return (\n msg.includes(\"require is not a function\") ||\n msg.includes(\"require is not defined\") ||\n msg.includes(\"exports is not defined\") ||\n msg.includes(\"module is not defined\") ||\n msg.includes(\"__dirname is not defined\") ||\n msg.includes(\"__filename is not defined\")\n );\n}\n\n/**\n * Emit a warning when config loading fails, with a targeted hint for\n * known plugin wrappers that are unnecessary in vinext.\n */\nfunction warnConfigLoadFailure(filename: string, err: Error): void {\n const msg = err.message ?? \"\";\n const stack = err.stack ?? \"\";\n const isNextIntlPlugin =\n msg.includes(\"next-intl\") ||\n stack.includes(\"next-intl/plugin\") ||\n stack.includes(\"next-intl/dist\");\n\n console.warn(`[vinext] Failed to load ${filename}: ${msg}`);\n if (isNextIntlPlugin) {\n console.warn(\n \"[vinext] Hint: createNextIntlPlugin() is not needed with vinext. \" +\n \"Remove the next-intl/plugin wrapper from your next.config — \" +\n \"vinext auto-detects next-intl and registers the i18n config alias automatically.\",\n );\n }\n}\n\n/**\n * Unwrap the config value from a loaded module, calling it if it's a\n * function-form config (Next.js supports `module.exports = (phase, opts) => config`).\n */\nasync function unwrapConfig(\n mod: any,\n phase: string = PHASE_DEVELOPMENT_SERVER,\n): Promise<NextConfig> {\n const config = mod.default ?? mod;\n if (typeof config === \"function\") {\n const result = await config(phase, {\n defaultConfig: {},\n });\n return result as NextConfig;\n }\n return config as NextConfig;\n}\n\n/**\n * Find and load the next.config file from the project root.\n * Returns null if no config file is found.\n *\n * Attempts Vite's module runner first so TS configs and extensionless local\n * imports (e.g. `import \"./env\"`) resolve consistently. If loading fails due\n * to CJS constructs (`require`, `module.exports`), falls back to `createRequire`\n * so common CJS plugin wrappers (nextra, @next/mdx, etc.) still work.\n */\nexport async function loadNextConfig(\n root: string,\n phase: string = PHASE_DEVELOPMENT_SERVER,\n): Promise<NextConfig | null> {\n for (const filename of CONFIG_FILES) {\n const configPath = path.join(root, filename);\n if (!fs.existsSync(configPath)) continue;\n\n try {\n // Load config via Vite's module runner (TS + extensionless import support)\n const { runnerImport } = await import(\"vite\");\n const { module: mod } = await runnerImport(configPath, {\n root,\n logLevel: \"error\",\n clearScreen: false,\n });\n return await unwrapConfig(mod, phase);\n } catch (e) {\n // If the error indicates a CJS file loaded in ESM context, retry with\n // createRequire which provides a proper CommonJS environment.\n if (isCjsError(e) && (filename.endsWith(\".js\") || filename.endsWith(\".cjs\"))) {\n try {\n const require = createRequire(path.join(root, \"package.json\"));\n const mod = require(configPath);\n return await unwrapConfig({ default: mod }, phase);\n } catch (e2) {\n warnConfigLoadFailure(filename, e2 as Error);\n return null;\n }\n }\n\n warnConfigLoadFailure(filename, e as Error);\n return null;\n }\n }\n\n return null;\n}\n\n/**\n * Generate a UUID that doesn't contain \"ad\" to avoid false-positive ad-blocker hits.\n * Mirrors Next.js's own nanoid retry loop.\n */\nfunction safeUUID(): string {\n let id = randomUUID();\n while (/ad/i.test(id)) id = randomUUID();\n return id;\n}\n\n/**\n * Call the user's generateBuildId function and validate its return value.\n * Follows Next.js semantics: null return falls back to a random UUID; any\n * other non-string throws. Leading/trailing whitespace is trimmed.\n *\n * @see https://nextjs.org/docs/app/api-reference/config/next-config-js/generateBuildId\n */\nasync function resolveBuildId(\n generate: (() => string | null | Promise<string | null>) | undefined,\n): Promise<string> {\n if (!generate) return safeUUID();\n\n const result = await generate();\n\n if (result === null) return safeUUID();\n\n if (typeof result !== \"string\") {\n throw new Error(\n \"generateBuildId did not return a string. https://nextjs.org/docs/messages/generatebuildid-not-a-string\",\n );\n }\n\n const trimmed = result.trim();\n if (trimmed.length === 0) {\n throw new Error(\n \"generateBuildId returned an empty string. https://nextjs.org/docs/messages/generatebuildid-not-a-string\",\n );\n }\n\n return trimmed;\n}\n\n/**\n * Resolve a NextConfig into a fully-resolved ResolvedNextConfig.\n * Awaits async functions for redirects/rewrites/headers.\n */\nexport async function resolveNextConfig(\n config: NextConfig | null,\n root: string = process.cwd(),\n): Promise<ResolvedNextConfig> {\n if (!config) {\n const buildId = await resolveBuildId(undefined);\n const resolved: ResolvedNextConfig = {\n env: {},\n basePath: \"\",\n trailingSlash: false,\n output: \"\",\n pageExtensions: normalizePageExtensions(),\n cacheComponents: false,\n redirects: [],\n rewrites: { beforeFiles: [], afterFiles: [], fallback: [] },\n headers: [],\n images: undefined,\n i18n: null,\n mdx: null,\n aliases: {},\n allowedDevOrigins: [],\n serverActionsAllowedOrigins: [],\n serverActionsBodySizeLimit: 1 * 1024 * 1024,\n buildId,\n };\n detectNextIntlConfig(root, resolved);\n return resolved;\n }\n\n // Resolve redirects\n let redirects: NextRedirect[] = [];\n if (config.redirects) {\n const result = await config.redirects();\n redirects = Array.isArray(result) ? result : [];\n }\n\n // Resolve rewrites\n let rewrites = {\n beforeFiles: [] as NextRewrite[],\n afterFiles: [] as NextRewrite[],\n fallback: [] as NextRewrite[],\n };\n if (config.rewrites) {\n const result = await config.rewrites();\n if (Array.isArray(result)) {\n rewrites.afterFiles = result;\n } else {\n rewrites = {\n beforeFiles: result.beforeFiles ?? [],\n afterFiles: result.afterFiles ?? [],\n fallback: result.fallback ?? [],\n };\n }\n }\n\n // Resolve headers\n let headers: NextHeader[] = [];\n if (config.headers) {\n headers = await config.headers();\n }\n\n // Probe wrapped webpack config once so alias extraction and MDX extraction\n // observe the same mock environment.\n const webpackProbe = await probeWebpackConfig(config, root);\n const mdx = webpackProbe.mdx;\n const aliases = {\n ...extractTurboAliases(config, root),\n ...webpackProbe.aliases,\n };\n\n const allowedDevOrigins = Array.isArray(config.allowedDevOrigins) ? config.allowedDevOrigins : [];\n\n // Resolve serverActions.allowedOrigins and bodySizeLimit from experimental config\n const experimental = config.experimental as Record<string, unknown> | undefined;\n const serverActionsConfig = experimental?.serverActions as Record<string, unknown> | undefined;\n const serverActionsAllowedOrigins = Array.isArray(serverActionsConfig?.allowedOrigins)\n ? (serverActionsConfig.allowedOrigins as string[])\n : [];\n const serverActionsBodySizeLimit = parseBodySizeLimit(\n serverActionsConfig?.bodySizeLimit as string | number | undefined,\n );\n\n // Warn about unsupported webpack usage. We preserve alias injection and\n // extract MDX settings, but all other webpack customization is still ignored.\n if (config.webpack !== undefined) {\n if (mdx || Object.keys(webpackProbe.aliases).length > 0) {\n console.warn(\n '[vinext] next.config option \"webpack\" is only partially supported. ' +\n \"vinext preserves resolve.alias entries and MDX loader settings, but other webpack customization is ignored\",\n );\n } else {\n console.warn(\n '[vinext] next.config option \"webpack\" is not yet supported and will be ignored',\n );\n }\n }\n\n const output = config.output ?? \"\";\n if (output && output !== \"export\" && output !== \"standalone\") {\n console.warn(`[vinext] Unknown output mode \"${output as string}\", ignoring`);\n }\n\n const pageExtensions = normalizePageExtensions(config.pageExtensions);\n\n // Parse i18n config\n let i18n: NextI18nConfig | null = null;\n if (config.i18n) {\n i18n = {\n locales: config.i18n.locales,\n defaultLocale: config.i18n.defaultLocale,\n localeDetection: config.i18n.localeDetection ?? true,\n domains: config.i18n.domains,\n };\n }\n\n const buildId = await resolveBuildId(\n config.generateBuildId as (() => string | null | Promise<string | null>) | undefined,\n );\n\n const resolved: ResolvedNextConfig = {\n env: config.env ?? {},\n basePath: config.basePath ?? \"\",\n trailingSlash: config.trailingSlash ?? false,\n output: output === \"export\" || output === \"standalone\" ? output : \"\",\n pageExtensions,\n cacheComponents: config.cacheComponents ?? false,\n redirects,\n rewrites,\n headers,\n images: config.images,\n i18n,\n mdx,\n aliases,\n allowedDevOrigins,\n serverActionsAllowedOrigins,\n serverActionsBodySizeLimit,\n buildId,\n };\n\n // Auto-detect next-intl (lowest priority — explicit aliases from\n // webpack/turbopack already in `aliases` take precedence)\n detectNextIntlConfig(root, resolved);\n\n return resolved;\n}\n\nfunction normalizeAliasEntries(\n aliases: Record<string, unknown> | undefined,\n root: string,\n): Record<string, string> {\n if (!aliases) return {};\n\n const normalized: Record<string, string> = {};\n for (const [key, value] of Object.entries(aliases)) {\n if (typeof value !== \"string\") continue;\n normalized[key] = path.isAbsolute(value) ? value : path.resolve(root, value);\n }\n return normalized;\n}\n\nfunction extractTurboAliases(config: NextConfig, root: string): Record<string, string> {\n const experimental = config.experimental as Record<string, unknown> | undefined;\n const experimentalTurbo = experimental?.turbo as Record<string, unknown> | undefined;\n const topLevelTurbopack = config.turbopack as Record<string, unknown> | undefined;\n\n return {\n ...normalizeAliasEntries(\n experimentalTurbo?.resolveAlias as Record<string, unknown> | undefined,\n root,\n ),\n ...normalizeAliasEntries(\n topLevelTurbopack?.resolveAlias as Record<string, unknown> | undefined,\n root,\n ),\n };\n}\n\nasync function probeWebpackConfig(\n config: NextConfig,\n root: string,\n): Promise<{ aliases: Record<string, string>; mdx: MdxOptions | null }> {\n if (typeof config.webpack !== \"function\") {\n return { aliases: {}, mdx: null };\n }\n\n const mockModuleRules: any[] = [];\n const mockConfig = {\n context: root,\n resolve: { alias: {} as Record<string, unknown> },\n module: { rules: mockModuleRules },\n plugins: [] as any[],\n };\n const mockOptions = {\n defaultLoaders: { babel: { loader: \"next-babel-loader\" } },\n isServer: false,\n dev: false,\n dir: root,\n };\n\n try {\n const result = await (config.webpack as Function)(mockConfig, mockOptions);\n const finalConfig = result ?? mockConfig;\n const rules: any[] = finalConfig.module?.rules ?? mockModuleRules;\n return {\n aliases: normalizeAliasEntries(finalConfig.resolve?.alias, root),\n mdx: extractMdxOptionsFromRules(rules),\n };\n } catch {\n return { aliases: {}, mdx: null };\n }\n}\n\n/**\n * Extract MDX compilation options (remark/rehype/recma plugins) from\n * a Next.js config that uses @next/mdx.\n *\n * @next/mdx wraps the config with a webpack function that injects an MDX\n * loader rule. The remark/rehype plugins are captured in that closure.\n * We probe the webpack function with a mock config to extract them.\n */\nexport async function extractMdxOptions(\n config: NextConfig,\n root: string = process.cwd(),\n): Promise<MdxOptions | null> {\n return (await probeWebpackConfig(config, root)).mdx;\n}\n\n/**\n * Probe file candidates relative to root. Returns the first one that exists,\n * or null if none match.\n */\nfunction probeFiles(root: string, candidates: string[]): string | null {\n for (const candidate of candidates) {\n const abs = path.resolve(root, candidate);\n if (fs.existsSync(abs)) return abs;\n }\n return null;\n}\n\nconst I18N_REQUEST_CANDIDATES = [\n \"i18n/request.ts\",\n \"i18n/request.tsx\",\n \"i18n/request.js\",\n \"i18n/request.jsx\",\n \"src/i18n/request.ts\",\n \"src/i18n/request.tsx\",\n \"src/i18n/request.js\",\n \"src/i18n/request.jsx\",\n];\n\n/**\n * Detect next-intl in the project and auto-register the `next-intl/config`\n * alias if needed.\n *\n * next-intl's `createNextIntlPlugin()` crashes in vinext because it calls\n * `require('next/package.json')` to check the Next.js version. Instead,\n * vinext detects next-intl and registers the alias automatically.\n *\n * Note: `require.resolve('next-intl')` walks up to parent `node_modules`\n * directories via standard Node module resolution. In a monorepo, next-intl\n * installed at the workspace root will trigger detection even if not listed\n * in the project's own package.json. This is acceptable since a workspace-root\n * install implies the user wants it available.\n *\n * Mutates `resolved.aliases` and `resolved.env` in place.\n */\nexport function detectNextIntlConfig(root: string, resolved: ResolvedNextConfig): void {\n // Explicit alias wins — user or plugin already set it\n if (resolved.aliases[\"next-intl/config\"]) return;\n\n // Check if next-intl is installed (use main entry — some packages\n // don't expose ./package.json in their exports map)\n const require = createRequire(path.join(root, \"package.json\"));\n try {\n require.resolve(\"next-intl\");\n } catch {\n return; // next-intl not installed\n }\n\n // Probe for the i18n request config file\n const configPath = probeFiles(root, I18N_REQUEST_CANDIDATES);\n if (!configPath) return;\n\n resolved.aliases[\"next-intl/config\"] = configPath;\n\n if (resolved.trailingSlash) {\n resolved.env._next_intl_trailing_slash = \"true\";\n }\n}\n\nfunction extractMdxOptionsFromRules(rules: any[]): MdxOptions | null {\n // Search through webpack rules for the MDX loader injected by @next/mdx\n for (const rule of rules) {\n const loaders = extractMdxLoaders(rule);\n if (loaders) return loaders;\n }\n return null;\n}\n\n/**\n * Recursively search a webpack rule (which may have nested `oneOf` arrays)\n * for an MDX loader and extract its remark/rehype/recma plugin options.\n */\nfunction extractMdxLoaders(rule: any): MdxOptions | null {\n if (!rule) return null;\n\n // Check `oneOf` arrays (Next.js uses these extensively)\n if (Array.isArray(rule.oneOf)) {\n for (const child of rule.oneOf) {\n const result = extractMdxLoaders(child);\n if (result) return result;\n }\n }\n\n // Check `use` array (loader chain)\n const use = Array.isArray(rule.use) ? rule.use : rule.use ? [rule.use] : [];\n for (const loader of use) {\n const loaderPath = typeof loader === \"string\" ? loader : loader?.loader;\n if (typeof loaderPath === \"string\" && isMdxLoader(loaderPath)) {\n const opts = typeof loader === \"object\" ? loader.options : {};\n return extractPluginsFromOptions(opts);\n }\n }\n\n // Check direct `loader` field\n if (typeof rule.loader === \"string\" && isMdxLoader(rule.loader)) {\n return extractPluginsFromOptions(rule.options);\n }\n\n return null;\n}\n\nfunction isMdxLoader(loaderPath: string): boolean {\n return (\n loaderPath.includes(\"mdx\") &&\n (loaderPath.includes(\"@next\") ||\n loaderPath.includes(\"@mdx-js\") ||\n loaderPath.includes(\"mdx-js-loader\") ||\n loaderPath.includes(\"next-mdx\"))\n );\n}\n\nfunction extractPluginsFromOptions(opts: any): MdxOptions | null {\n if (!opts || typeof opts !== \"object\") return null;\n\n const remarkPlugins = Array.isArray(opts.remarkPlugins) ? opts.remarkPlugins : undefined;\n const rehypePlugins = Array.isArray(opts.rehypePlugins) ? opts.rehypePlugins : undefined;\n const recmaPlugins = Array.isArray(opts.recmaPlugins) ? opts.recmaPlugins : undefined;\n\n // Only return if at least one plugin array is non-empty\n if (\n (remarkPlugins && remarkPlugins.length > 0) ||\n (rehypePlugins && rehypePlugins.length > 0) ||\n (recmaPlugins && recmaPlugins.length > 0)\n ) {\n return {\n ...(remarkPlugins && remarkPlugins.length > 0 ? { remarkPlugins } : {}),\n ...(rehypePlugins && rehypePlugins.length > 0 ? { rehypePlugins } : {}),\n ...(recmaPlugins && recmaPlugins.length > 0 ? { recmaPlugins } : {}),\n };\n }\n\n return null;\n}\n"]}
package/dist/deploy.d.ts CHANGED
@@ -70,6 +70,17 @@ interface ProjectInfo {
70
70
  /** Native Node modules that need stubbing for Workers */
71
71
  nativeModulesToStub: string[];
72
72
  }
73
+ /** Check whether a wrangler config file exists in the given directory. */
74
+ export declare function hasWranglerConfig(root: string): boolean;
75
+ /**
76
+ * Build the error message thrown when cloudflare() is missing from the Vite config.
77
+ * Shared between the build-time guard (index.ts configResolved) and the
78
+ * deploy-time guard (deploy.ts deploy()).
79
+ */
80
+ export declare function formatMissingCloudflarePluginError(options: {
81
+ isAppRouter: boolean;
82
+ configFile?: string;
83
+ }): string;
73
84
  export declare function detectProject(root: string): ProjectInfo;
74
85
  /** @see {@link _ensureESModule} */
75
86
  export declare const ensureESModule: typeof _ensureESModule;
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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"}