vinext 1.0.0-beta.1 → 1.0.0-beta.2

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 (175) hide show
  1. package/README.md +4 -1
  2. package/dist/build/client-build-config.js +1 -0
  3. package/dist/build/report.d.ts +8 -1
  4. package/dist/build/report.js +12 -2
  5. package/dist/check.js +15 -2
  6. package/dist/cli.js +3 -2
  7. package/dist/config/config-matchers.d.ts +13 -37
  8. package/dist/config/config-matchers.js +31 -121
  9. package/dist/config/next-config.d.ts +3 -2
  10. package/dist/config/next-config.js +3 -1
  11. package/dist/config/request-context.d.ts +14 -0
  12. package/dist/config/request-context.js +26 -0
  13. package/dist/entries/app-rsc-entry.js +27 -9
  14. package/dist/entries/app-rsc-manifest.js +17 -0
  15. package/dist/entries/pages-server-entry.js +3 -2
  16. package/dist/index.js +82 -58
  17. package/dist/init.d.ts +6 -4
  18. package/dist/init.js +20 -22
  19. package/dist/plugins/og-assets.js +1 -1
  20. package/dist/routing/app-route-graph.d.ts +13 -5
  21. package/dist/routing/app-route-graph.js +59 -13
  22. package/dist/routing/app-router.js +12 -6
  23. package/dist/routing/file-matcher.d.ts +11 -22
  24. package/dist/routing/file-matcher.js +21 -33
  25. package/dist/routing/pages-router.js +23 -29
  26. package/dist/routing/route-matching.d.ts +14 -1
  27. package/dist/routing/route-matching.js +13 -1
  28. package/dist/routing/route-pattern.d.ts +2 -1
  29. package/dist/routing/route-pattern.js +7 -4
  30. package/dist/routing/route-trie.d.ts +5 -1
  31. package/dist/routing/route-trie.js +5 -2
  32. package/dist/server/app-browser-entry.js +7 -6
  33. package/dist/server/app-browser-history-controller.d.ts +1 -1
  34. package/dist/server/app-browser-history-controller.js +3 -3
  35. package/dist/server/app-browser-navigation-controller.js +1 -1
  36. package/dist/server/app-browser-state.js +1 -1
  37. package/dist/server/app-browser-visible-commit.js +1 -1
  38. package/dist/server/app-fallback-renderer.d.ts +3 -0
  39. package/dist/server/app-fallback-renderer.js +4 -2
  40. package/dist/server/app-middleware.js +2 -1
  41. package/dist/server/app-page-boundary-render.d.ts +12 -1
  42. package/dist/server/app-page-boundary-render.js +84 -2
  43. package/dist/server/app-page-cache-finalizer.d.ts +1 -1
  44. package/dist/server/app-page-cache.d.ts +1 -1
  45. package/dist/server/app-page-dispatch.d.ts +11 -2
  46. package/dist/server/app-page-dispatch.js +14 -17
  47. package/dist/server/app-page-element-builder.d.ts +7 -2
  48. package/dist/server/app-page-element-builder.js +112 -27
  49. package/dist/server/app-page-head.d.ts +54 -2
  50. package/dist/server/app-page-head.js +164 -78
  51. package/dist/server/app-page-http-access-fallback-metadata.d.ts +29 -0
  52. package/dist/server/app-page-http-access-fallback-metadata.js +106 -0
  53. package/dist/server/app-page-render.d.ts +2 -2
  54. package/dist/server/app-page-render.js +1 -1
  55. package/dist/server/app-page-request.d.ts +12 -0
  56. package/dist/server/app-page-request.js +133 -13
  57. package/dist/server/app-page-route-wiring.d.ts +9 -0
  58. package/dist/server/app-page-route-wiring.js +43 -3
  59. package/dist/server/app-post-middleware-context.d.ts +1 -1
  60. package/dist/server/app-post-middleware-context.js +1 -1
  61. package/dist/server/app-route-handler-dispatch.js +31 -17
  62. package/dist/server/app-route-handler-execution.d.ts +6 -1
  63. package/dist/server/app-route-handler-execution.js +42 -16
  64. package/dist/server/app-route-handler-policy.d.ts +2 -0
  65. package/dist/server/app-route-handler-policy.js +3 -3
  66. package/dist/server/app-route-module-loader.d.ts +3 -1
  67. package/dist/server/app-route-module-loader.js +1 -0
  68. package/dist/server/app-rsc-cache-busting.d.ts +1 -1
  69. package/dist/server/app-rsc-errors.d.ts +1 -1
  70. package/dist/server/app-rsc-errors.js +12 -2
  71. package/dist/server/app-rsc-handler.d.ts +10 -5
  72. package/dist/server/app-rsc-handler.js +52 -24
  73. package/dist/server/app-rsc-request-normalization.d.ts +3 -2
  74. package/dist/server/app-rsc-request-normalization.js +8 -2
  75. package/dist/server/app-rsc-response-finalizer.d.ts +2 -2
  76. package/dist/server/app-rsc-response-finalizer.js +5 -11
  77. package/dist/server/app-rsc-route-matching.d.ts +20 -0
  78. package/dist/server/app-rsc-route-matching.js +87 -11
  79. package/dist/server/app-segment-config.js +13 -3
  80. package/dist/server/app-server-action-execution.d.ts +3 -1
  81. package/dist/server/app-server-action-execution.js +9 -7
  82. package/dist/server/app-ssr-entry.js +2 -2
  83. package/dist/server/app-ssr-stream.d.ts +1 -7
  84. package/dist/server/app-ssr-stream.js +2 -10
  85. package/dist/server/config-headers.d.ts +24 -0
  86. package/dist/server/config-headers.js +52 -0
  87. package/dist/server/dev-initial-server-error.d.ts +1 -1
  88. package/dist/server/dev-server.js +29 -13
  89. package/dist/server/isr-cache.d.ts +1 -1
  90. package/dist/server/middleware-matcher-pattern.d.ts +22 -0
  91. package/dist/server/middleware-matcher-pattern.js +219 -0
  92. package/dist/server/middleware-matcher.d.ts +2 -7
  93. package/dist/server/middleware-matcher.js +13 -60
  94. package/dist/server/middleware-path-to-regexp.d.ts +14 -0
  95. package/dist/server/middleware-path-to-regexp.js +228 -0
  96. package/dist/server/middleware-runtime.js +4 -3
  97. package/dist/server/middleware.d.ts +1 -1
  98. package/dist/server/middleware.js +2 -1
  99. package/dist/server/pages-data-route.d.ts +11 -1
  100. package/dist/server/pages-data-route.js +16 -1
  101. package/dist/server/pages-get-initial-props.d.ts +15 -2
  102. package/dist/server/pages-get-initial-props.js +16 -6
  103. package/dist/server/pages-page-data.d.ts +3 -1
  104. package/dist/server/pages-page-data.js +16 -7
  105. package/dist/server/pages-page-handler.d.ts +4 -2
  106. package/dist/server/pages-page-handler.js +16 -17
  107. package/dist/server/pages-page-response.js +1 -1
  108. package/dist/server/pages-readiness.d.ts +3 -3
  109. package/dist/server/pages-request-pipeline.d.ts +1 -0
  110. package/dist/server/pages-request-pipeline.js +25 -11
  111. package/dist/server/pages-router-entry.js +6 -0
  112. package/dist/server/prerender-route-params.js +2 -2
  113. package/dist/server/prod-server.d.ts +1 -4
  114. package/dist/server/prod-server.js +36 -23
  115. package/dist/server/request-pipeline.d.ts +15 -29
  116. package/dist/server/request-pipeline.js +24 -59
  117. package/dist/server/rsc-stream-hints.js +122 -18
  118. package/dist/shims/app.d.ts +1 -1
  119. package/dist/shims/cache-request-state.d.ts +27 -1
  120. package/dist/shims/cache-request-state.js +60 -1
  121. package/dist/shims/cache-runtime.d.ts +12 -1
  122. package/dist/shims/cache-runtime.js +22 -7
  123. package/dist/shims/cache.d.ts +5 -5
  124. package/dist/shims/cache.js +26 -10
  125. package/dist/shims/document.d.ts +42 -83
  126. package/dist/shims/document.js +62 -53
  127. package/dist/shims/dynamic.d.ts +5 -25
  128. package/dist/shims/dynamic.js +29 -8
  129. package/dist/shims/error.d.ts +1 -1
  130. package/dist/shims/error.js +1 -1
  131. package/dist/shims/fetch-cache.js +12 -3
  132. package/dist/shims/font-google-base.d.ts +11 -4
  133. package/dist/shims/font-local.d.ts +10 -3
  134. package/dist/shims/head.d.ts +13 -2
  135. package/dist/shims/head.js +3 -3
  136. package/dist/shims/headers.d.ts +28 -31
  137. package/dist/shims/headers.js +109 -49
  138. package/dist/shims/image.d.ts +27 -37
  139. package/dist/shims/image.js +21 -14
  140. package/dist/shims/internal/cookie-serialize.d.ts +3 -1
  141. package/dist/shims/internal/cookie-serialize.js +3 -1
  142. package/dist/shims/internal/hybrid-client-route-owner.js +3 -1
  143. package/dist/shims/internal/utils.d.ts +3 -3
  144. package/dist/shims/legacy-image.d.ts +3 -37
  145. package/dist/shims/legacy-image.js +6 -16
  146. package/dist/shims/link.d.ts +15 -22
  147. package/dist/shims/link.js +20 -11
  148. package/dist/shims/navigation-context-state.d.ts +1 -1
  149. package/dist/shims/navigation.d.ts +7 -3
  150. package/dist/shims/navigation.js +24 -13
  151. package/dist/shims/navigation.react-server.js +1 -1
  152. package/dist/shims/next-shims-augmentations.d.ts +1 -0
  153. package/dist/shims/next-shims-public.d.ts +1 -0
  154. package/dist/shims/public-shim-map.json.js +103 -0
  155. package/dist/shims/readonly-url-search-params.d.ts +3 -3
  156. package/dist/shims/readonly-url-search-params.js +3 -3
  157. package/dist/shims/request-state-types.d.ts +1 -1
  158. package/dist/shims/router.d.ts +55 -21
  159. package/dist/shims/router.js +162 -37
  160. package/dist/shims/script.d.ts +6 -10
  161. package/dist/shims/script.js +6 -3
  162. package/dist/shims/server.d.ts +45 -22
  163. package/dist/shims/server.js +44 -5
  164. package/dist/shims/unified-request-context.d.ts +1 -1
  165. package/dist/shims/unified-request-context.js +2 -0
  166. package/dist/shims/url-safety.d.ts +1 -1
  167. package/dist/shims/url-safety.js +2 -2
  168. package/dist/typegen.d.ts +8 -2
  169. package/dist/typegen.js +76 -15
  170. package/dist/utils/domain-locale.d.ts +2 -2
  171. package/dist/utils/external-url.d.ts +5 -0
  172. package/dist/utils/external-url.js +7 -0
  173. package/dist/utils/regex-safety.d.ts +8 -0
  174. package/dist/utils/regex-safety.js +737 -0
  175. package/package.json +13 -2
