-
Notifications
You must be signed in to change notification settings - Fork 29.5k
[OTel] fix: Root span name should not include high cardinality URL #75416
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
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 |
👋 @ijjk any chance you can take a look or know someone who can? Would love to push this forward. |
isRSCRequest | ||
? `RSC ${method} ${req.url}` | ||
: `${method} ${req.url}` | ||
? `RSC ${method}}` |
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.
There's an extraneous closing curly brace in the RSC method template string. The line:
? `RSC ${method}}`
should be:
? `RSC ${method}`
This will ensure the span name is formatted correctly without unexpected characters.
? `RSC ${method}}` | |
? `RSC ${method}` |
Spotted by Diamond
Is this helpful? React 👍 or 👎 to let us know.
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.
This would need updating in templates as well
spanName: `${method} ${req.url}`, |
Tests Passed |
I think it should be |
Updated PR to render {route} if it's available, based on: https://github.com/vercel/next.js/pull/75416/files#diff-6f4291cc2bfc5073fdca12a014011769e840ee68583db1468acef075f037015aL934-L945 |
// Get the route from root span attributes for better span naming | ||
const rootSpanAttributes = tracer.getRootSpanAttributes() | ||
const route = rootSpanAttributes?.get('next.route') | ||
const spanName = route ? `${method} ${route}` : `${method}` |
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 route information is being accessed too early in the request lifecycle, causing the span to always use just the HTTP method instead of including the route.
View Details
📝 Patch Details
diff --git a/packages/next/src/server/base-server.ts b/packages/next/src/server/base-server.ts
index 9b535c3a5c..080581f15b 100644
--- a/packages/next/src/server/base-server.ts
+++ b/packages/next/src/server/base-server.ts
@@ -885,16 +885,11 @@ export default abstract class Server<
const tracer = getTracer()
- // Get the route from root span attributes for better span naming
- const rootSpanAttributes = tracer.getRootSpanAttributes()
- const route = rootSpanAttributes?.get('next.route')
- const spanName = route ? `${method} ${route}` : `${method}`
-
return tracer.withPropagatedContext(req.headers, () => {
return tracer.trace(
BaseServerSpan.handleRequest,
{
- spanName,
+ spanName: method,
kind: SpanKind.SERVER,
attributes: {
'http.method': method,
Analysis
OpenTelemetry Span Naming Timing Issue in Next.js BaseServer
Bug Validation: CONFIRMED
The reported issue is a legitimate bug in the Next.js OpenTelemetry instrumentation. There is indeed a timing issue where route information is accessed before it becomes available during request processing.
Technical Analysis
The Problem
In packages/next/src/server/base-server.ts
(lines 888-891), the code attempts to access route information at the beginning of the handleRequest
method:
// Get the route from root span attributes for better span naming
const rootSpanAttributes = tracer.getRootSpanAttributes()
const route = rootSpanAttributes?.get('next.route')
const spanName = route ? `${method} ${route}` : `${method}`
However, the route information (next.route
) is only set much later in the request lifecycle through multiple setRootSpanAttribute('next.route', pathname)
calls that occur in:
renderPageComponent
method (line 2480)app-render.tsx
(line 1733)render.tsx
(line 1452)api-utils/index.ts
(line 28)
Request Flow Timeline
- Early:
handleRequest
method starts → tries to readnext.route
→ always undefined - Later: Request processing continues → routing resolution occurs
- Much Later:
renderPageComponent
and related methods →setRootSpanAttribute('next.route')
called - Finally:
finally
block correctly accesses route (lines 940+) → route is now available
Impact
- Span names are always incomplete: Instead of
"GET /api/users"
, spans are named just"GET"
- Reduced observability: Makes it harder to identify specific routes in OpenTelemetry traces
- Defeats the purpose: The feature intended to improve span naming with route information is ineffective
Root Cause
The timing issue occurs because:
- Route resolution happens during request processing, not before it
- The early access assumes route information is already available
- The existing
finally
block correctly demonstrates when route information is accessible
Fix Implementation
The fix removes the premature route access code and uses just the HTTP method for the initial span name, allowing the existing finally
block logic to properly update the span name once route information becomes available.
Before:
const rootSpanAttributes = tracer.getRootSpanAttributes()
const route = rootSpanAttributes?.get('next.route')
const spanName = route ? `${method} ${route}` : `${method}`
After:
// Use method initially; route will be set later in finally block
const spanName = method
This approach aligns with OpenTelemetry span naming best practices and maintains the existing functionality where the span name is properly updated with route information in the finally
block once it becomes available.
Verification
The fix was validated by:
- Code flow analysis: Confirmed
setRootSpanAttribute
calls happen afterhandleRequest
- Timing verification: Demonstrated the sequence where route access precedes route setting
- Documentation review: Verified against Next.js OpenTelemetry documentation expectations
- Best practices alignment: Confirmed fix follows OpenTelemetry naming conventions
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.
Actually, this seems right, @povilasv's initial approach of ${method}
makes sense in this case.
Stats from current PRDefault Build (Increase detected
|
vercel/next.js canary | povilasv/next.js otel-span-name | Change | |
---|---|---|---|
buildDuration | 19.2s | 16.7s | N/A |
buildDurationCached | 15.9s | 13.1s | N/A |
nodeModulesSize | 452 MB | 452 MB | N/A |
nextStartRea..uration (ms) | 704ms | 606ms | N/A |
Client Bundles (main, webpack)
vercel/next.js canary | povilasv/next.js otel-span-name | Change | |
---|---|---|---|
234bef07-HASH.js gzip | 54.3 kB | 54.3 kB | ✓ |
3414-HASH.js gzip | 4.32 kB | 4.32 kB | N/A |
5194.HASH.js gzip | 169 B | 169 B | ✓ |
8863-HASH.js gzip | 5.32 kB | 5.32 kB | N/A |
9304-HASH.js gzip | 46.5 kB | 46 kB | N/A |
framework-HASH.js gzip | 57.7 kB | 57.7 kB | N/A |
main-app-HASH.js gzip | 261 B | 258 B | N/A |
main-HASH.js gzip | 37 kB | 36.8 kB | N/A |
webpack-HASH.js gzip | 1.71 kB | 1.71 kB | N/A |
Overall change | 54.5 kB | 54.5 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | povilasv/next.js otel-span-name | Change | |
---|---|---|---|
polyfills-HASH.js gzip | 39.4 kB | 39.4 kB | ✓ |
Overall change | 39.4 kB | 39.4 kB | ✓ |
Client Pages
vercel/next.js canary | povilasv/next.js otel-span-name | Change | |
---|---|---|---|
_app-HASH.js gzip | 194 B | 193 B | N/A |
_error-HASH.js gzip | 182 B | 182 B | ✓ |
amp-HASH.js gzip | 502 B | 507 B | N/A |
css-HASH.js gzip | 335 B | 333 B | N/A |
dynamic-HASH.js gzip | 1.83 kB | 1.83 kB | N/A |
edge-ssr-HASH.js gzip | 255 B | 255 B | ✓ |
head-HASH.js gzip | 350 B | 352 B | N/A |
hooks-HASH.js gzip | 385 B | 383 B | N/A |
image-HASH.js gzip | 581 B | 580 B | N/A |
index-HASH.js gzip | 257 B | 259 B | N/A |
link-HASH.js gzip | 2.29 kB | 2.29 kB | N/A |
routerDirect..HASH.js gzip | 320 B | 318 B | N/A |
script-HASH.js gzip | 387 B | 386 B | N/A |
withRouter-HASH.js gzip | 315 B | 313 B | N/A |
1afbb74e6ecf..834.css gzip | 106 B | 106 B | ✓ |
Overall change | 543 B | 543 B | ✓ |
Client Build Manifests
vercel/next.js canary | povilasv/next.js otel-span-name | Change | |
---|---|---|---|
_buildManifest.js gzip | 770 B | 770 B | ✓ |
Overall change | 770 B | 770 B | ✓ |
Rendered Page Sizes
vercel/next.js canary | povilasv/next.js otel-span-name | Change | |
---|---|---|---|
index.html gzip | 524 B | 523 B | N/A |
link.html gzip | 538 B | 535 B | N/A |
withRouter.html gzip | 519 B | 518 B | N/A |
Overall change | 0 B | 0 B | ✓ |
Edge SSR bundle Size
vercel/next.js canary | povilasv/next.js otel-span-name | Change | |
---|---|---|---|
edge-ssr.js gzip | 121 kB | 121 kB | N/A |
page.js gzip | 242 kB | 241 kB | N/A |
Overall change | 0 B | 0 B | ✓ |
Middleware size Overall increase ⚠️
vercel/next.js canary | povilasv/next.js otel-span-name | Change | |
---|---|---|---|
middleware-b..fest.js gzip | 689 B | 695 B | N/A |
middleware-r..fest.js gzip | 156 B | 155 B | N/A |
middleware.js gzip | 33.1 kB | 33.2 kB | |
edge-runtime..pack.js gzip | 853 B | 853 B | ✓ |
Overall change | 33.9 kB | 34.1 kB |
Next Runtimes
vercel/next.js canary | povilasv/next.js otel-span-name | Change | |
---|---|---|---|
app-page-exp...dev.js gzip | 286 kB | 286 kB | N/A |
app-page-exp..prod.js gzip | 157 kB | 157 kB | ✓ |
app-page-tur...dev.js gzip | 286 kB | 286 kB | N/A |
app-page-tur..prod.js gzip | 157 kB | 157 kB | ✓ |
app-page-tur...dev.js gzip | 274 kB | 274 kB | ✓ |
app-page-tur..prod.js gzip | 151 kB | 151 kB | ✓ |
app-page.run...dev.js gzip | 274 kB | 274 kB | N/A |
app-page.run..prod.js gzip | 151 kB | 151 kB | ✓ |
app-route-ex...dev.js gzip | 70.4 kB | 70.4 kB | ✓ |
app-route-ex..prod.js gzip | 49.5 kB | 49.5 kB | ✓ |
app-route-tu...dev.js gzip | 70.4 kB | 70.4 kB | ✓ |
app-route-tu..prod.js gzip | 49.5 kB | 49.5 kB | ✓ |
app-route-tu...dev.js gzip | 69.8 kB | 69.8 kB | ✓ |
app-route-tu..prod.js gzip | 49.1 kB | 49.1 kB | ✓ |
app-route.ru...dev.js gzip | 69.7 kB | 69.7 kB | ✓ |
app-route.ru..prod.js gzip | 49.1 kB | 49.1 kB | ✓ |
dist_client_...dev.js gzip | 326 B | 326 B | ✓ |
dist_client_...dev.js gzip | 328 B | 328 B | ✓ |
dist_client_...dev.js gzip | 320 B | 320 B | ✓ |
dist_client_...dev.js gzip | 318 B | 318 B | ✓ |
pages-api-tu...dev.js gzip | 42.8 kB | 42.8 kB | ✓ |
pages-api-tu..prod.js gzip | 32.9 kB | 32.9 kB | ✓ |
pages-api.ru...dev.js gzip | 42.7 kB | 42.7 kB | ✓ |
pages-api.ru..prod.js gzip | 32.9 kB | 32.9 kB | ✓ |
pages-turbo....dev.js gzip | 53 kB | 53 kB | ✓ |
pages-turbo...prod.js gzip | 40.4 kB | 40.4 kB | ✓ |
pages.runtim...dev.js gzip | 53.1 kB | 53.1 kB | ✓ |
pages.runtim..prod.js gzip | 40.5 kB | 40.5 kB | ✓ |
server.runti..prod.js gzip | 77.9 kB | 77.9 kB | N/A |
Overall change | 1.71 MB | 1.71 MB | ✓ |
build cache Overall increase ⚠️
vercel/next.js canary | povilasv/next.js otel-span-name | Change | |
---|---|---|---|
0.pack gzip | 3.15 MB | 3.16 MB | |
index.pack gzip | 95.4 kB | 96.5 kB | |
Overall change | 3.25 MB | 3.26 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
failed to diff
Diff for _buildManifest.js
@@ -611,36 +611,36 @@ self.__BUILD_MANIFEST = (function (a, b, c) {
numHashes: NaN,
bitArray: [],
},
- "/": ["static\u002Fchunks\u002Fpages\u002Findex-a7fb71e5f6213aa9.js"],
+ "/": ["static\u002Fchunks\u002Fpages\u002Findex-75ff7f75f4c9520b.js"],
"/_error": [
- "static\u002Fchunks\u002Fpages\u002F_error-8f4e796cc66bb887.js",
+ "static\u002Fchunks\u002Fpages\u002F_error-21398e242bebd4bd.js",
],
- "/amp": ["static\u002Fchunks\u002Fpages\u002Famp-97249b00762d04b9.js"],
+ "/amp": ["static\u002Fchunks\u002Fpages\u002Famp-96acbf1ec5bf4dbf.js"],
"/css": [
"static\u002Fcss\u002Fded6b86ab9cc0a1f.css",
- "static\u002Fchunks\u002Fpages\u002Fcss-30fd1831d1c5954d.js",
+ "static\u002Fchunks\u002Fpages\u002Fcss-f0abb8f1d5d6aafc.js",
],
"/dynamic": [
- "static\u002Fchunks\u002Fpages\u002Fdynamic-933632969493a23b.js",
+ "static\u002Fchunks\u002Fpages\u002Fdynamic-a6de0bd7312dbe87.js",
],
"/edge-ssr": [
- "static\u002Fchunks\u002Fpages\u002Fedge-ssr-fbde6d2b170ddc8a.js",
+ "static\u002Fchunks\u002Fpages\u002Fedge-ssr-8437b1c654938313.js",
],
- "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-0fcabd05d9a7b019.js"],
- "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-52423902769dcda6.js"],
+ "/head": ["static\u002Fchunks\u002Fpages\u002Fhead-957c9636cda350bb.js"],
+ "/hooks": ["static\u002Fchunks\u002Fpages\u002Fhooks-48956e83e76a0b7c.js"],
"/image": [
- "static\u002Fchunks\u002F3414-0fcfc359d1626bc2.js",
- "static\u002Fchunks\u002Fpages\u002Fimage-bcf65fa5afa25af3.js",
+ "static\u002Fchunks\u002F4432-80834164a4d7ec68.js",
+ "static\u002Fchunks\u002Fpages\u002Fimage-00893f08e46cefe9.js",
],
- "/link": ["static\u002Fchunks\u002Fpages\u002Flink-107187295a8a4aea.js"],
+ "/link": ["static\u002Fchunks\u002Fpages\u002Flink-1312906a9876c4c3.js"],
"/routerDirect": [
- "static\u002Fchunks\u002Fpages\u002FrouterDirect-1422147417dba74a.js",
+ "static\u002Fchunks\u002Fpages\u002FrouterDirect-77c6ee7fa90e109b.js",
],
"/script": [
- "static\u002Fchunks\u002Fpages\u002Fscript-a68c215ba4b2c288.js",
+ "static\u002Fchunks\u002Fpages\u002Fscript-32f0c3e4bc363d50.js",
],
"/withRouter": [
- "static\u002Fchunks\u002Fpages\u002FwithRouter-0af6fb4f6ceaec8e.js",
+ "static\u002Fchunks\u002Fpages\u002FwithRouter-0a50058d9954ea8e.js",
],
sortedPages: [
"\u002F",
Diff for amp-HASH.js
@@ -1,17 +1,65 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[5034],
{
- /***/ 4105: /***/ (
+ /***/ 6212: /***/ (
+ __unused_webpack_module,
+ __webpack_exports__,
+ __webpack_require__
+ ) => {
+ "use strict";
+ __webpack_require__.r(__webpack_exports__);
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
+ /* harmony export */ config: () => /* binding */ config,
+ /* harmony export */ default: () => /* binding */ Amp,
+ /* harmony export */
+ });
+ /* harmony import */ var next_amp__WEBPACK_IMPORTED_MODULE_0__ =
+ __webpack_require__(7023);
+ /* harmony import */ var next_amp__WEBPACK_IMPORTED_MODULE_0___default =
+ /*#__PURE__*/ __webpack_require__.n(
+ next_amp__WEBPACK_IMPORTED_MODULE_0__
+ );
+
+ const config = {
+ amp: "hybrid",
+ };
+ function Amp(props) {
+ return (0, next_amp__WEBPACK_IMPORTED_MODULE_0__.useAmp)()
+ ? "AMP mode"
+ : "normal mode";
+ }
+
+ /***/
+ },
+
+ /***/ 7023: /***/ (
module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(4642);
+ module.exports = __webpack_require__(9926);
+
+ /***/
+ },
+
+ /***/ 8647: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/amp",
+ function () {
+ return __webpack_require__(6212);
+ },
+ ]);
+ if (false) {
+ }
/***/
},
- /***/ 4642: /***/ (module, exports, __webpack_require__) => {
+ /***/ 9926: /***/ (module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -27,8 +75,8 @@
const _react = /*#__PURE__*/ _interop_require_default._(
__webpack_require__(5977)
);
- const _ampcontextsharedruntime = __webpack_require__(8358);
- const _ampmode = __webpack_require__(242);
+ const _ampcontextsharedruntime = __webpack_require__(5418);
+ const _ampmode = __webpack_require__(3494);
function useAmp() {
// Don't assign the context value to a variable to save bytes
return (0, _ampmode.isInAmpMode)(
@@ -49,61 +97,13 @@
/***/
},
-
- /***/ 5261: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/amp",
- function () {
- return __webpack_require__(9550);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 9550: /***/ (
- __unused_webpack_module,
- __webpack_exports__,
- __webpack_require__
- ) => {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
- /* harmony export */ config: () => /* binding */ config,
- /* harmony export */ default: () => /* binding */ Amp,
- /* harmony export */
- });
- /* harmony import */ var next_amp__WEBPACK_IMPORTED_MODULE_0__ =
- __webpack_require__(4105);
- /* harmony import */ var next_amp__WEBPACK_IMPORTED_MODULE_0___default =
- /*#__PURE__*/ __webpack_require__.n(
- next_amp__WEBPACK_IMPORTED_MODULE_0__
- );
-
- const config = {
- amp: "hybrid",
- };
- function Amp(props) {
- return (0, next_amp__WEBPACK_IMPORTED_MODULE_0__.useAmp)()
- ? "AMP mode"
- : "normal mode";
- }
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(5261)
+ __webpack_exec__(8647)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;
Diff for css-HASH.js
@@ -1,7 +1,14 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[9813],
{
- /***/ 5267: /***/ (
+ /***/ 1978: /***/ (module) => {
+ // extracted by mini-css-extract-plugin
+ module.exports = { helloWorld: "css_helloWorld__aUdUq" };
+
+ /***/
+ },
+
+ /***/ 6941: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -15,7 +22,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(7765);
/* harmony import */ var _css_module_css__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(6320);
+ __webpack_require__(1978);
/* harmony import */ var _css_module_css__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
_css_module_css__WEBPACK_IMPORTED_MODULE_1__
@@ -35,14 +42,7 @@
/***/
},
- /***/ 6320: /***/ (module) => {
- // extracted by mini-css-extract-plugin
- module.exports = { helloWorld: "css_helloWorld__aUdUq" };
-
- /***/
- },
-
- /***/ 9643: /***/ (
+ /***/ 8685: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
@@ -50,7 +50,7 @@
(window.__NEXT_P = window.__NEXT_P || []).push([
"/css",
function () {
- return __webpack_require__(5267);
+ return __webpack_require__(6941);
},
]);
if (false) {
@@ -64,7 +64,7 @@
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(9643)
+ __webpack_exec__(8685)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;
Diff for dynamic-HASH.js
@@ -1,17 +1,63 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[2291],
{
- /***/ 2406: /***/ (
- module,
- __unused_webpack_exports,
+ /***/ 2839: /***/ (
+ __unused_webpack_module,
+ __webpack_exports__,
__webpack_require__
) => {
- module.exports = __webpack_require__(8949);
+ "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__(7765);
+ /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
+ __webpack_require__(7444);
+ /* 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() */ 1376)
+ .then(__webpack_require__.bind(__webpack_require__, 1376))
+ .then((mod) => mod.Hello),
+ {
+ loadableGenerated: {
+ webpack: () => [/*require.resolve*/ 1376],
+ },
+ }
+ );
+ 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;
/***/
},
- /***/ 4466: /***/ (
+ /***/ 4478: /***/ (
__unused_webpack_module,
exports,
__webpack_require__
@@ -53,7 +99,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
const _react = /*#__PURE__*/ _interop_require_default._(
__webpack_require__(5977)
);
- const _loadablecontextsharedruntime = __webpack_require__(8452);
+ const _loadablecontextsharedruntime = __webpack_require__(5792);
function resolve(obj) {
return obj && obj.default ? obj.default : obj;
}
@@ -288,63 +334,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
/***/
},
- /***/ 4545: /***/ (
- __unused_webpack_module,
- __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__(7765);
- /* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(2406);
- /* 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() */ 5194)
- .then(__webpack_require__.bind(__webpack_require__, 5194))
- .then((mod) => mod.Hello),
- {
- loadableGenerated: {
- webpack: () => [/*require.resolve*/ 5194],
- },
- }
- );
- 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;
-
- /***/
- },
-
- /***/ 8452: /***/ (
+ /***/ 5792: /***/ (
__unused_webpack_module,
exports,
__webpack_require__
@@ -371,24 +361,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
/***/
},
- /***/ 8931: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/dynamic",
- function () {
- return __webpack_require__(4545);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 8949: /***/ (module, exports, __webpack_require__) => {
+ /***/ 6153: /***/ (module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -421,7 +394,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
__webpack_require__(5977)
);
const _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(4466)
+ __webpack_require__(4478)
);
const isServerSide = "object" === "undefined";
// Normalize loader to return the module as form { default: Component } for `React.lazy`.
@@ -521,13 +494,40 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
/***/
},
+
+ /***/ 7444: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(6153);
+
+ /***/
+ },
+
+ /***/ 9805: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/dynamic",
+ function () {
+ return __webpack_require__(2839);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(8931)
+ __webpack_exec__(9805)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;
Diff for edge-ssr-HASH.js
@@ -1,24 +1,7 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[676],
{
- /***/ 4717: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/edge-ssr",
- function () {
- return __webpack_require__(7776);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 7776: /***/ (
+ /***/ 170: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -37,13 +20,30 @@
/***/
},
+
+ /***/ 8079: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/edge-ssr",
+ function () {
+ return __webpack_require__(170);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(4717)
+ __webpack_exec__(8079)
);
/******/ 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],
{
- /***/ 943: /***/ (
+ /***/ 1177: /***/ (
module,
__unused_webpack_exports,
__webpack_require__
) => {
- module.exports = __webpack_require__(2554);
+ module.exports = __webpack_require__(8366);
/***/
},
- /***/ 3829: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/head",
- function () {
- return __webpack_require__(4662);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
-
- /***/ 4662: /***/ (
+ /***/ 1992: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -43,7 +26,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(7765);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(943);
+ __webpack_require__(1177);
/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_head__WEBPACK_IMPORTED_MODULE_1__
@@ -76,13 +59,30 @@
/***/
},
+
+ /***/ 8751: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/head",
+ function () {
+ return __webpack_require__(1992);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(3829)
+ __webpack_exec__(8751)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;
Diff for hooks-HASH.js
@@ -1,7 +1,24 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[9804],
{
- /***/ 2452: /***/ (
+ /***/ 2227: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/hooks",
+ function () {
+ return __webpack_require__(2770);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 2770: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -59,30 +76,13 @@
/***/
},
-
- /***/ 6105: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/hooks",
- function () {
- return __webpack_require__(2452);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(6105)
+ __webpack_exec__(2227)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;
Diff for link-HASH.js
@@ -1,143 +1,63 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[4672],
{
- /***/ 1585: /***/ (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__(5977);
- const _requestidlecallback = __webpack_require__(356);
- 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(param) {
- let { rootRef, rootMargin, disabled } = param;
- 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 == null ? void 0 : 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
+ /***/ 2783: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(5926);
/***/
},
- /***/ 2621: /***/ (
- module,
- __unused_webpack_exports,
+ /***/ 4174: /***/ (
+ __unused_webpack_module,
+ __webpack_exports__,
__webpack_require__
) => {
- module.exports = __webpack_require__(5410);
+ "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__(7765);
+ /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
+ __webpack_require__(2783);
+ /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
+ /*#__PURE__*/ __webpack_require__.n(
+ next_link__WEBPACK_IMPORTED_MODULE_1__
+ );
+
+ function aLink(props) {
+ return /*#__PURE__*/ (0,
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", {
+ children: [
+ /*#__PURE__*/ (0,
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h3", {
+ children: "A Link page!",
+ }),
+ /*#__PURE__*/ (0,
+ react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
+ next_link__WEBPACK_IMPORTED_MODULE_1___default(),
+ {
+ href: "/",
+ children: "Go to /",
+ }
+ ),
+ ],
+ });
+ }
+ var __N_SSP = true;
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = aLink;
/***/
},
- /***/ 5410: /***/ (module, exports, __webpack_require__) => {
+ /***/ 5926: /***/ (module, exports, __webpack_require__) => {
"use strict";
/* __next_internal_client_entry_do_not_use__ cjs */
Object.defineProperty(exports, "__esModule", {
@@ -164,16 +84,16 @@
const _react = /*#__PURE__*/ _interop_require_wildcard._(
__webpack_require__(5977)
);
- const _resolvehref = __webpack_require__(224);
- const _islocalurl = __webpack_require__(7746);
- const _formaturl = __webpack_require__(315);
- const _utils = __webpack_require__(8709);
- const _addlocale = __webpack_require__(6358);
- const _routercontextsharedruntime = __webpack_require__(4095);
- const _useintersection = __webpack_require__(1585);
- const _getdomainlocale = __webpack_require__(8802);
- const _addbasepath = __webpack_require__(6151);
- const _usemergedref = __webpack_require__(9100);
+ const _resolvehref = __webpack_require__(6708);
+ const _islocalurl = __webpack_require__(6526);
+ const _formaturl = __webpack_require__(5575);
+ const _utils = __webpack_require__(3497);
+ const _addlocale = __webpack_require__(722);
+ const _routercontextsharedruntime = __webpack_require__(1235);
+ const _useintersection = __webpack_require__(8069);
+ const _getdomainlocale = __webpack_require__(9734);
+ const _addbasepath = __webpack_require__(4419);
+ const _usemergedref = __webpack_require__(6136);
const prefetched = new Set();
function prefetch(router, href, as, options) {
if (false) {
@@ -495,43 +415,7 @@
/***/
},
- /***/ 8802: /***/ (module, exports, __webpack_require__) => {
- "use strict";
-
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "getDomainLocale", {
- enumerable: true,
- get: function () {
- return getDomainLocale;
- },
- });
- const _normalizetrailingslash = __webpack_require__(1652);
- const basePath =
- /* unused pure expression or super */ null && (false || "");
- function getDomainLocale(path, locale, locales, domainLocales) {
- if (false) {
- } else {
- return false;
- }
- }
- 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=get-domain-locale.js.map
-
- /***/
- },
-
- /***/ 9100: /***/ (module, exports, __webpack_require__) => {
+ /***/ 6136: /***/ (module, exports, __webpack_require__) => {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -609,7 +493,7 @@
/***/
},
- /***/ 9693: /***/ (
+ /***/ 7047: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
@@ -617,7 +501,7 @@
(window.__NEXT_P = window.__NEXT_P || []).push([
"/link",
function () {
- return __webpack_require__(9948);
+ return __webpack_require__(4174);
},
]);
if (false) {
@@ -626,48 +510,164 @@
/***/
},
- /***/ 9948: /***/ (
- __unused_webpack_module,
- __webpack_exports__,
- __webpack_require__
- ) => {
+ /***/ 8069: /***/ (module, 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 */
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
});
- /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
- __webpack_require__(7765);
- /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(2621);
- /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default =
- /*#__PURE__*/ __webpack_require__.n(
- next_link__WEBPACK_IMPORTED_MODULE_1__
+ Object.defineProperty(exports, "useIntersection", {
+ enumerable: true,
+ get: function () {
+ return useIntersection;
+ },
+ });
+ const _react = __webpack_require__(5977);
+ const _requestidlecallback = __webpack_require__(3432);
+ 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
);
-
- function aLink(props) {
- return /*#__PURE__*/ (0,
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", {
- children: [
- /*#__PURE__*/ (0,
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h3", {
- children: "A Link page!",
- }),
- /*#__PURE__*/ (0,
- react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(
- next_link__WEBPACK_IMPORTED_MODULE_1___default(),
- {
- href: "/",
- children: "Go to /",
- }
- ),
- ],
+ 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(param) {
+ let { rootRef, rootMargin, disabled } = param;
+ 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 == null ? void 0 : 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
+
+ /***/
+ },
+
+ /***/ 9734: /***/ (module, exports, __webpack_require__) => {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "getDomainLocale", {
+ enumerable: true,
+ get: function () {
+ return getDomainLocale;
+ },
+ });
+ const _normalizetrailingslash = __webpack_require__(504);
+ const basePath =
+ /* unused pure expression or super */ null && (false || "");
+ function getDomainLocale(path, locale, locales, domainLocales) {
+ if (false) {
+ } else {
+ return false;
+ }
}
- var __N_SSP = true;
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = aLink;
+ 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=get-domain-locale.js.map
/***/
},
@@ -677,7 +677,7 @@
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(9693)
+ __webpack_exec__(7047)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;
Diff for script-HASH.js
@@ -1,7 +1,34 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[1209],
{
- /***/ 3699: /***/ (
+ /***/ 1008: /***/ (
+ module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ module.exports = __webpack_require__(2817);
+
+ /***/
+ },
+
+ /***/ 6951: /***/ (
+ __unused_webpack_module,
+ __unused_webpack_exports,
+ __webpack_require__
+ ) => {
+ (window.__NEXT_P = window.__NEXT_P || []).push([
+ "/script",
+ function () {
+ return __webpack_require__(8889);
+ },
+ ]);
+ if (false) {
+ }
+
+ /***/
+ },
+
+ /***/ 8889: /***/ (
__unused_webpack_module,
__webpack_exports__,
__webpack_require__
@@ -16,7 +43,7 @@
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ =
__webpack_require__(7765);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ =
- __webpack_require__(4802);
+ __webpack_require__(1008);
/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1___default =
/*#__PURE__*/ __webpack_require__.n(
next_script__WEBPACK_IMPORTED_MODULE_1__
@@ -48,40 +75,13 @@
/***/
},
-
- /***/ 4802: /***/ (
- module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- module.exports = __webpack_require__(8661);
-
- /***/
- },
-
- /***/ 7861: /***/ (
- __unused_webpack_module,
- __unused_webpack_exports,
- __webpack_require__
- ) => {
- (window.__NEXT_P = window.__NEXT_P || []).push([
- "/script",
- function () {
- return __webpack_require__(3699);
- },
- ]);
- if (false) {
- }
-
- /***/
- },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) =>
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(0, [636, 6593, 8792], () =>
- __webpack_exec__(7861)
+ __webpack_exec__(6951)
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;
Diff for 3414-HASH.js
Diff too large to display
Diff for 8863-HASH.js
@@ -1,8 +1,33 @@
"use strict";
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
- [8863],
+ [7009],
{
- /***/ 22: /***/ (module, exports, __webpack_require__) => {
+ /***/ 414: /***/ (
+ __unused_webpack_module,
+ exports,
+ __webpack_require__
+ ) => {
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "AmpStateContext", {
+ enumerable: true,
+ get: function () {
+ return AmpStateContext;
+ },
+ });
+ const _interop_require_default = __webpack_require__(2726);
+ const _react = /*#__PURE__*/ _interop_require_default._(
+ __webpack_require__(2224)
+ );
+ const AmpStateContext = _react.default.createContext({});
+ if (false) {
+ } //# sourceMappingURL=amp-context.shared-runtime.js.map
+
+ /***/
+ },
+
+ /***/ 1912: /***/ (module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", {
value: true,
});
@@ -12,7 +37,7 @@
return useMergedRef;
},
});
- const _react = __webpack_require__(2786);
+ const _react = __webpack_require__(2224);
function useMergedRef(refA, refB) {
const cleanupA = (0, _react.useRef)(null);
const cleanupB = (0, _react.useRef)(null);
@@ -78,7 +103,93 @@
/***/
},
- /***/ 639: /***/ (__unused_webpack_module, exports) => {
+ /***/ 2843: /***/ (
+ __unused_webpack_module,
+ exports,
+ __webpack_require__
+ ) => {
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "RouterContext", {
+ enumerable: true,
+ get: function () {
+ return RouterContext;
+ },
+ });
+ const _interop_require_default = __webpack_require__(2726);
+ const _react = /*#__PURE__*/ _interop_require_default._(
+ __webpack_require__(2224)
+ );
+ const RouterContext = _react.default.createContext(null);
+ if (false) {
+ } //# sourceMappingURL=router-context.shared-runtime.js.map
+
+ /***/
+ },
+
+ /***/ 3003: /***/ (
+ __unused_webpack_module,
+ exports,
+ __webpack_require__
+ ) => {
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "default", {
+ enumerable: true,
+ get: function () {
+ return _default;
+ },
+ });
+ const _findclosestquality = __webpack_require__(5045);
+ function defaultLoader(param) {
+ let { config, src, width, quality } = param;
+ if (false) {
+ }
+ const q = (0, _findclosestquality.findClosestQuality)(quality, config);
+ return (
+ config.path +
+ "?url=" +
+ encodeURIComponent(src) +
+ "&w=" +
+ width +
+ "&q=" +
+ q +
+ (src.startsWith("/_next/static/media/") && false ? 0 : "")
+ );
+ }
+ // We use this to determine if the import is the default loader
+ // or a custom loader defined by the user in next.config.js
+ defaultLoader.__next_img_default = true;
+ const _default = defaultLoader; //# sourceMappingURL=image-loader.js.map
+
+ /***/
+ },
+
+ /***/ 3810: /***/ (__unused_webpack_module, exports) => {
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "isInAmpMode", {
+ enumerable: true,
+ get: function () {
+ return isInAmpMode;
+ },
+ });
+ function isInAmpMode(param) {
+ let {
+ ampFirst = false,
+ hybrid = false,
+ hasQuery = false,
+ } = param === void 0 ? {} : param;
+ return ampFirst || (hybrid && hasQuery);
+ } //# sourceMappingURL=amp-mode.js.map
+
+ /***/
+ },
+
+ /***/ 5045: /***/ (__unused_webpack_module, exports) => {
Object.defineProperty(exports, "__esModule", {
value: true,
});
@@ -109,56 +220,7 @@
/***/
},
- /***/ 936: /***/ (__unused_webpack_module, exports) => {
- 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, {
- VALID_LOADERS: function () {
- return VALID_LOADERS;
- },
- imageConfigDefault: function () {
- return imageConfigDefault;
- },
- });
- const VALID_LOADERS = [
- "default",
- "imgix",
- "cloudinary",
- "akamai",
- "custom",
- ];
- const imageConfigDefault = {
- deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
- imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
- path: "/_next/image",
- loader: "default",
- loaderFile: "",
- domains: [],
- disableStaticImages: false,
- minimumCacheTTL: 60,
- formats: ["image/webp"],
- dangerouslyAllowSVG: false,
- contentSecurityPolicy: "script-src 'none'; frame-src 'none'; sandbox;",
- contentDispositionType: "attachment",
- localPatterns: undefined,
- remotePatterns: [],
- qualities: [75],
- unoptimized: false,
- }; //# sourceMappingURL=image-config.js.map
-
- /***/
- },
-
- /***/ 1268: /***/ (__unused_webpack_module, exports) => {
+ /***/ 5218: /***/ (__unused_webpack_module, exports) => {
/**
* A shared function, used on both client and server, to generate a SVG blur placeholder.
*/
@@ -212,7 +274,7 @@
/***/
},
- /***/ 1796: /***/ (module, exports, __webpack_require__) => {
+ /***/ 5402: /***/ (module, exports, __webpack_require__) => {
/* __next_internal_client_entry_do_not_use__ cjs */
Object.defineProperty(exports, "__esModule", {
value: true,
@@ -233,19 +295,19 @@
return defaultHead;
},
});
- const _interop_require_default = __webpack_require__(8182);
- const _interop_require_wildcard = __webpack_require__(8319);
- const _jsxruntime = __webpack_require__(1050);
+ const _interop_require_default = __webpack_require__(2726);
+ const _interop_require_wildcard = __webpack_require__(2527);
+ const _jsxruntime = __webpack_require__(8204);
const _react = /*#__PURE__*/ _interop_require_wildcard._(
- __webpack_require__(2786)
+ __webpack_require__(2224)
);
const _sideeffect = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(5581)
+ __webpack_require__(9319)
);
- const _ampcontextsharedruntime = __webpack_require__(3800);
- const _headmanagercontextsharedruntime = __webpack_require__(4950);
- const _ampmode = __webpack_require__(7824);
- const _warnonce = __webpack_require__(2854);
+ const _ampcontextsharedruntime = __webpack_require__(414);
+ const _headmanagercontextsharedruntime = __webpack_require__(3100);
+ const _ampmode = __webpack_require__(3810);
+ const _warnonce = __webpack_require__(4504);
function defaultHead(inAmpMode) {
if (inAmpMode === void 0) inAmpMode = false;
const head = [
@@ -410,7 +472,7 @@
/***/
},
- /***/ 2843: /***/ (
+ /***/ 6745: /***/ (
__unused_webpack_module,
exports,
__webpack_require__
@@ -424,9 +486,9 @@
return getImgProps;
},
});
- const _warnonce = __webpack_require__(2854);
- const _imageblursvg = __webpack_require__(1268);
- const _imageconfig = __webpack_require__(936);
+ const _warnonce = __webpack_require__(4504);
+ const _imageblursvg = __webpack_require__(5218);
+ const _imageconfig = __webpack_require__(9278);
const VALID_LOADING_VALUES =
/* unused pure expression or super */ null && [
"lazy",
@@ -858,239 +920,7 @@
/***/
},
- /***/ 3800: /***/ (
- __unused_webpack_module,
- exports,
- __webpack_require__
- ) => {
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "AmpStateContext", {
- enumerable: true,
- get: function () {
- return AmpStateContext;
- },
- });
- const _interop_require_default = __webpack_require__(8182);
- const _react = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(2786)
- );
- const AmpStateContext = _react.default.createContext({});
- if (false) {
- } //# sourceMappingURL=amp-context.shared-runtime.js.map
-
- /***/
- },
-
- /***/ 5581: /***/ (
- __unused_webpack_module,
- exports,
- __webpack_require__
- ) => {
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "default", {
- enumerable: true,
- get: function () {
- return SideEffect;
- },
- });
- const _react = __webpack_require__(2786);
- const isServer = "object" === "undefined";
- const useClientOnlyLayoutEffect = isServer
- ? () => {}
- : _react.useLayoutEffect;
- const useClientOnlyEffect = isServer ? () => {} : _react.useEffect;
- function SideEffect(props) {
- const { headManager, reduceComponentsToState } = props;
- function emitChange() {
- if (headManager && headManager.mountedInstances) {
- const headElements = _react.Children.toArray(
- Array.from(headManager.mountedInstances).filter(Boolean)
- );
- headManager.updateHead(
- reduceComponentsToState(headElements, props)
- );
- }
- }
- if (isServer) {
- var _headManager_mountedInstances;
- headManager == null
- ? void 0
- : (_headManager_mountedInstances = headManager.mountedInstances) ==
- null
- ? void 0
- : _headManager_mountedInstances.add(props.children);
- emitChange();
- }
- useClientOnlyLayoutEffect(() => {
- var _headManager_mountedInstances;
- headManager == null
- ? void 0
- : (_headManager_mountedInstances = headManager.mountedInstances) ==
- null
- ? void 0
- : _headManager_mountedInstances.add(props.children);
- return () => {
- var _headManager_mountedInstances;
- headManager == null
- ? void 0
- : (_headManager_mountedInstances =
- headManager.mountedInstances) == null
- ? void 0
- : _headManager_mountedInstances.delete(props.children);
- };
- });
- // We need to call `updateHead` method whenever the `SideEffect` is trigger in all
- // life-cycles: mount, update, unmount. However, if there are multiple `SideEffect`s
- // being rendered, we only trigger the method from the last one.
- // This is ensured by keeping the last unflushed `updateHead` in the `_pendingUpdate`
- // singleton in the layout effect pass, and actually trigger it in the effect pass.
- useClientOnlyLayoutEffect(() => {
- if (headManager) {
- headManager._pendingUpdate = emitChange;
- }
- return () => {
- if (headManager) {
- headManager._pendingUpdate = emitChange;
- }
- };
- });
- useClientOnlyEffect(() => {
- if (headManager && headManager._pendingUpdate) {
- headManager._pendingUpdate();
- headManager._pendingUpdate = null;
- }
- return () => {
- if (headManager && headManager._pendingUpdate) {
- headManager._pendingUpdate();
- headManager._pendingUpdate = null;
- }
- };
- });
- return null;
- } //# sourceMappingURL=side-effect.js.map
-
- /***/
- },
-
- /***/ 7053: /***/ (
- __unused_webpack_module,
- exports,
- __webpack_require__
- ) => {
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "RouterContext", {
- enumerable: true,
- get: function () {
- return RouterContext;
- },
- });
- const _interop_require_default = __webpack_require__(8182);
- const _react = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(2786)
- );
- const RouterContext = _react.default.createContext(null);
- if (false) {
- } //# sourceMappingURL=router-context.shared-runtime.js.map
-
- /***/
- },
-
- /***/ 7281: /***/ (
- __unused_webpack_module,
- exports,
- __webpack_require__
- ) => {
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "default", {
- enumerable: true,
- get: function () {
- return _default;
- },
- });
- const _findclosestquality = __webpack_require__(639);
- function defaultLoader(param) {
- let { config, src, width, quality } = param;
- if (false) {
- }
- const q = (0, _findclosestquality.findClosestQuality)(quality, config);
- return (
- config.path +
- "?url=" +
- encodeURIComponent(src) +
- "&w=" +
- width +
- "&q=" +
- q +
- (src.startsWith("/_next/static/media/") && false ? 0 : "")
- );
- }
- // We use this to determine if the import is the default loader
- // or a custom loader defined by the user in next.config.js
- defaultLoader.__next_img_default = true;
- const _default = defaultLoader; //# sourceMappingURL=image-loader.js.map
-
- /***/
- },
-
- /***/ 7480: /***/ (
- __unused_webpack_module,
- exports,
- __webpack_require__
- ) => {
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "ImageConfigContext", {
- enumerable: true,
- get: function () {
- return ImageConfigContext;
- },
- });
- const _interop_require_default = __webpack_require__(8182);
- const _react = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(2786)
- );
- const _imageconfig = __webpack_require__(936);
- const ImageConfigContext = _react.default.createContext(
- _imageconfig.imageConfigDefault
- );
- if (false) {
- } //# sourceMappingURL=image-config-context.shared-runtime.js.map
-
- /***/
- },
-
- /***/ 7824: /***/ (__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", {
- value: true,
- });
- Object.defineProperty(exports, "isInAmpMode", {
- enumerable: true,
- get: function () {
- return isInAmpMode;
- },
- });
- function isInAmpMode(param) {
- let {
- ampFirst = false,
- hybrid = false,
- hasQuery = false,
- } = param === void 0 ? {} : param;
- return ampFirst || (hybrid && hasQuery);
- } //# sourceMappingURL=amp-mode.js.map
-
- /***/
- },
-
- /***/ 8863: /***/ (module, exports, __webpack_require__) => {
+ /***/ 7009: /***/ (module, exports, __webpack_require__) => {
/* __next_internal_client_entry_do_not_use__ cjs */
Object.defineProperty(exports, "__esModule", {
value: true,
@@ -1101,27 +931,27 @@
return Image;
},
});
- const _interop_require_default = __webpack_require__(8182);
- const _interop_require_wildcard = __webpack_require__(8319);
- const _jsxruntime = __webpack_require__(1050);
+ const _interop_require_default = __webpack_require__(2726);
+ const _interop_require_wildcard = __webpack_require__(2527);
+ const _jsxruntime = __webpack_require__(8204);
const _react = /*#__PURE__*/ _interop_require_wildcard._(
- __webpack_require__(2786)
+ __webpack_require__(2224)
);
const _reactdom = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(1407)
+ __webpack_require__(1345)
);
const _head = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(1796)
+ __webpack_require__(5402)
);
- const _getimgprops = __webpack_require__(2843);
- const _imageconfig = __webpack_require__(936);
- const _imageconfigcontextsharedruntime = __webpack_require__(7480);
- const _warnonce = __webpack_require__(2854);
- const _routercontextsharedruntime = __webpack_require__(7053);
+ const _getimgprops = __webpack_require__(6745);
+ const _imageconfig = __webpack_require__(9278);
+ const _imageconfigcontextsharedruntime = __webpack_require__(9690);
+ const _warnonce = __webpack_require__(4504);
+ const _routercontextsharedruntime = __webpack_require__(2843);
const _imageloader = /*#__PURE__*/ _interop_require_default._(
- __webpack_require__(7281)
+ __webpack_require__(3003)
);
- const _usemergedref = __webpack_require__(22);
+ const _usemergedref = __webpack_require__(1912);
// This is replaced by webpack define plugin
const configEnv = {
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
@@ -1447,5 +1277,175 @@
/***/
},
+
+ /***/ 9278: /***/ (__unused_webpack_module, exports) => {
+ 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, {
+ VALID_LOADERS: function () {
+ return VALID_LOADERS;
+ },
+ imageConfigDefault: function () {
+ return imageConfigDefault;
+ },
+ });
+ const VALID_LOADERS = [
+ "default",
+ "imgix",
+ "cloudinary",
+ "akamai",
+ "custom",
+ ];
+ const imageConfigDefault = {
+ deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
+ imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
+ path: "/_next/image",
+ loader: "default",
+ loaderFile: "",
+ domains: [],
+ disableStaticImages: false,
+ minimumCacheTTL: 60,
+ formats: ["image/webp"],
+ dangerouslyAllowSVG: false,
+ contentSecurityPolicy: "script-src 'none'; frame-src 'none'; sandbox;",
+ contentDispositionType: "attachment",
+ localPatterns: undefined,
+ remotePatterns: [],
+ qualities: [75],
+ unoptimized: false,
+ }; //# sourceMappingURL=image-config.js.map
+
+ /***/
+ },
+
+ /***/ 9319: /***/ (
+ __unused_webpack_module,
+ exports,
+ __webpack_require__
+ ) => {
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "default", {
+ enumerable: true,
+ get: function () {
+ return SideEffect;
+ },
+ });
+ const _react = __webpack_require__(2224);
+ const isServer = "object" === "undefined";
+ const useClientOnlyLayoutEffect = isServer
+ ? () => {}
+ : _react.useLayoutEffect;
+ const useClientOnlyEffect = isServer ? () => {} : _react.useEffect;
+ function SideEffect(props) {
+ const { headManager, reduceComponentsToState } = props;
+ function emitChange() {
+ if (headManager && headManager.mountedInstances) {
+ const headElements = _react.Children.toArray(
+ Array.from(headManager.mountedInstances).filter(Boolean)
+ );
+ headManager.updateHead(
+ reduceComponentsToState(headElements, props)
+ );
+ }
+ }
+ if (isServer) {
+ var _headManager_mountedInstances;
+ headManager == null
+ ? void 0
+ : (_headManager_mountedInstances = headManager.mountedInstances) ==
+ null
+ ? void 0
+ : _headManager_mountedInstances.add(props.children);
+ emitChange();
+ }
+ useClientOnlyLayoutEffect(() => {
+ var _headManager_mountedInstances;
+ headManager == null
+ ? void 0
+ : (_headManager_mountedInstances = headManager.mountedInstances) ==
+ null
+ ? void 0
+ : _headManager_mountedInstances.add(props.children);
+ return () => {
+ var _headManager_mountedInstances;
+ headManager == null
+ ? void 0
+ : (_headManager_mountedInstances =
+ headManager.mountedInstances) == null
+ ? void 0
+ : _headManager_mountedInstances.delete(props.children);
+ };
+ });
+ // We need to call `updateHead` method whenever the `SideEffect` is trigger in all
+ // life-cycles: mount, update, unmount. However, if there are multiple `SideEffect`s
+ // being rendered, we only trigger the method from the last one.
+ // This is ensured by keeping the last unflushed `updateHead` in the `_pendingUpdate`
+ // singleton in the layout effect pass, and actually trigger it in the effect pass.
+ useClientOnlyLayoutEffect(() => {
+ if (headManager) {
+ headManager._pendingUpdate = emitChange;
+ }
+ return () => {
+ if (headManager) {
+ headManager._pendingUpdate = emitChange;
+ }
+ };
+ });
+ useClientOnlyEffect(() => {
+ if (headManager && headManager._pendingUpdate) {
+ headManager._pendingUpdate();
+ headManager._pendingUpdate = null;
+ }
+ return () => {
+ if (headManager && headManager._pendingUpdate) {
+ headManager._pendingUpdate();
+ headManager._pendingUpdate = null;
+ }
+ };
+ });
+ return null;
+ } //# sourceMappingURL=side-effect.js.map
+
+ /***/
+ },
+
+ /***/ 9690: /***/ (
+ __unused_webpack_module,
+ exports,
+ __webpack_require__
+ ) => {
+ Object.defineProperty(exports, "__esModule", {
+ value: true,
+ });
+ Object.defineProperty(exports, "ImageConfigContext", {
+ enumerable: true,
+ get: function () {
+ return ImageConfigContext;
+ },
+ });
+ const _interop_require_default = __webpack_require__(2726);
+ const _react = /*#__PURE__*/ _interop_require_default._(
+ __webpack_require__(2224)
+ );
+ const _imageconfig = __webpack_require__(9278);
+ const ImageConfigContext = _react.default.createContext(
+ _imageconfig.imageConfigDefault
+ );
+ if (false) {
+ } //# sourceMappingURL=image-config-context.shared-runtime.js.map
+
+ /***/
+ },
},
]);
Diff for 9304-HASH.js
Diff too large to display
Diff for main-HASH.js
Diff too large to display
Diff for main-app-HASH.js
@@ -1,67 +1,67 @@
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([
[4977],
{
- /***/ 3228: /***/ () => {
- /* (ignored) */
- /***/
- },
-
- /***/ 7425: /***/ (
+ /***/ 3476: /***/ (
__unused_webpack_module,
__unused_webpack_exports,
__webpack_require__
) => {
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 2673, 23)
+ __webpack_require__.t.bind(__webpack_require__, 3319, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 4710, 23)
+ __webpack_require__.t.bind(__webpack_require__, 3564, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 9138, 23)
+ __webpack_require__.t.bind(__webpack_require__, 4932, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 1049, 23)
+ __webpack_require__.t.bind(__webpack_require__, 5963, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 9207, 23)
+ __webpack_require__.t.bind(__webpack_require__, 4549, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 4379, 23)
+ __webpack_require__.t.bind(__webpack_require__, 3877, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 631, 23)
+ __webpack_require__.t.bind(__webpack_require__, 6769, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 3798, 23)
+ __webpack_require__.t.bind(__webpack_require__, 7356, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 6231, 23)
+ __webpack_require__.t.bind(__webpack_require__, 5521, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 4706, 23)
+ __webpack_require__.t.bind(__webpack_require__, 9520, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 7121, 23)
+ __webpack_require__.t.bind(__webpack_require__, 5947, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 6594, 23)
+ __webpack_require__.t.bind(__webpack_require__, 1720, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.bind(__webpack_require__, 2231)
+ __webpack_require__.bind(__webpack_require__, 977)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 9683, 23)
+ __webpack_require__.t.bind(__webpack_require__, 7569, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 174, 23)
+ __webpack_require__.t.bind(__webpack_require__, 1504, 23)
);
Promise.resolve(/* import() eager */).then(
- __webpack_require__.t.bind(__webpack_require__, 3496, 23)
+ __webpack_require__.t.bind(__webpack_require__, 4186, 23)
);
/***/
},
+
+ /***/ 3550: /***/ () => {
+ /* (ignored) */
+ /***/
+ },
},
/******/ (__webpack_require__) => {
// webpackRuntimeModules
@@ -69,8 +69,8 @@
__webpack_require__((__webpack_require__.s = moduleId));
/******/ __webpack_require__.O(
0,
- [5862, 9304],
- () => (__webpack_exec__(7007), __webpack_exec__(7425))
+ [3008, 2426],
+ () => (__webpack_exec__(6401), __webpack_exec__(3476))
);
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;
Diff for server.runtime.prod.js
Diff too large to display
Co-authored-by: JJ Kasper <[email protected]>
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.
Additional Comments:
packages/next/src/build/templates/edge-ssr-app.ts (lines 320-320):
The edge SSR app template still uses the old high-cardinality span naming pattern that includes the URL, inconsistent with the OpenTelemetry specification updates made to other templates.
View Details
📝 Patch Details
diff --git a/packages/next/src/build/templates/edge-ssr-app.ts b/packages/next/src/build/templates/edge-ssr-app.ts
index b3f7790ca5..902ed50548 100644
--- a/packages/next/src/build/templates/edge-ssr-app.ts
+++ b/packages/next/src/build/templates/edge-ssr-app.ts
@@ -317,7 +317,7 @@ async function requestHandler(
})
span.updateName(name)
} else {
- span.updateName(`${req.method} ${relativeUrl}`)
+ span.updateName(`${req.method}`)
}
})
diff --git a/packages/next/src/build/templates/edge-ssr.ts b/packages/next/src/build/templates/edge-ssr.ts
index 33ac154639..a8025369c7 100644
--- a/packages/next/src/build/templates/edge-ssr.ts
+++ b/packages/next/src/build/templates/edge-ssr.ts
@@ -296,7 +296,7 @@ async function requestHandler(
})
span.updateName(name)
} else {
- span.updateName(`${req.method} ${relativeUrl}`)
+ span.updateName(`${req.method}`)
}
})
Analysis
Edge runtime templates use high-cardinality OpenTelemetry span names violating specification
What fails: Edge SSR templates in edge-ssr-app.ts
(line 320) and edge-ssr.ts
(line 299) use span.updateName(\
${req.method} ${relativeUrl}`)` when no route match is available, creating high-cardinality span names like "GET /api/some/path"
How to reproduce:
- Deploy Next.js app with OpenTelemetry enabled
- Make request to edge route without a matched route pattern
- Observe span names in telemetry data
Result: Edge runtime spans show "GET /api/some/path" (high cardinality). Node.js runtime spans correctly show "GET" (low cardinality)
Expected: All runtimes should use span.updateName(\
${req.method}`)per [OpenTelemetry HTTP semantic conventions](https://opentelemetry.io/docs/specs/semconv/http/http-spans/) which state spans should use just
{method}` when no low-cardinality target is available
Evidence: Base-server.ts was already updated in commit 176ec01dc1 but edge templates were missed
Thank you for the PR! |
traceId: env.span.traceId, | ||
parentId: env.span.rootParentId, | ||
name: 'GET /api/app/param/data/edge', | ||
name: 'GET', |
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.
Why is this one not GET
/api/app/[param]/data/edge`?
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.
next.route
is not available at this point, which is measured in the very beginning of the request. We might remove it as we doubt if this span is helpful.
spanName: `${method}`, |
cc @ijjk who has more context
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.
next.route should always be available by the end of the span. So it should be available here.
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.
Ah these spans are never updated because it's next-server
crossing to the edge runtime. The comment above in the test even calls out wondering why we're asserting it being there. It would also only be present locally with next start
since edge runtime when deployed wouldn't use next-server
.
Some root spans don't have the
next.route
name available. In that case, we used thereq.url
in the name. However, the OTel docs recommend using only the method if the target is high cardinality. Therefore, removed the usage ofreq.url
in the name of root spans.x-ref: OTel docs
Related: #59645