-
Notifications
You must be signed in to change notification settings - Fork 30.2k
Add retry logic for chunk load errors and improve detection #88004
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
Warning This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
This stack of pull requests is managed by Graphite. Learn more about stacking. |
| debugInfo: flightResponsePromise._debugInfo ?? null, | ||
| } | ||
| } catch (err) { | ||
| // Check if this is a chunk/network error that we can retry |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The clearFailureState function is exported but never called after successful navigation, causing failure tracking state to persist across multiple navigations to the same route. This results in unexpected retry behavior on subsequent visits.
View Details
📝 Patch Details
diff --git a/packages/next/src/client/components/router-reducer/ppr-navigations.ts b/packages/next/src/client/components/router-reducer/ppr-navigations.ts
index 680fb13766..c2b3a0c6fd 100644
--- a/packages/next/src/client/components/router-reducer/ppr-navigations.ts
+++ b/packages/next/src/client/components/router-reducer/ppr-navigations.ts
@@ -30,6 +30,7 @@ import {
convertServerPatchToFullTree,
type NavigationSeed,
} from '../segment-cache/navigation'
+import { clearFailureState } from '../chunk-load-error'
// This is yet another tree type that is used to track pending promises that
// need to be fulfilled once the dynamic data is received. The terminal nodes of
@@ -1302,6 +1303,9 @@ async function finishNavigationTask(
case NavigationTaskExitStatus.Done: {
// The task has completely finished. There's no missing data. Exit.
previousNavigationDidMismatch = false
+ // Clear failure state for the successfully navigated route
+ const primaryRequestResult = await primaryRequestPromise
+ clearFailureState(primaryRequestResult.url.pathname)
return
}
case NavigationTaskExitStatus.SoftRetry: {
Analysis
Failure tracking state not cleared after successful navigation
What fails: Failure count for chunk/network errors persists across navigations, preventing silent retries on subsequent visits to the same route.
How to reproduce:
- Navigate to
/page1 - Encounter a chunk load error (e.g., due to network issue)
- Silent retry succeeds
- Navigate to
/page2 - Navigate back to
/page1 - Trigger the same chunk error again
Result: The second chunk error on /page1 fails the silent retry check because failCount has accumulated from the previous session (1 + 1 = 2), reaching the MAX_FAIL_COUNT_FOR_RETRY threshold. Error banner is shown immediately instead of attempting a silent retry.
Expected: When navigation completes successfully, the failure state for that route should be cleared via clearFailureState(). This provides fresh retry opportunities on subsequent visits. The clearFailureState() function exists and is exported from packages/next/src/client/components/chunk-load-error/chunk-load-error-handler.ts (with a docstring indicating it should be "called on successful navigation"), but was never invoked anywhere in the codebase.
Fix: Call clearFailureState(pathname) in finishNavigationTask() when NavigationTaskExitStatus.Done is reached (successful navigation completion). This clears all accumulated failure counts for the successfully navigated route's chunks, stored in sessionStorage under keys matching __next_chunk_fail:{buildId}:{route}:{chunkKey}.
725f152 to
a304c38
Compare
e3e91ab to
382a356
Compare
|
Allow CI Workflow Run
Note: this should only be enabled once the PR is ready to go and can only be enabled by a maintainer |
1 similar comment
|
Allow CI Workflow Run
Note: this should only be enabled once the PR is ready to go and can only be enabled by a maintainer |
Stats from current PRDefault Build (Increase detected
|
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| buildDuration | 16.6s | 14.9s | N/A |
| buildDurationCached | 13.8s | 11s | N/A |
| nodeModulesSize | 457 MB | 458 MB | |
| nextStartRea..uration (ms) | 692ms | 693ms | N/A |
Client Bundles (main, webpack) Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| 2086.HASH.js gzip | 169 B | 169 B | ✓ |
| 2161-HASH.js gzip | 5.39 kB | 5.41 kB | N/A |
| 2747-HASH.js gzip | 4.48 kB | 4.46 kB | N/A |
| 4322-HASH.js gzip | 51.2 kB | 54.7 kB | |
| ec793fe8-HASH.js gzip | 62.3 kB | 62.3 kB | N/A |
| framework-HASH.js gzip | 59.8 kB | 59.8 kB | N/A |
| main-app-HASH.js gzip | 251 B | 254 B | N/A |
| main-HASH.js gzip | 38.4 kB | 38.7 kB | |
| webpack-HASH.js gzip | 1.68 kB | 1.73 kB | N/A |
| Overall change | 89.8 kB | 93.7 kB |
Legacy Client Bundles (polyfills)
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| polyfills-HASH.js gzip | 39.4 kB | 39.4 kB | ✓ |
| Overall change | 39.4 kB | 39.4 kB | ✓ |
Client Pages Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| _app-HASH.js gzip | 194 B | 193 B | N/A |
| _error-HASH.js gzip | 182 B | 182 B | ✓ |
| css-HASH.js gzip | 336 B | 335 B | N/A |
| dynamic-HASH.js gzip | 1.8 kB | 4.18 kB | |
| edge-ssr-HASH.js gzip | 256 B | 256 B | ✓ |
| head-HASH.js gzip | 352 B | 349 B | N/A |
| hooks-HASH.js gzip | 385 B | 384 B | N/A |
| image-HASH.js gzip | 580 B | 580 B | ✓ |
| index-HASH.js gzip | 259 B | 258 B | N/A |
| link-HASH.js gzip | 2.5 kB | 2.51 kB | N/A |
| routerDirect..HASH.js gzip | 319 B | 317 B | N/A |
| script-HASH.js gzip | 385 B | 387 B | N/A |
| withRouter-HASH.js gzip | 316 B | 315 B | N/A |
| 1afbb74e6ecf..834.css gzip | 106 B | 106 B | ✓ |
| Overall change | 2.92 kB | 5.3 kB |
Client Build Manifests
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 738 B | 738 B | ✓ |
| Overall change | 738 B | 738 B | ✓ |
Rendered Page Sizes
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| index.html gzip | 523 B | 524 B | N/A |
| link.html gzip | 538 B | 538 B | ✓ |
| withRouter.html gzip | 520 B | 520 B | ✓ |
| Overall change | 1.06 kB | 1.06 kB | ✓ |
Edge SSR bundle Size Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| edge-ssr.js gzip | 124 kB | 124 kB | N/A |
| page.js gzip | 237 kB | 241 kB | |
| Overall change | 237 kB | 241 kB |
Middleware size Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| middleware-b..fest.js gzip | 652 B | 652 B | ✓ |
| middleware-r..fest.js gzip | 155 B | 156 B | N/A |
| middleware.js gzip | 32.8 kB | 32.9 kB | |
| edge-runtime..pack.js gzip | 846 B | 846 B | ✓ |
| Overall change | 34.3 kB | 34.4 kB |
Next Runtimes Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| app-page-exp...dev.js gzip | 301 kB | 305 kB | |
| app-page-exp..prod.js gzip | 156 kB | 158 kB | |
| app-page-tur...dev.js gzip | 301 kB | 305 kB | |
| app-page-tur..prod.js gzip | 156 kB | 158 kB | |
| app-page-tur...dev.js gzip | 298 kB | 301 kB | |
| app-page-tur..prod.js gzip | 154 kB | 156 kB | |
| app-page.run...dev.js gzip | 298 kB | 301 kB | |
| app-page.run..prod.js gzip | 154 kB | 156 kB | |
| app-route-ex...dev.js gzip | 68.7 kB | 68.7 kB | ✓ |
| app-route-ex..prod.js gzip | 47.5 kB | 47.5 kB | ✓ |
| app-route-tu...dev.js gzip | 68.7 kB | 68.7 kB | ✓ |
| app-route-tu..prod.js gzip | 47.5 kB | 47.5 kB | ✓ |
| app-route-tu...dev.js gzip | 68.3 kB | 68.3 kB | ✓ |
| app-route-tu..prod.js gzip | 47.3 kB | 47.3 kB | ✓ |
| app-route.ru...dev.js gzip | 68.3 kB | 68.3 kB | ✓ |
| app-route.ru..prod.js gzip | 47.3 kB | 47.3 kB | ✓ |
| dist_client_...dev.js gzip | 324 B | 324 B | ✓ |
| dist_client_...dev.js gzip | 326 B | 326 B | ✓ |
| dist_client_...dev.js gzip | 318 B | 318 B | ✓ |
| dist_client_...dev.js gzip | 317 B | 317 B | ✓ |
| pages-api-tu...dev.js gzip | 41.1 kB | 41.1 kB | ✓ |
| pages-api-tu..prod.js gzip | 31.2 kB | 31.2 kB | ✓ |
| pages-api.ru...dev.js gzip | 41 kB | 41 kB | ✓ |
| pages-api.ru..prod.js gzip | 31.2 kB | 31.2 kB | ✓ |
| pages-turbo....dev.js gzip | 50.7 kB | 50.7 kB | N/A |
| pages-turbo...prod.js gzip | 38.2 kB | 38.2 kB | N/A |
| pages.runtim...dev.js gzip | 50.6 kB | 50.7 kB | N/A |
| pages.runtim..prod.js gzip | 38.1 kB | 38.1 kB | N/A |
| server.runti..prod.js gzip | 59.9 kB | 59.9 kB | ✓ |
| Overall change | 2.49 MB | 2.51 MB |
build cache Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| 0.pack gzip | 3.61 MB | 3.66 MB | |
| index.pack gzip | 99.7 kB | 101 kB | |
| Overall change | 3.71 MB | 3.76 MB |
Diff details
Diff for page.js
Diff too large to display
Diff for middleware.js
Diff too large to display
Diff for edge-ssr.js
Diff too large to display
Diff for _buildManifest.js
@@ -611,35 +611,35 @@ self.__BUILD_MANIFEST = (function (a, b, c) {
numHashes: NaN,
bitArray: [],
},
- "/": ["static\u002Fchunks\u002Fpages\u002Findex-dda7d8b64d4ba15c.js"],
+ "/": ["static\u002Fchunks\u002Fpages\u002Findex-d95f7ec6af4d2644.js"],
"/_error": [
- "static\u002Fchunks\u002Fpages\u002F_error-6ef44d3954f25711.js",
+ "static\u002Fchunks\u002Fpages\u002F_error-209c0c82205a7c9f.js",
],
"/css": [
"static\u002Fcss\u002Fded6b86ab9cc0a1f.css",
- "static\u002Fchunks\u002Fpages\u002Fcss-c8aaa7211416a045.js",
+ "static\u002Fchunks\u002Fpages\u002Fcss-62710339bc830ded.js",
],
"/dynamic": [
- "static\u002Fchunks\u002Fpages\u002Fdynamic-d53bb7f318f342c2.js",
+ "static\u002Fchunks\u002Fpages\u002Fdynamic-8a03f5fe64080e08.js",
],
"/edge-ssr": [
- "static\u002Fchunks\u002Fpages\u002Fedge-ssr-1383106d4a3e7d72.js",
+ "static\u002Fchunks\u002Fpages\u002Fedge-ssr-0db9f7bb610d3072.js",
],
- "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-1db1c4be1a45662f.js"],
- "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-e6deee5b72a5b112.js"],
+ "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-747416c4075e42aa.js"],
+ "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-8b10205be7505244.js"],
"/image": [
- "static\u002Fchunks\u002F2747-90c828280005c0c3.js",
- "static\u002Fchunks\u002Fpages\u002Fimage-868472cd5e84efc9.js",
+ "static\u002Fchunks\u002F6349-ee9aecde860d4832.js",
+ "static\u002Fchunks\u002Fpages\u002Fimage-f90ae17c3ad1d38b.js",
],
- "/link": ["static\u002Fchunks\u002Fpages\u002Flink-0ec374e48b2ce5d9.js"],
+ "/link": ["static\u002Fchunks\u002Fpages\u002Flink-6ab9a67b348df1bf.js"],
"/routerDirect": [
- "static\u002Fchunks\u002Fpages\u002FrouterDirect-1a34bfadbc088491.js",
+ "static\u002Fchunks\u002Fpages\u002FrouterDirect-f132fb471e65a8b9.js",
],
"/script": [
- "static\u002Fchunks\u002Fpages\u002Fscript-52320f59afbd096d.js",
+ "static\u002Fchunks\u002Fpages\u002Fscript-8e2028e44b8da2d9.js",
],
"/withRouter": [
- "static\u002Fchunks\u002Fpages\u002FwithRouter-3b1a16d3dfa21c16.js",
+ "static\u002Fchunks\u002Fpages\u002FwithRouter-a86d259faa012c1c.js",
],
sortedPages: [
"\u002F",Diff for dynamic-HASH.js
@@ -1,17 +1,346 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[2291],
{
- /***/ 1231: /***/ (
- module,
+ /***/ 434: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+ /* __next_internal_client_entry_do_not_use__ cjs */
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "ChunkLoadErrorBanner", {
+ enumerable: true,
+ get: function () {
+ return ChunkLoadErrorBanner;
+ },
+ });
+ const _jsxruntime = __webpack_require__(3108);
+ const _react = __webpack_require__(4312);
+ // Copy constants (two lines, always)
+ const HEADLINE = "This page couldn't be fully loaded";
+ const DETAIL_DEFAULT = "A required file couldn't be loaded.";
+ const DETAIL_OFFLINE = "You're offline.";
+ // Fixed height for stable layout
+ const BANNER_HEIGHT = 70;
+ const styles = {
+ container: {
+ position: "fixed",
+ top: 0,
+ left: 0,
+ right: 0,
+ zIndex: 9999,
+ height: BANNER_HEIGHT,
+ padding: "0 20px",
+ backgroundColor: "#f5f5f5",
+ borderBottom: "1px solid #d4d4d4",
+ fontFamily:
+ 'system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"',
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "space-between",
+ gap: "16px",
+ boxSizing: "border-box",
+ },
+ spacer: {
+ height: BANNER_HEIGHT,
+ flexShrink: 0,
+ },
+ left: {
+ display: "flex",
+ alignItems: "center",
+ gap: "12px",
+ flex: 1,
+ minWidth: 0,
+ },
+ icon: {
+ flexShrink: 0,
+ width: "20px",
+ height: "20px",
+ },
+ content: {
+ display: "flex",
+ flexDirection: "column",
+ gap: "2px",
+ flex: 1,
+ minWidth: 0,
+ },
+ headline: {
+ fontSize: "14px",
+ fontWeight: 600,
+ color: "#171717",
+ margin: 0,
+ lineHeight: 1.4,
+ },
+ detail: {
+ fontSize: "13px",
+ fontWeight: 400,
+ color: "#525252",
+ margin: 0,
+ lineHeight: 1.4,
+ },
+ button: {
+ padding: "8px 16px",
+ fontSize: "13px",
+ fontWeight: 600,
+ borderRadius: "6px",
+ cursor: "pointer",
+ color: "#171717",
+ backgroundColor: "#fff",
+ border: "1px solid #a3a3a3",
+ lineHeight: 1,
+ flexShrink: 0,
+ },
+ };
+ // Neutral warning icon (circle with exclamation)
+ function WarningIcon() {
+ return /*#__PURE__*/ (0, _jsxruntime.jsxs)("svg", {
+ style: styles.icon,
+ viewBox: "0 0 20 20",
+ fill: "none",
+ xmlns: "http://www.w3.org/2000/svg",
+ "aria-hidden": "true",
+ children: [
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("circle", {
+ cx: "10",
+ cy: "10",
+ r: "9",
+ stroke: "#737373",
+ strokeWidth: "1.5",
+ }),
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("path", {
+ d: "M10 5.5V11",
+ stroke: "#737373",
+ strokeWidth: "1.5",
+ strokeLinecap: "round",
+ }),
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("circle", {
+ cx: "10",
+ cy: "14",
+ r: "1",
+ fill: "#737373",
+ }),
+ ],
+ });
+ }
+ function ChunkLoadErrorBanner(_props) {
+ const [isOffline, setIsOffline] = (0, _react.useState)(
+ typeof navigator !== "undefined" ? !navigator.onLine : false
+ );
+ (0, _react.useEffect)(() => {
+ const handleOnline = () => setIsOffline(false);
+ const handleOffline = () => setIsOffline(true);
+ window.addEventListener("online", handleOnline);
+ window.addEventListener("offline", handleOffline);
+ return () => {
+ window.removeEventListener("online", handleOnline);
+ window.removeEventListener("offline", handleOffline);
+ };
+ }, []);
+ const handleReload = (0, _react.useCallback)(() => {
+ window.location.reload();
+ }, []);
+ const detail = isOffline ? DETAIL_OFFLINE : DETAIL_DEFAULT;
+ return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_jsxruntime.Fragment, {
+ children: [
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
+ style: styles.container,
+ role: "alert",
+ "aria-live": "assertive",
+ children: [
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
+ style: styles.left,
+ children: [
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(WarningIcon, {}),
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
+ style: styles.content,
+ children: [
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("p", {
+ style: styles.headline,
+ children: HEADLINE,
+ }),
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("p", {
+ style: styles.detail,
+ children: detail,
+ }),
+ ],
+ }),
+ ],
+ }),
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("button", {
+ type: "button",
+ style: styles.button,
+ onClick: handleReload,
+ children: "Reload page",
+ }),
+ ],
+ }),
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
+ style: styles.spacer,
+ }),
+ ],
+ });
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=chunk-load-error-banner.js.map
+
+ /***/
+ },
+
+ /***/ 1033: /***/ (module, exports) => {
+ "use strict";
+ // This gets assigned as a side-effect during app initialization. Because it
+ // represents the build used to create the JS bundle, it should never change
+ // after being set, so we store it in a global variable.
+ //
+ // When performing RSC requests, if the incoming data has a different build ID,
+ // we perform an MPA navigation/refresh to load the updated build and ensure
+ // that the client and server in sync.
+ // Starts as an empty string. In practice, because setAppBuildId is called
+ // during initialization before hydration starts, this will always get
+ // reassigned to the actual build ID before it's ever needed by a navigation.
+ // If for some reasons it didn't, due to a bug or race condition, then on
+ // navigation the build comparision would fail and trigger an MPA navigation.
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ getAppBuildId: function () {
+ return getAppBuildId;
+ },
+ setAppBuildId: function () {
+ return setAppBuildId;
+ },
+ });
+ let globalBuildId = "";
+ function setAppBuildId(buildId) {
+ globalBuildId = buildId;
+ }
+ function getAppBuildId() {
+ return globalBuildId;
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=app-build-id.js.map
+
+ /***/
+ },
+
+ /***/ 2604: /***/ (
+ __unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(4464);
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/dynamic",
+ function () {
+ return __webpack_require__(3643);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 2758: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ ChunkLoadErrorBanner: function () {
+ return _chunkloaderrorbanner.ChunkLoadErrorBanner;
+ },
+ clearChunkCache: function () {
+ return _chunkloaderrorhandler.clearChunkCache;
+ },
+ clearFailureState: function () {
+ return _chunkloaderrorhandler.clearFailureState;
+ },
+ createChunkErrorContext: function () {
+ return _chunkloaderrorhandler.createChunkErrorContext;
+ },
+ getFailCount: function () {
+ return _chunkloaderrorhandler.getFailCount;
+ },
+ getRetryDelayMs: function () {
+ return _chunkloaderrorhandler.getRetryDelayMs;
+ },
+ handleChunkFailure: function () {
+ return _chunkloaderrorhandler.handleChunkFailure;
+ },
+ isChunkLoadError: function () {
+ return _ischunkloaderror.isChunkLoadError;
+ },
+ isChunkOrNetworkError: function () {
+ return _ischunkloaderror.isChunkOrNetworkError;
+ },
+ isNetworkError: function () {
+ return _ischunkloaderror.isNetworkError;
+ },
+ retryChunkImport: function () {
+ return _chunkloaderrorhandler.retryChunkImport;
+ },
+ shouldSilentRetry: function () {
+ return _chunkloaderrorhandler.shouldSilentRetry;
+ },
+ sleep: function () {
+ return _chunkloaderrorhandler.sleep;
+ },
+ });
+ const _ischunkloaderror = __webpack_require__(9462);
+ const _chunkloaderrorhandler = __webpack_require__(7676);
+ const _chunkloaderrorbanner = __webpack_require__(434);
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=index.js.map
/***/
},
- /***/ 2101: /***/ (
+ /***/ 3401: /***/ (
__unused_webpack_module,
exports,
__webpack_require__
@@ -38,24 +367,63 @@
/***/
},
- /***/ 3458: /***/ (
+ /***/ 3643: /***/ (
__unused_webpack_module,
- __unused_webpack_exports,
+ __webpack_exports__,
__webpack_require__
) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/dynamic",
- function () {
- return __webpack_require__(9381);
- },
- ]);
- if (false) {
- }
+ "use strict";
+ __webpack_require__.r(__webpack_exports__);
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
+ /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
+ /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
+ /* harmony export */
+ });
+ /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
+ __webpack_require__(3108);
+ /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
+ __webpack_require__(3973);
+ /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
+ /*#__PURE__*/ __webpack_require__.n(
+ next_dynamic__WEBPACK_IMPORTED_MODULE_1__
+ );
+
+ const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
+ () =>
+ __webpack_require__
+ .e(/* import() */ 1596)
+ .then(__webpack_require__.bind(__webpack_require__, 1596))
+ .then((mod) => mod.Hello),
+ {
+ loadableGenerated: {
+ webpack: () => [/*require.resolve*/ 1596],
+ },
+ }
+ );
+ const Page = () =>
+ /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
+ {
+ children: [
+ /*#__PURE__*/ (0,
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
+ children: "testing next/dynamic size",
+ }),
+ /*#__PURE__*/ (0,
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
+ DynamicHello,
+ {}
+ ),
+ ],
+ }
+ );
+ var __N_SSP = true;
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
/***/
},
- /***/ 4464: /***/ (module, exports, __webpack_require__) => {
+ /***/ 3660: /***/ (module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -88,7 +456,7 @@
__webpack_require__(4312)
);
const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(9799)
+ __webpack_require__(4539)
);
const isServerSide = "object" === "undefined";
// Normalize loader to return the module as form { default: Component } for `React.lazy`.
@@ -188,63 +556,17 @@
/***/
},
- /***/ 9381: /***/ (
- __unused_webpack_module,
- __webpack_exports__,
+ /***/ 3973: /***/ (
+ module,
+ __unused_webpack_exports,
__webpack_require__
) => {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
- /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
- /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
- /* harmony export */
- });
- /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
- __webpack_require__(3108);
- /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1231);
- /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
- /*#__PURE__*/ __webpack_require__.n(
- next_dynamic__WEBPACK_IMPORTED_MODULE_1__
- );
-
- const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
- () =>
- __webpack_require__
- .e(/* import() */ 2086)
- .then(__webpack_require__.bind(__webpack_require__, 2086))
- .then((mod) => mod.Hello),
- {
- loadableGenerated: {
- webpack: () => [/*require.resolve*/ 2086],
- },
- }
- );
- const Page = () =>
- /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
- {
- children: [
- /*#__PURE__*/ (0,
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
- children: "testing next/dynamic size",
- }),
- /*#__PURE__*/ (0,
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
- DynamicHello,
- {}
- ),
- ],
- }
- );
- var __N_SSP = true;
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
+ module.exports = __webpack_require__(3660);
/***/
},
- /***/ 9799: /***/ (
+ /***/ 4539: /***/ (
__unused_webpack_module,
exports,
__webpack_require__
@@ -286,7 +608,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
const _react = /*#__PURE__*/ _interop_require_default._(
__webpack_require__(4312)
);
- const _loadablecontextsharedruntime = __webpack_require__(2101);
+ const _loadablecontextsharedruntime = __webpack_require__(3401);
+ const _chunkloaderror = __webpack_require__(2758);
function resolve(obj) {
return obj && obj.default ? obj.default : obj;
}
@@ -413,6 +736,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
this._callbacks = new Set();
this._delay = null;
this._timeout = null;
+ this._hasAutoRetried = false;
this.retry();
}
promise() {
@@ -451,7 +775,25 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
this._update({});
this._clearTimeouts();
})
- .catch((_err) => {
+ .catch((err) => {
+ // Auto-retry for chunk load errors (once)
+ // This handles transient network failures during dynamic imports
+ if (
+ true &&
+ (0, _chunkloaderror.isChunkLoadError)(err) &&
+ !this._hasAutoRetried
+ ) {
+ this._hasAutoRetried = true;
+ // Clear bundler's chunk cache so retry will fetch fresh
+ (0, _chunkloaderror.clearChunkCache)(err);
+ // Retry after a short delay with jitter
+ const delay = (0, _chunkloaderror.getRetryDelayMs)();
+ setTimeout(() => {
+ this.retry();
+ }, delay);
+ return;
+ }
+ // No more retries - propagate error
this._update({});
this._clearTimeouts();
});
@@ -518,13 +860,392 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
/***/
},
+
+ /***/ 7676: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+ /**
+ * Chunk load error handling with silent retry logic.
+ *
+ * This module provides retry orchestration for chunk/network loading failures.
+ * It tracks failures in sessionStorage per {route, buildId, chunkKey} and
+ * implements silent retry with jittered backoff.
+ */
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ clearChunkCache: function () {
+ return clearChunkCache;
+ },
+ clearFailureState: function () {
+ return clearFailureState;
+ },
+ createChunkErrorContext: function () {
+ return createChunkErrorContext;
+ },
+ getFailCount: function () {
+ return getFailCount;
+ },
+ getRetryDelayMs: function () {
+ return getRetryDelayMs;
+ },
+ handleChunkFailure: function () {
+ return handleChunkFailure;
+ },
+ retryChunkImport: function () {
+ return retryChunkImport;
+ },
+ shouldSilentRetry: function () {
+ return shouldSilentRetry;
+ },
+ sleep: function () {
+ return sleep;
+ },
+ });
+ const _appbuildid = __webpack_require__(1033);
+ const _ischunkloaderror = __webpack_require__(9462);
+ const STORAGE_PREFIX = "__next_chunk_fail:";
+ const RETRY_WINDOW_MS = 30000; // Don't retry same chunk within 30s of a retry
+ const MAX_FAIL_COUNT_FOR_RETRY = 2; // After 2 failures, skip silent retry
+ /**
+ * Simple hash function for generating chunk keys when URL isn't available.
+ */ function simpleHash(str) {
+ let hash = 0;
+ for (let i = 0; i < str.length; i++) {
+ const char = str.charCodeAt(i);
+ hash = ((hash << 5) - hash + char) | 0;
+ }
+ return Math.abs(hash).toString(36);
+ }
+ /**
+ * Extract chunk URL from error message if possible.
+ * ChunkLoadError messages typically contain the URL.
+ */ function extractChunkUrl(error) {
+ const message = error.message;
+ // Turbopack format: "Failed to load chunk <url> from <reason>: <cause>"
+ // The URL can be relative (/_next/...) or absolute (http://...)
+ const turbopackMatch = message.match(
+ /Failed to load chunk ([^\s]+\.(?:js|css))/
+ );
+ if (turbopackMatch) {
+ return turbopackMatch[1];
+ }
+ // Webpack format: "Loading chunk <id> failed. (error: <url>)"
+ const webpackMatch = message.match(/https?:\/\/[^\s)]+/);
+ return webpackMatch?.[0];
+ }
+ /**
+ * Extract the chunk ID from a webpack chunk URL.
+ * URLs look like: /_next/static/chunks/123.hash.js
+ */ function extractWebpackChunkId(chunkUrl) {
+ // Match chunk ID from URL path: /chunks/123.abc123.js or /chunks/pages_foo_bar.abc123.js
+ const match = chunkUrl.match(/\/chunks\/([^/.]+)\.[a-f0-9]+\.js/);
+ return match?.[1];
+ }
+ function clearChunkCache(error) {
+ const chunkUrl = extractChunkUrl(error);
+ if (!chunkUrl) return false;
+ // Turbopack: clear by chunk URL
+ if (
+ typeof globalThis.__turbopack_clear_chunk_resolver__ === "function"
+ ) {
+ // Extract the relative URL path that Turbopack uses as key
+ try {
+ const url = new URL(chunkUrl);
+ globalThis.__turbopack_clear_chunk_resolver__(
+ url.pathname + url.search
+ );
+ return true;
+ } catch {
+ // Invalid URL, try using the full URL
+ globalThis.__turbopack_clear_chunk_resolver__(chunkUrl);
+ return true;
+ }
+ }
+ // Webpack: extract chunk ID from URL and clear by ID
+ if (typeof globalThis.__next_clear_chunk_cache__ === "function") {
+ const chunkId = extractWebpackChunkId(chunkUrl);
+ if (chunkId) {
+ globalThis.__next_clear_chunk_cache__(chunkId);
+ return true;
+ }
+ }
+ return false;
+ }
+ /**
+ * Generate a unique key for this chunk error, used for deduplication.
+ */ function getChunkKey(ctx) {
+ return ctx.chunkUrl ?? simpleHash(ctx.message);
+ }
+ /**
+ * Get the sessionStorage key for tracking this chunk failure.
+ */ function getStorageKey(ctx) {
+ const buildId = (0, _appbuildid.getAppBuildId)();
+ const chunkKey = getChunkKey(ctx);
+ return `${STORAGE_PREFIX}${buildId}:${ctx.route}:${chunkKey}`;
+ }
+ /**
+ * Read failure state from sessionStorage.
+ */ function readFailureState(key) {
+ if (typeof sessionStorage === "undefined") return null;
+ try {
+ const stored = sessionStorage.getItem(key);
+ if (!stored) return null;
+ return JSON.parse(stored);
+ } catch {
+ return null;
+ }
+ }
+ /**
+ * Write failure state to sessionStorage.
+ */ function writeFailureState(key, state) {
+ if (typeof sessionStorage === "undefined") return;
+ try {
+ sessionStorage.setItem(key, JSON.stringify(state));
+ } catch {
+ // Storage might be full or disabled - continue without tracking
+ }
+ }
+ function clearFailureState(route) {
+ if (typeof sessionStorage === "undefined") return;
+ try {
+ const buildId = (0, _appbuildid.getAppBuildId)();
+ const prefix = `${STORAGE_PREFIX}${buildId}:${route}:`;
+ const keysToRemove = [];
+ for (let i = 0; i < sessionStorage.length; i++) {
+ const key = sessionStorage.key(i);
+ if (key?.startsWith(prefix)) {
+ keysToRemove.push(key);
+ }
+ }
+ keysToRemove.forEach((key) => sessionStorage.removeItem(key));
+ } catch {
+ // Ignore storage errors
+ }
+ }
+ /**
+ * Increment the failure count for this chunk.
+ */ function bumpFailCount(ctx) {
+ const key = getStorageKey(ctx);
+ const existing = readFailureState(key);
+ const now = Date.now();
+ const state = {
+ failCount: (existing?.failCount ?? 0) + 1,
+ lastTs: now,
+ retriedTs: existing?.retriedTs,
+ };
+ writeFailureState(key, state);
+ return state;
+ }
+ /**
+ * Mark that a retry was attempted for this chunk.
+ */ function markRetried(ctx) {
+ const key = getStorageKey(ctx);
+ const existing = readFailureState(key);
+ const now = Date.now();
+ const state = {
+ failCount: existing?.failCount ?? 1,
+ lastTs: existing?.lastTs ?? now,
+ retriedTs: now,
+ };
+ writeFailureState(key, state);
+ }
+ function shouldSilentRetry(ctx) {
+ // Don't retry if offline
+ if (typeof navigator !== "undefined" && !navigator.onLine) {
+ return false;
+ }
+ const key = getStorageKey(ctx);
+ const state = readFailureState(key);
+ const now = Date.now();
+ // If we already retried within the window, don't retry again
+ if (state?.retriedTs && now - state.retriedTs < RETRY_WINDOW_MS) {
+ return false;
+ }
+ // Too many failures - skip silent retry to avoid annoying the user
+ if ((state?.failCount ?? 0) >= MAX_FAIL_COUNT_FOR_RETRY) {
+ return false;
+ }
+ return true;
+ }
+ function getFailCount(ctx) {
+ const key = getStorageKey(ctx);
+ const state = readFailureState(key);
+ return state?.failCount ?? 0;
+ }
+ function getRetryDelayMs() {
+ const baseDelay = 200;
+ const jitter = Math.floor(Math.random() * 401); // 0-400ms
+ // Get RTT if available via Network Information API
+ let rtt = 0;
+ if (typeof navigator !== "undefined" && "connection" in navigator) {
+ const connection = navigator.connection;
+ if (connection?.rtt) {
+ rtt = Math.min(500, connection.rtt); // Cap at 500ms
+ }
+ }
+ return Math.min(1500, baseDelay + jitter + rtt); // Cap total at 1500ms
+ }
+ function sleep(ms) {
+ return new Promise((resolve) => setTimeout(resolve, ms));
+ }
+ function createChunkErrorContext(error, route, userVisible = true) {
+ if (
+ !(0, _ischunkloaderror.isChunkLoadError)(error) &&
+ !(0, _ischunkloaderror.isNetworkError)(error)
+ ) {
+ return null;
+ }
+ return {
+ route,
+ userVisible,
+ message: error.message,
+ chunkUrl: extractChunkUrl(error),
+ };
+ }
+ function handleChunkFailure(ctx) {
+ // Always increment fail count first
+ bumpFailCount(ctx);
+ // Check if we should try a silent retry
+ if (shouldSilentRetry(ctx)) {
+ markRetried(ctx);
+ return "retry";
+ }
+ // Show banner to the user
+ return "banner";
+ }
+ async function retryChunkImport(ctx, importFn) {
+ const action = handleChunkFailure(ctx);
+ if (action === "retry") {
+ const delay = getRetryDelayMs();
+ await sleep(delay);
+ return importFn();
+ }
+ // If we shouldn't retry, re-throw to trigger error boundary
+ throw Object.defineProperty(
+ new Error("Chunk load failed after retry attempts"),
+ "__NEXT_ERROR_CODE",
+ {
+ value: "E976",
+ enumerable: false,
+ configurable: true,
+ }
+ );
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=chunk-load-error-handler.js.map
+
+ /***/
+ },
+
+ /***/ 9462: /***/ (module, exports) => {
+ "use strict";
+ /**
+ * Utilities for detecting chunk load errors and network failures.
+ *
+ * ChunkLoadError can come from:
+ * - Turbopack: error.name === 'ChunkLoadError'
+ * - Webpack: error.name === 'ChunkLoadError'
+ *
+ * We intentionally keep detection narrow to avoid false positives:
+ * - Server 4xx/5xx responses don't throw (they return Response objects)
+ * - We should NOT retry CORS errors, AbortErrors, or parsing failures
+ */ /**
+ * Detects if an error is a ChunkLoadError from Turbopack or webpack.
+ * This is the most reliable check - both bundlers explicitly set this error name.
+ */
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ isChunkLoadError: function () {
+ return isChunkLoadError;
+ },
+ isChunkOrNetworkError: function () {
+ return isChunkOrNetworkError;
+ },
+ isNetworkError: function () {
+ return isNetworkError;
+ },
+ });
+ function isChunkLoadError(error) {
+ if (!error || typeof error !== "object") return false;
+ return error.name === "ChunkLoadError";
+ }
+ function isNetworkError(error) {
+ if (!error || typeof error !== "object") return false;
+ const err = error;
+ // Never retry intentional aborts
+ if (err.name === "AbortError") return false;
+ // TypeError with specific fetch failure messages
+ // These occur when the network request itself fails (not CORS, not server error)
+ if (err.name === "TypeError") {
+ const message = err.message || "";
+ // Browser-specific network failure messages
+ // Chrome/Edge: "Failed to fetch"
+ // Firefox: "NetworkError when attempting to fetch resource"
+ // Safari: "Load failed" or "The Internet connection appears to be offline"
+ if (
+ message === "Failed to fetch" ||
+ message.startsWith("NetworkError when attempting to fetch") ||
+ message === "Load failed" ||
+ message.includes("Internet connection appears to be offline") ||
+ message.includes("network connection was lost")
+ ) {
+ return true;
+ }
+ }
+ return false;
+ }
+ function isChunkOrNetworkError(error) {
+ return isChunkLoadError(error) || isNetworkError(error);
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=is-chunk-load-error.js.map
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(3458)
+ __webpack_exec__(2604)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for edge-ssr-HASH.js
@@ -1,7 +1,24 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[676],
{
- /***/ 1564: /***/ (
+ /***/ 7046: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/edge-ssr",
+ function () {
+ return __webpack_require__(7142);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 7142: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -20,30 +37,13 @@
/***/
},
-
- /***/ 4300: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/edge-ssr",
- function () {
- return __webpack_require__(1564);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(4300)
+ __webpack_exec__(7046)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for head-HASH.js
@@ -1,34 +1,17 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[5350],
{
- /***/ 1548: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/head",
- function () {
- return __webpack_require__(4282);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 3952: /***/ (
+ /***/ 3770: /***/ (
module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(1653);
+ module.exports = __webpack_require__(9025);
/***/
},
- /***/ 4282: /***/ (
+ /***/ 6236: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -43,7 +26,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(3952);
+ __webpack_require__(3770);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_head__WEBPACK_IMPORTED_MODULE_1__
@@ -76,13 +59,30 @@
/***/
},
+
+ /***/ 6510: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/head",
+ function () {
+ return __webpack_require__(6236);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(1548)
+ __webpack_exec__(6510)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for index-HASH.js
@@ -1,24 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[3332],
{
- /***/ 6376: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/",
- function () {
- return __webpack_require__(8460);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 8460: /***/ (
+ /***/ 830: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -36,13 +19,30 @@
/***/
},
+
+ /***/ 1938: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/",
+ function () {
+ return __webpack_require__(830);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(6376)
+ __webpack_exec__(1938)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for link-HASH.js
@@ -1,7 +1,220 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[4672],
{
- /***/ 857: /***/ (module, exports, __webpack_require__) => {
+ /***/ 2774: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "useIntersection", {
+ enumerable: true,
+ get: function () {
+ return useIntersection;
+ },
+ });
+ const _react = __webpack_require__(4312);
+ const _requestidlecallback = __webpack_require__(9413);
+ const hasIntersectionObserver =
+ typeof IntersectionObserver === "function";
+ const observers = new Map();
+ const idList = [];
+ function createObserver(options) {
+ const id = {
+ root: options.root || null,
+ margin: options.rootMargin || "",
+ };
+ const existing = idList.find(
+ (obj) => obj.root === id.root && obj.margin === id.margin
+ );
+ let instance;
+ if (existing) {
+ instance = observers.get(existing);
+ if (instance) {
+ return instance;
+ }
+ }
+ const elements = new Map();
+ const observer = new IntersectionObserver((entries) => {
+ entries.forEach((entry) => {
+ const callback = elements.get(entry.target);
+ const isVisible =
+ entry.isIntersecting || entry.intersectionRatio > 0;
+ if (callback && isVisible) {
+ callback(isVisible);
+ }
+ });
+ }, options);
+ instance = {
+ id,
+ observer,
+ elements,
+ };
+ idList.push(id);
+ observers.set(id, instance);
+ return instance;
+ }
+ function observe(element, callback, options) {
+ const { id, observer, elements } = createObserver(options);
+ elements.set(element, callback);
+ observer.observe(element);
+ return function unobserve() {
+ elements.delete(element);
+ observer.unobserve(element);
+ // Destroy observer when there's nothing left to watch:
+ if (elements.size === 0) {
+ observer.disconnect();
+ observers.delete(id);
+ const index = idList.findIndex(
+ (obj) => obj.root === id.root && obj.margin === id.margin
+ );
+ if (index > -1) {
+ idList.splice(index, 1);
+ }
+ }
+ };
+ }
+ function useIntersection({ rootRef, rootMargin, disabled }) {
+ const isDisabled = disabled || !hasIntersectionObserver;
+ const [visible, setVisible] = (0, _react.useState)(false);
+ const elementRef = (0, _react.useRef)(null);
+ const setElement = (0, _react.useCallback)((element) => {
+ elementRef.current = element;
+ }, []);
+ (0, _react.useEffect)(() => {
+ if (hasIntersectionObserver) {
+ if (isDisabled || visible) return;
+ const element = elementRef.current;
+ if (element && element.tagName) {
+ const unobserve = observe(
+ element,
+ (isVisible) => isVisible && setVisible(isVisible),
+ {
+ root: rootRef?.current,
+ rootMargin,
+ }
+ );
+ return unobserve;
+ }
+ } else {
+ if (!visible) {
+ const idleCallback = (0,
+ _requestidlecallback.requestIdleCallback)(() => setVisible(true));
+ return () =>
+ (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
+ }
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
+ const resetVisible = (0, _react.useCallback)(() => {
+ setVisible(false);
+ }, []);
+ return [setElement, visible, resetVisible];
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=use-intersection.js.map
+
+ /***/
+ },
+
+ /***/ 3351: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "useMergedRef", {
+ enumerable: true,
+ get: function () {
+ return useMergedRef;
+ },
+ });
+ const _react = __webpack_require__(4312);
+ function useMergedRef(refA, refB) {
+ const cleanupA = (0, _react.useRef)(null);
+ const cleanupB = (0, _react.useRef)(null);
+ // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
+ // (this happens often if the user doesn't pass a ref to Link/Form/Image)
+ // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
+ // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
+ // (because it hasn't been updated for React 19)
+ // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
+ // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
+ return (0, _react.useCallback)(
+ (current) => {
+ if (current === null) {
+ const cleanupFnA = cleanupA.current;
+ if (cleanupFnA) {
+ cleanupA.current = null;
+ cleanupFnA();
+ }
+ const cleanupFnB = cleanupB.current;
+ if (cleanupFnB) {
+ cleanupB.current = null;
+ cleanupFnB();
+ }
+ } else {
+ if (refA) {
+ cleanupA.current = applyRef(refA, current);
+ }
+ if (refB) {
+ cleanupB.current = applyRef(refB, current);
+ }
+ }
+ },
+ [refA, refB]
+ );
+ }
+ function applyRef(refA, current) {
+ if (typeof refA === "function") {
+ const cleanup = refA(current);
+ if (typeof cleanup === "function") {
+ return cleanup;
+ } else {
+ return () => refA(null);
+ }
+ } else {
+ refA.current = current;
+ return () => {
+ refA.current = null;
+ };
+ }
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=use-merged-ref.js.map
+
+ /***/
+ },
+
+ /***/ 3440: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(4757);
+
+ /***/
+ },
+
+ /***/ 4757: /***/ (module, exports, __webpack_require__) => {
"use strict";
/* __next_internal_client_entry_do_not_use__ cjs */
Object.defineProperty(exports, "__esModule", {
@@ -23,22 +236,22 @@
return useLinkStatus;
},
});
- const _interop_require_wildcard = __webpack_require__(8781);
+ const _interop_require_wildcard = __webpack_require__(1162);
const _jsxruntime = __webpack_require__(3108);
const _react = /*#__PURE__*/ _interop_require_wildcard._(
__webpack_require__(4312)
);
- const _resolvehref = __webpack_require__(4055);
- const _islocalurl = __webpack_require__(7175);
- const _formaturl = __webpack_require__(9674);
- const _utils = __webpack_require__(7424);
- const _addlocale = __webpack_require__(589);
- const _routercontextsharedruntime = __webpack_require__(7010);
- const _useintersection = __webpack_require__(2330);
- const _getdomainlocale = __webpack_require__(7207);
- const _addbasepath = __webpack_require__(9942);
- const _usemergedref = __webpack_require__(8067);
- const _erroronce = __webpack_require__(1945);
+ const _resolvehref = __webpack_require__(4691);
+ const _islocalurl = __webpack_require__(4763);
+ const _formaturl = __webpack_require__(3246);
+ const _utils = __webpack_require__(7372);
+ const _addlocale = __webpack_require__(1809);
+ const _routercontextsharedruntime = __webpack_require__(2254);
+ const _useintersection = __webpack_require__(2774);
+ const _getdomainlocale = __webpack_require__(8803);
+ const _addbasepath = __webpack_require__(5834);
+ const _usemergedref = __webpack_require__(3351);
+ const _erroronce = __webpack_require__(6021);
const prefetched = new Set();
function prefetch(router, href, as, options) {
if (false) {
@@ -417,168 +630,43 @@
/***/
},
- /***/ 1945: /***/ (__unused_webpack_module, exports) => {
- "use strict";
-
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "errorOnce", {
- enumerable: true,
- get: function () {
- return errorOnce;
+ /***/ 5326: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/link",
+ function () {
+ return __webpack_require__(9058);
},
- });
- let errorOnce = (_) => {};
+ ]);
if (false) {
- } //# sourceMappingURL=error-once.js.map
+ }
/***/
},
- /***/ 2330: /***/ (module, exports, __webpack_require__) => {
+ /***/ 6021: /***/ (__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
- Object.defineProperty(exports, "useIntersection", {
+ Object.defineProperty(exports, "errorOnce", {
enumerable: true,
get: function () {
- return useIntersection;
+ return errorOnce;
},
});
- const _react = __webpack_require__(4312);
- const _requestidlecallback = __webpack_require__(601);
- const hasIntersectionObserver =
- typeof IntersectionObserver === "function";
- const observers = new Map();
- const idList = [];
- function createObserver(options) {
- const id = {
- root: options.root || null,
- margin: options.rootMargin || "",
- };
- const existing = idList.find(
- (obj) => obj.root === id.root && obj.margin === id.margin
- );
- let instance;
- if (existing) {
- instance = observers.get(existing);
- if (instance) {
- return instance;
- }
- }
- const elements = new Map();
- const observer = new IntersectionObserver((entries) => {
- entries.forEach((entry) => {
- const callback = elements.get(entry.target);
- const isVisible =
- entry.isIntersecting || entry.intersectionRatio > 0;
- if (callback && isVisible) {
- callback(isVisible);
- }
- });
- }, options);
- instance = {
- id,
- observer,
- elements,
- };
- idList.push(id);
- observers.set(id, instance);
- return instance;
- }
- function observe(element, callback, options) {
- const { id, observer, elements } = createObserver(options);
- elements.set(element, callback);
- observer.observe(element);
- return function unobserve() {
- elements.delete(element);
- observer.unobserve(element);
- // Destroy observer when there's nothing left to watch:
- if (elements.size === 0) {
- observer.disconnect();
- observers.delete(id);
- const index = idList.findIndex(
- (obj) => obj.root === id.root && obj.margin === id.margin
- );
- if (index > -1) {
- idList.splice(index, 1);
- }
- }
- };
- }
- function useIntersection({ rootRef, rootMargin, disabled }) {
- const isDisabled = disabled || !hasIntersectionObserver;
- const [visible, setVisible] = (0, _react.useState)(false);
- const elementRef = (0, _react.useRef)(null);
- const setElement = (0, _react.useCallback)((element) => {
- elementRef.current = element;
- }, []);
- (0, _react.useEffect)(() => {
- if (hasIntersectionObserver) {
- if (isDisabled || visible) return;
- const element = elementRef.current;
- if (element && element.tagName) {
- const unobserve = observe(
- element,
- (isVisible) => isVisible && setVisible(isVisible),
- {
- root: rootRef?.current,
- rootMargin,
- }
- );
- return unobserve;
- }
- } else {
- if (!visible) {
- const idleCallback = (0,
- _requestidlecallback.requestIdleCallback)(() => setVisible(true));
- return () =>
- (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
- }
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
- const resetVisible = (0, _react.useCallback)(() => {
- setVisible(false);
- }, []);
- return [setElement, visible, resetVisible];
- }
- if (
- (typeof exports.default === "function" ||
- (typeof exports.default === "object" && exports.default !== null)) &&
- typeof exports.default.__esModule === "undefined"
- ) {
- Object.defineProperty(exports.default, "__esModule", {
- value: true,
- });
- Object.assign(exports.default, exports);
- module.exports = exports.default;
- } //# sourceMappingURL=use-intersection.js.map
-
- /***/
- },
-
- /***/ 4972: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/link",
- function () {
- return __webpack_require__(7600);
- },
- ]);
+ let errorOnce = (_) => {};
if (false) {
- }
+ } //# sourceMappingURL=error-once.js.map
/***/
},
- /***/ 7207: /***/ (module, exports, __webpack_require__) => {
+ /***/ 8803: /***/ (module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -590,7 +678,7 @@
return getDomainLocale;
},
});
- const _normalizetrailingslash = __webpack_require__(151);
+ const _normalizetrailingslash = __webpack_require__(1315);
const basePath =
/* unused pure expression or super */ null && (false || "");
function getDomainLocale(path, locale, locales, domainLocales) {
@@ -614,7 +702,7 @@
/***/
},
- /***/ 7600: /***/ (
+ /***/ 9058: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -629,7 +717,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(7830);
+ __webpack_require__(3440);
/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_link__WEBPACK_IMPORTED_MODULE_1__
@@ -659,101 +747,13 @@
/***/
},
-
- /***/ 7830: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(857);
-
- /***/
- },
-
- /***/ 8067: /***/ (module, exports, __webpack_require__) => {
- "use strict";
-
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "useMergedRef", {
- enumerable: true,
- get: function () {
- return useMergedRef;
- },
- });
- const _react = __webpack_require__(4312);
- function useMergedRef(refA, refB) {
- const cleanupA = (0, _react.useRef)(null);
- const cleanupB = (0, _react.useRef)(null);
- // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
- // (this happens often if the user doesn't pass a ref to Link/Form/Image)
- // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
- // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
- // (because it hasn't been updated for React 19)
- // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
- // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
- return (0, _react.useCallback)(
- (current) => {
- if (current === null) {
- const cleanupFnA = cleanupA.current;
- if (cleanupFnA) {
- cleanupA.current = null;
- cleanupFnA();
- }
- const cleanupFnB = cleanupB.current;
- if (cleanupFnB) {
- cleanupB.current = null;
- cleanupFnB();
- }
- } else {
- if (refA) {
- cleanupA.current = applyRef(refA, current);
- }
- if (refB) {
- cleanupB.current = applyRef(refB, current);
- }
- }
- },
- [refA, refB]
- );
- }
- function applyRef(refA, current) {
- if (typeof refA === "function") {
- const cleanup = refA(current);
- if (typeof cleanup === "function") {
- return cleanup;
- } else {
- return () => refA(null);
- }
- } else {
- refA.current = current;
- return () => {
- refA.current = null;
- };
- }
- }
- if (
- (typeof exports.default === "function" ||
- (typeof exports.default === "object" && exports.default !== null)) &&
- typeof exports.default.__esModule === "undefined"
- ) {
- Object.defineProperty(exports.default, "__esModule", {
- value: true,
- });
- Object.assign(exports.default, exports);
- module.exports = exports.default;
- } //# sourceMappingURL=use-merged-ref.js.map
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(4972)
+ __webpack_exec__(5326)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for routerDirect-HASH.js
@@ -1,17 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[188],
{
- /***/ 1179: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(9864);
-
- /***/
- },
-
- /***/ 1640: /***/ (
+ /***/ 2014: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -26,7 +16,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1179);
+ __webpack_require__(4169);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -46,7 +36,17 @@
/***/
},
- /***/ 2172: /***/ (
+ /***/ 4169: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(9700);
+
+ /***/
+ },
+
+ /***/ 4414: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
@@ -54,7 +54,7 @@
(window.__NEXT_P = window.__NEXT_P || []).push([
"/routerDirect",
function () {
- return __webpack_require__(1640);
+ return __webpack_require__(2014);
},
]);
if (false) {
@@ -68,7 +68,7 @@
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(2172)
+ __webpack_exec__(4414)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for script-HASH.js
@@ -1,17 +1,34 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[1209],
{
- /***/ 4977: /***/ (
+ /***/ 2591: /***/ (
module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(326);
+ module.exports = __webpack_require__(4634);
/***/
},
- /***/ 5887: /***/ (
+ /***/ 5030: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/script",
+ function () {
+ return __webpack_require__(7557);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 7557: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -26,7 +43,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(4977);
+ __webpack_require__(2591);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -58,30 +75,13 @@
/***/
},
-
- /***/ 6268: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/script",
- function () {
- return __webpack_require__(5887);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(6268)
+ __webpack_exec__(5030)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for withRouter-HASH.js
@@ -1,34 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[3263],
{
- /***/ 1179: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(9864);
-
- /***/
- },
-
- /***/ 2028: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/withRouter",
- function () {
- return __webpack_require__(4501);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 4501: /***/ (
+ /***/ 559: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -43,7 +16,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1179);
+ __webpack_require__(4169);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -61,13 +34,40 @@
/***/
},
+
+ /***/ 726: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/withRouter",
+ function () {
+ return __webpack_require__(559);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 4169: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(9700);
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(2028)
+ __webpack_exec__(726)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for 2161-HASH.js
Diff too large to display
Diff for 2747-HASH.js
Diff too large to display
Diff for 4322-HASH.js
failed to diffDiff for main-HASH.js
Diff too large to display
Diff for webpack-HASH.js
@@ -205,7 +205,7 @@
/******/ __webpack_require__.u = (chunkId) => {
/******/ // return url for filenames based on template
/******/ return (
- "static/chunks/" + chunkId + "." + "9c9ddbde79ea2f29" + ".js"
+ "static/chunks/" + chunkId + "." + "871ca3fb4b1caa0e" + ".js"
);
/******/
};
@@ -380,6 +380,23 @@
/******/
};
/******/
+ /******/ // Next.js chunk cache clearing for retry logic
+ /******/ if (typeof globalThis !== "undefined") {
+ /******/ globalThis.__next_clear_chunk_cache__ = function (chunkId) {
+ /******/ // Only clear if not already loaded (0 means loaded)
+ /******/ if (
+ installedChunks[chunkId] !== 0 &&
+ installedChunks[chunkId] !== undefined
+ ) {
+ /******/ delete installedChunks[chunkId];
+ /******/
+ }
+ /******/
+ };
+ /******/
+ }
+ /******/
+ /******/
/******/ __webpack_require__.f.j = (chunkId, promises) => {
/******/ // JSONP chunk loading for javascript
/******/ var installedChunkData = __webpack_require__.o(Diff for app-page-exp..ntime.dev.js
Diff too large to display
Diff for app-page-exp..time.prod.js
failed to diffDiff for app-page-tur..ntime.dev.js
Diff too large to display
Diff for app-page-tur..time.prod.js
failed to diffDiff for app-page-tur..ntime.dev.js
Diff too large to display
Diff for app-page-tur..time.prod.js
Diff too large to display
Diff for app-page.runtime.dev.js
Diff too large to display
Diff for app-page.runtime.prod.js
Diff too large to display
Diff for pages-turbo...ntime.dev.js
Diff too large to display
Diff for pages-turbo...time.prod.js
Diff too large to display
Diff for pages.runtime.dev.js
Diff too large to display
Diff for pages.runtime.prod.js
Diff too large to display
Stats from current PRDefault Build (Increase detected
|
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| buildDuration | 17.4s | 15.1s | N/A |
| buildDurationCached | 13.9s | 11s | N/A |
| nodeModulesSize | 457 MB | 458 MB | |
| nextStartRea..uration (ms) | 713ms | 717ms | N/A |
Client Bundles (main, webpack) Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| 2086.HASH.js gzip | 169 B | 169 B | ✓ |
| 2161-HASH.js gzip | 5.39 kB | 5.41 kB | N/A |
| 2747-HASH.js gzip | 4.48 kB | 4.46 kB | N/A |
| 4322-HASH.js gzip | 51.2 kB | 54.7 kB | |
| ec793fe8-HASH.js gzip | 62.3 kB | 62.3 kB | N/A |
| framework-HASH.js gzip | 59.8 kB | 59.8 kB | N/A |
| main-app-HASH.js gzip | 252 B | 253 B | N/A |
| main-HASH.js gzip | 38.4 kB | 38.7 kB | |
| webpack-HASH.js gzip | 1.68 kB | 1.73 kB | N/A |
| Overall change | 89.8 kB | 93.7 kB |
Legacy Client Bundles (polyfills)
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| polyfills-HASH.js gzip | 39.4 kB | 39.4 kB | ✓ |
| Overall change | 39.4 kB | 39.4 kB | ✓ |
Client Pages Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| _app-HASH.js gzip | 194 B | 193 B | N/A |
| _error-HASH.js gzip | 182 B | 182 B | ✓ |
| css-HASH.js gzip | 336 B | 335 B | N/A |
| dynamic-HASH.js gzip | 1.8 kB | 4.18 kB | |
| edge-ssr-HASH.js gzip | 256 B | 256 B | ✓ |
| head-HASH.js gzip | 352 B | 349 B | N/A |
| hooks-HASH.js gzip | 385 B | 384 B | N/A |
| image-HASH.js gzip | 580 B | 580 B | ✓ |
| index-HASH.js gzip | 259 B | 258 B | N/A |
| link-HASH.js gzip | 2.5 kB | 2.51 kB | N/A |
| routerDirect..HASH.js gzip | 319 B | 317 B | N/A |
| script-HASH.js gzip | 385 B | 387 B | N/A |
| withRouter-HASH.js gzip | 316 B | 315 B | N/A |
| 1afbb74e6ecf..834.css gzip | 106 B | 106 B | ✓ |
| Overall change | 2.92 kB | 5.3 kB |
Client Build Manifests
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 738 B | 738 B | ✓ |
| Overall change | 738 B | 738 B | ✓ |
Rendered Page Sizes
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| index.html gzip | 523 B | 524 B | N/A |
| link.html gzip | 538 B | 538 B | ✓ |
| withRouter.html gzip | 520 B | 520 B | ✓ |
| Overall change | 1.06 kB | 1.06 kB | ✓ |
Edge SSR bundle Size Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| edge-ssr.js gzip | 124 kB | 124 kB | N/A |
| page.js gzip | 237 kB | 241 kB | |
| Overall change | 237 kB | 241 kB |
Middleware size
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| middleware-b..fest.js gzip | 654 B | 655 B | N/A |
| middleware-r..fest.js gzip | 155 B | 156 B | N/A |
| middleware.js gzip | 32.8 kB | 32.9 kB | N/A |
| edge-runtime..pack.js gzip | 846 B | 846 B | ✓ |
| Overall change | 846 B | 846 B | ✓ |
Next Runtimes Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| app-page-exp...dev.js gzip | 301 kB | 305 kB | |
| app-page-exp..prod.js gzip | 156 kB | 158 kB | |
| app-page-tur...dev.js gzip | 301 kB | 305 kB | |
| app-page-tur..prod.js gzip | 156 kB | 158 kB | |
| app-page-tur...dev.js gzip | 298 kB | 301 kB | |
| app-page-tur..prod.js gzip | 154 kB | 156 kB | |
| app-page.run...dev.js gzip | 298 kB | 301 kB | |
| app-page.run..prod.js gzip | 154 kB | 156 kB | |
| app-route-ex...dev.js gzip | 68.7 kB | 68.7 kB | ✓ |
| app-route-ex..prod.js gzip | 47.5 kB | 47.5 kB | ✓ |
| app-route-tu...dev.js gzip | 68.7 kB | 68.7 kB | ✓ |
| app-route-tu..prod.js gzip | 47.5 kB | 47.5 kB | ✓ |
| app-route-tu...dev.js gzip | 68.3 kB | 68.3 kB | ✓ |
| app-route-tu..prod.js gzip | 47.3 kB | 47.3 kB | ✓ |
| app-route.ru...dev.js gzip | 68.3 kB | 68.3 kB | ✓ |
| app-route.ru..prod.js gzip | 47.3 kB | 47.3 kB | ✓ |
| dist_client_...dev.js gzip | 324 B | 324 B | ✓ |
| dist_client_...dev.js gzip | 326 B | 326 B | ✓ |
| dist_client_...dev.js gzip | 318 B | 318 B | ✓ |
| dist_client_...dev.js gzip | 317 B | 317 B | ✓ |
| pages-api-tu...dev.js gzip | 41.1 kB | 41.1 kB | ✓ |
| pages-api-tu..prod.js gzip | 31.2 kB | 31.2 kB | ✓ |
| pages-api.ru...dev.js gzip | 41 kB | 41 kB | ✓ |
| pages-api.ru..prod.js gzip | 31.2 kB | 31.2 kB | ✓ |
| pages-turbo....dev.js gzip | 50.7 kB | 50.7 kB | N/A |
| pages-turbo...prod.js gzip | 38.2 kB | 38.2 kB | N/A |
| pages.runtim...dev.js gzip | 50.6 kB | 50.7 kB | N/A |
| pages.runtim..prod.js gzip | 38.1 kB | 38.1 kB | N/A |
| server.runti..prod.js gzip | 59.9 kB | 59.9 kB | ✓ |
| Overall change | 2.49 MB | 2.51 MB |
build cache Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| 0.pack gzip | 3.61 MB | 3.66 MB | |
| index.pack gzip | 97.5 kB | 100 kB | |
| Overall change | 3.7 MB | 3.76 MB |
Diff details
Diff for page.js
Diff too large to display
Diff for middleware.js
Diff too large to display
Diff for edge-ssr.js
Diff too large to display
Diff for _buildManifest.js
@@ -611,35 +611,35 @@ self.__BUILD_MANIFEST = (function (a, b, c) {
numHashes: NaN,
bitArray: [],
},
- "/": ["static\u002Fchunks\u002Fpages\u002Findex-dda7d8b64d4ba15c.js"],
+ "/": ["static\u002Fchunks\u002Fpages\u002Findex-d95f7ec6af4d2644.js"],
"/_error": [
- "static\u002Fchunks\u002Fpages\u002F_error-6ef44d3954f25711.js",
+ "static\u002Fchunks\u002Fpages\u002F_error-209c0c82205a7c9f.js",
],
"/css": [
"static\u002Fcss\u002Fded6b86ab9cc0a1f.css",
- "static\u002Fchunks\u002Fpages\u002Fcss-c8aaa7211416a045.js",
+ "static\u002Fchunks\u002Fpages\u002Fcss-62710339bc830ded.js",
],
"/dynamic": [
- "static\u002Fchunks\u002Fpages\u002Fdynamic-d53bb7f318f342c2.js",
+ "static\u002Fchunks\u002Fpages\u002Fdynamic-8a03f5fe64080e08.js",
],
"/edge-ssr": [
- "static\u002Fchunks\u002Fpages\u002Fedge-ssr-1383106d4a3e7d72.js",
+ "static\u002Fchunks\u002Fpages\u002Fedge-ssr-0db9f7bb610d3072.js",
],
- "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-1db1c4be1a45662f.js"],
- "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-e6deee5b72a5b112.js"],
+ "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-747416c4075e42aa.js"],
+ "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-8b10205be7505244.js"],
"/image": [
- "static\u002Fchunks\u002F2747-90c828280005c0c3.js",
- "static\u002Fchunks\u002Fpages\u002Fimage-868472cd5e84efc9.js",
+ "static\u002Fchunks\u002F6349-ee9aecde860d4832.js",
+ "static\u002Fchunks\u002Fpages\u002Fimage-f90ae17c3ad1d38b.js",
],
- "/link": ["static\u002Fchunks\u002Fpages\u002Flink-0ec374e48b2ce5d9.js"],
+ "/link": ["static\u002Fchunks\u002Fpages\u002Flink-6ab9a67b348df1bf.js"],
"/routerDirect": [
- "static\u002Fchunks\u002Fpages\u002FrouterDirect-1a34bfadbc088491.js",
+ "static\u002Fchunks\u002Fpages\u002FrouterDirect-f132fb471e65a8b9.js",
],
"/script": [
- "static\u002Fchunks\u002Fpages\u002Fscript-52320f59afbd096d.js",
+ "static\u002Fchunks\u002Fpages\u002Fscript-8e2028e44b8da2d9.js",
],
"/withRouter": [
- "static\u002Fchunks\u002Fpages\u002FwithRouter-3b1a16d3dfa21c16.js",
+ "static\u002Fchunks\u002Fpages\u002FwithRouter-a86d259faa012c1c.js",
],
sortedPages: [
"\u002F",Diff for dynamic-HASH.js
@@ -1,17 +1,346 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[2291],
{
- /***/ 1231: /***/ (
- module,
+ /***/ 434: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+ /* __next_internal_client_entry_do_not_use__ cjs */
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "ChunkLoadErrorBanner", {
+ enumerable: true,
+ get: function () {
+ return ChunkLoadErrorBanner;
+ },
+ });
+ const _jsxruntime = __webpack_require__(3108);
+ const _react = __webpack_require__(4312);
+ // Copy constants (two lines, always)
+ const HEADLINE = "This page couldn't be fully loaded";
+ const DETAIL_DEFAULT = "A required file couldn't be loaded.";
+ const DETAIL_OFFLINE = "You're offline.";
+ // Fixed height for stable layout
+ const BANNER_HEIGHT = 70;
+ const styles = {
+ container: {
+ position: "fixed",
+ top: 0,
+ left: 0,
+ right: 0,
+ zIndex: 9999,
+ height: BANNER_HEIGHT,
+ padding: "0 20px",
+ backgroundColor: "#f5f5f5",
+ borderBottom: "1px solid #d4d4d4",
+ fontFamily:
+ 'system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"',
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "space-between",
+ gap: "16px",
+ boxSizing: "border-box",
+ },
+ spacer: {
+ height: BANNER_HEIGHT,
+ flexShrink: 0,
+ },
+ left: {
+ display: "flex",
+ alignItems: "center",
+ gap: "12px",
+ flex: 1,
+ minWidth: 0,
+ },
+ icon: {
+ flexShrink: 0,
+ width: "20px",
+ height: "20px",
+ },
+ content: {
+ display: "flex",
+ flexDirection: "column",
+ gap: "2px",
+ flex: 1,
+ minWidth: 0,
+ },
+ headline: {
+ fontSize: "14px",
+ fontWeight: 600,
+ color: "#171717",
+ margin: 0,
+ lineHeight: 1.4,
+ },
+ detail: {
+ fontSize: "13px",
+ fontWeight: 400,
+ color: "#525252",
+ margin: 0,
+ lineHeight: 1.4,
+ },
+ button: {
+ padding: "8px 16px",
+ fontSize: "13px",
+ fontWeight: 600,
+ borderRadius: "6px",
+ cursor: "pointer",
+ color: "#171717",
+ backgroundColor: "#fff",
+ border: "1px solid #a3a3a3",
+ lineHeight: 1,
+ flexShrink: 0,
+ },
+ };
+ // Neutral warning icon (circle with exclamation)
+ function WarningIcon() {
+ return /*#__PURE__*/ (0, _jsxruntime.jsxs)("svg", {
+ style: styles.icon,
+ viewBox: "0 0 20 20",
+ fill: "none",
+ xmlns: "http://www.w3.org/2000/svg",
+ "aria-hidden": "true",
+ children: [
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("circle", {
+ cx: "10",
+ cy: "10",
+ r: "9",
+ stroke: "#737373",
+ strokeWidth: "1.5",
+ }),
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("path", {
+ d: "M10 5.5V11",
+ stroke: "#737373",
+ strokeWidth: "1.5",
+ strokeLinecap: "round",
+ }),
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("circle", {
+ cx: "10",
+ cy: "14",
+ r: "1",
+ fill: "#737373",
+ }),
+ ],
+ });
+ }
+ function ChunkLoadErrorBanner(_props) {
+ const [isOffline, setIsOffline] = (0, _react.useState)(
+ typeof navigator !== "undefined" ? !navigator.onLine : false
+ );
+ (0, _react.useEffect)(() => {
+ const handleOnline = () => setIsOffline(false);
+ const handleOffline = () => setIsOffline(true);
+ window.addEventListener("online", handleOnline);
+ window.addEventListener("offline", handleOffline);
+ return () => {
+ window.removeEventListener("online", handleOnline);
+ window.removeEventListener("offline", handleOffline);
+ };
+ }, []);
+ const handleReload = (0, _react.useCallback)(() => {
+ window.location.reload();
+ }, []);
+ const detail = isOffline ? DETAIL_OFFLINE : DETAIL_DEFAULT;
+ return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_jsxruntime.Fragment, {
+ children: [
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
+ style: styles.container,
+ role: "alert",
+ "aria-live": "assertive",
+ children: [
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
+ style: styles.left,
+ children: [
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(WarningIcon, {}),
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
+ style: styles.content,
+ children: [
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("p", {
+ style: styles.headline,
+ children: HEADLINE,
+ }),
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("p", {
+ style: styles.detail,
+ children: detail,
+ }),
+ ],
+ }),
+ ],
+ }),
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("button", {
+ type: "button",
+ style: styles.button,
+ onClick: handleReload,
+ children: "Reload page",
+ }),
+ ],
+ }),
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
+ style: styles.spacer,
+ }),
+ ],
+ });
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=chunk-load-error-banner.js.map
+
+ /***/
+ },
+
+ /***/ 1033: /***/ (module, exports) => {
+ "use strict";
+ // This gets assigned as a side-effect during app initialization. Because it
+ // represents the build used to create the JS bundle, it should never change
+ // after being set, so we store it in a global variable.
+ //
+ // When performing RSC requests, if the incoming data has a different build ID,
+ // we perform an MPA navigation/refresh to load the updated build and ensure
+ // that the client and server in sync.
+ // Starts as an empty string. In practice, because setAppBuildId is called
+ // during initialization before hydration starts, this will always get
+ // reassigned to the actual build ID before it's ever needed by a navigation.
+ // If for some reasons it didn't, due to a bug or race condition, then on
+ // navigation the build comparision would fail and trigger an MPA navigation.
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ getAppBuildId: function () {
+ return getAppBuildId;
+ },
+ setAppBuildId: function () {
+ return setAppBuildId;
+ },
+ });
+ let globalBuildId = "";
+ function setAppBuildId(buildId) {
+ globalBuildId = buildId;
+ }
+ function getAppBuildId() {
+ return globalBuildId;
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=app-build-id.js.map
+
+ /***/
+ },
+
+ /***/ 2604: /***/ (
+ __unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(4464);
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/dynamic",
+ function () {
+ return __webpack_require__(3643);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 2758: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ ChunkLoadErrorBanner: function () {
+ return _chunkloaderrorbanner.ChunkLoadErrorBanner;
+ },
+ clearChunkCache: function () {
+ return _chunkloaderrorhandler.clearChunkCache;
+ },
+ clearFailureState: function () {
+ return _chunkloaderrorhandler.clearFailureState;
+ },
+ createChunkErrorContext: function () {
+ return _chunkloaderrorhandler.createChunkErrorContext;
+ },
+ getFailCount: function () {
+ return _chunkloaderrorhandler.getFailCount;
+ },
+ getRetryDelayMs: function () {
+ return _chunkloaderrorhandler.getRetryDelayMs;
+ },
+ handleChunkFailure: function () {
+ return _chunkloaderrorhandler.handleChunkFailure;
+ },
+ isChunkLoadError: function () {
+ return _ischunkloaderror.isChunkLoadError;
+ },
+ isChunkOrNetworkError: function () {
+ return _ischunkloaderror.isChunkOrNetworkError;
+ },
+ isNetworkError: function () {
+ return _ischunkloaderror.isNetworkError;
+ },
+ retryChunkImport: function () {
+ return _chunkloaderrorhandler.retryChunkImport;
+ },
+ shouldSilentRetry: function () {
+ return _chunkloaderrorhandler.shouldSilentRetry;
+ },
+ sleep: function () {
+ return _chunkloaderrorhandler.sleep;
+ },
+ });
+ const _ischunkloaderror = __webpack_require__(9462);
+ const _chunkloaderrorhandler = __webpack_require__(7676);
+ const _chunkloaderrorbanner = __webpack_require__(434);
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=index.js.map
/***/
},
- /***/ 2101: /***/ (
+ /***/ 3401: /***/ (
__unused_webpack_module,
exports,
__webpack_require__
@@ -38,24 +367,63 @@
/***/
},
- /***/ 3458: /***/ (
+ /***/ 3643: /***/ (
__unused_webpack_module,
- __unused_webpack_exports,
+ __webpack_exports__,
__webpack_require__
) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/dynamic",
- function () {
- return __webpack_require__(9381);
- },
- ]);
- if (false) {
- }
+ "use strict";
+ __webpack_require__.r(__webpack_exports__);
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
+ /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
+ /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
+ /* harmony export */
+ });
+ /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
+ __webpack_require__(3108);
+ /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
+ __webpack_require__(3973);
+ /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
+ /*#__PURE__*/ __webpack_require__.n(
+ next_dynamic__WEBPACK_IMPORTED_MODULE_1__
+ );
+
+ const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
+ () =>
+ __webpack_require__
+ .e(/* import() */ 1596)
+ .then(__webpack_require__.bind(__webpack_require__, 1596))
+ .then((mod) => mod.Hello),
+ {
+ loadableGenerated: {
+ webpack: () => [/*require.resolve*/ 1596],
+ },
+ }
+ );
+ const Page = () =>
+ /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
+ {
+ children: [
+ /*#__PURE__*/ (0,
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
+ children: "testing next/dynamic size",
+ }),
+ /*#__PURE__*/ (0,
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
+ DynamicHello,
+ {}
+ ),
+ ],
+ }
+ );
+ var __N_SSP = true;
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
/***/
},
- /***/ 4464: /***/ (module, exports, __webpack_require__) => {
+ /***/ 3660: /***/ (module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -88,7 +456,7 @@
__webpack_require__(4312)
);
const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(9799)
+ __webpack_require__(4539)
);
const isServerSide = "object" === "undefined";
// Normalize loader to return the module as form { default: Component } for `React.lazy`.
@@ -188,63 +556,17 @@
/***/
},
- /***/ 9381: /***/ (
- __unused_webpack_module,
- __webpack_exports__,
+ /***/ 3973: /***/ (
+ module,
+ __unused_webpack_exports,
__webpack_require__
) => {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
- /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
- /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
- /* harmony export */
- });
- /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
- __webpack_require__(3108);
- /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1231);
- /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
- /*#__PURE__*/ __webpack_require__.n(
- next_dynamic__WEBPACK_IMPORTED_MODULE_1__
- );
-
- const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
- () =>
- __webpack_require__
- .e(/* import() */ 2086)
- .then(__webpack_require__.bind(__webpack_require__, 2086))
- .then((mod) => mod.Hello),
- {
- loadableGenerated: {
- webpack: () => [/*require.resolve*/ 2086],
- },
- }
- );
- const Page = () =>
- /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
- {
- children: [
- /*#__PURE__*/ (0,
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
- children: "testing next/dynamic size",
- }),
- /*#__PURE__*/ (0,
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
- DynamicHello,
- {}
- ),
- ],
- }
- );
- var __N_SSP = true;
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
+ module.exports = __webpack_require__(3660);
/***/
},
- /***/ 9799: /***/ (
+ /***/ 4539: /***/ (
__unused_webpack_module,
exports,
__webpack_require__
@@ -286,7 +608,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
const _react = /*#__PURE__*/ _interop_require_default._(
__webpack_require__(4312)
);
- const _loadablecontextsharedruntime = __webpack_require__(2101);
+ const _loadablecontextsharedruntime = __webpack_require__(3401);
+ const _chunkloaderror = __webpack_require__(2758);
function resolve(obj) {
return obj && obj.default ? obj.default : obj;
}
@@ -413,6 +736,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
this._callbacks = new Set();
this._delay = null;
this._timeout = null;
+ this._hasAutoRetried = false;
this.retry();
}
promise() {
@@ -451,7 +775,25 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
this._update({});
this._clearTimeouts();
})
- .catch((_err) => {
+ .catch((err) => {
+ // Auto-retry for chunk load errors (once)
+ // This handles transient network failures during dynamic imports
+ if (
+ true &&
+ (0, _chunkloaderror.isChunkLoadError)(err) &&
+ !this._hasAutoRetried
+ ) {
+ this._hasAutoRetried = true;
+ // Clear bundler's chunk cache so retry will fetch fresh
+ (0, _chunkloaderror.clearChunkCache)(err);
+ // Retry after a short delay with jitter
+ const delay = (0, _chunkloaderror.getRetryDelayMs)();
+ setTimeout(() => {
+ this.retry();
+ }, delay);
+ return;
+ }
+ // No more retries - propagate error
this._update({});
this._clearTimeouts();
});
@@ -518,13 +860,392 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
/***/
},
+
+ /***/ 7676: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+ /**
+ * Chunk load error handling with silent retry logic.
+ *
+ * This module provides retry orchestration for chunk/network loading failures.
+ * It tracks failures in sessionStorage per {route, buildId, chunkKey} and
+ * implements silent retry with jittered backoff.
+ */
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ clearChunkCache: function () {
+ return clearChunkCache;
+ },
+ clearFailureState: function () {
+ return clearFailureState;
+ },
+ createChunkErrorContext: function () {
+ return createChunkErrorContext;
+ },
+ getFailCount: function () {
+ return getFailCount;
+ },
+ getRetryDelayMs: function () {
+ return getRetryDelayMs;
+ },
+ handleChunkFailure: function () {
+ return handleChunkFailure;
+ },
+ retryChunkImport: function () {
+ return retryChunkImport;
+ },
+ shouldSilentRetry: function () {
+ return shouldSilentRetry;
+ },
+ sleep: function () {
+ return sleep;
+ },
+ });
+ const _appbuildid = __webpack_require__(1033);
+ const _ischunkloaderror = __webpack_require__(9462);
+ const STORAGE_PREFIX = "__next_chunk_fail:";
+ const RETRY_WINDOW_MS = 30000; // Don't retry same chunk within 30s of a retry
+ const MAX_FAIL_COUNT_FOR_RETRY = 2; // After 2 failures, skip silent retry
+ /**
+ * Simple hash function for generating chunk keys when URL isn't available.
+ */ function simpleHash(str) {
+ let hash = 0;
+ for (let i = 0; i < str.length; i++) {
+ const char = str.charCodeAt(i);
+ hash = ((hash << 5) - hash + char) | 0;
+ }
+ return Math.abs(hash).toString(36);
+ }
+ /**
+ * Extract chunk URL from error message if possible.
+ * ChunkLoadError messages typically contain the URL.
+ */ function extractChunkUrl(error) {
+ const message = error.message;
+ // Turbopack format: "Failed to load chunk <url> from <reason>: <cause>"
+ // The URL can be relative (/_next/...) or absolute (http://...)
+ const turbopackMatch = message.match(
+ /Failed to load chunk ([^\s]+\.(?:js|css))/
+ );
+ if (turbopackMatch) {
+ return turbopackMatch[1];
+ }
+ // Webpack format: "Loading chunk <id> failed. (error: <url>)"
+ const webpackMatch = message.match(/https?:\/\/[^\s)]+/);
+ return webpackMatch?.[0];
+ }
+ /**
+ * Extract the chunk ID from a webpack chunk URL.
+ * URLs look like: /_next/static/chunks/123.hash.js
+ */ function extractWebpackChunkId(chunkUrl) {
+ // Match chunk ID from URL path: /chunks/123.abc123.js or /chunks/pages_foo_bar.abc123.js
+ const match = chunkUrl.match(/\/chunks\/([^/.]+)\.[a-f0-9]+\.js/);
+ return match?.[1];
+ }
+ function clearChunkCache(error) {
+ const chunkUrl = extractChunkUrl(error);
+ if (!chunkUrl) return false;
+ // Turbopack: clear by chunk URL
+ if (
+ typeof globalThis.__turbopack_clear_chunk_resolver__ === "function"
+ ) {
+ // Extract the relative URL path that Turbopack uses as key
+ try {
+ const url = new URL(chunkUrl);
+ globalThis.__turbopack_clear_chunk_resolver__(
+ url.pathname + url.search
+ );
+ return true;
+ } catch {
+ // Invalid URL, try using the full URL
+ globalThis.__turbopack_clear_chunk_resolver__(chunkUrl);
+ return true;
+ }
+ }
+ // Webpack: extract chunk ID from URL and clear by ID
+ if (typeof globalThis.__next_clear_chunk_cache__ === "function") {
+ const chunkId = extractWebpackChunkId(chunkUrl);
+ if (chunkId) {
+ globalThis.__next_clear_chunk_cache__(chunkId);
+ return true;
+ }
+ }
+ return false;
+ }
+ /**
+ * Generate a unique key for this chunk error, used for deduplication.
+ */ function getChunkKey(ctx) {
+ return ctx.chunkUrl ?? simpleHash(ctx.message);
+ }
+ /**
+ * Get the sessionStorage key for tracking this chunk failure.
+ */ function getStorageKey(ctx) {
+ const buildId = (0, _appbuildid.getAppBuildId)();
+ const chunkKey = getChunkKey(ctx);
+ return `${STORAGE_PREFIX}${buildId}:${ctx.route}:${chunkKey}`;
+ }
+ /**
+ * Read failure state from sessionStorage.
+ */ function readFailureState(key) {
+ if (typeof sessionStorage === "undefined") return null;
+ try {
+ const stored = sessionStorage.getItem(key);
+ if (!stored) return null;
+ return JSON.parse(stored);
+ } catch {
+ return null;
+ }
+ }
+ /**
+ * Write failure state to sessionStorage.
+ */ function writeFailureState(key, state) {
+ if (typeof sessionStorage === "undefined") return;
+ try {
+ sessionStorage.setItem(key, JSON.stringify(state));
+ } catch {
+ // Storage might be full or disabled - continue without tracking
+ }
+ }
+ function clearFailureState(route) {
+ if (typeof sessionStorage === "undefined") return;
+ try {
+ const buildId = (0, _appbuildid.getAppBuildId)();
+ const prefix = `${STORAGE_PREFIX}${buildId}:${route}:`;
+ const keysToRemove = [];
+ for (let i = 0; i < sessionStorage.length; i++) {
+ const key = sessionStorage.key(i);
+ if (key?.startsWith(prefix)) {
+ keysToRemove.push(key);
+ }
+ }
+ keysToRemove.forEach((key) => sessionStorage.removeItem(key));
+ } catch {
+ // Ignore storage errors
+ }
+ }
+ /**
+ * Increment the failure count for this chunk.
+ */ function bumpFailCount(ctx) {
+ const key = getStorageKey(ctx);
+ const existing = readFailureState(key);
+ const now = Date.now();
+ const state = {
+ failCount: (existing?.failCount ?? 0) + 1,
+ lastTs: now,
+ retriedTs: existing?.retriedTs,
+ };
+ writeFailureState(key, state);
+ return state;
+ }
+ /**
+ * Mark that a retry was attempted for this chunk.
+ */ function markRetried(ctx) {
+ const key = getStorageKey(ctx);
+ const existing = readFailureState(key);
+ const now = Date.now();
+ const state = {
+ failCount: existing?.failCount ?? 1,
+ lastTs: existing?.lastTs ?? now,
+ retriedTs: now,
+ };
+ writeFailureState(key, state);
+ }
+ function shouldSilentRetry(ctx) {
+ // Don't retry if offline
+ if (typeof navigator !== "undefined" && !navigator.onLine) {
+ return false;
+ }
+ const key = getStorageKey(ctx);
+ const state = readFailureState(key);
+ const now = Date.now();
+ // If we already retried within the window, don't retry again
+ if (state?.retriedTs && now - state.retriedTs < RETRY_WINDOW_MS) {
+ return false;
+ }
+ // Too many failures - skip silent retry to avoid annoying the user
+ if ((state?.failCount ?? 0) >= MAX_FAIL_COUNT_FOR_RETRY) {
+ return false;
+ }
+ return true;
+ }
+ function getFailCount(ctx) {
+ const key = getStorageKey(ctx);
+ const state = readFailureState(key);
+ return state?.failCount ?? 0;
+ }
+ function getRetryDelayMs() {
+ const baseDelay = 200;
+ const jitter = Math.floor(Math.random() * 401); // 0-400ms
+ // Get RTT if available via Network Information API
+ let rtt = 0;
+ if (typeof navigator !== "undefined" && "connection" in navigator) {
+ const connection = navigator.connection;
+ if (connection?.rtt) {
+ rtt = Math.min(500, connection.rtt); // Cap at 500ms
+ }
+ }
+ return Math.min(1500, baseDelay + jitter + rtt); // Cap total at 1500ms
+ }
+ function sleep(ms) {
+ return new Promise((resolve) => setTimeout(resolve, ms));
+ }
+ function createChunkErrorContext(error, route, userVisible = true) {
+ if (
+ !(0, _ischunkloaderror.isChunkLoadError)(error) &&
+ !(0, _ischunkloaderror.isNetworkError)(error)
+ ) {
+ return null;
+ }
+ return {
+ route,
+ userVisible,
+ message: error.message,
+ chunkUrl: extractChunkUrl(error),
+ };
+ }
+ function handleChunkFailure(ctx) {
+ // Always increment fail count first
+ bumpFailCount(ctx);
+ // Check if we should try a silent retry
+ if (shouldSilentRetry(ctx)) {
+ markRetried(ctx);
+ return "retry";
+ }
+ // Show banner to the user
+ return "banner";
+ }
+ async function retryChunkImport(ctx, importFn) {
+ const action = handleChunkFailure(ctx);
+ if (action === "retry") {
+ const delay = getRetryDelayMs();
+ await sleep(delay);
+ return importFn();
+ }
+ // If we shouldn't retry, re-throw to trigger error boundary
+ throw Object.defineProperty(
+ new Error("Chunk load failed after retry attempts"),
+ "__NEXT_ERROR_CODE",
+ {
+ value: "E976",
+ enumerable: false,
+ configurable: true,
+ }
+ );
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=chunk-load-error-handler.js.map
+
+ /***/
+ },
+
+ /***/ 9462: /***/ (module, exports) => {
+ "use strict";
+ /**
+ * Utilities for detecting chunk load errors and network failures.
+ *
+ * ChunkLoadError can come from:
+ * - Turbopack: error.name === 'ChunkLoadError'
+ * - Webpack: error.name === 'ChunkLoadError'
+ *
+ * We intentionally keep detection narrow to avoid false positives:
+ * - Server 4xx/5xx responses don't throw (they return Response objects)
+ * - We should NOT retry CORS errors, AbortErrors, or parsing failures
+ */ /**
+ * Detects if an error is a ChunkLoadError from Turbopack or webpack.
+ * This is the most reliable check - both bundlers explicitly set this error name.
+ */
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ isChunkLoadError: function () {
+ return isChunkLoadError;
+ },
+ isChunkOrNetworkError: function () {
+ return isChunkOrNetworkError;
+ },
+ isNetworkError: function () {
+ return isNetworkError;
+ },
+ });
+ function isChunkLoadError(error) {
+ if (!error || typeof error !== "object") return false;
+ return error.name === "ChunkLoadError";
+ }
+ function isNetworkError(error) {
+ if (!error || typeof error !== "object") return false;
+ const err = error;
+ // Never retry intentional aborts
+ if (err.name === "AbortError") return false;
+ // TypeError with specific fetch failure messages
+ // These occur when the network request itself fails (not CORS, not server error)
+ if (err.name === "TypeError") {
+ const message = err.message || "";
+ // Browser-specific network failure messages
+ // Chrome/Edge: "Failed to fetch"
+ // Firefox: "NetworkError when attempting to fetch resource"
+ // Safari: "Load failed" or "The Internet connection appears to be offline"
+ if (
+ message === "Failed to fetch" ||
+ message.startsWith("NetworkError when attempting to fetch") ||
+ message === "Load failed" ||
+ message.includes("Internet connection appears to be offline") ||
+ message.includes("network connection was lost")
+ ) {
+ return true;
+ }
+ }
+ return false;
+ }
+ function isChunkOrNetworkError(error) {
+ return isChunkLoadError(error) || isNetworkError(error);
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=is-chunk-load-error.js.map
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(3458)
+ __webpack_exec__(2604)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for edge-ssr-HASH.js
@@ -1,7 +1,24 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[676],
{
- /***/ 1564: /***/ (
+ /***/ 7046: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/edge-ssr",
+ function () {
+ return __webpack_require__(7142);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 7142: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -20,30 +37,13 @@
/***/
},
-
- /***/ 4300: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/edge-ssr",
- function () {
- return __webpack_require__(1564);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(4300)
+ __webpack_exec__(7046)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for head-HASH.js
@@ -1,34 +1,17 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[5350],
{
- /***/ 1548: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/head",
- function () {
- return __webpack_require__(4282);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 3952: /***/ (
+ /***/ 3770: /***/ (
module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(1653);
+ module.exports = __webpack_require__(9025);
/***/
},
- /***/ 4282: /***/ (
+ /***/ 6236: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -43,7 +26,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(3952);
+ __webpack_require__(3770);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_head__WEBPACK_IMPORTED_MODULE_1__
@@ -76,13 +59,30 @@
/***/
},
+
+ /***/ 6510: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/head",
+ function () {
+ return __webpack_require__(6236);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(1548)
+ __webpack_exec__(6510)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for index-HASH.js
@@ -1,24 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[3332],
{
- /***/ 6376: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/",
- function () {
- return __webpack_require__(8460);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 8460: /***/ (
+ /***/ 830: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -36,13 +19,30 @@
/***/
},
+
+ /***/ 1938: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/",
+ function () {
+ return __webpack_require__(830);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(6376)
+ __webpack_exec__(1938)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for link-HASH.js
@@ -1,7 +1,220 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[4672],
{
- /***/ 857: /***/ (module, exports, __webpack_require__) => {
+ /***/ 2774: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "useIntersection", {
+ enumerable: true,
+ get: function () {
+ return useIntersection;
+ },
+ });
+ const _react = __webpack_require__(4312);
+ const _requestidlecallback = __webpack_require__(9413);
+ const hasIntersectionObserver =
+ typeof IntersectionObserver === "function";
+ const observers = new Map();
+ const idList = [];
+ function createObserver(options) {
+ const id = {
+ root: options.root || null,
+ margin: options.rootMargin || "",
+ };
+ const existing = idList.find(
+ (obj) => obj.root === id.root && obj.margin === id.margin
+ );
+ let instance;
+ if (existing) {
+ instance = observers.get(existing);
+ if (instance) {
+ return instance;
+ }
+ }
+ const elements = new Map();
+ const observer = new IntersectionObserver((entries) => {
+ entries.forEach((entry) => {
+ const callback = elements.get(entry.target);
+ const isVisible =
+ entry.isIntersecting || entry.intersectionRatio > 0;
+ if (callback && isVisible) {
+ callback(isVisible);
+ }
+ });
+ }, options);
+ instance = {
+ id,
+ observer,
+ elements,
+ };
+ idList.push(id);
+ observers.set(id, instance);
+ return instance;
+ }
+ function observe(element, callback, options) {
+ const { id, observer, elements } = createObserver(options);
+ elements.set(element, callback);
+ observer.observe(element);
+ return function unobserve() {
+ elements.delete(element);
+ observer.unobserve(element);
+ // Destroy observer when there's nothing left to watch:
+ if (elements.size === 0) {
+ observer.disconnect();
+ observers.delete(id);
+ const index = idList.findIndex(
+ (obj) => obj.root === id.root && obj.margin === id.margin
+ );
+ if (index > -1) {
+ idList.splice(index, 1);
+ }
+ }
+ };
+ }
+ function useIntersection({ rootRef, rootMargin, disabled }) {
+ const isDisabled = disabled || !hasIntersectionObserver;
+ const [visible, setVisible] = (0, _react.useState)(false);
+ const elementRef = (0, _react.useRef)(null);
+ const setElement = (0, _react.useCallback)((element) => {
+ elementRef.current = element;
+ }, []);
+ (0, _react.useEffect)(() => {
+ if (hasIntersectionObserver) {
+ if (isDisabled || visible) return;
+ const element = elementRef.current;
+ if (element && element.tagName) {
+ const unobserve = observe(
+ element,
+ (isVisible) => isVisible && setVisible(isVisible),
+ {
+ root: rootRef?.current,
+ rootMargin,
+ }
+ );
+ return unobserve;
+ }
+ } else {
+ if (!visible) {
+ const idleCallback = (0,
+ _requestidlecallback.requestIdleCallback)(() => setVisible(true));
+ return () =>
+ (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
+ }
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
+ const resetVisible = (0, _react.useCallback)(() => {
+ setVisible(false);
+ }, []);
+ return [setElement, visible, resetVisible];
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=use-intersection.js.map
+
+ /***/
+ },
+
+ /***/ 3351: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "useMergedRef", {
+ enumerable: true,
+ get: function () {
+ return useMergedRef;
+ },
+ });
+ const _react = __webpack_require__(4312);
+ function useMergedRef(refA, refB) {
+ const cleanupA = (0, _react.useRef)(null);
+ const cleanupB = (0, _react.useRef)(null);
+ // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
+ // (this happens often if the user doesn't pass a ref to Link/Form/Image)
+ // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
+ // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
+ // (because it hasn't been updated for React 19)
+ // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
+ // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
+ return (0, _react.useCallback)(
+ (current) => {
+ if (current === null) {
+ const cleanupFnA = cleanupA.current;
+ if (cleanupFnA) {
+ cleanupA.current = null;
+ cleanupFnA();
+ }
+ const cleanupFnB = cleanupB.current;
+ if (cleanupFnB) {
+ cleanupB.current = null;
+ cleanupFnB();
+ }
+ } else {
+ if (refA) {
+ cleanupA.current = applyRef(refA, current);
+ }
+ if (refB) {
+ cleanupB.current = applyRef(refB, current);
+ }
+ }
+ },
+ [refA, refB]
+ );
+ }
+ function applyRef(refA, current) {
+ if (typeof refA === "function") {
+ const cleanup = refA(current);
+ if (typeof cleanup === "function") {
+ return cleanup;
+ } else {
+ return () => refA(null);
+ }
+ } else {
+ refA.current = current;
+ return () => {
+ refA.current = null;
+ };
+ }
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=use-merged-ref.js.map
+
+ /***/
+ },
+
+ /***/ 3440: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(4757);
+
+ /***/
+ },
+
+ /***/ 4757: /***/ (module, exports, __webpack_require__) => {
"use strict";
/* __next_internal_client_entry_do_not_use__ cjs */
Object.defineProperty(exports, "__esModule", {
@@ -23,22 +236,22 @@
return useLinkStatus;
},
});
- const _interop_require_wildcard = __webpack_require__(8781);
+ const _interop_require_wildcard = __webpack_require__(1162);
const _jsxruntime = __webpack_require__(3108);
const _react = /*#__PURE__*/ _interop_require_wildcard._(
__webpack_require__(4312)
);
- const _resolvehref = __webpack_require__(4055);
- const _islocalurl = __webpack_require__(7175);
- const _formaturl = __webpack_require__(9674);
- const _utils = __webpack_require__(7424);
- const _addlocale = __webpack_require__(589);
- const _routercontextsharedruntime = __webpack_require__(7010);
- const _useintersection = __webpack_require__(2330);
- const _getdomainlocale = __webpack_require__(7207);
- const _addbasepath = __webpack_require__(9942);
- const _usemergedref = __webpack_require__(8067);
- const _erroronce = __webpack_require__(1945);
+ const _resolvehref = __webpack_require__(4691);
+ const _islocalurl = __webpack_require__(4763);
+ const _formaturl = __webpack_require__(3246);
+ const _utils = __webpack_require__(7372);
+ const _addlocale = __webpack_require__(1809);
+ const _routercontextsharedruntime = __webpack_require__(2254);
+ const _useintersection = __webpack_require__(2774);
+ const _getdomainlocale = __webpack_require__(8803);
+ const _addbasepath = __webpack_require__(5834);
+ const _usemergedref = __webpack_require__(3351);
+ const _erroronce = __webpack_require__(6021);
const prefetched = new Set();
function prefetch(router, href, as, options) {
if (false) {
@@ -417,168 +630,43 @@
/***/
},
- /***/ 1945: /***/ (__unused_webpack_module, exports) => {
- "use strict";
-
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "errorOnce", {
- enumerable: true,
- get: function () {
- return errorOnce;
+ /***/ 5326: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/link",
+ function () {
+ return __webpack_require__(9058);
},
- });
- let errorOnce = (_) => {};
+ ]);
if (false) {
- } //# sourceMappingURL=error-once.js.map
+ }
/***/
},
- /***/ 2330: /***/ (module, exports, __webpack_require__) => {
+ /***/ 6021: /***/ (__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
- Object.defineProperty(exports, "useIntersection", {
+ Object.defineProperty(exports, "errorOnce", {
enumerable: true,
get: function () {
- return useIntersection;
+ return errorOnce;
},
});
- const _react = __webpack_require__(4312);
- const _requestidlecallback = __webpack_require__(601);
- const hasIntersectionObserver =
- typeof IntersectionObserver === "function";
- const observers = new Map();
- const idList = [];
- function createObserver(options) {
- const id = {
- root: options.root || null,
- margin: options.rootMargin || "",
- };
- const existing = idList.find(
- (obj) => obj.root === id.root && obj.margin === id.margin
- );
- let instance;
- if (existing) {
- instance = observers.get(existing);
- if (instance) {
- return instance;
- }
- }
- const elements = new Map();
- const observer = new IntersectionObserver((entries) => {
- entries.forEach((entry) => {
- const callback = elements.get(entry.target);
- const isVisible =
- entry.isIntersecting || entry.intersectionRatio > 0;
- if (callback && isVisible) {
- callback(isVisible);
- }
- });
- }, options);
- instance = {
- id,
- observer,
- elements,
- };
- idList.push(id);
- observers.set(id, instance);
- return instance;
- }
- function observe(element, callback, options) {
- const { id, observer, elements } = createObserver(options);
- elements.set(element, callback);
- observer.observe(element);
- return function unobserve() {
- elements.delete(element);
- observer.unobserve(element);
- // Destroy observer when there's nothing left to watch:
- if (elements.size === 0) {
- observer.disconnect();
- observers.delete(id);
- const index = idList.findIndex(
- (obj) => obj.root === id.root && obj.margin === id.margin
- );
- if (index > -1) {
- idList.splice(index, 1);
- }
- }
- };
- }
- function useIntersection({ rootRef, rootMargin, disabled }) {
- const isDisabled = disabled || !hasIntersectionObserver;
- const [visible, setVisible] = (0, _react.useState)(false);
- const elementRef = (0, _react.useRef)(null);
- const setElement = (0, _react.useCallback)((element) => {
- elementRef.current = element;
- }, []);
- (0, _react.useEffect)(() => {
- if (hasIntersectionObserver) {
- if (isDisabled || visible) return;
- const element = elementRef.current;
- if (element && element.tagName) {
- const unobserve = observe(
- element,
- (isVisible) => isVisible && setVisible(isVisible),
- {
- root: rootRef?.current,
- rootMargin,
- }
- );
- return unobserve;
- }
- } else {
- if (!visible) {
- const idleCallback = (0,
- _requestidlecallback.requestIdleCallback)(() => setVisible(true));
- return () =>
- (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
- }
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
- const resetVisible = (0, _react.useCallback)(() => {
- setVisible(false);
- }, []);
- return [setElement, visible, resetVisible];
- }
- if (
- (typeof exports.default === "function" ||
- (typeof exports.default === "object" && exports.default !== null)) &&
- typeof exports.default.__esModule === "undefined"
- ) {
- Object.defineProperty(exports.default, "__esModule", {
- value: true,
- });
- Object.assign(exports.default, exports);
- module.exports = exports.default;
- } //# sourceMappingURL=use-intersection.js.map
-
- /***/
- },
-
- /***/ 4972: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/link",
- function () {
- return __webpack_require__(7600);
- },
- ]);
+ let errorOnce = (_) => {};
if (false) {
- }
+ } //# sourceMappingURL=error-once.js.map
/***/
},
- /***/ 7207: /***/ (module, exports, __webpack_require__) => {
+ /***/ 8803: /***/ (module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -590,7 +678,7 @@
return getDomainLocale;
},
});
- const _normalizetrailingslash = __webpack_require__(151);
+ const _normalizetrailingslash = __webpack_require__(1315);
const basePath =
/* unused pure expression or super */ null && (false || "");
function getDomainLocale(path, locale, locales, domainLocales) {
@@ -614,7 +702,7 @@
/***/
},
- /***/ 7600: /***/ (
+ /***/ 9058: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -629,7 +717,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(7830);
+ __webpack_require__(3440);
/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_link__WEBPACK_IMPORTED_MODULE_1__
@@ -659,101 +747,13 @@
/***/
},
-
- /***/ 7830: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(857);
-
- /***/
- },
-
- /***/ 8067: /***/ (module, exports, __webpack_require__) => {
- "use strict";
-
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "useMergedRef", {
- enumerable: true,
- get: function () {
- return useMergedRef;
- },
- });
- const _react = __webpack_require__(4312);
- function useMergedRef(refA, refB) {
- const cleanupA = (0, _react.useRef)(null);
- const cleanupB = (0, _react.useRef)(null);
- // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
- // (this happens often if the user doesn't pass a ref to Link/Form/Image)
- // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
- // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
- // (because it hasn't been updated for React 19)
- // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
- // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
- return (0, _react.useCallback)(
- (current) => {
- if (current === null) {
- const cleanupFnA = cleanupA.current;
- if (cleanupFnA) {
- cleanupA.current = null;
- cleanupFnA();
- }
- const cleanupFnB = cleanupB.current;
- if (cleanupFnB) {
- cleanupB.current = null;
- cleanupFnB();
- }
- } else {
- if (refA) {
- cleanupA.current = applyRef(refA, current);
- }
- if (refB) {
- cleanupB.current = applyRef(refB, current);
- }
- }
- },
- [refA, refB]
- );
- }
- function applyRef(refA, current) {
- if (typeof refA === "function") {
- const cleanup = refA(current);
- if (typeof cleanup === "function") {
- return cleanup;
- } else {
- return () => refA(null);
- }
- } else {
- refA.current = current;
- return () => {
- refA.current = null;
- };
- }
- }
- if (
- (typeof exports.default === "function" ||
- (typeof exports.default === "object" && exports.default !== null)) &&
- typeof exports.default.__esModule === "undefined"
- ) {
- Object.defineProperty(exports.default, "__esModule", {
- value: true,
- });
- Object.assign(exports.default, exports);
- module.exports = exports.default;
- } //# sourceMappingURL=use-merged-ref.js.map
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(4972)
+ __webpack_exec__(5326)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for routerDirect-HASH.js
@@ -1,17 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[188],
{
- /***/ 1179: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(9864);
-
- /***/
- },
-
- /***/ 1640: /***/ (
+ /***/ 2014: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -26,7 +16,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1179);
+ __webpack_require__(4169);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -46,7 +36,17 @@
/***/
},
- /***/ 2172: /***/ (
+ /***/ 4169: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(9700);
+
+ /***/
+ },
+
+ /***/ 4414: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
@@ -54,7 +54,7 @@
(window.__NEXT_P = window.__NEXT_P || []).push([
"/routerDirect",
function () {
- return __webpack_require__(1640);
+ return __webpack_require__(2014);
},
]);
if (false) {
@@ -68,7 +68,7 @@
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(2172)
+ __webpack_exec__(4414)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for script-HASH.js
@@ -1,17 +1,34 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[1209],
{
- /***/ 4977: /***/ (
+ /***/ 2591: /***/ (
module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(326);
+ module.exports = __webpack_require__(4634);
/***/
},
- /***/ 5887: /***/ (
+ /***/ 5030: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/script",
+ function () {
+ return __webpack_require__(7557);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 7557: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -26,7 +43,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(4977);
+ __webpack_require__(2591);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -58,30 +75,13 @@
/***/
},
-
- /***/ 6268: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/script",
- function () {
- return __webpack_require__(5887);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(6268)
+ __webpack_exec__(5030)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for withRouter-HASH.js
@@ -1,34 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[3263],
{
- /***/ 1179: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(9864);
-
- /***/
- },
-
- /***/ 2028: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/withRouter",
- function () {
- return __webpack_require__(4501);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 4501: /***/ (
+ /***/ 559: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -43,7 +16,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1179);
+ __webpack_require__(4169);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -61,13 +34,40 @@
/***/
},
+
+ /***/ 726: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/withRouter",
+ function () {
+ return __webpack_require__(559);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 4169: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(9700);
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(2028)
+ __webpack_exec__(726)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for 2161-HASH.js
Diff too large to display
Diff for 2747-HASH.js
Diff too large to display
Diff for 4322-HASH.js
failed to diffDiff for main-HASH.js
Diff too large to display
Diff for webpack-HASH.js
@@ -205,7 +205,7 @@
/******/ __webpack_require__.u = (chunkId) => {
/******/ // return url for filenames based on template
/******/ return (
- "static/chunks/" + chunkId + "." + "9c9ddbde79ea2f29" + ".js"
+ "static/chunks/" + chunkId + "." + "871ca3fb4b1caa0e" + ".js"
);
/******/
};
@@ -380,6 +380,23 @@
/******/
};
/******/
+ /******/ // Next.js chunk cache clearing for retry logic
+ /******/ if (typeof globalThis !== "undefined") {
+ /******/ globalThis.__next_clear_chunk_cache__ = function (chunkId) {
+ /******/ // Only clear if not already loaded (0 means loaded)
+ /******/ if (
+ installedChunks[chunkId] !== 0 &&
+ installedChunks[chunkId] !== undefined
+ ) {
+ /******/ delete installedChunks[chunkId];
+ /******/
+ }
+ /******/
+ };
+ /******/
+ }
+ /******/
+ /******/
/******/ __webpack_require__.f.j = (chunkId, promises) => {
/******/ // JSONP chunk loading for javascript
/******/ var installedChunkData = __webpack_require__.o(Diff for app-page-exp..ntime.dev.js
Diff too large to display
Diff for app-page-exp..time.prod.js
failed to diffDiff for app-page-tur..ntime.dev.js
Diff too large to display
Diff for app-page-tur..time.prod.js
failed to diffDiff for app-page-tur..ntime.dev.js
Diff too large to display
Diff for app-page-tur..time.prod.js
Diff too large to display
Diff for app-page.runtime.dev.js
Diff too large to display
Diff for app-page.runtime.prod.js
Diff too large to display
Diff for pages-turbo...ntime.dev.js
Diff too large to display
Diff for pages-turbo...time.prod.js
Diff too large to display
Diff for pages.runtime.dev.js
Diff too large to display
Diff for pages.runtime.prod.js
Diff too large to display
a304c38 to
3049f08
Compare
8db7ab6 to
f344080
Compare
6f91adc to
dade081
Compare
f344080 to
00c70c0
Compare
CodSpeed Performance ReportMerging #88004 will improve performance by 6.08%Comparing Summary
Benchmarks breakdown
Footnotes
|
dade081 to
a12e5f7
Compare
00c70c0 to
0cf6b84
Compare
| } | ||
|
|
||
| // Webpack format: "Loading chunk <id> failed. (error: <url>)" | ||
| const webpackMatch = message.match(/https?:\/\/[^\s)]+/) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| const webpackMatch = message.match(/https?:\/\/[^\s)]+/) | |
| // Match absolute URLs (http/https), protocol-relative URLs, and relative URLs | |
| const webpackMatch = message.match( | |
| /(?:https?:)?\/\/[^\s)]+|\/[^\s)]+\.(?:js|css)/ | |
| ) |
The webpack URL extraction regex only matches absolute URLs (http://https://), but webpack error messages contain relative URLs, causing chunk cache clearing to fail silently for webpack.
View Details
Analysis
Webpack chunk cache clearing fails for relative URLs
What fails: The extractChunkUrl() function in packages/next/src/client/components/chunk-load-error/chunk-load-error-handler.ts fails to extract relative URLs from webpack error messages, preventing the webpack chunk cache from being cleared during retry logic.
How to reproduce:
- In a Next.js app using webpack (not turbopack) bundler, configure a dynamic import
- Force a chunk load failure by blocking the network request to
/_next/static/chunks/... - The error message will contain:
Loading chunk <id> failed. (error: /_next/static/chunks/main.abc123.js) - The regex
/https?:\/\/[^\s)]+/on line 76 only matches absolute URLs starting withhttp://orhttps:// - The relative URL
/_next/static/chunks/main.abc123.jsis not matched extractChunkUrl()returnsundefinedclearChunkCache()returnsfalsewithout clearing the webpackinstalledChunkscache- Retry fails because webpack's cached rejected promise is returned instead of fetching a fresh chunk
Result: Chunk retry mechanism fails silently for webpack when using default Next.js configuration (which uses relative URLs via publicPath: "/_next/").
Expected behavior: The regex should match relative URLs like /_next/static/chunks/main.js, protocol-relative URLs like //cdn.com/chunks/main.js, and absolute URLs like https://cdn.com/chunks/main.js. The webpack chunk cache is cleared via __next_clear_chunk_cache__, allowing the retry to fetch a fresh chunk instead of using the cached rejected promise.
Fix applied: Updated the webpack URL extraction regex from /https?:\/\/[^\s)]+/ to /(?:https?:)?\/\/[^\s)]+|\/[^\s)]+\.(?:js|css)/ to match:
- Absolute URLs:
https://...orhttp://... - Protocol-relative URLs:
//... - Relative URLs:
/...
This matches the pattern used by turbopack format detection on line 66 which already handles relative URLs correctly.
Stats from current PRDefault Build (Increase detected
|
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| buildDuration | 17.1s | 15s | N/A |
| buildDurationCached | 13.9s | 11s | N/A |
| nodeModulesSize | 457 MB | 458 MB | |
| nextStartRea..uration (ms) | 712ms | 722ms | N/A |
Client Bundles (main, webpack) Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| 2086.HASH.js gzip | 169 B | 169 B | ✓ |
| 2161-HASH.js gzip | 5.39 kB | 5.41 kB | N/A |
| 2747-HASH.js gzip | 4.48 kB | 4.46 kB | N/A |
| 4322-HASH.js gzip | 51.2 kB | 54.7 kB | |
| ec793fe8-HASH.js gzip | 62.3 kB | 62.3 kB | N/A |
| framework-HASH.js gzip | 59.8 kB | 59.8 kB | N/A |
| main-app-HASH.js gzip | 251 B | 253 B | N/A |
| main-HASH.js gzip | 38.4 kB | 38.7 kB | |
| webpack-HASH.js gzip | 1.68 kB | 1.73 kB | N/A |
| Overall change | 89.8 kB | 93.7 kB |
Legacy Client Bundles (polyfills)
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| polyfills-HASH.js gzip | 39.4 kB | 39.4 kB | ✓ |
| Overall change | 39.4 kB | 39.4 kB | ✓ |
Client Pages Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| _app-HASH.js gzip | 194 B | 193 B | N/A |
| _error-HASH.js gzip | 182 B | 182 B | ✓ |
| css-HASH.js gzip | 336 B | 335 B | N/A |
| dynamic-HASH.js gzip | 1.8 kB | 4.18 kB | |
| edge-ssr-HASH.js gzip | 256 B | 256 B | ✓ |
| head-HASH.js gzip | 352 B | 349 B | N/A |
| hooks-HASH.js gzip | 385 B | 384 B | N/A |
| image-HASH.js gzip | 580 B | 580 B | ✓ |
| index-HASH.js gzip | 259 B | 258 B | N/A |
| link-HASH.js gzip | 2.5 kB | 2.51 kB | N/A |
| routerDirect..HASH.js gzip | 319 B | 317 B | N/A |
| script-HASH.js gzip | 385 B | 387 B | N/A |
| withRouter-HASH.js gzip | 316 B | 315 B | N/A |
| 1afbb74e6ecf..834.css gzip | 106 B | 106 B | ✓ |
| Overall change | 2.92 kB | 5.3 kB |
Client Build Manifests
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 738 B | 738 B | ✓ |
| Overall change | 738 B | 738 B | ✓ |
Rendered Page Sizes
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| index.html gzip | 523 B | 524 B | N/A |
| link.html gzip | 538 B | 538 B | ✓ |
| withRouter.html gzip | 520 B | 520 B | ✓ |
| Overall change | 1.06 kB | 1.06 kB | ✓ |
Edge SSR bundle Size Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| edge-ssr.js gzip | 124 kB | 124 kB | N/A |
| page.js gzip | 237 kB | 241 kB | |
| Overall change | 237 kB | 241 kB |
Middleware size Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| middleware-b..fest.js gzip | 654 B | 654 B | ✓ |
| middleware-r..fest.js gzip | 155 B | 156 B | N/A |
| middleware.js gzip | 32.7 kB | 33 kB | |
| edge-runtime..pack.js gzip | 846 B | 846 B | ✓ |
| Overall change | 34.2 kB | 34.5 kB |
Next Runtimes Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| app-page-exp...dev.js gzip | 301 kB | 305 kB | |
| app-page-exp..prod.js gzip | 156 kB | 158 kB | |
| app-page-tur...dev.js gzip | 301 kB | 305 kB | |
| app-page-tur..prod.js gzip | 156 kB | 158 kB | |
| app-page-tur...dev.js gzip | 298 kB | 301 kB | |
| app-page-tur..prod.js gzip | 154 kB | 156 kB | |
| app-page.run...dev.js gzip | 298 kB | 301 kB | |
| app-page.run..prod.js gzip | 154 kB | 156 kB | |
| app-route-ex...dev.js gzip | 68.7 kB | 68.7 kB | ✓ |
| app-route-ex..prod.js gzip | 47.5 kB | 47.5 kB | ✓ |
| app-route-tu...dev.js gzip | 68.7 kB | 68.7 kB | ✓ |
| app-route-tu..prod.js gzip | 47.5 kB | 47.5 kB | ✓ |
| app-route-tu...dev.js gzip | 68.3 kB | 68.3 kB | ✓ |
| app-route-tu..prod.js gzip | 47.3 kB | 47.3 kB | ✓ |
| app-route.ru...dev.js gzip | 68.3 kB | 68.3 kB | ✓ |
| app-route.ru..prod.js gzip | 47.3 kB | 47.3 kB | ✓ |
| dist_client_...dev.js gzip | 324 B | 324 B | ✓ |
| dist_client_...dev.js gzip | 326 B | 326 B | ✓ |
| dist_client_...dev.js gzip | 318 B | 318 B | ✓ |
| dist_client_...dev.js gzip | 317 B | 317 B | ✓ |
| pages-api-tu...dev.js gzip | 41.1 kB | 41.1 kB | ✓ |
| pages-api-tu..prod.js gzip | 31.2 kB | 31.2 kB | ✓ |
| pages-api.ru...dev.js gzip | 41 kB | 41 kB | ✓ |
| pages-api.ru..prod.js gzip | 31.2 kB | 31.2 kB | ✓ |
| pages-turbo....dev.js gzip | 50.7 kB | 50.7 kB | N/A |
| pages-turbo...prod.js gzip | 38.2 kB | 38.2 kB | N/A |
| pages.runtim...dev.js gzip | 50.6 kB | 50.7 kB | N/A |
| pages.runtim..prod.js gzip | 38.1 kB | 38.1 kB | N/A |
| server.runti..prod.js gzip | 59.9 kB | 59.9 kB | ✓ |
| Overall change | 2.49 MB | 2.51 MB |
build cache Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| 0.pack gzip | 3.61 MB | 3.66 MB | |
| index.pack gzip | 97.6 kB | 99.9 kB | |
| Overall change | 3.71 MB | 3.76 MB |
Diff details
Diff for page.js
Diff too large to display
Diff for middleware.js
Diff too large to display
Diff for edge-ssr.js
Diff too large to display
Diff for _buildManifest.js
@@ -611,35 +611,35 @@ self.__BUILD_MANIFEST = (function (a, b, c) {
numHashes: NaN,
bitArray: [],
},
- "/": ["static\u002Fchunks\u002Fpages\u002Findex-dda7d8b64d4ba15c.js"],
+ "/": ["static\u002Fchunks\u002Fpages\u002Findex-d95f7ec6af4d2644.js"],
"/_error": [
- "static\u002Fchunks\u002Fpages\u002F_error-6ef44d3954f25711.js",
+ "static\u002Fchunks\u002Fpages\u002F_error-209c0c82205a7c9f.js",
],
"/css": [
"static\u002Fcss\u002Fded6b86ab9cc0a1f.css",
- "static\u002Fchunks\u002Fpages\u002Fcss-c8aaa7211416a045.js",
+ "static\u002Fchunks\u002Fpages\u002Fcss-62710339bc830ded.js",
],
"/dynamic": [
- "static\u002Fchunks\u002Fpages\u002Fdynamic-d53bb7f318f342c2.js",
+ "static\u002Fchunks\u002Fpages\u002Fdynamic-8a03f5fe64080e08.js",
],
"/edge-ssr": [
- "static\u002Fchunks\u002Fpages\u002Fedge-ssr-1383106d4a3e7d72.js",
+ "static\u002Fchunks\u002Fpages\u002Fedge-ssr-0db9f7bb610d3072.js",
],
- "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-1db1c4be1a45662f.js"],
- "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-e6deee5b72a5b112.js"],
+ "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-747416c4075e42aa.js"],
+ "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-8b10205be7505244.js"],
"/image": [
- "static\u002Fchunks\u002F2747-90c828280005c0c3.js",
- "static\u002Fchunks\u002Fpages\u002Fimage-868472cd5e84efc9.js",
+ "static\u002Fchunks\u002F6349-ee9aecde860d4832.js",
+ "static\u002Fchunks\u002Fpages\u002Fimage-f90ae17c3ad1d38b.js",
],
- "/link": ["static\u002Fchunks\u002Fpages\u002Flink-0ec374e48b2ce5d9.js"],
+ "/link": ["static\u002Fchunks\u002Fpages\u002Flink-6ab9a67b348df1bf.js"],
"/routerDirect": [
- "static\u002Fchunks\u002Fpages\u002FrouterDirect-1a34bfadbc088491.js",
+ "static\u002Fchunks\u002Fpages\u002FrouterDirect-f132fb471e65a8b9.js",
],
"/script": [
- "static\u002Fchunks\u002Fpages\u002Fscript-52320f59afbd096d.js",
+ "static\u002Fchunks\u002Fpages\u002Fscript-8e2028e44b8da2d9.js",
],
"/withRouter": [
- "static\u002Fchunks\u002Fpages\u002FwithRouter-3b1a16d3dfa21c16.js",
+ "static\u002Fchunks\u002Fpages\u002FwithRouter-a86d259faa012c1c.js",
],
sortedPages: [
"\u002F",Diff for dynamic-HASH.js
@@ -1,17 +1,346 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[2291],
{
- /***/ 1231: /***/ (
- module,
+ /***/ 434: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+ /* __next_internal_client_entry_do_not_use__ cjs */
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "ChunkLoadErrorBanner", {
+ enumerable: true,
+ get: function () {
+ return ChunkLoadErrorBanner;
+ },
+ });
+ const _jsxruntime = __webpack_require__(3108);
+ const _react = __webpack_require__(4312);
+ // Copy constants (two lines, always)
+ const HEADLINE = "This page couldn't be fully loaded";
+ const DETAIL_DEFAULT = "A required file couldn't be loaded.";
+ const DETAIL_OFFLINE = "You're offline.";
+ // Fixed height for stable layout
+ const BANNER_HEIGHT = 70;
+ const styles = {
+ container: {
+ position: "fixed",
+ top: 0,
+ left: 0,
+ right: 0,
+ zIndex: 9999,
+ height: BANNER_HEIGHT,
+ padding: "0 20px",
+ backgroundColor: "#f5f5f5",
+ borderBottom: "1px solid #d4d4d4",
+ fontFamily:
+ 'system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"',
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "space-between",
+ gap: "16px",
+ boxSizing: "border-box",
+ },
+ spacer: {
+ height: BANNER_HEIGHT,
+ flexShrink: 0,
+ },
+ left: {
+ display: "flex",
+ alignItems: "center",
+ gap: "12px",
+ flex: 1,
+ minWidth: 0,
+ },
+ icon: {
+ flexShrink: 0,
+ width: "20px",
+ height: "20px",
+ },
+ content: {
+ display: "flex",
+ flexDirection: "column",
+ gap: "2px",
+ flex: 1,
+ minWidth: 0,
+ },
+ headline: {
+ fontSize: "14px",
+ fontWeight: 600,
+ color: "#171717",
+ margin: 0,
+ lineHeight: 1.4,
+ },
+ detail: {
+ fontSize: "13px",
+ fontWeight: 400,
+ color: "#525252",
+ margin: 0,
+ lineHeight: 1.4,
+ },
+ button: {
+ padding: "8px 16px",
+ fontSize: "13px",
+ fontWeight: 600,
+ borderRadius: "6px",
+ cursor: "pointer",
+ color: "#171717",
+ backgroundColor: "#fff",
+ border: "1px solid #a3a3a3",
+ lineHeight: 1,
+ flexShrink: 0,
+ },
+ };
+ // Neutral warning icon (circle with exclamation)
+ function WarningIcon() {
+ return /*#__PURE__*/ (0, _jsxruntime.jsxs)("svg", {
+ style: styles.icon,
+ viewBox: "0 0 20 20",
+ fill: "none",
+ xmlns: "http://www.w3.org/2000/svg",
+ "aria-hidden": "true",
+ children: [
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("circle", {
+ cx: "10",
+ cy: "10",
+ r: "9",
+ stroke: "#737373",
+ strokeWidth: "1.5",
+ }),
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("path", {
+ d: "M10 5.5V11",
+ stroke: "#737373",
+ strokeWidth: "1.5",
+ strokeLinecap: "round",
+ }),
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("circle", {
+ cx: "10",
+ cy: "14",
+ r: "1",
+ fill: "#737373",
+ }),
+ ],
+ });
+ }
+ function ChunkLoadErrorBanner(_props) {
+ const [isOffline, setIsOffline] = (0, _react.useState)(
+ typeof navigator !== "undefined" ? !navigator.onLine : false
+ );
+ (0, _react.useEffect)(() => {
+ const handleOnline = () => setIsOffline(false);
+ const handleOffline = () => setIsOffline(true);
+ window.addEventListener("online", handleOnline);
+ window.addEventListener("offline", handleOffline);
+ return () => {
+ window.removeEventListener("online", handleOnline);
+ window.removeEventListener("offline", handleOffline);
+ };
+ }, []);
+ const handleReload = (0, _react.useCallback)(() => {
+ window.location.reload();
+ }, []);
+ const detail = isOffline ? DETAIL_OFFLINE : DETAIL_DEFAULT;
+ return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_jsxruntime.Fragment, {
+ children: [
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
+ style: styles.container,
+ role: "alert",
+ "aria-live": "assertive",
+ children: [
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
+ style: styles.left,
+ children: [
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(WarningIcon, {}),
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
+ style: styles.content,
+ children: [
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("p", {
+ style: styles.headline,
+ children: HEADLINE,
+ }),
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("p", {
+ style: styles.detail,
+ children: detail,
+ }),
+ ],
+ }),
+ ],
+ }),
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("button", {
+ type: "button",
+ style: styles.button,
+ onClick: handleReload,
+ children: "Reload page",
+ }),
+ ],
+ }),
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
+ style: styles.spacer,
+ }),
+ ],
+ });
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=chunk-load-error-banner.js.map
+
+ /***/
+ },
+
+ /***/ 1033: /***/ (module, exports) => {
+ "use strict";
+ // This gets assigned as a side-effect during app initialization. Because it
+ // represents the build used to create the JS bundle, it should never change
+ // after being set, so we store it in a global variable.
+ //
+ // When performing RSC requests, if the incoming data has a different build ID,
+ // we perform an MPA navigation/refresh to load the updated build and ensure
+ // that the client and server in sync.
+ // Starts as an empty string. In practice, because setAppBuildId is called
+ // during initialization before hydration starts, this will always get
+ // reassigned to the actual build ID before it's ever needed by a navigation.
+ // If for some reasons it didn't, due to a bug or race condition, then on
+ // navigation the build comparision would fail and trigger an MPA navigation.
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ getAppBuildId: function () {
+ return getAppBuildId;
+ },
+ setAppBuildId: function () {
+ return setAppBuildId;
+ },
+ });
+ let globalBuildId = "";
+ function setAppBuildId(buildId) {
+ globalBuildId = buildId;
+ }
+ function getAppBuildId() {
+ return globalBuildId;
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=app-build-id.js.map
+
+ /***/
+ },
+
+ /***/ 2604: /***/ (
+ __unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(4464);
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/dynamic",
+ function () {
+ return __webpack_require__(3643);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 2758: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ ChunkLoadErrorBanner: function () {
+ return _chunkloaderrorbanner.ChunkLoadErrorBanner;
+ },
+ clearChunkCache: function () {
+ return _chunkloaderrorhandler.clearChunkCache;
+ },
+ clearFailureState: function () {
+ return _chunkloaderrorhandler.clearFailureState;
+ },
+ createChunkErrorContext: function () {
+ return _chunkloaderrorhandler.createChunkErrorContext;
+ },
+ getFailCount: function () {
+ return _chunkloaderrorhandler.getFailCount;
+ },
+ getRetryDelayMs: function () {
+ return _chunkloaderrorhandler.getRetryDelayMs;
+ },
+ handleChunkFailure: function () {
+ return _chunkloaderrorhandler.handleChunkFailure;
+ },
+ isChunkLoadError: function () {
+ return _ischunkloaderror.isChunkLoadError;
+ },
+ isChunkOrNetworkError: function () {
+ return _ischunkloaderror.isChunkOrNetworkError;
+ },
+ isNetworkError: function () {
+ return _ischunkloaderror.isNetworkError;
+ },
+ retryChunkImport: function () {
+ return _chunkloaderrorhandler.retryChunkImport;
+ },
+ shouldSilentRetry: function () {
+ return _chunkloaderrorhandler.shouldSilentRetry;
+ },
+ sleep: function () {
+ return _chunkloaderrorhandler.sleep;
+ },
+ });
+ const _ischunkloaderror = __webpack_require__(9462);
+ const _chunkloaderrorhandler = __webpack_require__(7676);
+ const _chunkloaderrorbanner = __webpack_require__(434);
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=index.js.map
/***/
},
- /***/ 2101: /***/ (
+ /***/ 3401: /***/ (
__unused_webpack_module,
exports,
__webpack_require__
@@ -38,24 +367,63 @@
/***/
},
- /***/ 3458: /***/ (
+ /***/ 3643: /***/ (
__unused_webpack_module,
- __unused_webpack_exports,
+ __webpack_exports__,
__webpack_require__
) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/dynamic",
- function () {
- return __webpack_require__(9381);
- },
- ]);
- if (false) {
- }
+ "use strict";
+ __webpack_require__.r(__webpack_exports__);
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
+ /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
+ /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
+ /* harmony export */
+ });
+ /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
+ __webpack_require__(3108);
+ /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
+ __webpack_require__(3973);
+ /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
+ /*#__PURE__*/ __webpack_require__.n(
+ next_dynamic__WEBPACK_IMPORTED_MODULE_1__
+ );
+
+ const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
+ () =>
+ __webpack_require__
+ .e(/* import() */ 1596)
+ .then(__webpack_require__.bind(__webpack_require__, 1596))
+ .then((mod) => mod.Hello),
+ {
+ loadableGenerated: {
+ webpack: () => [/*require.resolve*/ 1596],
+ },
+ }
+ );
+ const Page = () =>
+ /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
+ {
+ children: [
+ /*#__PURE__*/ (0,
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
+ children: "testing next/dynamic size",
+ }),
+ /*#__PURE__*/ (0,
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
+ DynamicHello,
+ {}
+ ),
+ ],
+ }
+ );
+ var __N_SSP = true;
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
/***/
},
- /***/ 4464: /***/ (module, exports, __webpack_require__) => {
+ /***/ 3660: /***/ (module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -88,7 +456,7 @@
__webpack_require__(4312)
);
const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(9799)
+ __webpack_require__(4539)
);
const isServerSide = "object" === "undefined";
// Normalize loader to return the module as form { default: Component } for `React.lazy`.
@@ -188,63 +556,17 @@
/***/
},
- /***/ 9381: /***/ (
- __unused_webpack_module,
- __webpack_exports__,
+ /***/ 3973: /***/ (
+ module,
+ __unused_webpack_exports,
__webpack_require__
) => {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
- /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
- /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
- /* harmony export */
- });
- /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
- __webpack_require__(3108);
- /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1231);
- /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
- /*#__PURE__*/ __webpack_require__.n(
- next_dynamic__WEBPACK_IMPORTED_MODULE_1__
- );
-
- const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
- () =>
- __webpack_require__
- .e(/* import() */ 2086)
- .then(__webpack_require__.bind(__webpack_require__, 2086))
- .then((mod) => mod.Hello),
- {
- loadableGenerated: {
- webpack: () => [/*require.resolve*/ 2086],
- },
- }
- );
- const Page = () =>
- /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
- {
- children: [
- /*#__PURE__*/ (0,
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
- children: "testing next/dynamic size",
- }),
- /*#__PURE__*/ (0,
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
- DynamicHello,
- {}
- ),
- ],
- }
- );
- var __N_SSP = true;
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
+ module.exports = __webpack_require__(3660);
/***/
},
- /***/ 9799: /***/ (
+ /***/ 4539: /***/ (
__unused_webpack_module,
exports,
__webpack_require__
@@ -286,7 +608,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
const _react = /*#__PURE__*/ _interop_require_default._(
__webpack_require__(4312)
);
- const _loadablecontextsharedruntime = __webpack_require__(2101);
+ const _loadablecontextsharedruntime = __webpack_require__(3401);
+ const _chunkloaderror = __webpack_require__(2758);
function resolve(obj) {
return obj && obj.default ? obj.default : obj;
}
@@ -413,6 +736,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
this._callbacks = new Set();
this._delay = null;
this._timeout = null;
+ this._hasAutoRetried = false;
this.retry();
}
promise() {
@@ -451,7 +775,25 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
this._update({});
this._clearTimeouts();
})
- .catch((_err) => {
+ .catch((err) => {
+ // Auto-retry for chunk load errors (once)
+ // This handles transient network failures during dynamic imports
+ if (
+ true &&
+ (0, _chunkloaderror.isChunkLoadError)(err) &&
+ !this._hasAutoRetried
+ ) {
+ this._hasAutoRetried = true;
+ // Clear bundler's chunk cache so retry will fetch fresh
+ (0, _chunkloaderror.clearChunkCache)(err);
+ // Retry after a short delay with jitter
+ const delay = (0, _chunkloaderror.getRetryDelayMs)();
+ setTimeout(() => {
+ this.retry();
+ }, delay);
+ return;
+ }
+ // No more retries - propagate error
this._update({});
this._clearTimeouts();
});
@@ -518,13 +860,392 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
/***/
},
+
+ /***/ 7676: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+ /**
+ * Chunk load error handling with silent retry logic.
+ *
+ * This module provides retry orchestration for chunk/network loading failures.
+ * It tracks failures in sessionStorage per {route, buildId, chunkKey} and
+ * implements silent retry with jittered backoff.
+ */
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ clearChunkCache: function () {
+ return clearChunkCache;
+ },
+ clearFailureState: function () {
+ return clearFailureState;
+ },
+ createChunkErrorContext: function () {
+ return createChunkErrorContext;
+ },
+ getFailCount: function () {
+ return getFailCount;
+ },
+ getRetryDelayMs: function () {
+ return getRetryDelayMs;
+ },
+ handleChunkFailure: function () {
+ return handleChunkFailure;
+ },
+ retryChunkImport: function () {
+ return retryChunkImport;
+ },
+ shouldSilentRetry: function () {
+ return shouldSilentRetry;
+ },
+ sleep: function () {
+ return sleep;
+ },
+ });
+ const _appbuildid = __webpack_require__(1033);
+ const _ischunkloaderror = __webpack_require__(9462);
+ const STORAGE_PREFIX = "__next_chunk_fail:";
+ const RETRY_WINDOW_MS = 30000; // Don't retry same chunk within 30s of a retry
+ const MAX_FAIL_COUNT_FOR_RETRY = 2; // After 2 failures, skip silent retry
+ /**
+ * Simple hash function for generating chunk keys when URL isn't available.
+ */ function simpleHash(str) {
+ let hash = 0;
+ for (let i = 0; i < str.length; i++) {
+ const char = str.charCodeAt(i);
+ hash = ((hash << 5) - hash + char) | 0;
+ }
+ return Math.abs(hash).toString(36);
+ }
+ /**
+ * Extract chunk URL from error message if possible.
+ * ChunkLoadError messages typically contain the URL.
+ */ function extractChunkUrl(error) {
+ const message = error.message;
+ // Turbopack format: "Failed to load chunk <url> from <reason>: <cause>"
+ // The URL can be relative (/_next/...) or absolute (http://...)
+ const turbopackMatch = message.match(
+ /Failed to load chunk ([^\s]+\.(?:js|css))/
+ );
+ if (turbopackMatch) {
+ return turbopackMatch[1];
+ }
+ // Webpack format: "Loading chunk <id> failed. (error: <url>)"
+ const webpackMatch = message.match(/https?:\/\/[^\s)]+/);
+ return webpackMatch?.[0];
+ }
+ /**
+ * Extract the chunk ID from a webpack chunk URL.
+ * URLs look like: /_next/static/chunks/123.hash.js
+ */ function extractWebpackChunkId(chunkUrl) {
+ // Match chunk ID from URL path: /chunks/123.abc123.js or /chunks/pages_foo_bar.abc123.js
+ const match = chunkUrl.match(/\/chunks\/([^/.]+)\.[a-f0-9]+\.js/);
+ return match?.[1];
+ }
+ function clearChunkCache(error) {
+ const chunkUrl = extractChunkUrl(error);
+ if (!chunkUrl) return false;
+ // Turbopack: clear by chunk URL
+ if (
+ typeof globalThis.__turbopack_clear_chunk_resolver__ === "function"
+ ) {
+ // Extract the relative URL path that Turbopack uses as key
+ try {
+ const url = new URL(chunkUrl);
+ globalThis.__turbopack_clear_chunk_resolver__(
+ url.pathname + url.search
+ );
+ return true;
+ } catch {
+ // Invalid URL, try using the full URL
+ globalThis.__turbopack_clear_chunk_resolver__(chunkUrl);
+ return true;
+ }
+ }
+ // Webpack: extract chunk ID from URL and clear by ID
+ if (typeof globalThis.__next_clear_chunk_cache__ === "function") {
+ const chunkId = extractWebpackChunkId(chunkUrl);
+ if (chunkId) {
+ globalThis.__next_clear_chunk_cache__(chunkId);
+ return true;
+ }
+ }
+ return false;
+ }
+ /**
+ * Generate a unique key for this chunk error, used for deduplication.
+ */ function getChunkKey(ctx) {
+ return ctx.chunkUrl ?? simpleHash(ctx.message);
+ }
+ /**
+ * Get the sessionStorage key for tracking this chunk failure.
+ */ function getStorageKey(ctx) {
+ const buildId = (0, _appbuildid.getAppBuildId)();
+ const chunkKey = getChunkKey(ctx);
+ return `${STORAGE_PREFIX}${buildId}:${ctx.route}:${chunkKey}`;
+ }
+ /**
+ * Read failure state from sessionStorage.
+ */ function readFailureState(key) {
+ if (typeof sessionStorage === "undefined") return null;
+ try {
+ const stored = sessionStorage.getItem(key);
+ if (!stored) return null;
+ return JSON.parse(stored);
+ } catch {
+ return null;
+ }
+ }
+ /**
+ * Write failure state to sessionStorage.
+ */ function writeFailureState(key, state) {
+ if (typeof sessionStorage === "undefined") return;
+ try {
+ sessionStorage.setItem(key, JSON.stringify(state));
+ } catch {
+ // Storage might be full or disabled - continue without tracking
+ }
+ }
+ function clearFailureState(route) {
+ if (typeof sessionStorage === "undefined") return;
+ try {
+ const buildId = (0, _appbuildid.getAppBuildId)();
+ const prefix = `${STORAGE_PREFIX}${buildId}:${route}:`;
+ const keysToRemove = [];
+ for (let i = 0; i < sessionStorage.length; i++) {
+ const key = sessionStorage.key(i);
+ if (key?.startsWith(prefix)) {
+ keysToRemove.push(key);
+ }
+ }
+ keysToRemove.forEach((key) => sessionStorage.removeItem(key));
+ } catch {
+ // Ignore storage errors
+ }
+ }
+ /**
+ * Increment the failure count for this chunk.
+ */ function bumpFailCount(ctx) {
+ const key = getStorageKey(ctx);
+ const existing = readFailureState(key);
+ const now = Date.now();
+ const state = {
+ failCount: (existing?.failCount ?? 0) + 1,
+ lastTs: now,
+ retriedTs: existing?.retriedTs,
+ };
+ writeFailureState(key, state);
+ return state;
+ }
+ /**
+ * Mark that a retry was attempted for this chunk.
+ */ function markRetried(ctx) {
+ const key = getStorageKey(ctx);
+ const existing = readFailureState(key);
+ const now = Date.now();
+ const state = {
+ failCount: existing?.failCount ?? 1,
+ lastTs: existing?.lastTs ?? now,
+ retriedTs: now,
+ };
+ writeFailureState(key, state);
+ }
+ function shouldSilentRetry(ctx) {
+ // Don't retry if offline
+ if (typeof navigator !== "undefined" && !navigator.onLine) {
+ return false;
+ }
+ const key = getStorageKey(ctx);
+ const state = readFailureState(key);
+ const now = Date.now();
+ // If we already retried within the window, don't retry again
+ if (state?.retriedTs && now - state.retriedTs < RETRY_WINDOW_MS) {
+ return false;
+ }
+ // Too many failures - skip silent retry to avoid annoying the user
+ if ((state?.failCount ?? 0) >= MAX_FAIL_COUNT_FOR_RETRY) {
+ return false;
+ }
+ return true;
+ }
+ function getFailCount(ctx) {
+ const key = getStorageKey(ctx);
+ const state = readFailureState(key);
+ return state?.failCount ?? 0;
+ }
+ function getRetryDelayMs() {
+ const baseDelay = 200;
+ const jitter = Math.floor(Math.random() * 401); // 0-400ms
+ // Get RTT if available via Network Information API
+ let rtt = 0;
+ if (typeof navigator !== "undefined" && "connection" in navigator) {
+ const connection = navigator.connection;
+ if (connection?.rtt) {
+ rtt = Math.min(500, connection.rtt); // Cap at 500ms
+ }
+ }
+ return Math.min(1500, baseDelay + jitter + rtt); // Cap total at 1500ms
+ }
+ function sleep(ms) {
+ return new Promise((resolve) => setTimeout(resolve, ms));
+ }
+ function createChunkErrorContext(error, route, userVisible = true) {
+ if (
+ !(0, _ischunkloaderror.isChunkLoadError)(error) &&
+ !(0, _ischunkloaderror.isNetworkError)(error)
+ ) {
+ return null;
+ }
+ return {
+ route,
+ userVisible,
+ message: error.message,
+ chunkUrl: extractChunkUrl(error),
+ };
+ }
+ function handleChunkFailure(ctx) {
+ // Always increment fail count first
+ bumpFailCount(ctx);
+ // Check if we should try a silent retry
+ if (shouldSilentRetry(ctx)) {
+ markRetried(ctx);
+ return "retry";
+ }
+ // Show banner to the user
+ return "banner";
+ }
+ async function retryChunkImport(ctx, importFn) {
+ const action = handleChunkFailure(ctx);
+ if (action === "retry") {
+ const delay = getRetryDelayMs();
+ await sleep(delay);
+ return importFn();
+ }
+ // If we shouldn't retry, re-throw to trigger error boundary
+ throw Object.defineProperty(
+ new Error("Chunk load failed after retry attempts"),
+ "__NEXT_ERROR_CODE",
+ {
+ value: "E976",
+ enumerable: false,
+ configurable: true,
+ }
+ );
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=chunk-load-error-handler.js.map
+
+ /***/
+ },
+
+ /***/ 9462: /***/ (module, exports) => {
+ "use strict";
+ /**
+ * Utilities for detecting chunk load errors and network failures.
+ *
+ * ChunkLoadError can come from:
+ * - Turbopack: error.name === 'ChunkLoadError'
+ * - Webpack: error.name === 'ChunkLoadError'
+ *
+ * We intentionally keep detection narrow to avoid false positives:
+ * - Server 4xx/5xx responses don't throw (they return Response objects)
+ * - We should NOT retry CORS errors, AbortErrors, or parsing failures
+ */ /**
+ * Detects if an error is a ChunkLoadError from Turbopack or webpack.
+ * This is the most reliable check - both bundlers explicitly set this error name.
+ */
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ isChunkLoadError: function () {
+ return isChunkLoadError;
+ },
+ isChunkOrNetworkError: function () {
+ return isChunkOrNetworkError;
+ },
+ isNetworkError: function () {
+ return isNetworkError;
+ },
+ });
+ function isChunkLoadError(error) {
+ if (!error || typeof error !== "object") return false;
+ return error.name === "ChunkLoadError";
+ }
+ function isNetworkError(error) {
+ if (!error || typeof error !== "object") return false;
+ const err = error;
+ // Never retry intentional aborts
+ if (err.name === "AbortError") return false;
+ // TypeError with specific fetch failure messages
+ // These occur when the network request itself fails (not CORS, not server error)
+ if (err.name === "TypeError") {
+ const message = err.message || "";
+ // Browser-specific network failure messages
+ // Chrome/Edge: "Failed to fetch"
+ // Firefox: "NetworkError when attempting to fetch resource"
+ // Safari: "Load failed" or "The Internet connection appears to be offline"
+ if (
+ message === "Failed to fetch" ||
+ message.startsWith("NetworkError when attempting to fetch") ||
+ message === "Load failed" ||
+ message.includes("Internet connection appears to be offline") ||
+ message.includes("network connection was lost")
+ ) {
+ return true;
+ }
+ }
+ return false;
+ }
+ function isChunkOrNetworkError(error) {
+ return isChunkLoadError(error) || isNetworkError(error);
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=is-chunk-load-error.js.map
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(3458)
+ __webpack_exec__(2604)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for edge-ssr-HASH.js
@@ -1,7 +1,24 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[676],
{
- /***/ 1564: /***/ (
+ /***/ 7046: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/edge-ssr",
+ function () {
+ return __webpack_require__(7142);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 7142: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -20,30 +37,13 @@
/***/
},
-
- /***/ 4300: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/edge-ssr",
- function () {
- return __webpack_require__(1564);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(4300)
+ __webpack_exec__(7046)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for head-HASH.js
@@ -1,34 +1,17 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[5350],
{
- /***/ 1548: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/head",
- function () {
- return __webpack_require__(4282);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 3952: /***/ (
+ /***/ 3770: /***/ (
module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(1653);
+ module.exports = __webpack_require__(9025);
/***/
},
- /***/ 4282: /***/ (
+ /***/ 6236: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -43,7 +26,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(3952);
+ __webpack_require__(3770);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_head__WEBPACK_IMPORTED_MODULE_1__
@@ -76,13 +59,30 @@
/***/
},
+
+ /***/ 6510: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/head",
+ function () {
+ return __webpack_require__(6236);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(1548)
+ __webpack_exec__(6510)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for index-HASH.js
@@ -1,24 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[3332],
{
- /***/ 6376: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/",
- function () {
- return __webpack_require__(8460);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 8460: /***/ (
+ /***/ 830: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -36,13 +19,30 @@
/***/
},
+
+ /***/ 1938: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/",
+ function () {
+ return __webpack_require__(830);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(6376)
+ __webpack_exec__(1938)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for link-HASH.js
@@ -1,7 +1,220 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[4672],
{
- /***/ 857: /***/ (module, exports, __webpack_require__) => {
+ /***/ 2774: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "useIntersection", {
+ enumerable: true,
+ get: function () {
+ return useIntersection;
+ },
+ });
+ const _react = __webpack_require__(4312);
+ const _requestidlecallback = __webpack_require__(9413);
+ const hasIntersectionObserver =
+ typeof IntersectionObserver === "function";
+ const observers = new Map();
+ const idList = [];
+ function createObserver(options) {
+ const id = {
+ root: options.root || null,
+ margin: options.rootMargin || "",
+ };
+ const existing = idList.find(
+ (obj) => obj.root === id.root && obj.margin === id.margin
+ );
+ let instance;
+ if (existing) {
+ instance = observers.get(existing);
+ if (instance) {
+ return instance;
+ }
+ }
+ const elements = new Map();
+ const observer = new IntersectionObserver((entries) => {
+ entries.forEach((entry) => {
+ const callback = elements.get(entry.target);
+ const isVisible =
+ entry.isIntersecting || entry.intersectionRatio > 0;
+ if (callback && isVisible) {
+ callback(isVisible);
+ }
+ });
+ }, options);
+ instance = {
+ id,
+ observer,
+ elements,
+ };
+ idList.push(id);
+ observers.set(id, instance);
+ return instance;
+ }
+ function observe(element, callback, options) {
+ const { id, observer, elements } = createObserver(options);
+ elements.set(element, callback);
+ observer.observe(element);
+ return function unobserve() {
+ elements.delete(element);
+ observer.unobserve(element);
+ // Destroy observer when there's nothing left to watch:
+ if (elements.size === 0) {
+ observer.disconnect();
+ observers.delete(id);
+ const index = idList.findIndex(
+ (obj) => obj.root === id.root && obj.margin === id.margin
+ );
+ if (index > -1) {
+ idList.splice(index, 1);
+ }
+ }
+ };
+ }
+ function useIntersection({ rootRef, rootMargin, disabled }) {
+ const isDisabled = disabled || !hasIntersectionObserver;
+ const [visible, setVisible] = (0, _react.useState)(false);
+ const elementRef = (0, _react.useRef)(null);
+ const setElement = (0, _react.useCallback)((element) => {
+ elementRef.current = element;
+ }, []);
+ (0, _react.useEffect)(() => {
+ if (hasIntersectionObserver) {
+ if (isDisabled || visible) return;
+ const element = elementRef.current;
+ if (element && element.tagName) {
+ const unobserve = observe(
+ element,
+ (isVisible) => isVisible && setVisible(isVisible),
+ {
+ root: rootRef?.current,
+ rootMargin,
+ }
+ );
+ return unobserve;
+ }
+ } else {
+ if (!visible) {
+ const idleCallback = (0,
+ _requestidlecallback.requestIdleCallback)(() => setVisible(true));
+ return () =>
+ (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
+ }
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
+ const resetVisible = (0, _react.useCallback)(() => {
+ setVisible(false);
+ }, []);
+ return [setElement, visible, resetVisible];
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=use-intersection.js.map
+
+ /***/
+ },
+
+ /***/ 3351: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "useMergedRef", {
+ enumerable: true,
+ get: function () {
+ return useMergedRef;
+ },
+ });
+ const _react = __webpack_require__(4312);
+ function useMergedRef(refA, refB) {
+ const cleanupA = (0, _react.useRef)(null);
+ const cleanupB = (0, _react.useRef)(null);
+ // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
+ // (this happens often if the user doesn't pass a ref to Link/Form/Image)
+ // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
+ // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
+ // (because it hasn't been updated for React 19)
+ // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
+ // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
+ return (0, _react.useCallback)(
+ (current) => {
+ if (current === null) {
+ const cleanupFnA = cleanupA.current;
+ if (cleanupFnA) {
+ cleanupA.current = null;
+ cleanupFnA();
+ }
+ const cleanupFnB = cleanupB.current;
+ if (cleanupFnB) {
+ cleanupB.current = null;
+ cleanupFnB();
+ }
+ } else {
+ if (refA) {
+ cleanupA.current = applyRef(refA, current);
+ }
+ if (refB) {
+ cleanupB.current = applyRef(refB, current);
+ }
+ }
+ },
+ [refA, refB]
+ );
+ }
+ function applyRef(refA, current) {
+ if (typeof refA === "function") {
+ const cleanup = refA(current);
+ if (typeof cleanup === "function") {
+ return cleanup;
+ } else {
+ return () => refA(null);
+ }
+ } else {
+ refA.current = current;
+ return () => {
+ refA.current = null;
+ };
+ }
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=use-merged-ref.js.map
+
+ /***/
+ },
+
+ /***/ 3440: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(4757);
+
+ /***/
+ },
+
+ /***/ 4757: /***/ (module, exports, __webpack_require__) => {
"use strict";
/* __next_internal_client_entry_do_not_use__ cjs */
Object.defineProperty(exports, "__esModule", {
@@ -23,22 +236,22 @@
return useLinkStatus;
},
});
- const _interop_require_wildcard = __webpack_require__(8781);
+ const _interop_require_wildcard = __webpack_require__(1162);
const _jsxruntime = __webpack_require__(3108);
const _react = /*#__PURE__*/ _interop_require_wildcard._(
__webpack_require__(4312)
);
- const _resolvehref = __webpack_require__(4055);
- const _islocalurl = __webpack_require__(7175);
- const _formaturl = __webpack_require__(9674);
- const _utils = __webpack_require__(7424);
- const _addlocale = __webpack_require__(589);
- const _routercontextsharedruntime = __webpack_require__(7010);
- const _useintersection = __webpack_require__(2330);
- const _getdomainlocale = __webpack_require__(7207);
- const _addbasepath = __webpack_require__(9942);
- const _usemergedref = __webpack_require__(8067);
- const _erroronce = __webpack_require__(1945);
+ const _resolvehref = __webpack_require__(4691);
+ const _islocalurl = __webpack_require__(4763);
+ const _formaturl = __webpack_require__(3246);
+ const _utils = __webpack_require__(7372);
+ const _addlocale = __webpack_require__(1809);
+ const _routercontextsharedruntime = __webpack_require__(2254);
+ const _useintersection = __webpack_require__(2774);
+ const _getdomainlocale = __webpack_require__(8803);
+ const _addbasepath = __webpack_require__(5834);
+ const _usemergedref = __webpack_require__(3351);
+ const _erroronce = __webpack_require__(6021);
const prefetched = new Set();
function prefetch(router, href, as, options) {
if (false) {
@@ -417,168 +630,43 @@
/***/
},
- /***/ 1945: /***/ (__unused_webpack_module, exports) => {
- "use strict";
-
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "errorOnce", {
- enumerable: true,
- get: function () {
- return errorOnce;
+ /***/ 5326: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/link",
+ function () {
+ return __webpack_require__(9058);
},
- });
- let errorOnce = (_) => {};
+ ]);
if (false) {
- } //# sourceMappingURL=error-once.js.map
+ }
/***/
},
- /***/ 2330: /***/ (module, exports, __webpack_require__) => {
+ /***/ 6021: /***/ (__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
- Object.defineProperty(exports, "useIntersection", {
+ Object.defineProperty(exports, "errorOnce", {
enumerable: true,
get: function () {
- return useIntersection;
+ return errorOnce;
},
});
- const _react = __webpack_require__(4312);
- const _requestidlecallback = __webpack_require__(601);
- const hasIntersectionObserver =
- typeof IntersectionObserver === "function";
- const observers = new Map();
- const idList = [];
- function createObserver(options) {
- const id = {
- root: options.root || null,
- margin: options.rootMargin || "",
- };
- const existing = idList.find(
- (obj) => obj.root === id.root && obj.margin === id.margin
- );
- let instance;
- if (existing) {
- instance = observers.get(existing);
- if (instance) {
- return instance;
- }
- }
- const elements = new Map();
- const observer = new IntersectionObserver((entries) => {
- entries.forEach((entry) => {
- const callback = elements.get(entry.target);
- const isVisible =
- entry.isIntersecting || entry.intersectionRatio > 0;
- if (callback && isVisible) {
- callback(isVisible);
- }
- });
- }, options);
- instance = {
- id,
- observer,
- elements,
- };
- idList.push(id);
- observers.set(id, instance);
- return instance;
- }
- function observe(element, callback, options) {
- const { id, observer, elements } = createObserver(options);
- elements.set(element, callback);
- observer.observe(element);
- return function unobserve() {
- elements.delete(element);
- observer.unobserve(element);
- // Destroy observer when there's nothing left to watch:
- if (elements.size === 0) {
- observer.disconnect();
- observers.delete(id);
- const index = idList.findIndex(
- (obj) => obj.root === id.root && obj.margin === id.margin
- );
- if (index > -1) {
- idList.splice(index, 1);
- }
- }
- };
- }
- function useIntersection({ rootRef, rootMargin, disabled }) {
- const isDisabled = disabled || !hasIntersectionObserver;
- const [visible, setVisible] = (0, _react.useState)(false);
- const elementRef = (0, _react.useRef)(null);
- const setElement = (0, _react.useCallback)((element) => {
- elementRef.current = element;
- }, []);
- (0, _react.useEffect)(() => {
- if (hasIntersectionObserver) {
- if (isDisabled || visible) return;
- const element = elementRef.current;
- if (element && element.tagName) {
- const unobserve = observe(
- element,
- (isVisible) => isVisible && setVisible(isVisible),
- {
- root: rootRef?.current,
- rootMargin,
- }
- );
- return unobserve;
- }
- } else {
- if (!visible) {
- const idleCallback = (0,
- _requestidlecallback.requestIdleCallback)(() => setVisible(true));
- return () =>
- (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
- }
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
- const resetVisible = (0, _react.useCallback)(() => {
- setVisible(false);
- }, []);
- return [setElement, visible, resetVisible];
- }
- if (
- (typeof exports.default === "function" ||
- (typeof exports.default === "object" && exports.default !== null)) &&
- typeof exports.default.__esModule === "undefined"
- ) {
- Object.defineProperty(exports.default, "__esModule", {
- value: true,
- });
- Object.assign(exports.default, exports);
- module.exports = exports.default;
- } //# sourceMappingURL=use-intersection.js.map
-
- /***/
- },
-
- /***/ 4972: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/link",
- function () {
- return __webpack_require__(7600);
- },
- ]);
+ let errorOnce = (_) => {};
if (false) {
- }
+ } //# sourceMappingURL=error-once.js.map
/***/
},
- /***/ 7207: /***/ (module, exports, __webpack_require__) => {
+ /***/ 8803: /***/ (module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -590,7 +678,7 @@
return getDomainLocale;
},
});
- const _normalizetrailingslash = __webpack_require__(151);
+ const _normalizetrailingslash = __webpack_require__(1315);
const basePath =
/* unused pure expression or super */ null && (false || "");
function getDomainLocale(path, locale, locales, domainLocales) {
@@ -614,7 +702,7 @@
/***/
},
- /***/ 7600: /***/ (
+ /***/ 9058: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -629,7 +717,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(7830);
+ __webpack_require__(3440);
/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_link__WEBPACK_IMPORTED_MODULE_1__
@@ -659,101 +747,13 @@
/***/
},
-
- /***/ 7830: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(857);
-
- /***/
- },
-
- /***/ 8067: /***/ (module, exports, __webpack_require__) => {
- "use strict";
-
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "useMergedRef", {
- enumerable: true,
- get: function () {
- return useMergedRef;
- },
- });
- const _react = __webpack_require__(4312);
- function useMergedRef(refA, refB) {
- const cleanupA = (0, _react.useRef)(null);
- const cleanupB = (0, _react.useRef)(null);
- // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
- // (this happens often if the user doesn't pass a ref to Link/Form/Image)
- // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
- // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
- // (because it hasn't been updated for React 19)
- // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
- // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
- return (0, _react.useCallback)(
- (current) => {
- if (current === null) {
- const cleanupFnA = cleanupA.current;
- if (cleanupFnA) {
- cleanupA.current = null;
- cleanupFnA();
- }
- const cleanupFnB = cleanupB.current;
- if (cleanupFnB) {
- cleanupB.current = null;
- cleanupFnB();
- }
- } else {
- if (refA) {
- cleanupA.current = applyRef(refA, current);
- }
- if (refB) {
- cleanupB.current = applyRef(refB, current);
- }
- }
- },
- [refA, refB]
- );
- }
- function applyRef(refA, current) {
- if (typeof refA === "function") {
- const cleanup = refA(current);
- if (typeof cleanup === "function") {
- return cleanup;
- } else {
- return () => refA(null);
- }
- } else {
- refA.current = current;
- return () => {
- refA.current = null;
- };
- }
- }
- if (
- (typeof exports.default === "function" ||
- (typeof exports.default === "object" && exports.default !== null)) &&
- typeof exports.default.__esModule === "undefined"
- ) {
- Object.defineProperty(exports.default, "__esModule", {
- value: true,
- });
- Object.assign(exports.default, exports);
- module.exports = exports.default;
- } //# sourceMappingURL=use-merged-ref.js.map
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(4972)
+ __webpack_exec__(5326)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for routerDirect-HASH.js
@@ -1,17 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[188],
{
- /***/ 1179: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(9864);
-
- /***/
- },
-
- /***/ 1640: /***/ (
+ /***/ 2014: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -26,7 +16,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1179);
+ __webpack_require__(4169);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -46,7 +36,17 @@
/***/
},
- /***/ 2172: /***/ (
+ /***/ 4169: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(9700);
+
+ /***/
+ },
+
+ /***/ 4414: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
@@ -54,7 +54,7 @@
(window.__NEXT_P = window.__NEXT_P || []).push([
"/routerDirect",
function () {
- return __webpack_require__(1640);
+ return __webpack_require__(2014);
},
]);
if (false) {
@@ -68,7 +68,7 @@
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(2172)
+ __webpack_exec__(4414)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for script-HASH.js
@@ -1,17 +1,34 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[1209],
{
- /***/ 4977: /***/ (
+ /***/ 2591: /***/ (
module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(326);
+ module.exports = __webpack_require__(4634);
/***/
},
- /***/ 5887: /***/ (
+ /***/ 5030: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/script",
+ function () {
+ return __webpack_require__(7557);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 7557: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -26,7 +43,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(4977);
+ __webpack_require__(2591);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -58,30 +75,13 @@
/***/
},
-
- /***/ 6268: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/script",
- function () {
- return __webpack_require__(5887);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(6268)
+ __webpack_exec__(5030)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for withRouter-HASH.js
@@ -1,34 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[3263],
{
- /***/ 1179: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(9864);
-
- /***/
- },
-
- /***/ 2028: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/withRouter",
- function () {
- return __webpack_require__(4501);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 4501: /***/ (
+ /***/ 559: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -43,7 +16,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1179);
+ __webpack_require__(4169);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -61,13 +34,40 @@
/***/
},
+
+ /***/ 726: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/withRouter",
+ function () {
+ return __webpack_require__(559);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 4169: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(9700);
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(2028)
+ __webpack_exec__(726)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for 2161-HASH.js
Diff too large to display
Diff for 2747-HASH.js
Diff too large to display
Diff for 4322-HASH.js
failed to diffDiff for main-HASH.js
Diff too large to display
Diff for webpack-HASH.js
@@ -205,7 +205,7 @@
/******/ __webpack_require__.u = (chunkId) => {
/******/ // return url for filenames based on template
/******/ return (
- "static/chunks/" + chunkId + "." + "9c9ddbde79ea2f29" + ".js"
+ "static/chunks/" + chunkId + "." + "871ca3fb4b1caa0e" + ".js"
);
/******/
};
@@ -380,6 +380,23 @@
/******/
};
/******/
+ /******/ // Next.js chunk cache clearing for retry logic
+ /******/ if (typeof globalThis !== "undefined") {
+ /******/ globalThis.__next_clear_chunk_cache__ = function (chunkId) {
+ /******/ // Only clear if not already loaded (0 means loaded)
+ /******/ if (
+ installedChunks[chunkId] !== 0 &&
+ installedChunks[chunkId] !== undefined
+ ) {
+ /******/ delete installedChunks[chunkId];
+ /******/
+ }
+ /******/
+ };
+ /******/
+ }
+ /******/
+ /******/
/******/ __webpack_require__.f.j = (chunkId, promises) => {
/******/ // JSONP chunk loading for javascript
/******/ var installedChunkData = __webpack_require__.o(Diff for app-page-exp..ntime.dev.js
Diff too large to display
Diff for app-page-exp..time.prod.js
failed to diffDiff for app-page-tur..ntime.dev.js
Diff too large to display
Diff for app-page-tur..time.prod.js
failed to diffDiff for app-page-tur..ntime.dev.js
Diff too large to display
Diff for app-page-tur..time.prod.js
Diff too large to display
Diff for app-page.runtime.dev.js
Diff too large to display
Diff for app-page.runtime.prod.js
Diff too large to display
Diff for pages-turbo...ntime.dev.js
Diff too large to display
Diff for pages-turbo...time.prod.js
Diff too large to display
Diff for pages.runtime.dev.js
Diff too large to display
Diff for pages.runtime.prod.js
Diff too large to display
0cf6b84 to
799a0ce
Compare
a12e5f7 to
39c5db5
Compare
Stats from current PRDefault Build (Increase detected
|
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| buildDuration | 17.5s | 14.8s | N/A |
| buildDurationCached | 13.9s | 10.9s | N/A |
| nodeModulesSize | 457 MB | 457 MB | |
| nextStartRea..uration (ms) | 719ms | 718ms | N/A |
Client Bundles (main, webpack) Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| 2086.HASH.js gzip | 169 B | 169 B | ✓ |
| 2161-HASH.js gzip | 5.39 kB | 5.41 kB | N/A |
| 2747-HASH.js gzip | 4.48 kB | 4.46 kB | N/A |
| 4322-HASH.js gzip | 51.2 kB | 54.6 kB | |
| ec793fe8-HASH.js gzip | 62.3 kB | 62.3 kB | N/A |
| framework-HASH.js gzip | 59.8 kB | 59.8 kB | N/A |
| main-app-HASH.js gzip | 251 B | 254 B | N/A |
| main-HASH.js gzip | 38.4 kB | 38.7 kB | |
| webpack-HASH.js gzip | 1.68 kB | 1.73 kB | N/A |
| Overall change | 89.8 kB | 93.5 kB |
Legacy Client Bundles (polyfills)
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| polyfills-HASH.js gzip | 39.4 kB | 39.4 kB | ✓ |
| Overall change | 39.4 kB | 39.4 kB | ✓ |
Client Pages Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| _app-HASH.js gzip | 194 B | 193 B | N/A |
| _error-HASH.js gzip | 182 B | 182 B | ✓ |
| css-HASH.js gzip | 336 B | 335 B | N/A |
| dynamic-HASH.js gzip | 1.8 kB | 3.18 kB | |
| edge-ssr-HASH.js gzip | 256 B | 256 B | ✓ |
| head-HASH.js gzip | 352 B | 349 B | N/A |
| hooks-HASH.js gzip | 385 B | 384 B | N/A |
| image-HASH.js gzip | 580 B | 580 B | ✓ |
| index-HASH.js gzip | 259 B | 258 B | N/A |
| link-HASH.js gzip | 2.5 kB | 2.51 kB | N/A |
| routerDirect..HASH.js gzip | 319 B | 317 B | N/A |
| script-HASH.js gzip | 385 B | 387 B | N/A |
| withRouter-HASH.js gzip | 316 B | 315 B | N/A |
| 1afbb74e6ecf..834.css gzip | 106 B | 106 B | ✓ |
| Overall change | 2.92 kB | 4.31 kB |
Client Build Manifests
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 738 B | 738 B | ✓ |
| Overall change | 738 B | 738 B | ✓ |
Rendered Page Sizes
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| index.html gzip | 523 B | 524 B | N/A |
| link.html gzip | 538 B | 538 B | ✓ |
| withRouter.html gzip | 520 B | 520 B | ✓ |
| Overall change | 1.06 kB | 1.06 kB | ✓ |
Edge SSR bundle Size Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| edge-ssr.js gzip | 124 kB | 124 kB | N/A |
| page.js gzip | 237 kB | 241 kB | |
| Overall change | 237 kB | 241 kB |
Middleware size Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| middleware-b..fest.js gzip | 653 B | 655 B | N/A |
| middleware-r..fest.js gzip | 155 B | 156 B | N/A |
| middleware.js gzip | 32.6 kB | 32.9 kB | |
| edge-runtime..pack.js gzip | 846 B | 846 B | ✓ |
| Overall change | 33.4 kB | 33.7 kB |
Next Runtimes Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| app-page-exp...dev.js gzip | 301 kB | 304 kB | |
| app-page-exp..prod.js gzip | 156 kB | 158 kB | |
| app-page-tur...dev.js gzip | 301 kB | 304 kB | |
| app-page-tur..prod.js gzip | 156 kB | 158 kB | |
| app-page-tur...dev.js gzip | 298 kB | 301 kB | |
| app-page-tur..prod.js gzip | 154 kB | 156 kB | |
| app-page.run...dev.js gzip | 298 kB | 301 kB | |
| app-page.run..prod.js gzip | 154 kB | 156 kB | |
| app-route-ex...dev.js gzip | 68.7 kB | 68.7 kB | ✓ |
| app-route-ex..prod.js gzip | 47.5 kB | 47.5 kB | ✓ |
| app-route-tu...dev.js gzip | 68.7 kB | 68.7 kB | ✓ |
| app-route-tu..prod.js gzip | 47.5 kB | 47.5 kB | ✓ |
| app-route-tu...dev.js gzip | 68.3 kB | 68.3 kB | ✓ |
| app-route-tu..prod.js gzip | 47.3 kB | 47.3 kB | ✓ |
| app-route.ru...dev.js gzip | 68.3 kB | 68.3 kB | ✓ |
| app-route.ru..prod.js gzip | 47.3 kB | 47.3 kB | ✓ |
| dist_client_...dev.js gzip | 324 B | 324 B | ✓ |
| dist_client_...dev.js gzip | 326 B | 326 B | ✓ |
| dist_client_...dev.js gzip | 318 B | 318 B | ✓ |
| dist_client_...dev.js gzip | 317 B | 317 B | ✓ |
| pages-api-tu...dev.js gzip | 41.1 kB | 41.1 kB | ✓ |
| pages-api-tu..prod.js gzip | 31.2 kB | 31.2 kB | ✓ |
| pages-api.ru...dev.js gzip | 41 kB | 41 kB | ✓ |
| pages-api.ru..prod.js gzip | 31.2 kB | 31.2 kB | ✓ |
| pages-turbo....dev.js gzip | 50.7 kB | 50.7 kB | N/A |
| pages-turbo...prod.js gzip | 38.2 kB | 38.2 kB | N/A |
| pages.runtim...dev.js gzip | 50.6 kB | 50.7 kB | N/A |
| pages.runtim..prod.js gzip | 38.1 kB | 38.1 kB | N/A |
| server.runti..prod.js gzip | 59.9 kB | 59.9 kB | ✓ |
| Overall change | 2.49 MB | 2.51 MB |
build cache Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| 0.pack gzip | 3.61 MB | 3.65 MB | |
| index.pack gzip | 98.6 kB | 102 kB | |
| Overall change | 3.71 MB | 3.76 MB |
Diff details
Diff for page.js
Diff too large to display
Diff for middleware.js
Diff too large to display
Diff for edge-ssr.js
Diff too large to display
Diff for _buildManifest.js
@@ -611,35 +611,35 @@ self.__BUILD_MANIFEST = (function (a, b, c) {
numHashes: NaN,
bitArray: [],
},
- "/": ["static\u002Fchunks\u002Fpages\u002Findex-dda7d8b64d4ba15c.js"],
+ "/": ["static\u002Fchunks\u002Fpages\u002Findex-d95f7ec6af4d2644.js"],
"/_error": [
- "static\u002Fchunks\u002Fpages\u002F_error-6ef44d3954f25711.js",
+ "static\u002Fchunks\u002Fpages\u002F_error-209c0c82205a7c9f.js",
],
"/css": [
"static\u002Fcss\u002Fded6b86ab9cc0a1f.css",
- "static\u002Fchunks\u002Fpages\u002Fcss-c8aaa7211416a045.js",
+ "static\u002Fchunks\u002Fpages\u002Fcss-62710339bc830ded.js",
],
"/dynamic": [
- "static\u002Fchunks\u002Fpages\u002Fdynamic-d53bb7f318f342c2.js",
+ "static\u002Fchunks\u002Fpages\u002Fdynamic-0da0672e6c8cfd41.js",
],
"/edge-ssr": [
- "static\u002Fchunks\u002Fpages\u002Fedge-ssr-1383106d4a3e7d72.js",
+ "static\u002Fchunks\u002Fpages\u002Fedge-ssr-0db9f7bb610d3072.js",
],
- "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-1db1c4be1a45662f.js"],
- "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-e6deee5b72a5b112.js"],
+ "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-747416c4075e42aa.js"],
+ "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-8b10205be7505244.js"],
"/image": [
- "static\u002Fchunks\u002F2747-90c828280005c0c3.js",
- "static\u002Fchunks\u002Fpages\u002Fimage-868472cd5e84efc9.js",
+ "static\u002Fchunks\u002F6349-ee9aecde860d4832.js",
+ "static\u002Fchunks\u002Fpages\u002Fimage-f90ae17c3ad1d38b.js",
],
- "/link": ["static\u002Fchunks\u002Fpages\u002Flink-0ec374e48b2ce5d9.js"],
+ "/link": ["static\u002Fchunks\u002Fpages\u002Flink-6ab9a67b348df1bf.js"],
"/routerDirect": [
- "static\u002Fchunks\u002Fpages\u002FrouterDirect-1a34bfadbc088491.js",
+ "static\u002Fchunks\u002Fpages\u002FrouterDirect-f132fb471e65a8b9.js",
],
"/script": [
- "static\u002Fchunks\u002Fpages\u002Fscript-52320f59afbd096d.js",
+ "static\u002Fchunks\u002Fpages\u002Fscript-8e2028e44b8da2d9.js",
],
"/withRouter": [
- "static\u002Fchunks\u002Fpages\u002FwithRouter-3b1a16d3dfa21c16.js",
+ "static\u002Fchunks\u002Fpages\u002FwithRouter-a86d259faa012c1c.js",
],
sortedPages: [
"\u002F",Diff for dynamic-HASH.js
@@ -1,17 +1,80 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[2291],
{
- /***/ 1231: /***/ (
- module,
+ /***/ 1033: /***/ (module, exports) => {
+ "use strict";
+ // This gets assigned as a side-effect during app initialization. Because it
+ // represents the build used to create the JS bundle, it should never change
+ // after being set, so we store it in a global variable.
+ //
+ // When performing RSC requests, if the incoming data has a different build ID,
+ // we perform an MPA navigation/refresh to load the updated build and ensure
+ // that the client and server in sync.
+ // Starts as an empty string. In practice, because setAppBuildId is called
+ // during initialization before hydration starts, this will always get
+ // reassigned to the actual build ID before it's ever needed by a navigation.
+ // If for some reasons it didn't, due to a bug or race condition, then on
+ // navigation the build comparision would fail and trigger an MPA navigation.
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ getAppBuildId: function () {
+ return getAppBuildId;
+ },
+ setAppBuildId: function () {
+ return setAppBuildId;
+ },
+ });
+ let globalBuildId = "";
+ function setAppBuildId(buildId) {
+ globalBuildId = buildId;
+ }
+ function getAppBuildId() {
+ return globalBuildId;
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=app-build-id.js.map
+
+ /***/
+ },
+
+ /***/ 2604: /***/ (
+ __unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(4464);
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/dynamic",
+ function () {
+ return __webpack_require__(3643);
+ },
+ ]);
+ if (false) {
+ }
/***/
},
- /***/ 2101: /***/ (
+ /***/ 3401: /***/ (
__unused_webpack_module,
exports,
__webpack_require__
@@ -38,24 +101,63 @@
/***/
},
- /***/ 3458: /***/ (
+ /***/ 3643: /***/ (
__unused_webpack_module,
- __unused_webpack_exports,
+ __webpack_exports__,
__webpack_require__
) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/dynamic",
- function () {
- return __webpack_require__(9381);
- },
- ]);
- if (false) {
- }
+ "use strict";
+ __webpack_require__.r(__webpack_exports__);
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
+ /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
+ /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
+ /* harmony export */
+ });
+ /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
+ __webpack_require__(3108);
+ /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
+ __webpack_require__(3973);
+ /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
+ /*#__PURE__*/ __webpack_require__.n(
+ next_dynamic__WEBPACK_IMPORTED_MODULE_1__
+ );
+
+ const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
+ () =>
+ __webpack_require__
+ .e(/* import() */ 1596)
+ .then(__webpack_require__.bind(__webpack_require__, 1596))
+ .then((mod) => mod.Hello),
+ {
+ loadableGenerated: {
+ webpack: () => [/*require.resolve*/ 1596],
+ },
+ }
+ );
+ const Page = () =>
+ /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
+ {
+ children: [
+ /*#__PURE__*/ (0,
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
+ children: "testing next/dynamic size",
+ }),
+ /*#__PURE__*/ (0,
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
+ DynamicHello,
+ {}
+ ),
+ ],
+ }
+ );
+ var __N_SSP = true;
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
/***/
},
- /***/ 4464: /***/ (module, exports, __webpack_require__) => {
+ /***/ 3660: /***/ (module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -88,7 +190,7 @@
__webpack_require__(4312)
);
const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(9799)
+ __webpack_require__(4539)
);
const isServerSide = "object" === "undefined";
// Normalize loader to return the module as form { default: Component } for `React.lazy`.
@@ -188,63 +290,17 @@
/***/
},
- /***/ 9381: /***/ (
- __unused_webpack_module,
- __webpack_exports__,
+ /***/ 3973: /***/ (
+ module,
+ __unused_webpack_exports,
__webpack_require__
) => {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
- /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
- /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
- /* harmony export */
- });
- /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
- __webpack_require__(3108);
- /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1231);
- /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
- /*#__PURE__*/ __webpack_require__.n(
- next_dynamic__WEBPACK_IMPORTED_MODULE_1__
- );
-
- const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
- () =>
- __webpack_require__
- .e(/* import() */ 2086)
- .then(__webpack_require__.bind(__webpack_require__, 2086))
- .then((mod) => mod.Hello),
- {
- loadableGenerated: {
- webpack: () => [/*require.resolve*/ 2086],
- },
- }
- );
- const Page = () =>
- /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
- {
- children: [
- /*#__PURE__*/ (0,
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
- children: "testing next/dynamic size",
- }),
- /*#__PURE__*/ (0,
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
- DynamicHello,
- {}
- ),
- ],
- }
- );
- var __N_SSP = true;
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
+ module.exports = __webpack_require__(3660);
/***/
},
- /***/ 9799: /***/ (
+ /***/ 4539: /***/ (
__unused_webpack_module,
exports,
__webpack_require__
@@ -286,7 +342,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
const _react = /*#__PURE__*/ _interop_require_default._(
__webpack_require__(4312)
);
- const _loadablecontextsharedruntime = __webpack_require__(2101);
+ const _loadablecontextsharedruntime = __webpack_require__(3401);
+ const _ischunkloaderror = __webpack_require__(9462);
+ const _chunkloaderrorhandler = __webpack_require__(7676);
function resolve(obj) {
return obj && obj.default ? obj.default : obj;
}
@@ -413,6 +471,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
this._callbacks = new Set();
this._delay = null;
this._timeout = null;
+ this._hasAutoRetried = false;
this.retry();
}
promise() {
@@ -451,7 +510,25 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
this._update({});
this._clearTimeouts();
})
- .catch((_err) => {
+ .catch((err) => {
+ // Auto-retry for chunk load errors (once)
+ // This handles transient network failures during dynamic imports
+ if (
+ true &&
+ (0, _ischunkloaderror.isChunkLoadError)(err) &&
+ !this._hasAutoRetried
+ ) {
+ this._hasAutoRetried = true;
+ // Clear bundler's chunk cache so retry will fetch fresh
+ (0, _chunkloaderrorhandler.clearChunkCache)(err);
+ // Retry after a short delay with jitter
+ const delay = (0, _chunkloaderrorhandler.getRetryDelayMs)();
+ setTimeout(() => {
+ this.retry();
+ }, delay);
+ return;
+ }
+ // No more retries - propagate error
this._update({});
this._clearTimeouts();
});
@@ -518,13 +595,392 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
/***/
},
+
+ /***/ 7676: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+ /**
+ * Chunk load error handling with silent retry logic.
+ *
+ * This module provides retry orchestration for chunk/network loading failures.
+ * It tracks failures in sessionStorage per {route, buildId, chunkKey} and
+ * implements silent retry with jittered backoff.
+ */
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ clearChunkCache: function () {
+ return clearChunkCache;
+ },
+ clearFailureState: function () {
+ return clearFailureState;
+ },
+ createChunkErrorContext: function () {
+ return createChunkErrorContext;
+ },
+ getFailCount: function () {
+ return getFailCount;
+ },
+ getRetryDelayMs: function () {
+ return getRetryDelayMs;
+ },
+ handleChunkFailure: function () {
+ return handleChunkFailure;
+ },
+ retryChunkImport: function () {
+ return retryChunkImport;
+ },
+ shouldSilentRetry: function () {
+ return shouldSilentRetry;
+ },
+ sleep: function () {
+ return sleep;
+ },
+ });
+ const _appbuildid = __webpack_require__(1033);
+ const _ischunkloaderror = __webpack_require__(9462);
+ const STORAGE_PREFIX = "__next_chunk_fail:";
+ const RETRY_WINDOW_MS = 30000; // Don't retry same chunk within 30s of a retry
+ const MAX_FAIL_COUNT_FOR_RETRY = 2; // After 2 failures, skip silent retry
+ /**
+ * Simple hash function for generating chunk keys when URL isn't available.
+ */ function simpleHash(str) {
+ let hash = 0;
+ for (let i = 0; i < str.length; i++) {
+ const char = str.charCodeAt(i);
+ hash = ((hash << 5) - hash + char) | 0;
+ }
+ return Math.abs(hash).toString(36);
+ }
+ /**
+ * Extract chunk URL from error message if possible.
+ * ChunkLoadError messages typically contain the URL.
+ */ function extractChunkUrl(error) {
+ const message = error.message;
+ // Turbopack format: "Failed to load chunk <url> from <reason>: <cause>"
+ // The URL can be relative (/_next/...) or absolute (http://...)
+ const turbopackMatch = message.match(
+ /Failed to load chunk ([^\s]+\.(?:js|css))/
+ );
+ if (turbopackMatch) {
+ return turbopackMatch[1];
+ }
+ // Webpack format: "Loading chunk <id> failed. (error: <url>)"
+ const webpackMatch = message.match(/https?:\/\/[^\s)]+/);
+ return webpackMatch?.[0];
+ }
+ /**
+ * Extract the chunk ID from a webpack chunk URL.
+ * URLs look like: /_next/static/chunks/123.hash.js
+ */ function extractWebpackChunkId(chunkUrl) {
+ // Match chunk ID from URL path: /chunks/123.abc123.js or /chunks/pages_foo_bar.abc123.js
+ const match = chunkUrl.match(/\/chunks\/([^/.]+)\.[a-f0-9]+\.js/);
+ return match?.[1];
+ }
+ function clearChunkCache(error) {
+ const chunkUrl = extractChunkUrl(error);
+ if (!chunkUrl) return false;
+ // Turbopack: clear by chunk URL
+ if (
+ typeof globalThis.__turbopack_clear_chunk_resolver__ === "function"
+ ) {
+ // Extract the relative URL path that Turbopack uses as key
+ try {
+ const url = new URL(chunkUrl);
+ globalThis.__turbopack_clear_chunk_resolver__(
+ url.pathname + url.search
+ );
+ return true;
+ } catch {
+ // Invalid URL, try using the full URL
+ globalThis.__turbopack_clear_chunk_resolver__(chunkUrl);
+ return true;
+ }
+ }
+ // Webpack: extract chunk ID from URL and clear by ID
+ if (typeof globalThis.__next_clear_chunk_cache__ === "function") {
+ const chunkId = extractWebpackChunkId(chunkUrl);
+ if (chunkId) {
+ globalThis.__next_clear_chunk_cache__(chunkId);
+ return true;
+ }
+ }
+ return false;
+ }
+ /**
+ * Generate a unique key for this chunk error, used for deduplication.
+ */ function getChunkKey(ctx) {
+ return ctx.chunkUrl ?? simpleHash(ctx.message);
+ }
+ /**
+ * Get the sessionStorage key for tracking this chunk failure.
+ */ function getStorageKey(ctx) {
+ const buildId = (0, _appbuildid.getAppBuildId)();
+ const chunkKey = getChunkKey(ctx);
+ return `${STORAGE_PREFIX}${buildId}:${ctx.route}:${chunkKey}`;
+ }
+ /**
+ * Read failure state from sessionStorage.
+ */ function readFailureState(key) {
+ if (typeof sessionStorage === "undefined") return null;
+ try {
+ const stored = sessionStorage.getItem(key);
+ if (!stored) return null;
+ return JSON.parse(stored);
+ } catch {
+ return null;
+ }
+ }
+ /**
+ * Write failure state to sessionStorage.
+ */ function writeFailureState(key, state) {
+ if (typeof sessionStorage === "undefined") return;
+ try {
+ sessionStorage.setItem(key, JSON.stringify(state));
+ } catch {
+ // Storage might be full or disabled - continue without tracking
+ }
+ }
+ function clearFailureState(route) {
+ if (typeof sessionStorage === "undefined") return;
+ try {
+ const buildId = (0, _appbuildid.getAppBuildId)();
+ const prefix = `${STORAGE_PREFIX}${buildId}:${route}:`;
+ const keysToRemove = [];
+ for (let i = 0; i < sessionStorage.length; i++) {
+ const key = sessionStorage.key(i);
+ if (key?.startsWith(prefix)) {
+ keysToRemove.push(key);
+ }
+ }
+ keysToRemove.forEach((key) => sessionStorage.removeItem(key));
+ } catch {
+ // Ignore storage errors
+ }
+ }
+ /**
+ * Increment the failure count for this chunk.
+ */ function bumpFailCount(ctx) {
+ const key = getStorageKey(ctx);
+ const existing = readFailureState(key);
+ const now = Date.now();
+ const state = {
+ failCount: (existing?.failCount ?? 0) + 1,
+ lastTs: now,
+ retriedTs: existing?.retriedTs,
+ };
+ writeFailureState(key, state);
+ return state;
+ }
+ /**
+ * Mark that a retry was attempted for this chunk.
+ */ function markRetried(ctx) {
+ const key = getStorageKey(ctx);
+ const existing = readFailureState(key);
+ const now = Date.now();
+ const state = {
+ failCount: existing?.failCount ?? 1,
+ lastTs: existing?.lastTs ?? now,
+ retriedTs: now,
+ };
+ writeFailureState(key, state);
+ }
+ function shouldSilentRetry(ctx) {
+ // Don't retry if offline
+ if (typeof navigator !== "undefined" && !navigator.onLine) {
+ return false;
+ }
+ const key = getStorageKey(ctx);
+ const state = readFailureState(key);
+ const now = Date.now();
+ // If we already retried within the window, don't retry again
+ if (state?.retriedTs && now - state.retriedTs < RETRY_WINDOW_MS) {
+ return false;
+ }
+ // Too many failures - skip silent retry to avoid annoying the user
+ if ((state?.failCount ?? 0) >= MAX_FAIL_COUNT_FOR_RETRY) {
+ return false;
+ }
+ return true;
+ }
+ function getFailCount(ctx) {
+ const key = getStorageKey(ctx);
+ const state = readFailureState(key);
+ return state?.failCount ?? 0;
+ }
+ function getRetryDelayMs() {
+ const baseDelay = 200;
+ const jitter = Math.floor(Math.random() * 401); // 0-400ms
+ // Get RTT if available via Network Information API
+ let rtt = 0;
+ if (typeof navigator !== "undefined" && "connection" in navigator) {
+ const connection = navigator.connection;
+ if (connection?.rtt) {
+ rtt = Math.min(500, connection.rtt); // Cap at 500ms
+ }
+ }
+ return Math.min(1500, baseDelay + jitter + rtt); // Cap total at 1500ms
+ }
+ function sleep(ms) {
+ return new Promise((resolve) => setTimeout(resolve, ms));
+ }
+ function createChunkErrorContext(error, route, userVisible = true) {
+ if (
+ !(0, _ischunkloaderror.isChunkLoadError)(error) &&
+ !(0, _ischunkloaderror.isNetworkError)(error)
+ ) {
+ return null;
+ }
+ return {
+ route,
+ userVisible,
+ message: error.message,
+ chunkUrl: extractChunkUrl(error),
+ };
+ }
+ function handleChunkFailure(ctx) {
+ // Always increment fail count first
+ bumpFailCount(ctx);
+ // Check if we should try a silent retry
+ if (shouldSilentRetry(ctx)) {
+ markRetried(ctx);
+ return "retry";
+ }
+ // Show banner to the user
+ return "banner";
+ }
+ async function retryChunkImport(ctx, importFn) {
+ const action = handleChunkFailure(ctx);
+ if (action === "retry") {
+ const delay = getRetryDelayMs();
+ await sleep(delay);
+ return importFn();
+ }
+ // If we shouldn't retry, re-throw to trigger error boundary
+ throw Object.defineProperty(
+ new Error("Chunk load failed after retry attempts"),
+ "__NEXT_ERROR_CODE",
+ {
+ value: "E976",
+ enumerable: false,
+ configurable: true,
+ }
+ );
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=chunk-load-error-handler.js.map
+
+ /***/
+ },
+
+ /***/ 9462: /***/ (module, exports) => {
+ "use strict";
+ /**
+ * Utilities for detecting chunk load errors and network failures.
+ *
+ * ChunkLoadError can come from:
+ * - Turbopack: error.name === 'ChunkLoadError'
+ * - Webpack: error.name === 'ChunkLoadError'
+ *
+ * We intentionally keep detection narrow to avoid false positives:
+ * - Server 4xx/5xx responses don't throw (they return Response objects)
+ * - We should NOT retry CORS errors, AbortErrors, or parsing failures
+ */ /**
+ * Detects if an error is a ChunkLoadError from Turbopack or webpack.
+ * This is the most reliable check - both bundlers explicitly set this error name.
+ */
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ isChunkLoadError: function () {
+ return isChunkLoadError;
+ },
+ isChunkOrNetworkError: function () {
+ return isChunkOrNetworkError;
+ },
+ isNetworkError: function () {
+ return isNetworkError;
+ },
+ });
+ function isChunkLoadError(error) {
+ if (!error || typeof error !== "object") return false;
+ return error.name === "ChunkLoadError";
+ }
+ function isNetworkError(error) {
+ if (!error || typeof error !== "object") return false;
+ const err = error;
+ // Never retry intentional aborts
+ if (err.name === "AbortError") return false;
+ // TypeError with specific fetch failure messages
+ // These occur when the network request itself fails (not CORS, not server error)
+ if (err.name === "TypeError") {
+ const message = err.message || "";
+ // Browser-specific network failure messages
+ // Chrome/Edge: "Failed to fetch"
+ // Firefox: "NetworkError when attempting to fetch resource"
+ // Safari: "Load failed" or "The Internet connection appears to be offline"
+ if (
+ message === "Failed to fetch" ||
+ message.startsWith("NetworkError when attempting to fetch") ||
+ message === "Load failed" ||
+ message.includes("Internet connection appears to be offline") ||
+ message.includes("network connection was lost")
+ ) {
+ return true;
+ }
+ }
+ return false;
+ }
+ function isChunkOrNetworkError(error) {
+ return isChunkLoadError(error) || isNetworkError(error);
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=is-chunk-load-error.js.map
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(3458)
+ __webpack_exec__(2604)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for edge-ssr-HASH.js
@@ -1,7 +1,24 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[676],
{
- /***/ 1564: /***/ (
+ /***/ 7046: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/edge-ssr",
+ function () {
+ return __webpack_require__(7142);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 7142: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -20,30 +37,13 @@
/***/
},
-
- /***/ 4300: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/edge-ssr",
- function () {
- return __webpack_require__(1564);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(4300)
+ __webpack_exec__(7046)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for head-HASH.js
@@ -1,34 +1,17 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[5350],
{
- /***/ 1548: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/head",
- function () {
- return __webpack_require__(4282);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 3952: /***/ (
+ /***/ 3770: /***/ (
module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(1653);
+ module.exports = __webpack_require__(9025);
/***/
},
- /***/ 4282: /***/ (
+ /***/ 6236: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -43,7 +26,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(3952);
+ __webpack_require__(3770);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_head__WEBPACK_IMPORTED_MODULE_1__
@@ -76,13 +59,30 @@
/***/
},
+
+ /***/ 6510: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/head",
+ function () {
+ return __webpack_require__(6236);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(1548)
+ __webpack_exec__(6510)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for index-HASH.js
@@ -1,24 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[3332],
{
- /***/ 6376: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/",
- function () {
- return __webpack_require__(8460);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 8460: /***/ (
+ /***/ 830: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -36,13 +19,30 @@
/***/
},
+
+ /***/ 1938: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/",
+ function () {
+ return __webpack_require__(830);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(6376)
+ __webpack_exec__(1938)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for link-HASH.js
@@ -1,7 +1,220 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[4672],
{
- /***/ 857: /***/ (module, exports, __webpack_require__) => {
+ /***/ 2774: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "useIntersection", {
+ enumerable: true,
+ get: function () {
+ return useIntersection;
+ },
+ });
+ const _react = __webpack_require__(4312);
+ const _requestidlecallback = __webpack_require__(9413);
+ const hasIntersectionObserver =
+ typeof IntersectionObserver === "function";
+ const observers = new Map();
+ const idList = [];
+ function createObserver(options) {
+ const id = {
+ root: options.root || null,
+ margin: options.rootMargin || "",
+ };
+ const existing = idList.find(
+ (obj) => obj.root === id.root && obj.margin === id.margin
+ );
+ let instance;
+ if (existing) {
+ instance = observers.get(existing);
+ if (instance) {
+ return instance;
+ }
+ }
+ const elements = new Map();
+ const observer = new IntersectionObserver((entries) => {
+ entries.forEach((entry) => {
+ const callback = elements.get(entry.target);
+ const isVisible =
+ entry.isIntersecting || entry.intersectionRatio > 0;
+ if (callback && isVisible) {
+ callback(isVisible);
+ }
+ });
+ }, options);
+ instance = {
+ id,
+ observer,
+ elements,
+ };
+ idList.push(id);
+ observers.set(id, instance);
+ return instance;
+ }
+ function observe(element, callback, options) {
+ const { id, observer, elements } = createObserver(options);
+ elements.set(element, callback);
+ observer.observe(element);
+ return function unobserve() {
+ elements.delete(element);
+ observer.unobserve(element);
+ // Destroy observer when there's nothing left to watch:
+ if (elements.size === 0) {
+ observer.disconnect();
+ observers.delete(id);
+ const index = idList.findIndex(
+ (obj) => obj.root === id.root && obj.margin === id.margin
+ );
+ if (index > -1) {
+ idList.splice(index, 1);
+ }
+ }
+ };
+ }
+ function useIntersection({ rootRef, rootMargin, disabled }) {
+ const isDisabled = disabled || !hasIntersectionObserver;
+ const [visible, setVisible] = (0, _react.useState)(false);
+ const elementRef = (0, _react.useRef)(null);
+ const setElement = (0, _react.useCallback)((element) => {
+ elementRef.current = element;
+ }, []);
+ (0, _react.useEffect)(() => {
+ if (hasIntersectionObserver) {
+ if (isDisabled || visible) return;
+ const element = elementRef.current;
+ if (element && element.tagName) {
+ const unobserve = observe(
+ element,
+ (isVisible) => isVisible && setVisible(isVisible),
+ {
+ root: rootRef?.current,
+ rootMargin,
+ }
+ );
+ return unobserve;
+ }
+ } else {
+ if (!visible) {
+ const idleCallback = (0,
+ _requestidlecallback.requestIdleCallback)(() => setVisible(true));
+ return () =>
+ (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
+ }
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
+ const resetVisible = (0, _react.useCallback)(() => {
+ setVisible(false);
+ }, []);
+ return [setElement, visible, resetVisible];
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=use-intersection.js.map
+
+ /***/
+ },
+
+ /***/ 3351: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "useMergedRef", {
+ enumerable: true,
+ get: function () {
+ return useMergedRef;
+ },
+ });
+ const _react = __webpack_require__(4312);
+ function useMergedRef(refA, refB) {
+ const cleanupA = (0, _react.useRef)(null);
+ const cleanupB = (0, _react.useRef)(null);
+ // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
+ // (this happens often if the user doesn't pass a ref to Link/Form/Image)
+ // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
+ // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
+ // (because it hasn't been updated for React 19)
+ // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
+ // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
+ return (0, _react.useCallback)(
+ (current) => {
+ if (current === null) {
+ const cleanupFnA = cleanupA.current;
+ if (cleanupFnA) {
+ cleanupA.current = null;
+ cleanupFnA();
+ }
+ const cleanupFnB = cleanupB.current;
+ if (cleanupFnB) {
+ cleanupB.current = null;
+ cleanupFnB();
+ }
+ } else {
+ if (refA) {
+ cleanupA.current = applyRef(refA, current);
+ }
+ if (refB) {
+ cleanupB.current = applyRef(refB, current);
+ }
+ }
+ },
+ [refA, refB]
+ );
+ }
+ function applyRef(refA, current) {
+ if (typeof refA === "function") {
+ const cleanup = refA(current);
+ if (typeof cleanup === "function") {
+ return cleanup;
+ } else {
+ return () => refA(null);
+ }
+ } else {
+ refA.current = current;
+ return () => {
+ refA.current = null;
+ };
+ }
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=use-merged-ref.js.map
+
+ /***/
+ },
+
+ /***/ 3440: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(4757);
+
+ /***/
+ },
+
+ /***/ 4757: /***/ (module, exports, __webpack_require__) => {
"use strict";
/* __next_internal_client_entry_do_not_use__ cjs */
Object.defineProperty(exports, "__esModule", {
@@ -23,22 +236,22 @@
return useLinkStatus;
},
});
- const _interop_require_wildcard = __webpack_require__(8781);
+ const _interop_require_wildcard = __webpack_require__(1162);
const _jsxruntime = __webpack_require__(3108);
const _react = /*#__PURE__*/ _interop_require_wildcard._(
__webpack_require__(4312)
);
- const _resolvehref = __webpack_require__(4055);
- const _islocalurl = __webpack_require__(7175);
- const _formaturl = __webpack_require__(9674);
- const _utils = __webpack_require__(7424);
- const _addlocale = __webpack_require__(589);
- const _routercontextsharedruntime = __webpack_require__(7010);
- const _useintersection = __webpack_require__(2330);
- const _getdomainlocale = __webpack_require__(7207);
- const _addbasepath = __webpack_require__(9942);
- const _usemergedref = __webpack_require__(8067);
- const _erroronce = __webpack_require__(1945);
+ const _resolvehref = __webpack_require__(4691);
+ const _islocalurl = __webpack_require__(4763);
+ const _formaturl = __webpack_require__(3246);
+ const _utils = __webpack_require__(7372);
+ const _addlocale = __webpack_require__(1809);
+ const _routercontextsharedruntime = __webpack_require__(2254);
+ const _useintersection = __webpack_require__(2774);
+ const _getdomainlocale = __webpack_require__(8803);
+ const _addbasepath = __webpack_require__(5834);
+ const _usemergedref = __webpack_require__(3351);
+ const _erroronce = __webpack_require__(6021);
const prefetched = new Set();
function prefetch(router, href, as, options) {
if (false) {
@@ -417,168 +630,43 @@
/***/
},
- /***/ 1945: /***/ (__unused_webpack_module, exports) => {
- "use strict";
-
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "errorOnce", {
- enumerable: true,
- get: function () {
- return errorOnce;
+ /***/ 5326: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/link",
+ function () {
+ return __webpack_require__(9058);
},
- });
- let errorOnce = (_) => {};
+ ]);
if (false) {
- } //# sourceMappingURL=error-once.js.map
+ }
/***/
},
- /***/ 2330: /***/ (module, exports, __webpack_require__) => {
+ /***/ 6021: /***/ (__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
- Object.defineProperty(exports, "useIntersection", {
+ Object.defineProperty(exports, "errorOnce", {
enumerable: true,
get: function () {
- return useIntersection;
+ return errorOnce;
},
});
- const _react = __webpack_require__(4312);
- const _requestidlecallback = __webpack_require__(601);
- const hasIntersectionObserver =
- typeof IntersectionObserver === "function";
- const observers = new Map();
- const idList = [];
- function createObserver(options) {
- const id = {
- root: options.root || null,
- margin: options.rootMargin || "",
- };
- const existing = idList.find(
- (obj) => obj.root === id.root && obj.margin === id.margin
- );
- let instance;
- if (existing) {
- instance = observers.get(existing);
- if (instance) {
- return instance;
- }
- }
- const elements = new Map();
- const observer = new IntersectionObserver((entries) => {
- entries.forEach((entry) => {
- const callback = elements.get(entry.target);
- const isVisible =
- entry.isIntersecting || entry.intersectionRatio > 0;
- if (callback && isVisible) {
- callback(isVisible);
- }
- });
- }, options);
- instance = {
- id,
- observer,
- elements,
- };
- idList.push(id);
- observers.set(id, instance);
- return instance;
- }
- function observe(element, callback, options) {
- const { id, observer, elements } = createObserver(options);
- elements.set(element, callback);
- observer.observe(element);
- return function unobserve() {
- elements.delete(element);
- observer.unobserve(element);
- // Destroy observer when there's nothing left to watch:
- if (elements.size === 0) {
- observer.disconnect();
- observers.delete(id);
- const index = idList.findIndex(
- (obj) => obj.root === id.root && obj.margin === id.margin
- );
- if (index > -1) {
- idList.splice(index, 1);
- }
- }
- };
- }
- function useIntersection({ rootRef, rootMargin, disabled }) {
- const isDisabled = disabled || !hasIntersectionObserver;
- const [visible, setVisible] = (0, _react.useState)(false);
- const elementRef = (0, _react.useRef)(null);
- const setElement = (0, _react.useCallback)((element) => {
- elementRef.current = element;
- }, []);
- (0, _react.useEffect)(() => {
- if (hasIntersectionObserver) {
- if (isDisabled || visible) return;
- const element = elementRef.current;
- if (element && element.tagName) {
- const unobserve = observe(
- element,
- (isVisible) => isVisible && setVisible(isVisible),
- {
- root: rootRef?.current,
- rootMargin,
- }
- );
- return unobserve;
- }
- } else {
- if (!visible) {
- const idleCallback = (0,
- _requestidlecallback.requestIdleCallback)(() => setVisible(true));
- return () =>
- (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
- }
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
- const resetVisible = (0, _react.useCallback)(() => {
- setVisible(false);
- }, []);
- return [setElement, visible, resetVisible];
- }
- if (
- (typeof exports.default === "function" ||
- (typeof exports.default === "object" && exports.default !== null)) &&
- typeof exports.default.__esModule === "undefined"
- ) {
- Object.defineProperty(exports.default, "__esModule", {
- value: true,
- });
- Object.assign(exports.default, exports);
- module.exports = exports.default;
- } //# sourceMappingURL=use-intersection.js.map
-
- /***/
- },
-
- /***/ 4972: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/link",
- function () {
- return __webpack_require__(7600);
- },
- ]);
+ let errorOnce = (_) => {};
if (false) {
- }
+ } //# sourceMappingURL=error-once.js.map
/***/
},
- /***/ 7207: /***/ (module, exports, __webpack_require__) => {
+ /***/ 8803: /***/ (module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -590,7 +678,7 @@
return getDomainLocale;
},
});
- const _normalizetrailingslash = __webpack_require__(151);
+ const _normalizetrailingslash = __webpack_require__(1315);
const basePath =
/* unused pure expression or super */ null && (false || "");
function getDomainLocale(path, locale, locales, domainLocales) {
@@ -614,7 +702,7 @@
/***/
},
- /***/ 7600: /***/ (
+ /***/ 9058: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -629,7 +717,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(7830);
+ __webpack_require__(3440);
/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_link__WEBPACK_IMPORTED_MODULE_1__
@@ -659,101 +747,13 @@
/***/
},
-
- /***/ 7830: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(857);
-
- /***/
- },
-
- /***/ 8067: /***/ (module, exports, __webpack_require__) => {
- "use strict";
-
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "useMergedRef", {
- enumerable: true,
- get: function () {
- return useMergedRef;
- },
- });
- const _react = __webpack_require__(4312);
- function useMergedRef(refA, refB) {
- const cleanupA = (0, _react.useRef)(null);
- const cleanupB = (0, _react.useRef)(null);
- // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
- // (this happens often if the user doesn't pass a ref to Link/Form/Image)
- // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
- // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
- // (because it hasn't been updated for React 19)
- // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
- // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
- return (0, _react.useCallback)(
- (current) => {
- if (current === null) {
- const cleanupFnA = cleanupA.current;
- if (cleanupFnA) {
- cleanupA.current = null;
- cleanupFnA();
- }
- const cleanupFnB = cleanupB.current;
- if (cleanupFnB) {
- cleanupB.current = null;
- cleanupFnB();
- }
- } else {
- if (refA) {
- cleanupA.current = applyRef(refA, current);
- }
- if (refB) {
- cleanupB.current = applyRef(refB, current);
- }
- }
- },
- [refA, refB]
- );
- }
- function applyRef(refA, current) {
- if (typeof refA === "function") {
- const cleanup = refA(current);
- if (typeof cleanup === "function") {
- return cleanup;
- } else {
- return () => refA(null);
- }
- } else {
- refA.current = current;
- return () => {
- refA.current = null;
- };
- }
- }
- if (
- (typeof exports.default === "function" ||
- (typeof exports.default === "object" && exports.default !== null)) &&
- typeof exports.default.__esModule === "undefined"
- ) {
- Object.defineProperty(exports.default, "__esModule", {
- value: true,
- });
- Object.assign(exports.default, exports);
- module.exports = exports.default;
- } //# sourceMappingURL=use-merged-ref.js.map
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(4972)
+ __webpack_exec__(5326)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for routerDirect-HASH.js
@@ -1,17 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[188],
{
- /***/ 1179: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(9864);
-
- /***/
- },
-
- /***/ 1640: /***/ (
+ /***/ 2014: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -26,7 +16,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1179);
+ __webpack_require__(4169);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -46,7 +36,17 @@
/***/
},
- /***/ 2172: /***/ (
+ /***/ 4169: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(9700);
+
+ /***/
+ },
+
+ /***/ 4414: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
@@ -54,7 +54,7 @@
(window.__NEXT_P = window.__NEXT_P || []).push([
"/routerDirect",
function () {
- return __webpack_require__(1640);
+ return __webpack_require__(2014);
},
]);
if (false) {
@@ -68,7 +68,7 @@
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(2172)
+ __webpack_exec__(4414)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for script-HASH.js
@@ -1,17 +1,34 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[1209],
{
- /***/ 4977: /***/ (
+ /***/ 2591: /***/ (
module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(326);
+ module.exports = __webpack_require__(4634);
/***/
},
- /***/ 5887: /***/ (
+ /***/ 5030: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/script",
+ function () {
+ return __webpack_require__(7557);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 7557: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -26,7 +43,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(4977);
+ __webpack_require__(2591);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -58,30 +75,13 @@
/***/
},
-
- /***/ 6268: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/script",
- function () {
- return __webpack_require__(5887);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(6268)
+ __webpack_exec__(5030)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for withRouter-HASH.js
@@ -1,34 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[3263],
{
- /***/ 1179: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(9864);
-
- /***/
- },
-
- /***/ 2028: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/withRouter",
- function () {
- return __webpack_require__(4501);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 4501: /***/ (
+ /***/ 559: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -43,7 +16,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1179);
+ __webpack_require__(4169);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -61,13 +34,40 @@
/***/
},
+
+ /***/ 726: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/withRouter",
+ function () {
+ return __webpack_require__(559);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 4169: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(9700);
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(2028)
+ __webpack_exec__(726)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for 2161-HASH.js
Diff too large to display
Diff for 2747-HASH.js
Diff too large to display
Diff for 4322-HASH.js
failed to diffDiff for main-HASH.js
Diff too large to display
Diff for webpack-HASH.js
@@ -205,7 +205,7 @@
/******/ __webpack_require__.u = (chunkId) => {
/******/ // return url for filenames based on template
/******/ return (
- "static/chunks/" + chunkId + "." + "9c9ddbde79ea2f29" + ".js"
+ "static/chunks/" + chunkId + "." + "871ca3fb4b1caa0e" + ".js"
);
/******/
};
@@ -380,6 +380,23 @@
/******/
};
/******/
+ /******/ // Next.js chunk cache clearing for retry logic
+ /******/ if (typeof globalThis !== "undefined") {
+ /******/ globalThis.__next_clear_chunk_cache__ = function (chunkId) {
+ /******/ // Only clear if not already loaded (0 means loaded)
+ /******/ if (
+ installedChunks[chunkId] !== 0 &&
+ installedChunks[chunkId] !== undefined
+ ) {
+ /******/ delete installedChunks[chunkId];
+ /******/
+ }
+ /******/
+ };
+ /******/
+ }
+ /******/
+ /******/
/******/ __webpack_require__.f.j = (chunkId, promises) => {
/******/ // JSONP chunk loading for javascript
/******/ var installedChunkData = __webpack_require__.o(Diff for app-page-exp..ntime.dev.js
Diff too large to display
Diff for app-page-exp..time.prod.js
failed to diffDiff for app-page-tur..ntime.dev.js
Diff too large to display
Diff for app-page-tur..time.prod.js
failed to diffDiff for app-page-tur..ntime.dev.js
Diff too large to display
Diff for app-page-tur..time.prod.js
Diff too large to display
Diff for app-page.runtime.dev.js
Diff too large to display
Diff for app-page.runtime.prod.js
Diff too large to display
Diff for pages-turbo...ntime.dev.js
Diff too large to display
Diff for pages-turbo...time.prod.js
Diff too large to display
Diff for pages.runtime.dev.js
Diff too large to display
Diff for pages.runtime.prod.js
Diff too large to display
799a0ce to
5cbd33b
Compare
5cbd33b to
9ca9ab2
Compare
Stats from current PRDefault Build (Increase detected
|
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| buildDuration | 18.6s | 15.9s | N/A |
| buildDurationCached | 14.9s | 12s | N/A |
| nodeModulesSize | 457 MB | 458 MB | |
| nextStartRea..uration (ms) | 684ms | 706ms | N/A |
Client Bundles (main, webpack) Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| 2086.HASH.js gzip | 169 B | 169 B | ✓ |
| 2161-HASH.js gzip | 5.39 kB | 5.41 kB | N/A |
| 2747-HASH.js gzip | 4.48 kB | 4.46 kB | N/A |
| 4322-HASH.js gzip | 51.2 kB | 54.6 kB | |
| ec793fe8-HASH.js gzip | 62.3 kB | 62.3 kB | N/A |
| framework-HASH.js gzip | 59.8 kB | 59.8 kB | N/A |
| main-app-HASH.js gzip | 251 B | 254 B | N/A |
| main-HASH.js gzip | 38.4 kB | 38.7 kB | |
| webpack-HASH.js gzip | 1.68 kB | 1.73 kB | N/A |
| Overall change | 89.8 kB | 93.5 kB |
Legacy Client Bundles (polyfills)
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| polyfills-HASH.js gzip | 39.4 kB | 39.4 kB | ✓ |
| Overall change | 39.4 kB | 39.4 kB | ✓ |
Client Pages Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| _app-HASH.js gzip | 194 B | 193 B | N/A |
| _error-HASH.js gzip | 182 B | 182 B | ✓ |
| css-HASH.js gzip | 336 B | 335 B | N/A |
| dynamic-HASH.js gzip | 1.8 kB | 3.18 kB | |
| edge-ssr-HASH.js gzip | 256 B | 256 B | ✓ |
| head-HASH.js gzip | 352 B | 349 B | N/A |
| hooks-HASH.js gzip | 385 B | 384 B | N/A |
| image-HASH.js gzip | 580 B | 580 B | ✓ |
| index-HASH.js gzip | 259 B | 258 B | N/A |
| link-HASH.js gzip | 2.5 kB | 2.51 kB | N/A |
| routerDirect..HASH.js gzip | 319 B | 317 B | N/A |
| script-HASH.js gzip | 385 B | 387 B | N/A |
| withRouter-HASH.js gzip | 316 B | 315 B | N/A |
| 1afbb74e6ecf..834.css gzip | 106 B | 106 B | ✓ |
| Overall change | 2.92 kB | 4.31 kB |
Client Build Manifests
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 738 B | 738 B | ✓ |
| Overall change | 738 B | 738 B | ✓ |
Rendered Page Sizes
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| index.html gzip | 523 B | 524 B | N/A |
| link.html gzip | 537 B | 538 B | N/A |
| withRouter.html gzip | 520 B | 520 B | ✓ |
| Overall change | 520 B | 520 B | ✓ |
Edge SSR bundle Size Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| edge-ssr.js gzip | 124 kB | 124 kB | N/A |
| page.js gzip | 237 kB | 241 kB | |
| Overall change | 237 kB | 241 kB |
Middleware size
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| middleware-b..fest.js gzip | 652 B | 656 B | N/A |
| middleware-r..fest.js gzip | 155 B | 156 B | N/A |
| middleware.js gzip | 32.9 kB | 33 kB | N/A |
| edge-runtime..pack.js gzip | 846 B | 846 B | ✓ |
| Overall change | 846 B | 846 B | ✓ |
Next Runtimes Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| app-page-exp...dev.js gzip | 301 kB | 304 kB | |
| app-page-exp..prod.js gzip | 156 kB | 158 kB | |
| app-page-tur...dev.js gzip | 301 kB | 304 kB | |
| app-page-tur..prod.js gzip | 156 kB | 158 kB | |
| app-page-tur...dev.js gzip | 298 kB | 301 kB | |
| app-page-tur..prod.js gzip | 154 kB | 156 kB | |
| app-page.run...dev.js gzip | 298 kB | 301 kB | |
| app-page.run..prod.js gzip | 154 kB | 156 kB | |
| app-route-ex...dev.js gzip | 68.7 kB | 68.7 kB | ✓ |
| app-route-ex..prod.js gzip | 47.5 kB | 47.5 kB | ✓ |
| app-route-tu...dev.js gzip | 68.7 kB | 68.7 kB | ✓ |
| app-route-tu..prod.js gzip | 47.5 kB | 47.5 kB | ✓ |
| app-route-tu...dev.js gzip | 68.3 kB | 68.3 kB | ✓ |
| app-route-tu..prod.js gzip | 47.3 kB | 47.3 kB | ✓ |
| app-route.ru...dev.js gzip | 68.3 kB | 68.3 kB | ✓ |
| app-route.ru..prod.js gzip | 47.3 kB | 47.3 kB | ✓ |
| dist_client_...dev.js gzip | 324 B | 324 B | ✓ |
| dist_client_...dev.js gzip | 326 B | 326 B | ✓ |
| dist_client_...dev.js gzip | 318 B | 318 B | ✓ |
| dist_client_...dev.js gzip | 317 B | 317 B | ✓ |
| pages-api-tu...dev.js gzip | 41.1 kB | 41.1 kB | ✓ |
| pages-api-tu..prod.js gzip | 31.2 kB | 31.2 kB | ✓ |
| pages-api.ru...dev.js gzip | 41 kB | 41 kB | ✓ |
| pages-api.ru..prod.js gzip | 31.2 kB | 31.2 kB | ✓ |
| pages-turbo....dev.js gzip | 50.7 kB | 50.7 kB | N/A |
| pages-turbo...prod.js gzip | 38.2 kB | 38.2 kB | N/A |
| pages.runtim...dev.js gzip | 50.6 kB | 50.7 kB | N/A |
| pages.runtim..prod.js gzip | 38.1 kB | 38.1 kB | N/A |
| server.runti..prod.js gzip | 59.9 kB | 59.9 kB | ✓ |
| Overall change | 2.49 MB | 2.51 MB |
build cache Overall increase ⚠️
| vercel/next.js canary | vercel/next.js chunk-load-error-retry | Change | |
|---|---|---|---|
| 0.pack gzip | 3.61 MB | 3.65 MB | |
| index.pack gzip | 99.7 kB | 99.7 kB | N/A |
| Overall change | 3.61 MB | 3.65 MB |
Diff details
Diff for page.js
Diff too large to display
Diff for middleware.js
Diff too large to display
Diff for edge-ssr.js
Diff too large to display
Diff for _buildManifest.js
@@ -611,35 +611,35 @@ self.__BUILD_MANIFEST = (function (a, b, c) {
numHashes: NaN,
bitArray: [],
},
- "/": ["static\u002Fchunks\u002Fpages\u002Findex-dda7d8b64d4ba15c.js"],
+ "/": ["static\u002Fchunks\u002Fpages\u002Findex-d95f7ec6af4d2644.js"],
"/_error": [
- "static\u002Fchunks\u002Fpages\u002F_error-6ef44d3954f25711.js",
+ "static\u002Fchunks\u002Fpages\u002F_error-209c0c82205a7c9f.js",
],
"/css": [
"static\u002Fcss\u002Fded6b86ab9cc0a1f.css",
- "static\u002Fchunks\u002Fpages\u002Fcss-c8aaa7211416a045.js",
+ "static\u002Fchunks\u002Fpages\u002Fcss-62710339bc830ded.js",
],
"/dynamic": [
- "static\u002Fchunks\u002Fpages\u002Fdynamic-d53bb7f318f342c2.js",
+ "static\u002Fchunks\u002Fpages\u002Fdynamic-0da0672e6c8cfd41.js",
],
"/edge-ssr": [
- "static\u002Fchunks\u002Fpages\u002Fedge-ssr-1383106d4a3e7d72.js",
+ "static\u002Fchunks\u002Fpages\u002Fedge-ssr-0db9f7bb610d3072.js",
],
- "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-1db1c4be1a45662f.js"],
- "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-e6deee5b72a5b112.js"],
+ "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-747416c4075e42aa.js"],
+ "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-8b10205be7505244.js"],
"/image": [
- "static\u002Fchunks\u002F2747-90c828280005c0c3.js",
- "static\u002Fchunks\u002Fpages\u002Fimage-868472cd5e84efc9.js",
+ "static\u002Fchunks\u002F6349-ee9aecde860d4832.js",
+ "static\u002Fchunks\u002Fpages\u002Fimage-f90ae17c3ad1d38b.js",
],
- "/link": ["static\u002Fchunks\u002Fpages\u002Flink-0ec374e48b2ce5d9.js"],
+ "/link": ["static\u002Fchunks\u002Fpages\u002Flink-6ab9a67b348df1bf.js"],
"/routerDirect": [
- "static\u002Fchunks\u002Fpages\u002FrouterDirect-1a34bfadbc088491.js",
+ "static\u002Fchunks\u002Fpages\u002FrouterDirect-f132fb471e65a8b9.js",
],
"/script": [
- "static\u002Fchunks\u002Fpages\u002Fscript-52320f59afbd096d.js",
+ "static\u002Fchunks\u002Fpages\u002Fscript-8e2028e44b8da2d9.js",
],
"/withRouter": [
- "static\u002Fchunks\u002Fpages\u002FwithRouter-3b1a16d3dfa21c16.js",
+ "static\u002Fchunks\u002Fpages\u002FwithRouter-a86d259faa012c1c.js",
],
sortedPages: [
"\u002F",Diff for dynamic-HASH.js
@@ -1,17 +1,80 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[2291],
{
- /***/ 1231: /***/ (
- module,
+ /***/ 1033: /***/ (module, exports) => {
+ "use strict";
+ // This gets assigned as a side-effect during app initialization. Because it
+ // represents the build used to create the JS bundle, it should never change
+ // after being set, so we store it in a global variable.
+ //
+ // When performing RSC requests, if the incoming data has a different build ID,
+ // we perform an MPA navigation/refresh to load the updated build and ensure
+ // that the client and server in sync.
+ // Starts as an empty string. In practice, because setAppBuildId is called
+ // during initialization before hydration starts, this will always get
+ // reassigned to the actual build ID before it's ever needed by a navigation.
+ // If for some reasons it didn't, due to a bug or race condition, then on
+ // navigation the build comparision would fail and trigger an MPA navigation.
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ getAppBuildId: function () {
+ return getAppBuildId;
+ },
+ setAppBuildId: function () {
+ return setAppBuildId;
+ },
+ });
+ let globalBuildId = "";
+ function setAppBuildId(buildId) {
+ globalBuildId = buildId;
+ }
+ function getAppBuildId() {
+ return globalBuildId;
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=app-build-id.js.map
+
+ /***/
+ },
+
+ /***/ 2604: /***/ (
+ __unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(4464);
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/dynamic",
+ function () {
+ return __webpack_require__(3643);
+ },
+ ]);
+ if (false) {
+ }
/***/
},
- /***/ 2101: /***/ (
+ /***/ 3401: /***/ (
__unused_webpack_module,
exports,
__webpack_require__
@@ -38,24 +101,63 @@
/***/
},
- /***/ 3458: /***/ (
+ /***/ 3643: /***/ (
__unused_webpack_module,
- __unused_webpack_exports,
+ __webpack_exports__,
__webpack_require__
) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/dynamic",
- function () {
- return __webpack_require__(9381);
- },
- ]);
- if (false) {
- }
+ "use strict";
+ __webpack_require__.r(__webpack_exports__);
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
+ /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
+ /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
+ /* harmony export */
+ });
+ /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
+ __webpack_require__(3108);
+ /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
+ __webpack_require__(3973);
+ /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
+ /*#__PURE__*/ __webpack_require__.n(
+ next_dynamic__WEBPACK_IMPORTED_MODULE_1__
+ );
+
+ const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
+ () =>
+ __webpack_require__
+ .e(/* import() */ 1596)
+ .then(__webpack_require__.bind(__webpack_require__, 1596))
+ .then((mod) => mod.Hello),
+ {
+ loadableGenerated: {
+ webpack: () => [/*require.resolve*/ 1596],
+ },
+ }
+ );
+ const Page = () =>
+ /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
+ {
+ children: [
+ /*#__PURE__*/ (0,
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
+ children: "testing next/dynamic size",
+ }),
+ /*#__PURE__*/ (0,
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
+ DynamicHello,
+ {}
+ ),
+ ],
+ }
+ );
+ var __N_SSP = true;
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
/***/
},
- /***/ 4464: /***/ (module, exports, __webpack_require__) => {
+ /***/ 3660: /***/ (module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -88,7 +190,7 @@
__webpack_require__(4312)
);
const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(9799)
+ __webpack_require__(4539)
);
const isServerSide = "object" === "undefined";
// Normalize loader to return the module as form { default: Component } for `React.lazy`.
@@ -188,63 +290,17 @@
/***/
},
- /***/ 9381: /***/ (
- __unused_webpack_module,
- __webpack_exports__,
+ /***/ 3973: /***/ (
+ module,
+ __unused_webpack_exports,
__webpack_require__
) => {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
- /* harmony export */ __N_SSP: () => /* binding */ __N_SSP,
- /* harmony export */ default: () => __WEBPACK_DEFAULT_EXPORT__,
- /* harmony export */
- });
- /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
- __webpack_require__(3108);
- /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1231);
- /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1___default =
- /*#__PURE__*/ __webpack_require__.n(
- next_dynamic__WEBPACK_IMPORTED_MODULE_1__
- );
-
- const DynamicHello = next_dynamic__WEBPACK_IMPORTED_MODULE_1___default()(
- () =>
- __webpack_require__
- .e(/* import() */ 2086)
- .then(__webpack_require__.bind(__webpack_require__, 2086))
- .then((mod) => mod.Hello),
- {
- loadableGenerated: {
- webpack: () => [/*require.resolve*/ 2086],
- },
- }
- );
- const Page = () =>
- /*#__PURE__*/ (0, react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,
- {
- children: [
- /*#__PURE__*/ (0,
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", {
- children: "testing next/dynamic size",
- }),
- /*#__PURE__*/ (0,
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
- DynamicHello,
- {}
- ),
- ],
- }
- );
- var __N_SSP = true;
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = Page;
+ module.exports = __webpack_require__(3660);
/***/
},
- /***/ 9799: /***/ (
+ /***/ 4539: /***/ (
__unused_webpack_module,
exports,
__webpack_require__
@@ -286,7 +342,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
const _react = /*#__PURE__*/ _interop_require_default._(
__webpack_require__(4312)
);
- const _loadablecontextsharedruntime = __webpack_require__(2101);
+ const _loadablecontextsharedruntime = __webpack_require__(3401);
+ const _ischunkloaderror = __webpack_require__(9462);
+ const _chunkloaderrorhandler = __webpack_require__(7676);
function resolve(obj) {
return obj && obj.default ? obj.default : obj;
}
@@ -413,6 +471,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
this._callbacks = new Set();
this._delay = null;
this._timeout = null;
+ this._hasAutoRetried = false;
this.retry();
}
promise() {
@@ -451,7 +510,25 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
this._update({});
this._clearTimeouts();
})
- .catch((_err) => {
+ .catch((err) => {
+ // Auto-retry for chunk load errors (once)
+ // This handles transient network failures during dynamic imports
+ if (
+ true &&
+ (0, _ischunkloaderror.isChunkLoadError)(err) &&
+ !this._hasAutoRetried
+ ) {
+ this._hasAutoRetried = true;
+ // Clear bundler's chunk cache so retry will fetch fresh
+ (0, _chunkloaderrorhandler.clearChunkCache)(err);
+ // Retry after a short delay with jitter
+ const delay = (0, _chunkloaderrorhandler.getRetryDelayMs)();
+ setTimeout(() => {
+ this.retry();
+ }, delay);
+ return;
+ }
+ // No more retries - propagate error
this._update({});
this._clearTimeouts();
});
@@ -518,13 +595,392 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
/***/
},
+
+ /***/ 7676: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+ /**
+ * Chunk load error handling with silent retry logic.
+ *
+ * This module provides retry orchestration for chunk/network loading failures.
+ * It tracks failures in sessionStorage per {route, buildId, chunkKey} and
+ * implements silent retry with jittered backoff.
+ */
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ clearChunkCache: function () {
+ return clearChunkCache;
+ },
+ clearFailureState: function () {
+ return clearFailureState;
+ },
+ createChunkErrorContext: function () {
+ return createChunkErrorContext;
+ },
+ getFailCount: function () {
+ return getFailCount;
+ },
+ getRetryDelayMs: function () {
+ return getRetryDelayMs;
+ },
+ handleChunkFailure: function () {
+ return handleChunkFailure;
+ },
+ retryChunkImport: function () {
+ return retryChunkImport;
+ },
+ shouldSilentRetry: function () {
+ return shouldSilentRetry;
+ },
+ sleep: function () {
+ return sleep;
+ },
+ });
+ const _appbuildid = __webpack_require__(1033);
+ const _ischunkloaderror = __webpack_require__(9462);
+ const STORAGE_PREFIX = "__next_chunk_fail:";
+ const RETRY_WINDOW_MS = 30000; // Don't retry same chunk within 30s of a retry
+ const MAX_FAIL_COUNT_FOR_RETRY = 2; // After 2 failures, skip silent retry
+ /**
+ * Simple hash function for generating chunk keys when URL isn't available.
+ */ function simpleHash(str) {
+ let hash = 0;
+ for (let i = 0; i < str.length; i++) {
+ const char = str.charCodeAt(i);
+ hash = ((hash << 5) - hash + char) | 0;
+ }
+ return Math.abs(hash).toString(36);
+ }
+ /**
+ * Extract chunk URL from error message if possible.
+ * ChunkLoadError messages typically contain the URL.
+ */ function extractChunkUrl(error) {
+ const message = error.message;
+ // Turbopack format: "Failed to load chunk <url> from <reason>: <cause>"
+ // The URL can be relative (/_next/...) or absolute (http://...)
+ const turbopackMatch = message.match(
+ /Failed to load chunk ([^\s]+\.(?:js|css))/
+ );
+ if (turbopackMatch) {
+ return turbopackMatch[1];
+ }
+ // Webpack format: "Loading chunk <id> failed. (error: <url>)"
+ const webpackMatch = message.match(/https?:\/\/[^\s)]+/);
+ return webpackMatch?.[0];
+ }
+ /**
+ * Extract the chunk ID from a webpack chunk URL.
+ * URLs look like: /_next/static/chunks/123.hash.js
+ */ function extractWebpackChunkId(chunkUrl) {
+ // Match chunk ID from URL path: /chunks/123.abc123.js or /chunks/pages_foo_bar.abc123.js
+ const match = chunkUrl.match(/\/chunks\/([^/.]+)\.[a-f0-9]+\.js/);
+ return match?.[1];
+ }
+ function clearChunkCache(error) {
+ const chunkUrl = extractChunkUrl(error);
+ if (!chunkUrl) return false;
+ // Turbopack: clear by chunk URL
+ if (
+ typeof globalThis.__turbopack_clear_chunk_resolver__ === "function"
+ ) {
+ // Extract the relative URL path that Turbopack uses as key
+ try {
+ const url = new URL(chunkUrl);
+ globalThis.__turbopack_clear_chunk_resolver__(
+ url.pathname + url.search
+ );
+ return true;
+ } catch {
+ // Invalid URL, try using the full URL
+ globalThis.__turbopack_clear_chunk_resolver__(chunkUrl);
+ return true;
+ }
+ }
+ // Webpack: extract chunk ID from URL and clear by ID
+ if (typeof globalThis.__next_clear_chunk_cache__ === "function") {
+ const chunkId = extractWebpackChunkId(chunkUrl);
+ if (chunkId) {
+ globalThis.__next_clear_chunk_cache__(chunkId);
+ return true;
+ }
+ }
+ return false;
+ }
+ /**
+ * Generate a unique key for this chunk error, used for deduplication.
+ */ function getChunkKey(ctx) {
+ return ctx.chunkUrl ?? simpleHash(ctx.message);
+ }
+ /**
+ * Get the sessionStorage key for tracking this chunk failure.
+ */ function getStorageKey(ctx) {
+ const buildId = (0, _appbuildid.getAppBuildId)();
+ const chunkKey = getChunkKey(ctx);
+ return `${STORAGE_PREFIX}${buildId}:${ctx.route}:${chunkKey}`;
+ }
+ /**
+ * Read failure state from sessionStorage.
+ */ function readFailureState(key) {
+ if (typeof sessionStorage === "undefined") return null;
+ try {
+ const stored = sessionStorage.getItem(key);
+ if (!stored) return null;
+ return JSON.parse(stored);
+ } catch {
+ return null;
+ }
+ }
+ /**
+ * Write failure state to sessionStorage.
+ */ function writeFailureState(key, state) {
+ if (typeof sessionStorage === "undefined") return;
+ try {
+ sessionStorage.setItem(key, JSON.stringify(state));
+ } catch {
+ // Storage might be full or disabled - continue without tracking
+ }
+ }
+ function clearFailureState(route) {
+ if (typeof sessionStorage === "undefined") return;
+ try {
+ const buildId = (0, _appbuildid.getAppBuildId)();
+ const prefix = `${STORAGE_PREFIX}${buildId}:${route}:`;
+ const keysToRemove = [];
+ for (let i = 0; i < sessionStorage.length; i++) {
+ const key = sessionStorage.key(i);
+ if (key?.startsWith(prefix)) {
+ keysToRemove.push(key);
+ }
+ }
+ keysToRemove.forEach((key) => sessionStorage.removeItem(key));
+ } catch {
+ // Ignore storage errors
+ }
+ }
+ /**
+ * Increment the failure count for this chunk.
+ */ function bumpFailCount(ctx) {
+ const key = getStorageKey(ctx);
+ const existing = readFailureState(key);
+ const now = Date.now();
+ const state = {
+ failCount: (existing?.failCount ?? 0) + 1,
+ lastTs: now,
+ retriedTs: existing?.retriedTs,
+ };
+ writeFailureState(key, state);
+ return state;
+ }
+ /**
+ * Mark that a retry was attempted for this chunk.
+ */ function markRetried(ctx) {
+ const key = getStorageKey(ctx);
+ const existing = readFailureState(key);
+ const now = Date.now();
+ const state = {
+ failCount: existing?.failCount ?? 1,
+ lastTs: existing?.lastTs ?? now,
+ retriedTs: now,
+ };
+ writeFailureState(key, state);
+ }
+ function shouldSilentRetry(ctx) {
+ // Don't retry if offline
+ if (typeof navigator !== "undefined" && !navigator.onLine) {
+ return false;
+ }
+ const key = getStorageKey(ctx);
+ const state = readFailureState(key);
+ const now = Date.now();
+ // If we already retried within the window, don't retry again
+ if (state?.retriedTs && now - state.retriedTs < RETRY_WINDOW_MS) {
+ return false;
+ }
+ // Too many failures - skip silent retry to avoid annoying the user
+ if ((state?.failCount ?? 0) >= MAX_FAIL_COUNT_FOR_RETRY) {
+ return false;
+ }
+ return true;
+ }
+ function getFailCount(ctx) {
+ const key = getStorageKey(ctx);
+ const state = readFailureState(key);
+ return state?.failCount ?? 0;
+ }
+ function getRetryDelayMs() {
+ const baseDelay = 200;
+ const jitter = Math.floor(Math.random() * 401); // 0-400ms
+ // Get RTT if available via Network Information API
+ let rtt = 0;
+ if (typeof navigator !== "undefined" && "connection" in navigator) {
+ const connection = navigator.connection;
+ if (connection?.rtt) {
+ rtt = Math.min(500, connection.rtt); // Cap at 500ms
+ }
+ }
+ return Math.min(1500, baseDelay + jitter + rtt); // Cap total at 1500ms
+ }
+ function sleep(ms) {
+ return new Promise((resolve) => setTimeout(resolve, ms));
+ }
+ function createChunkErrorContext(error, route, userVisible = true) {
+ if (
+ !(0, _ischunkloaderror.isChunkLoadError)(error) &&
+ !(0, _ischunkloaderror.isNetworkError)(error)
+ ) {
+ return null;
+ }
+ return {
+ route,
+ userVisible,
+ message: error.message,
+ chunkUrl: extractChunkUrl(error),
+ };
+ }
+ function handleChunkFailure(ctx) {
+ // Always increment fail count first
+ bumpFailCount(ctx);
+ // Check if we should try a silent retry
+ if (shouldSilentRetry(ctx)) {
+ markRetried(ctx);
+ return "retry";
+ }
+ // Show banner to the user
+ return "banner";
+ }
+ async function retryChunkImport(ctx, importFn) {
+ const action = handleChunkFailure(ctx);
+ if (action === "retry") {
+ const delay = getRetryDelayMs();
+ await sleep(delay);
+ return importFn();
+ }
+ // If we shouldn't retry, re-throw to trigger error boundary
+ throw Object.defineProperty(
+ new Error("Chunk load failed after retry attempts"),
+ "__NEXT_ERROR_CODE",
+ {
+ value: "E976",
+ enumerable: false,
+ configurable: true,
+ }
+ );
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=chunk-load-error-handler.js.map
+
+ /***/
+ },
+
+ /***/ 9462: /***/ (module, exports) => {
+ "use strict";
+ /**
+ * Utilities for detecting chunk load errors and network failures.
+ *
+ * ChunkLoadError can come from:
+ * - Turbopack: error.name === 'ChunkLoadError'
+ * - Webpack: error.name === 'ChunkLoadError'
+ *
+ * We intentionally keep detection narrow to avoid false positives:
+ * - Server 4xx/5xx responses don't throw (they return Response objects)
+ * - We should NOT retry CORS errors, AbortErrors, or parsing failures
+ */ /**
+ * Detects if an error is a ChunkLoadError from Turbopack or webpack.
+ * This is the most reliable check - both bundlers explicitly set this error name.
+ */
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ 0 && 0;
+ function _export(target, all) {
+ for (var name in all)
+ Object.defineProperty(target, name, {
+ enumerable: true,
+ get: all[name],
+ });
+ }
+ _export(exports, {
+ isChunkLoadError: function () {
+ return isChunkLoadError;
+ },
+ isChunkOrNetworkError: function () {
+ return isChunkOrNetworkError;
+ },
+ isNetworkError: function () {
+ return isNetworkError;
+ },
+ });
+ function isChunkLoadError(error) {
+ if (!error || typeof error !== "object") return false;
+ return error.name === "ChunkLoadError";
+ }
+ function isNetworkError(error) {
+ if (!error || typeof error !== "object") return false;
+ const err = error;
+ // Never retry intentional aborts
+ if (err.name === "AbortError") return false;
+ // TypeError with specific fetch failure messages
+ // These occur when the network request itself fails (not CORS, not server error)
+ if (err.name === "TypeError") {
+ const message = err.message || "";
+ // Browser-specific network failure messages
+ // Chrome/Edge: "Failed to fetch"
+ // Firefox: "NetworkError when attempting to fetch resource"
+ // Safari: "Load failed" or "The Internet connection appears to be offline"
+ if (
+ message === "Failed to fetch" ||
+ message.startsWith("NetworkError when attempting to fetch") ||
+ message === "Load failed" ||
+ message.includes("Internet connection appears to be offline") ||
+ message.includes("network connection was lost")
+ ) {
+ return true;
+ }
+ }
+ return false;
+ }
+ function isChunkOrNetworkError(error) {
+ return isChunkLoadError(error) || isNetworkError(error);
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=is-chunk-load-error.js.map
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(3458)
+ __webpack_exec__(2604)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for edge-ssr-HASH.js
@@ -1,7 +1,24 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[676],
{
- /***/ 1564: /***/ (
+ /***/ 7046: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/edge-ssr",
+ function () {
+ return __webpack_require__(7142);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 7142: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -20,30 +37,13 @@
/***/
},
-
- /***/ 4300: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/edge-ssr",
- function () {
- return __webpack_require__(1564);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(4300)
+ __webpack_exec__(7046)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for head-HASH.js
@@ -1,34 +1,17 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[5350],
{
- /***/ 1548: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/head",
- function () {
- return __webpack_require__(4282);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 3952: /***/ (
+ /***/ 3770: /***/ (
module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(1653);
+ module.exports = __webpack_require__(9025);
/***/
},
- /***/ 4282: /***/ (
+ /***/ 6236: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -43,7 +26,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(3952);
+ __webpack_require__(3770);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_head__WEBPACK_IMPORTED_MODULE_1__
@@ -76,13 +59,30 @@
/***/
},
+
+ /***/ 6510: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/head",
+ function () {
+ return __webpack_require__(6236);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(1548)
+ __webpack_exec__(6510)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for index-HASH.js
@@ -1,24 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[3332],
{
- /***/ 6376: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/",
- function () {
- return __webpack_require__(8460);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 8460: /***/ (
+ /***/ 830: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -36,13 +19,30 @@
/***/
},
+
+ /***/ 1938: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/",
+ function () {
+ return __webpack_require__(830);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(6376)
+ __webpack_exec__(1938)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for link-HASH.js
@@ -1,7 +1,220 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[4672],
{
- /***/ 857: /***/ (module, exports, __webpack_require__) => {
+ /***/ 2774: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "useIntersection", {
+ enumerable: true,
+ get: function () {
+ return useIntersection;
+ },
+ });
+ const _react = __webpack_require__(4312);
+ const _requestidlecallback = __webpack_require__(9413);
+ const hasIntersectionObserver =
+ typeof IntersectionObserver === "function";
+ const observers = new Map();
+ const idList = [];
+ function createObserver(options) {
+ const id = {
+ root: options.root || null,
+ margin: options.rootMargin || "",
+ };
+ const existing = idList.find(
+ (obj) => obj.root === id.root && obj.margin === id.margin
+ );
+ let instance;
+ if (existing) {
+ instance = observers.get(existing);
+ if (instance) {
+ return instance;
+ }
+ }
+ const elements = new Map();
+ const observer = new IntersectionObserver((entries) => {
+ entries.forEach((entry) => {
+ const callback = elements.get(entry.target);
+ const isVisible =
+ entry.isIntersecting || entry.intersectionRatio > 0;
+ if (callback && isVisible) {
+ callback(isVisible);
+ }
+ });
+ }, options);
+ instance = {
+ id,
+ observer,
+ elements,
+ };
+ idList.push(id);
+ observers.set(id, instance);
+ return instance;
+ }
+ function observe(element, callback, options) {
+ const { id, observer, elements } = createObserver(options);
+ elements.set(element, callback);
+ observer.observe(element);
+ return function unobserve() {
+ elements.delete(element);
+ observer.unobserve(element);
+ // Destroy observer when there's nothing left to watch:
+ if (elements.size === 0) {
+ observer.disconnect();
+ observers.delete(id);
+ const index = idList.findIndex(
+ (obj) => obj.root === id.root && obj.margin === id.margin
+ );
+ if (index > -1) {
+ idList.splice(index, 1);
+ }
+ }
+ };
+ }
+ function useIntersection({ rootRef, rootMargin, disabled }) {
+ const isDisabled = disabled || !hasIntersectionObserver;
+ const [visible, setVisible] = (0, _react.useState)(false);
+ const elementRef = (0, _react.useRef)(null);
+ const setElement = (0, _react.useCallback)((element) => {
+ elementRef.current = element;
+ }, []);
+ (0, _react.useEffect)(() => {
+ if (hasIntersectionObserver) {
+ if (isDisabled || visible) return;
+ const element = elementRef.current;
+ if (element && element.tagName) {
+ const unobserve = observe(
+ element,
+ (isVisible) => isVisible && setVisible(isVisible),
+ {
+ root: rootRef?.current,
+ rootMargin,
+ }
+ );
+ return unobserve;
+ }
+ } else {
+ if (!visible) {
+ const idleCallback = (0,
+ _requestidlecallback.requestIdleCallback)(() => setVisible(true));
+ return () =>
+ (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
+ }
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
+ const resetVisible = (0, _react.useCallback)(() => {
+ setVisible(false);
+ }, []);
+ return [setElement, visible, resetVisible];
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=use-intersection.js.map
+
+ /***/
+ },
+
+ /***/ 3351: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "useMergedRef", {
+ enumerable: true,
+ get: function () {
+ return useMergedRef;
+ },
+ });
+ const _react = __webpack_require__(4312);
+ function useMergedRef(refA, refB) {
+ const cleanupA = (0, _react.useRef)(null);
+ const cleanupB = (0, _react.useRef)(null);
+ // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
+ // (this happens often if the user doesn't pass a ref to Link/Form/Image)
+ // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
+ // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
+ // (because it hasn't been updated for React 19)
+ // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
+ // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
+ return (0, _react.useCallback)(
+ (current) => {
+ if (current === null) {
+ const cleanupFnA = cleanupA.current;
+ if (cleanupFnA) {
+ cleanupA.current = null;
+ cleanupFnA();
+ }
+ const cleanupFnB = cleanupB.current;
+ if (cleanupFnB) {
+ cleanupB.current = null;
+ cleanupFnB();
+ }
+ } else {
+ if (refA) {
+ cleanupA.current = applyRef(refA, current);
+ }
+ if (refB) {
+ cleanupB.current = applyRef(refB, current);
+ }
+ }
+ },
+ [refA, refB]
+ );
+ }
+ function applyRef(refA, current) {
+ if (typeof refA === "function") {
+ const cleanup = refA(current);
+ if (typeof cleanup === "function") {
+ return cleanup;
+ } else {
+ return () => refA(null);
+ }
+ } else {
+ refA.current = current;
+ return () => {
+ refA.current = null;
+ };
+ }
+ }
+ if (
+ (typeof exports.default === "function" ||
+ (typeof exports.default === "object" && exports.default !== null)) &&
+ typeof exports.default.__esModule === "undefined"
+ ) {
+ Object.defineProperty(exports.default, "__esModule", {
+ value: true,
+ });
+ Object.assign(exports.default, exports);
+ module.exports = exports.default;
+ } //# sourceMappingURL=use-merged-ref.js.map
+
+ /***/
+ },
+
+ /***/ 3440: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(4757);
+
+ /***/
+ },
+
+ /***/ 4757: /***/ (module, exports, __webpack_require__) => {
"use strict";
/* __next_internal_client_entry_do_not_use__ cjs */
Object.defineProperty(exports, "__esModule", {
@@ -23,22 +236,22 @@
return useLinkStatus;
},
});
- const _interop_require_wildcard = __webpack_require__(8781);
+ const _interop_require_wildcard = __webpack_require__(1162);
const _jsxruntime = __webpack_require__(3108);
const _react = /*#__PURE__*/ _interop_require_wildcard._(
__webpack_require__(4312)
);
- const _resolvehref = __webpack_require__(4055);
- const _islocalurl = __webpack_require__(7175);
- const _formaturl = __webpack_require__(9674);
- const _utils = __webpack_require__(7424);
- const _addlocale = __webpack_require__(589);
- const _routercontextsharedruntime = __webpack_require__(7010);
- const _useintersection = __webpack_require__(2330);
- const _getdomainlocale = __webpack_require__(7207);
- const _addbasepath = __webpack_require__(9942);
- const _usemergedref = __webpack_require__(8067);
- const _erroronce = __webpack_require__(1945);
+ const _resolvehref = __webpack_require__(4691);
+ const _islocalurl = __webpack_require__(4763);
+ const _formaturl = __webpack_require__(3246);
+ const _utils = __webpack_require__(7372);
+ const _addlocale = __webpack_require__(1809);
+ const _routercontextsharedruntime = __webpack_require__(2254);
+ const _useintersection = __webpack_require__(2774);
+ const _getdomainlocale = __webpack_require__(8803);
+ const _addbasepath = __webpack_require__(5834);
+ const _usemergedref = __webpack_require__(3351);
+ const _erroronce = __webpack_require__(6021);
const prefetched = new Set();
function prefetch(router, href, as, options) {
if (false) {
@@ -417,168 +630,43 @@
/***/
},
- /***/ 1945: /***/ (__unused_webpack_module, exports) => {
- "use strict";
-
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "errorOnce", {
- enumerable: true,
- get: function () {
- return errorOnce;
+ /***/ 5326: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/link",
+ function () {
+ return __webpack_require__(9058);
},
- });
- let errorOnce = (_) => {};
+ ]);
if (false) {
- } //# sourceMappingURL=error-once.js.map
+ }
/***/
},
- /***/ 2330: /***/ (module, exports, __webpack_require__) => {
+ /***/ 6021: /***/ (__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
- Object.defineProperty(exports, "useIntersection", {
+ Object.defineProperty(exports, "errorOnce", {
enumerable: true,
get: function () {
- return useIntersection;
+ return errorOnce;
},
});
- const _react = __webpack_require__(4312);
- const _requestidlecallback = __webpack_require__(601);
- const hasIntersectionObserver =
- typeof IntersectionObserver === "function";
- const observers = new Map();
- const idList = [];
- function createObserver(options) {
- const id = {
- root: options.root || null,
- margin: options.rootMargin || "",
- };
- const existing = idList.find(
- (obj) => obj.root === id.root && obj.margin === id.margin
- );
- let instance;
- if (existing) {
- instance = observers.get(existing);
- if (instance) {
- return instance;
- }
- }
- const elements = new Map();
- const observer = new IntersectionObserver((entries) => {
- entries.forEach((entry) => {
- const callback = elements.get(entry.target);
- const isVisible =
- entry.isIntersecting || entry.intersectionRatio > 0;
- if (callback && isVisible) {
- callback(isVisible);
- }
- });
- }, options);
- instance = {
- id,
- observer,
- elements,
- };
- idList.push(id);
- observers.set(id, instance);
- return instance;
- }
- function observe(element, callback, options) {
- const { id, observer, elements } = createObserver(options);
- elements.set(element, callback);
- observer.observe(element);
- return function unobserve() {
- elements.delete(element);
- observer.unobserve(element);
- // Destroy observer when there's nothing left to watch:
- if (elements.size === 0) {
- observer.disconnect();
- observers.delete(id);
- const index = idList.findIndex(
- (obj) => obj.root === id.root && obj.margin === id.margin
- );
- if (index > -1) {
- idList.splice(index, 1);
- }
- }
- };
- }
- function useIntersection({ rootRef, rootMargin, disabled }) {
- const isDisabled = disabled || !hasIntersectionObserver;
- const [visible, setVisible] = (0, _react.useState)(false);
- const elementRef = (0, _react.useRef)(null);
- const setElement = (0, _react.useCallback)((element) => {
- elementRef.current = element;
- }, []);
- (0, _react.useEffect)(() => {
- if (hasIntersectionObserver) {
- if (isDisabled || visible) return;
- const element = elementRef.current;
- if (element && element.tagName) {
- const unobserve = observe(
- element,
- (isVisible) => isVisible && setVisible(isVisible),
- {
- root: rootRef?.current,
- rootMargin,
- }
- );
- return unobserve;
- }
- } else {
- if (!visible) {
- const idleCallback = (0,
- _requestidlecallback.requestIdleCallback)(() => setVisible(true));
- return () =>
- (0, _requestidlecallback.cancelIdleCallback)(idleCallback);
- }
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [isDisabled, rootMargin, rootRef, visible, elementRef.current]);
- const resetVisible = (0, _react.useCallback)(() => {
- setVisible(false);
- }, []);
- return [setElement, visible, resetVisible];
- }
- if (
- (typeof exports.default === "function" ||
- (typeof exports.default === "object" && exports.default !== null)) &&
- typeof exports.default.__esModule === "undefined"
- ) {
- Object.defineProperty(exports.default, "__esModule", {
- value: true,
- });
- Object.assign(exports.default, exports);
- module.exports = exports.default;
- } //# sourceMappingURL=use-intersection.js.map
-
- /***/
- },
-
- /***/ 4972: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/link",
- function () {
- return __webpack_require__(7600);
- },
- ]);
+ let errorOnce = (_) => {};
if (false) {
- }
+ } //# sourceMappingURL=error-once.js.map
/***/
},
- /***/ 7207: /***/ (module, exports, __webpack_require__) => {
+ /***/ 8803: /***/ (module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -590,7 +678,7 @@
return getDomainLocale;
},
});
- const _normalizetrailingslash = __webpack_require__(151);
+ const _normalizetrailingslash = __webpack_require__(1315);
const basePath =
/* unused pure expression or super */ null && (false || "");
function getDomainLocale(path, locale, locales, domainLocales) {
@@ -614,7 +702,7 @@
/***/
},
- /***/ 7600: /***/ (
+ /***/ 9058: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -629,7 +717,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(7830);
+ __webpack_require__(3440);
/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_link__WEBPACK_IMPORTED_MODULE_1__
@@ -659,101 +747,13 @@
/***/
},
-
- /***/ 7830: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(857);
-
- /***/
- },
-
- /***/ 8067: /***/ (module, exports, __webpack_require__) => {
- "use strict";
-
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "useMergedRef", {
- enumerable: true,
- get: function () {
- return useMergedRef;
- },
- });
- const _react = __webpack_require__(4312);
- function useMergedRef(refA, refB) {
- const cleanupA = (0, _react.useRef)(null);
- const cleanupB = (0, _react.useRef)(null);
- // NOTE: In theory, we could skip the wrapping if only one of the refs is non-null.
- // (this happens often if the user doesn't pass a ref to Link/Form/Image)
- // But this can cause us to leak a cleanup-ref into user code (previously via `<Link legacyBehavior>`),
- // and the user might pass that ref into ref-merging library that doesn't support cleanup refs
- // (because it hasn't been updated for React 19)
- // which can then cause things to blow up, because a cleanup-returning ref gets called with `null`.
- // So in practice, it's safer to be defensive and always wrap the ref, even on React 19.
- return (0, _react.useCallback)(
- (current) => {
- if (current === null) {
- const cleanupFnA = cleanupA.current;
- if (cleanupFnA) {
- cleanupA.current = null;
- cleanupFnA();
- }
- const cleanupFnB = cleanupB.current;
- if (cleanupFnB) {
- cleanupB.current = null;
- cleanupFnB();
- }
- } else {
- if (refA) {
- cleanupA.current = applyRef(refA, current);
- }
- if (refB) {
- cleanupB.current = applyRef(refB, current);
- }
- }
- },
- [refA, refB]
- );
- }
- function applyRef(refA, current) {
- if (typeof refA === "function") {
- const cleanup = refA(current);
- if (typeof cleanup === "function") {
- return cleanup;
- } else {
- return () => refA(null);
- }
- } else {
- refA.current = current;
- return () => {
- refA.current = null;
- };
- }
- }
- if (
- (typeof exports.default === "function" ||
- (typeof exports.default === "object" && exports.default !== null)) &&
- typeof exports.default.__esModule === "undefined"
- ) {
- Object.defineProperty(exports.default, "__esModule", {
- value: true,
- });
- Object.assign(exports.default, exports);
- module.exports = exports.default;
- } //# sourceMappingURL=use-merged-ref.js.map
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(4972)
+ __webpack_exec__(5326)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for routerDirect-HASH.js
@@ -1,17 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[188],
{
- /***/ 1179: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(9864);
-
- /***/
- },
-
- /***/ 1640: /***/ (
+ /***/ 2014: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -26,7 +16,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1179);
+ __webpack_require__(4169);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -46,7 +36,17 @@
/***/
},
- /***/ 2172: /***/ (
+ /***/ 4169: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(9700);
+
+ /***/
+ },
+
+ /***/ 4414: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
@@ -54,7 +54,7 @@
(window.__NEXT_P = window.__NEXT_P || []).push([
"/routerDirect",
function () {
- return __webpack_require__(1640);
+ return __webpack_require__(2014);
},
]);
if (false) {
@@ -68,7 +68,7 @@
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(2172)
+ __webpack_exec__(4414)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for script-HASH.js
@@ -1,17 +1,34 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[1209],
{
- /***/ 4977: /***/ (
+ /***/ 2591: /***/ (
module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(326);
+ module.exports = __webpack_require__(4634);
/***/
},
- /***/ 5887: /***/ (
+ /***/ 5030: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/script",
+ function () {
+ return __webpack_require__(7557);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 7557: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -26,7 +43,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(4977);
+ __webpack_require__(2591);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -58,30 +75,13 @@
/***/
},
-
- /***/ 6268: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/script",
- function () {
- return __webpack_require__(5887);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(6268)
+ __webpack_exec__(5030)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for withRouter-HASH.js
@@ -1,34 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[3263],
{
- /***/ 1179: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(9864);
-
- /***/
- },
-
- /***/ 2028: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/withRouter",
- function () {
- return __webpack_require__(4501);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 4501: /***/ (
+ /***/ 559: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -43,7 +16,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(3108);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(1179);
+ __webpack_require__(4169);
/* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_router__WEBPACK_IMPORTED_MODULE_1__
@@ -61,13 +34,40 @@
/***/
},
+
+ /***/ 726: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/withRouter",
+ function () {
+ return __webpack_require__(559);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 4169: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(9700);
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(2028)
+ __webpack_exec__(726)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for 2161-HASH.js
Diff too large to display
Diff for 2747-HASH.js
Diff too large to display
Diff for 4322-HASH.js
failed to diffDiff for main-HASH.js
Diff too large to display
Diff for main-app-HASH.js
@@ -1,64 +1,64 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[4977],
{
- /***/ 341: /***/ () => {
- /* (ignored) */
- /***/
- },
-
- /***/ 7353: /***/ (
+ /***/ 2637: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
) => {
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 375, 23)
+ __webpack_require__.t.bind(__webpack_require__, 7413, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 2972, 23)
+ __webpack_require__.t.bind(__webpack_require__, 9898, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 7508, 23)
+ __webpack_require__.t.bind(__webpack_require__, 9854, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 6043, 23)
+ __webpack_require__.t.bind(__webpack_require__, 9261, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 9797, 23)
+ __webpack_require__.t.bind(__webpack_require__, 867, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 2933, 23)
+ __webpack_require__.t.bind(__webpack_require__, 2463, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 4220, 23)
+ __webpack_require__.t.bind(__webpack_require__, 1866, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 97, 23)
+ __webpack_require__.t.bind(__webpack_require__, 9667, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 464, 23)
+ __webpack_require__.t.bind(__webpack_require__, 8822, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 619, 23)
+ __webpack_require__.t.bind(__webpack_require__, 1717, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 1464, 23)
+ __webpack_require__.t.bind(__webpack_require__, 5366, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.bind(__webpack_require__, 5297)
+ __webpack_require__.bind(__webpack_require__, 1155)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 7937, 23)
+ __webpack_require__.t.bind(__webpack_require__, 391, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 7584, 23)
+ __webpack_require__.t.bind(__webpack_require__, 7346, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 6826, 23)
+ __webpack_require__.t.bind(__webpack_require__, 1340, 23)
);
/***/
},
+
+ /***/ 2751: /***/ () => {
+ /* (ignored) */
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
@@ -66,8 +66,8 @@
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(
0,
- [5639, 4322],
- () => (__webpack_exec__(2193), __webpack_exec__(7353))
+ [8580, 2658],
+ () => (__webpack_exec__(9851), __webpack_exec__(2637))
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;Diff for webpack-HASH.js
@@ -205,7 +205,7 @@
/******/ __webpack_require__.u = (chunkId) => {
/******/ // return url for filenames based on template
/******/ return (
- "static/chunks/" + chunkId + "." + "9c9ddbde79ea2f29" + ".js"
+ "static/chunks/" + chunkId + "." + "871ca3fb4b1caa0e" + ".js"
);
/******/
};
@@ -380,6 +380,23 @@
/******/
};
/******/
+ /******/ // Next.js chunk cache clearing for retry logic
+ /******/ if (typeof globalThis !== "undefined") {
+ /******/ globalThis.__next_clear_chunk_cache__ = function (chunkId) {
+ /******/ // Only clear if not already loaded (0 means loaded)
+ /******/ if (
+ installedChunks[chunkId] !== 0 &&
+ installedChunks[chunkId] !== undefined
+ ) {
+ /******/ delete installedChunks[chunkId];
+ /******/
+ }
+ /******/
+ };
+ /******/
+ }
+ /******/
+ /******/
/******/ __webpack_require__.f.j = (chunkId, promises) => {
/******/ // JSONP chunk loading for javascript
/******/ var installedChunkData = __webpack_require__.o(Diff for app-page-exp..ntime.dev.js
Diff too large to display
Diff for app-page-exp..time.prod.js
failed to diffDiff for app-page-tur..ntime.dev.js
Diff too large to display
Diff for app-page-tur..time.prod.js
failed to diffDiff for app-page-tur..ntime.dev.js
Diff too large to display
Diff for app-page-tur..time.prod.js
Diff too large to display
Diff for app-page.runtime.dev.js
Diff too large to display
Diff for app-page.runtime.prod.js
Diff too large to display
Diff for pages-turbo...ntime.dev.js
Diff too large to display
Diff for pages-turbo...time.prod.js
Diff too large to display
Diff for pages.runtime.dev.js
Diff too large to display
Diff for pages.runtime.prod.js
Diff too large to display
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
acc1912 to
f2573ed
Compare
9ca9ab2 to
8eeb1f6
Compare
✅ Tests PassedUpdated 2026-01-05 10:41:17 UTC · Commit: 8eeb1f6 |

Uh oh!
There was an error while loading. Please reload this page.