@@ -17,6 +17,10 @@ import { assertSafeNavigationUrl } from "./url-safety.js";
17
17
  * This is a pragmatic subset — we implement the most commonly used APIs
18
18
  * rather than bug-for-bug parity with Next.js internals.
19
19
  */
20
+ /** @deprecated Import ImageResponse from `next/og` instead. */
21
+ function ImageResponse() {
22
+ throw new Error("ImageResponse has moved from next/server to next/og");
23
+ }
20
24
  const _USE_CACHE_ALS_KEY = Symbol.for("vinext.cacheRuntime.contextAls");
21
25
  const _UNSTABLE_CACHE_ALS_KEY = Symbol.for("vinext.unstableCache.als");
22
26
  const _g = globalThis;
@@ -60,10 +64,18 @@ var NextRequest = class extends Request {
60
64
  });
61
65
  } else super(input, requestInit);
62
66
  const url = typeof input === "string" ? new URL(input, "http://localhost") : input instanceof URL ? input : new URL(input.url, "http://localhost");
67
+ const i18n = _nextConfig?.i18n ? {
68
+ locales: [..._nextConfig.i18n.locales],
69
+ defaultLocale: _nextConfig.i18n.defaultLocale,
70
+ domains: _nextConfig.i18n.domains?.map((domain) => ({
71
+ ...domain,
72
+ locales: domain.locales ? [...domain.locales] : void 0
73
+ }))
74
+ } : void 0;
63
75
  const urlConfig = _nextConfig ? {
64
76
  basePath: _nextConfig.basePath,
65
77
  nextConfig: {
66
- i18n: _nextConfig.i18n,
78
+ i18n,
67
79
  trailingSlash: _nextConfig.trailingSlash
68
80
  }
69
81
  } : void 0;
@@ -80,6 +92,12 @@ var NextRequest = class extends Request {
80
92
  get cookies() {
81
93
  return this._cookies;
82
94
  }
95
+ get page() {
96
+ throw new Error("NextRequest.page has been removed; use URLPattern instead");
97
+ }
98
+ get ua() {
99
+ throw new Error("NextRequest.ua has been removed; use userAgent() instead");
100
+ }
83
101
  /**
84
102
  * Client IP address. Prefers Cloudflare's trusted CF-Connecting-IP header
85
103
  * over the spoofable X-Forwarded-For. Returns undefined if unavailable.
@@ -407,6 +425,9 @@ var NextURL = class NextURL {
407
425
  toString() {
408
426
  return this.href;
409
427
  }
428
+ toJSON() {
429
+ return this.href;
430
+ }
410
431
  /**
411
432
  * The build ID of the Next.js application.
412
433
  * Set from `generateBuildId` in next.config.js, or a random UUID if not configured.
@@ -489,7 +510,7 @@ var RequestCookies = class {
489
510
  else this._headers.set("cookie", this._serialize());
490
511
  }
491
512
  [Symbol.iterator]() {
492
- return this.getAll().map((c) => [c.name, c])[Symbol.iterator]();
513
+ return new Map(this.getAll().map((cookie) => [cookie.name, cookie])).entries();
493
514
  }
494
515
  };
495
516
  var ReadonlyRequestCookiesError = class ReadonlyRequestCookiesError extends Error {
@@ -557,7 +578,12 @@ var ResponseCookies = class {
557
578
  set(...args) {
558
579
  const [name, value, opts] = parseCookieSetArgs(args);
559
580
  validateCookieName(name);
560
- const serialized = serializeSetCookie(name, value, opts);
581
+ const sameSite = opts?.sameSite === true ? "Strict" : typeof opts?.sameSite === "string" ? opts.sameSite[0].toUpperCase() + opts.sameSite.slice(1) : void 0;
582
+ const serialized = serializeSetCookie(name, value, {
583
+ ...opts,
584
+ expires: typeof opts?.expires === "number" ? new Date(opts.expires) : opts?.expires,
585
+ sameSite
586
+ });
561
587
  this._parsed.set(name, {
562
588
  serialized,
563
589
  entry: {
@@ -595,7 +621,7 @@ var ResponseCookies = class {
595
621
  });
596
622
  }
597
623
  [Symbol.iterator]() {
598
- return [...this._parsed.values()].map((v) => [v.entry.name, v.entry])[Symbol.iterator]();
624
+ return new Map([...this._parsed.values()].map(({ entry }) => [entry.name, entry])).entries();
599
625
  }
600
626
  /** Delete all Set-Cookie headers and re-append from the internal map. */
601
627
  _syncHeaders() {
@@ -655,8 +681,21 @@ var NextFetchEvent = class {
655
681
  _waitUntilPromises = [];
656
682
  constructor(params) {
657
683
  this.sourcePage = params.page;
684
+ if (params.context) this._externalWaitUntil = params.context.waitUntil.bind(params.context);
685
+ }
686
+ _externalWaitUntil;
687
+ get request() {
688
+ throw new Error(`The middleware signature for ${this.sourcePage} no longer exposes event.request`);
658
689
  }
690
+ respondWith() {
691
+ throw new Error(`The middleware signature for ${this.sourcePage} no longer uses respondWith()`);
692
+ }
693
+ passThroughOnException() {}
659
694
  waitUntil(promise) {
695
+ if (this._externalWaitUntil) {
696
+ this._externalWaitUntil(promise);
697
+ return;
698
+ }
660
699
  this._waitUntilPromises.push(promise);
661
700
  }
662
701
  get waitUntilPromises() {
@@ -727,4 +766,4 @@ const URLPattern = globalThis.URLPattern ?? (() => {
727
766
  throw new Error("URLPattern is not available in this runtime. Install the `urlpattern-polyfill` package or upgrade to Node 20+.");
728
767
  });
729
768
  //#endregion
730
- export { NextFetchEvent, NextRequest, NextResponse, NextURL, RequestCookies, ResponseCookies, URLPattern, after, connection, sealRequestCookies, sealRequestHeaders, userAgent, userAgentFromString };
769
+ export { ImageResponse, NextFetchEvent, NextRequest, NextResponse, NextURL, RequestCookies, ResponseCookies, URLPattern, after, connection, sealRequestCookies, sealRequestHeaders, userAgent, userAgentFromString };
@@ -1,5 +1,5 @@
1
- import { RootParamsState } from "./root-params.js";
2
1
  import { CacheState } from "./cache-request-state.js";
2
+ import { RootParamsState } from "./root-params.js";
3
3
  import { ExecutionContextLike } from "./request-context.js";
4
4
  import { FetchCacheState } from "./fetch-cache.js";
5
5
  import { VinextHeadersShimState } from "./headers.js";
@@ -16,6 +16,8 @@ function createRequestContext(opts) {
16
16
  return {
17
17
  headersContext: null,
18
18
  actionRevalidationKind: 0,
19
+ pendingRevalidatedTags: /* @__PURE__ */ new Set(),
20
+ pendingRevalidations: /* @__PURE__ */ new Set(),
19
21
  dynamicUsageDetected: false,
20
22
  renderRequestApiUsage: /* @__PURE__ */ new Set(),
21
23
  connectionProbe: null,
@@ -29,6 +29,6 @@ declare function isDangerousScheme(url: string): boolean;
29
29
  * packages/next/src/shared/lib/router/router.ts:1025,1057
30
30
  */
31
31
  declare function reportBlockedDangerousNavigation(): void;
32
- declare function assertSafeNavigationUrl(url: string): void;
32
+ declare function assertSafeNavigationUrl(url: string, ErrorConstructor?: new (message: string) => Error): void;
33
33
  //#endregion
34
34
  export { DANGEROUS_URL_BLOCK_MESSAGE, assertSafeNavigationUrl, isDangerousScheme, reportBlockedDangerousNavigation };
@@ -60,10 +60,10 @@ function isDangerousScheme(url) {
60
60
  function reportBlockedDangerousNavigation() {
61
61
  console.error(DANGEROUS_URL_BLOCK_MESSAGE);
62
62
  }
63
- function assertSafeNavigationUrl(url) {
63
+ function assertSafeNavigationUrl(url, ErrorConstructor = Error) {
64
64
  if (isDangerousScheme(url)) {
65
65
  reportBlockedDangerousNavigation();
66
- throw new Error(DANGEROUS_URL_BLOCK_MESSAGE);
66
+ throw new ErrorConstructor(DANGEROUS_URL_BLOCK_MESSAGE);
67
67
  }
68
68
  }
69
69
  //#endregion
package/dist/typegen.d.ts CHANGED
@@ -4,6 +4,12 @@ type GenerateRouteTypesOptions = {
4
4
  appDir?: string | null;
5
5
  pageExtensions?: readonly string[];
6
6
  };
7
- declare function generateRouteTypes(options: GenerateRouteTypesOptions): Promise<string>;
7
+ type GenerateRouteTypesResult = {
8
+ routeTypesPath: string;
9
+ nextEnvPath: string;
10
+ nextEnvStatus: "created" | "updated" | "unchanged";
11
+ };
12
+ declare function nextEnvFileContent(hasNext: boolean, hasAppDir: boolean, eol?: string): string;
13
+ declare function generateRouteTypes(options: GenerateRouteTypesOptions): Promise<GenerateRouteTypesResult>;
8
14
  //#endregion
9
- export { generateRouteTypes };
15
+ export { GenerateRouteTypesResult, generateRouteTypes, nextEnvFileContent };
package/dist/typegen.js CHANGED
@@ -4,34 +4,82 @@ import { decodeRouteSegment, isInvisibleSegment } from "./routing/utils.js";
4
4
  import { patternToNextFormat } from "./routing/route-validation.js";
5
5
  import { compareStrings } from "./utils/compare.js";
6
6
  import { appRouteGraph } from "./routing/app-router.js";
7
+ import { createRequire } from "node:module";
7
8
  import fsp from "node:fs/promises";
9
+ import os from "node:os";
8
10
  //#region src/typegen.ts
9
- const NEXT_ENV_FILE_CONTENT = `/// <reference types="next" />
11
+ function nextEnvFileContent(hasNext, hasAppDir, eol = "\n") {
12
+ return `${hasNext ? `/// <reference types="next" />
10
13
  /// <reference types="next/image-types/global" />
11
- import "./.next/types/routes.d.ts";
14
+ import "vinext/types/augmentations";
15
+ ` : `import "vinext/types";
16
+ `}import "./.next/types/routes.d.ts";
12
17
 
13
18
  // NOTE: This file should not be edited
14
- // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
15
- `;
19
+ // see https://nextjs.org/docs/${hasAppDir ? "app" : "pages"}/api-reference/config/typescript for more information.
20
+ `.replaceAll("\n", eol);
21
+ }
16
22
  async function generateRouteTypes(options) {
17
23
  const root = path.resolve(options.root);
18
- const appDir = options.appDir ? path.resolve(options.appDir) : findDir(root, "app", "src/app");
24
+ const appDir = options.appDir === null ? null : options.appDir ? path.resolve(options.appDir) : findDir(root, "app", "src/app");
19
25
  const outPath = path.join(root, ".next", "types", "routes.d.ts");
20
- const content = appDir ? renderRouteTypes(await collectRouteTypeModel(appDir, options.pageExtensions)) : renderRouteTypes(emptyRouteTypeModel());
26
+ const pagesDir = findDir(root, "pages", "src/pages");
27
+ const content = appDir ? renderRouteTypes(await collectRouteTypeModel(appDir, options.pageExtensions), pagesDir !== null) : renderRouteTypes(emptyRouteTypeModel(), false);
21
28
  await fsp.mkdir(path.dirname(outPath), { recursive: true });
22
29
  await fsp.writeFile(outPath, content, "utf-8");
23
- await ensureNextEnvFile(root);
24
- return outPath;
30
+ const nextEnv = await ensureNextEnvFile(root, appDir !== null);
31
+ return {
32
+ routeTypesPath: outPath,
33
+ nextEnvPath: nextEnv.path,
34
+ nextEnvStatus: nextEnv.status
35
+ };
25
36
  }
26
- async function ensureNextEnvFile(root) {
37
+ async function ensureNextEnvFile(root, hasAppDir) {
27
38
  const envPath = path.join(root, "next-env.d.ts");
39
+ let eol = os.EOL;
40
+ let existing;
28
41
  try {
29
- await fsp.writeFile(envPath, NEXT_ENV_FILE_CONTENT, {
30
- encoding: "utf-8",
31
- flag: "wx"
42
+ existing = await fsp.readFile(envPath, "utf-8");
43
+ const newline = existing.indexOf("\n", 1);
44
+ if (newline !== -1) eol = existing[newline - 1] === "\r" ? "\r\n" : "\n";
45
+ } catch (error) {
46
+ if (error.code !== "ENOENT") throw error;
47
+ }
48
+ const content = nextEnvFileContent(await hasNextPackage(root), hasAppDir, eol);
49
+ if (existing === content) return {
50
+ path: envPath,
51
+ status: "unchanged"
52
+ };
53
+ await fsp.writeFile(envPath, content, "utf-8");
54
+ return {
55
+ path: envPath,
56
+ status: existing === void 0 ? "created" : "updated"
57
+ };
58
+ }
59
+ async function hasNextPackage(root) {
60
+ const manifestPath = path.join(root, "package.json");
61
+ let declaresNext;
62
+ try {
63
+ const manifest = JSON.parse(await fsp.readFile(manifestPath, "utf-8"));
64
+ declaresNext = [
65
+ "dependencies",
66
+ "devDependencies",
67
+ "peerDependencies",
68
+ "optionalDependencies"
69
+ ].some((field) => {
70
+ const dependencies = manifest[field];
71
+ return typeof dependencies === "object" && dependencies !== null && Object.hasOwn(dependencies, "next");
32
72
  });
33
73
  } catch (error) {
34
- if (error.code !== "EEXIST") throw error;
74
+ if (error.code !== "ENOENT") throw error;
75
+ }
76
+ if (declaresNext === false) return false;
77
+ try {
78
+ const packageJsonPath = createRequire(manifestPath).resolve("next/package.json");
79
+ await fsp.access(packageJsonPath);
80
+ return true;
81
+ } catch {
82
+ return false;
35
83
  }
36
84
  }
37
85
  function emptyRouteTypeModel() {
@@ -84,12 +132,23 @@ async function collectRouteTypeModel(appDir, pageExtensions) {
84
132
  for (const slotNames of model.layoutSlots.values()) slotNames.sort(compareStrings);
85
133
  return model;
86
134
  }
87
- function renderRouteTypes(model) {
135
+ function renderRouteTypes(model, hasPagesCompat) {
88
136
  const allRoutes = uniqueSorted([
89
137
  ...model.pageRoutes,
90
138
  ...model.layoutRoutes,
91
139
  ...model.routeHandlerRoutes
92
140
  ]);
141
+ const navigationCompat = hasPagesCompat ? `
142
+ declare module "next/navigation" {
143
+ function useSearchParams(): import("next/navigation").ReadonlyURLSearchParams | null;
144
+ function usePathname(): string | null;
145
+ function useParams<
146
+ T extends Record<string, string | string[]> = Record<string, string | string[]>,
147
+ >(): T | null;
148
+ function useSelectedLayoutSegments(): string[] | null;
149
+ function useSelectedLayoutSegment(): string | null;
150
+ }
151
+ ` : "";
93
152
  return `// This file is generated by vinext. Do not edit.
94
153
  import type * as React from "react";
95
154
 
@@ -126,6 +185,8 @@ ${renderLayoutSlotMap(model.layoutRoutes, model.layoutSlots)}
126
185
  }
127
186
  }
128
187
 
188
+ ${navigationCompat}
189
+
129
190
  export {};
130
191
  `;
131
192
  }
@@ -224,4 +285,4 @@ function quote(value) {
224
285
  return JSON.stringify(value);
225
286
  }
226
287
  //#endregion
227
- export { generateRouteTypes };
288
+ export { generateRouteTypes, nextEnvFileContent };
@@ -2,8 +2,8 @@
2
2
  type DomainLocale = {
3
3
  domain: string;
4
4
  defaultLocale: string;
5
- locales?: string[];
6
- http?: boolean;
5
+ locales?: readonly string[];
6
+ http?: true;
7
7
  };
8
8
  declare function normalizeDomainHostname(hostname: string | null | undefined): string | undefined;
9
9
  /**
@@ -0,0 +1,5 @@
1
+ //#region src/utils/external-url.d.ts
2
+ /** Detect an absolute URL with any scheme, or a protocol-relative URL. */
3
+ declare function isExternalUrl(url: string): boolean;
4
+ //#endregion
5
+ export { isExternalUrl };
@@ -0,0 +1,7 @@
1
+ //#region src/utils/external-url.ts
2
+ /** Detect an absolute URL with any scheme, or a protocol-relative URL. */
3
+ function isExternalUrl(url) {
4
+ return /^[a-z][a-z0-9+.-]*:/i.test(url) || url.startsWith("//");
5
+ }
6
+ //#endregion
7
+ export { isExternalUrl };
@@ -0,0 +1,8 @@
1
+ //#region src/utils/regex-safety.d.ts
2
+ type RegexSafetyIssue = "nested repetition" | "ambiguous alternatives under repetition" | "ambiguous sequence expansion" | "overlapping sequential repetition" | "analysis budget exceeded";
3
+ declare function analyzeRegexSafety(pattern: string, options?: {
4
+ ignoreCase?: boolean;
5
+ }): RegexSafetyIssue | null;
6
+ declare function regexAtomsMayOverlap(left: string, right: string, ignoreCase?: boolean): boolean;
7
+ //#endregion
8
+ export { RegexSafetyIssue, analyzeRegexSafety, regexAtomsMayOverlap };