next 15.2.0-canary.51 → 15.2.0-canary.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of next might be problematic. Click here for more details.
- package/dist/bin/next +1 -1
- package/dist/build/index.js +2 -2
- package/dist/build/load-jsconfig.d.ts +1 -0
- package/dist/build/load-jsconfig.js +2 -1
- package/dist/build/load-jsconfig.js.map +1 -1
- package/dist/build/swc/index.js +1 -1
- package/dist/build/webpack-config.d.ts +3 -1
- package/dist/build/webpack-config.js +44 -23
- package/dist/build/webpack-config.js.map +1 -1
- package/dist/client/app-bootstrap.js +1 -1
- package/dist/client/components/errors/attach-hydration-error-state.js +37 -24
- package/dist/client/components/errors/attach-hydration-error-state.js.map +1 -1
- package/dist/client/components/errors/hydration-error-info.js +86 -19
- package/dist/client/components/errors/hydration-error-info.js.map +1 -1
- package/dist/client/components/is-hydration-error.d.ts +1 -0
- package/dist/client/components/is-hydration-error.js +41 -3
- package/dist/client/components/is-hydration-error.js.map +1 -1
- package/dist/client/components/react-dev-overlay/_experimental/internal/container/errors.js +1 -2
- package/dist/client/components/react-dev-overlay/_experimental/internal/container/errors.js.map +1 -1
- package/dist/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/component-stack-pseudo-html.d.ts +1 -56
- package/dist/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/component-stack-pseudo-html.js +4 -240
- package/dist/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/component-stack-pseudo-html.js.map +1 -1
- package/dist/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/component-stack-pseudo-html.stories.js +0 -21
- package/dist/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/component-stack-pseudo-html.stories.js.map +1 -1
- package/dist/client/components/react-dev-overlay/hydration-diff/diff-view.d.ts +54 -0
- package/dist/client/components/react-dev-overlay/hydration-diff/diff-view.js +101 -0
- package/dist/client/components/react-dev-overlay/hydration-diff/diff-view.js.map +1 -0
- package/dist/client/components/react-dev-overlay/internal/container/Errors.js +1 -2
- package/dist/client/components/react-dev-overlay/internal/container/Errors.js.map +1 -1
- package/dist/client/components/react-dev-overlay/internal/container/RuntimeError/component-stack-pseudo-html.d.ts +2 -56
- package/dist/client/components/react-dev-overlay/internal/container/RuntimeError/component-stack-pseudo-html.js +28 -227
- package/dist/client/components/react-dev-overlay/internal/container/RuntimeError/component-stack-pseudo-html.js.map +1 -1
- package/dist/client/components/react-dev-overlay/internal/container/RuntimeError/index.js +1 -1
- package/dist/client/components/react-dev-overlay/internal/container/RuntimeError/index.js.map +1 -1
- package/dist/client/components/react-dev-overlay/internal/styles/ComponentStyles.js +3 -1
- package/dist/client/components/react-dev-overlay/internal/styles/ComponentStyles.js.map +1 -1
- package/dist/client/index.js +1 -1
- package/dist/compiled/next-server/app-page-experimental.runtime.dev.js +2 -2
- package/dist/compiled/next-server/app-page-experimental.runtime.dev.js.map +1 -1
- package/dist/compiled/next-server/app-page.runtime.dev.js +2 -2
- package/dist/compiled/next-server/app-page.runtime.dev.js.map +1 -1
- package/dist/compiled/next-server/server.runtime.prod.js +6 -6
- package/dist/compiled/next-server/server.runtime.prod.js.map +1 -1
- package/dist/esm/build/index.js +2 -2
- package/dist/esm/build/load-jsconfig.js +2 -1
- package/dist/esm/build/load-jsconfig.js.map +1 -1
- package/dist/esm/build/swc/index.js +1 -1
- package/dist/esm/build/webpack-config.js +44 -23
- package/dist/esm/build/webpack-config.js.map +1 -1
- package/dist/esm/client/app-bootstrap.js +1 -1
- package/dist/esm/client/components/errors/attach-hydration-error-state.js +38 -25
- package/dist/esm/client/components/errors/attach-hydration-error-state.js.map +1 -1
- package/dist/esm/client/components/errors/hydration-error-info.js +87 -20
- package/dist/esm/client/components/errors/hydration-error-info.js.map +1 -1
- package/dist/esm/client/components/is-hydration-error.js +36 -2
- package/dist/esm/client/components/is-hydration-error.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/errors.js +1 -2
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/errors.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/component-stack-pseudo-html.js +3 -287
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/component-stack-pseudo-html.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/component-stack-pseudo-html.stories.js +0 -21
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/component-stack-pseudo-html.stories.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/hydration-diff/diff-view.js +132 -0
- package/dist/esm/client/components/react-dev-overlay/hydration-diff/diff-view.js.map +1 -0
- package/dist/esm/client/components/react-dev-overlay/internal/container/Errors.js +1 -2
- package/dist/esm/client/components/react-dev-overlay/internal/container/Errors.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/internal/container/RuntimeError/component-stack-pseudo-html.js +12 -271
- package/dist/esm/client/components/react-dev-overlay/internal/container/RuntimeError/component-stack-pseudo-html.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/internal/container/RuntimeError/index.js +1 -1
- package/dist/esm/client/components/react-dev-overlay/internal/container/RuntimeError/index.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/internal/styles/ComponentStyles.js +3 -1
- package/dist/esm/client/components/react-dev-overlay/internal/styles/ComponentStyles.js.map +1 -1
- package/dist/esm/client/index.js +1 -1
- package/dist/esm/server/config.js +1 -1
- package/dist/esm/server/dev/hot-reloader-turbopack.js +1 -1
- package/dist/esm/server/dev/hot-reloader-webpack.js +1 -1
- package/dist/esm/server/lib/app-info-log.js +1 -1
- package/dist/esm/server/lib/start-server.js +1 -1
- package/dist/server/config.js +1 -1
- package/dist/server/dev/hot-reloader-turbopack.js +1 -1
- package/dist/server/dev/hot-reloader-webpack.js +1 -1
- package/dist/server/lib/app-info-log.js +1 -1
- package/dist/server/lib/start-server.js +1 -1
- package/dist/telemetry/anonymous-meta.js +1 -1
- package/dist/telemetry/events/session-stopped.js +2 -2
- package/dist/telemetry/events/version.js +2 -2
- package/package.json +15 -15
|
@@ -17,258 +17,22 @@ _export(exports, {
|
|
|
17
17
|
return PSEUDO_HTML_DIFF_STYLES;
|
|
18
18
|
},
|
|
19
19
|
PseudoHtmlDiff: function() {
|
|
20
|
-
return PseudoHtmlDiff;
|
|
20
|
+
return _diffview.PseudoHtmlDiff;
|
|
21
21
|
}
|
|
22
22
|
});
|
|
23
23
|
const _tagged_template_literal_loose = require("@swc/helpers/_/_tagged_template_literal_loose");
|
|
24
|
-
const _jsxruntime = require("react/jsx-runtime");
|
|
25
|
-
const _react = require("react");
|
|
26
|
-
const _collapseicon = require("../../icons/collapse-icon");
|
|
27
24
|
const _nooptemplate = require("../../helpers/noop-template");
|
|
25
|
+
const _diffview = require("../../../../hydration-diff/diff-view");
|
|
28
26
|
function _templateObject() {
|
|
29
27
|
const data = _tagged_template_literal_loose._([
|
|
30
|
-
"\n [data-nextjs-container-errors-pseudo-html] {\n padding: var(--size-3) 0;\n margin: var(--size-2) var(--size-4) var(--size-4);\n border: 1px solid var(--color-gray-400);\n background: var(--color-background-200);\n color: var(--color-syntax-constant);\n font-family: var(--font-stack-monospace);\n font-size: var(--size-font-smaller);\n line-height: var(--size-4);\n border-radius: var(--size-2);\n }\n [data-nextjs-container-errors-pseudo-html-line] {\n display: inline-block;\n width: 100%;\n padding-left: var(--size-10);\n line-height: calc(5 / 3);\n }\n [data-nextjs-container-errors-pseudo-html-line--error] {\n background: var(--color-amber-
|
|
31
|
-
"\n [data-nextjs-container-errors-pseudo-html--hint] {\n display: inline-block;\n font-size: 0;\n height: 0;\n }\n [data-nextjs-container-errors-pseudo-html--tag-adjacent='false'] {\n color: var(--color-accents-1);\n }\n .nextjs__container_errors__component-stack {\n margin: 0;\n }\n .nextjs__container_errors__component-stack code {\n display: block;\n width: 100%;\n white-space: pre-wrap;\n }\n .error-overlay-hydration-error-diff-plus-icon {\n color: var(--color-green-900);\n }\n .error-overlay-hydration-error-diff-minus-icon {\n color: var(--color-red-900);\n }\n"
|
|
28
|
+
"\n [data-nextjs-container-errors-pseudo-html] {\n padding: var(--size-3) 0;\n margin: var(--size-2) var(--size-4) var(--size-4);\n border: 1px solid var(--color-gray-400);\n background: var(--color-background-200);\n color: var(--color-syntax-constant);\n font-family: var(--font-stack-monospace);\n font-size: var(--size-font-smaller);\n line-height: var(--size-4);\n border-radius: var(--size-2);\n }\n [data-nextjs-container-errors-pseudo-html-line] {\n display: inline-block;\n width: 100%;\n padding-left: var(--size-10);\n line-height: calc(5 / 3);\n }\n [data-nextjs-container-errors-pseudo-html-line--error] {\n background: var(--color-amber-100);\n font-weight: bold;\n }\n [data-nextjs-container-errors-pseudo-html-collapse-button] {\n all: unset;\n margin-left: var(--size-3);\n &:focus {\n outline: none;\n }\n }\n [data-nextjs-container-errors-pseudo-html--diff='add'] {\n background: var(--color-green-300);\n }\n [data-nextjs-container-errors-pseudo-html-line-sign] {\n margin-left: calc(var(--size-6) * -1);\n margin-right: var(--size-6);\n }\n [data-nextjs-container-errors-pseudo-html--diff='add']\n [data-nextjs-container-errors-pseudo-html-line-sign] {\n color: var(--color-green-900);\n }\n [data-nextjs-container-errors-pseudo-html--diff='remove'] {\n background: var(--color-red-300);\n }\n [data-nextjs-container-errors-pseudo-html--diff='remove']\n [data-nextjs-container-errors-pseudo-html-line-sign] {\n color: var(--color-red-900);\n margin-left: calc(var(--size-6) * -1);\n margin-right: var(--size-6);\n }\n [data-nextjs-container-errors-pseudo-html-line--error]\n [data-nextjs-container-errors-pseudo-html-line-sign] {\n color: var(--color-amber-900);\n }\n ",
|
|
29
|
+
"\n [data-nextjs-container-errors-pseudo-html--hint] {\n display: inline-block;\n font-size: 0;\n height: 0;\n }\n [data-nextjs-container-errors-pseudo-html--tag-adjacent='false'] {\n color: var(--color-accents-1);\n }\n .nextjs__container_errors__component-stack {\n margin: 0;\n }\n [data-nextjs-container-errors-pseudo-html-collapse='true']\n .nextjs__container_errors__component-stack\n code {\n max-height: 100px;\n mask-image: linear-gradient(to top, rgba(0, 0, 0, 0) 0%, black 50%);\n }\n .nextjs__container_errors__component-stack code {\n display: block;\n width: 100%;\n white-space: pre-wrap;\n scroll-snap-type: y mandatory;\n overflow-y: hidden;\n }\n [data-nextjs-container-errors-pseudo-html--diff],\n [data-nextjs-container-errors-pseudo-html-line--error] {\n scroll-snap-align: center;\n }\n .error-overlay-hydration-error-diff-plus-icon {\n color: var(--color-green-900);\n }\n .error-overlay-hydration-error-diff-minus-icon {\n color: var(--color-red-900);\n }\n"
|
|
32
30
|
]);
|
|
33
31
|
_templateObject = function() {
|
|
34
32
|
return data;
|
|
35
33
|
};
|
|
36
34
|
return data;
|
|
37
35
|
}
|
|
38
|
-
function getAdjacentProps(isAdj) {
|
|
39
|
-
return {
|
|
40
|
-
'data-nextjs-container-errors-pseudo-html--tag-adjacent': isAdj
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
function PseudoHtmlDiff(param) {
|
|
44
|
-
let { componentStackFrames, firstContent, secondContent, hydrationMismatchType, reactOutputComponentDiff, ...props } = param;
|
|
45
|
-
const isHtmlTagsWarning = hydrationMismatchType === 'tag';
|
|
46
|
-
const isReactHydrationDiff = !!reactOutputComponentDiff;
|
|
47
|
-
// For text mismatch, mismatched text will take 2 rows, so we display 4 rows of component stack
|
|
48
|
-
const MAX_NON_COLLAPSED_FRAMES = isHtmlTagsWarning ? 6 : 4;
|
|
49
|
-
const [isHtmlCollapsed, toggleCollapseHtml] = (0, _react.useState)(true);
|
|
50
|
-
const htmlComponents = (0, _react.useMemo)(()=>{
|
|
51
|
-
const componentStacks = [];
|
|
52
|
-
// React 19 unified mismatch
|
|
53
|
-
if (isReactHydrationDiff) {
|
|
54
|
-
let currentComponentIndex = componentStackFrames.length - 1;
|
|
55
|
-
const reactComponentDiffLines = reactOutputComponentDiff.split('\n');
|
|
56
|
-
const diffHtmlStack = [];
|
|
57
|
-
reactComponentDiffLines.forEach((line, index)=>{
|
|
58
|
-
let trimmedLine = line.trim();
|
|
59
|
-
const isDiffLine = trimmedLine[0] === '+' || trimmedLine[0] === '-';
|
|
60
|
-
const spaces = ' '.repeat(Math.max(componentStacks.length * 2, 1));
|
|
61
|
-
if (isDiffLine) {
|
|
62
|
-
const sign = trimmedLine[0];
|
|
63
|
-
trimmedLine = trimmedLine.slice(1).trim() // trim spaces after sign
|
|
64
|
-
;
|
|
65
|
-
diffHtmlStack.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
|
|
66
|
-
"data-nextjs-container-errors-pseudo-html-line": true,
|
|
67
|
-
"data-nextjs-container-errors-pseudo-html--diff": sign === '+' ? 'add' : 'remove',
|
|
68
|
-
children: /*#__PURE__*/ (0, _jsxruntime.jsxs)("span", {
|
|
69
|
-
children: [
|
|
70
|
-
spaces.slice(2),
|
|
71
|
-
trimmedLine,
|
|
72
|
-
'\n'
|
|
73
|
-
]
|
|
74
|
-
})
|
|
75
|
-
}, 'comp-diff' + index));
|
|
76
|
-
} else if (currentComponentIndex >= 0) {
|
|
77
|
-
const isUserLandComponent = trimmedLine.startsWith('<' + componentStackFrames[currentComponentIndex].component);
|
|
78
|
-
// If it's matched userland component or it's ... we will keep the component stack in diff
|
|
79
|
-
if (isUserLandComponent || trimmedLine === '...') {
|
|
80
|
-
currentComponentIndex--;
|
|
81
|
-
componentStacks.push(/*#__PURE__*/ (0, _jsxruntime.jsxs)("span", {
|
|
82
|
-
"data-nextjs-container-errors-pseudo-html-line": true,
|
|
83
|
-
children: [
|
|
84
|
-
spaces,
|
|
85
|
-
trimmedLine,
|
|
86
|
-
'\n'
|
|
87
|
-
]
|
|
88
|
-
}, 'comp-diff' + index));
|
|
89
|
-
} else if (!isHtmlCollapsed) {
|
|
90
|
-
componentStacks.push(/*#__PURE__*/ (0, _jsxruntime.jsxs)("span", {
|
|
91
|
-
"data-nextjs-container-errors-pseudo-html-line": true,
|
|
92
|
-
children: [
|
|
93
|
-
spaces,
|
|
94
|
-
trimmedLine,
|
|
95
|
-
'\n'
|
|
96
|
-
]
|
|
97
|
-
}, 'comp-diff' + index));
|
|
98
|
-
}
|
|
99
|
-
} else if (!isHtmlCollapsed) {
|
|
100
|
-
// In general, if it's not collapsed, show the whole diff
|
|
101
|
-
componentStacks.push(/*#__PURE__*/ (0, _jsxruntime.jsxs)("span", {
|
|
102
|
-
"data-nextjs-container-errors-pseudo-html-line": true,
|
|
103
|
-
children: [
|
|
104
|
-
spaces,
|
|
105
|
-
trimmedLine,
|
|
106
|
-
'\n'
|
|
107
|
-
]
|
|
108
|
-
}, 'comp-diff' + index));
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
return componentStacks.concat(diffHtmlStack);
|
|
112
|
-
}
|
|
113
|
-
const nestedHtmlStack = [];
|
|
114
|
-
const tagNames = isHtmlTagsWarning ? [
|
|
115
|
-
firstContent.replace(/<|>/g, ''),
|
|
116
|
-
secondContent.replace(/<|>/g, '')
|
|
117
|
-
] : [];
|
|
118
|
-
let lastText = '';
|
|
119
|
-
const componentStack = componentStackFrames.map((frame)=>frame.component).reverse();
|
|
120
|
-
// [child index, parent index]
|
|
121
|
-
const matchedIndex = [
|
|
122
|
-
-1,
|
|
123
|
-
-1
|
|
124
|
-
];
|
|
125
|
-
if (isHtmlTagsWarning) {
|
|
126
|
-
// Reverse search for the child tag
|
|
127
|
-
for(let i = componentStack.length - 1; i >= 0; i--){
|
|
128
|
-
if (componentStack[i] === tagNames[0]) {
|
|
129
|
-
matchedIndex[0] = i;
|
|
130
|
-
break;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
// Start searching parent tag from child tag above
|
|
134
|
-
for(let i = matchedIndex[0] - 1; i >= 0; i--){
|
|
135
|
-
if (componentStack[i] === tagNames[1]) {
|
|
136
|
-
matchedIndex[1] = i;
|
|
137
|
-
break;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
componentStack.forEach((component, index, componentList)=>{
|
|
142
|
-
const spaces = ' '.repeat(nestedHtmlStack.length * 2);
|
|
143
|
-
// When component is the server or client tag name, highlight it
|
|
144
|
-
const isHighlightedTag = isHtmlTagsWarning ? index === matchedIndex[0] || index === matchedIndex[1] : tagNames.includes(component);
|
|
145
|
-
const isAdjacentTag = isHighlightedTag || Math.abs(index - matchedIndex[0]) <= 1 || Math.abs(index - matchedIndex[1]) <= 1;
|
|
146
|
-
const isLastFewFrames = !isHtmlTagsWarning && index >= componentList.length - 6;
|
|
147
|
-
const adjProps = getAdjacentProps(isAdjacentTag);
|
|
148
|
-
if (isHtmlTagsWarning && isAdjacentTag || isLastFewFrames) {
|
|
149
|
-
const codeLine = /*#__PURE__*/ (0, _jsxruntime.jsxs)("span", {
|
|
150
|
-
"data-nextjs-container-errors-pseudo-html-line": true,
|
|
151
|
-
...isHighlightedTag ? {
|
|
152
|
-
'data-nextjs-container-errors-pseudo-html-line--error': true
|
|
153
|
-
} : undefined,
|
|
154
|
-
children: [
|
|
155
|
-
spaces,
|
|
156
|
-
/*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
|
|
157
|
-
...adjProps,
|
|
158
|
-
children: "<" + component + ">\n"
|
|
159
|
-
})
|
|
160
|
-
]
|
|
161
|
-
});
|
|
162
|
-
lastText = component;
|
|
163
|
-
const wrappedCodeLine = /*#__PURE__*/ (0, _jsxruntime.jsxs)(_react.Fragment, {
|
|
164
|
-
children: [
|
|
165
|
-
codeLine,
|
|
166
|
-
isHighlightedTag && /*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
|
|
167
|
-
"data-nextjs-container-errors-pseudo-html--hint": true,
|
|
168
|
-
children: spaces + '^'.repeat(component.length + 2) + '\n'
|
|
169
|
-
})
|
|
170
|
-
]
|
|
171
|
-
}, nestedHtmlStack.length);
|
|
172
|
-
nestedHtmlStack.push(wrappedCodeLine);
|
|
173
|
-
} else {
|
|
174
|
-
if (nestedHtmlStack.length >= MAX_NON_COLLAPSED_FRAMES && isHtmlCollapsed) {
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
if (!isHtmlCollapsed || isLastFewFrames) {
|
|
178
|
-
nestedHtmlStack.push(/*#__PURE__*/ (0, _react.createElement)("span", {
|
|
179
|
-
...adjProps,
|
|
180
|
-
key: nestedHtmlStack.length,
|
|
181
|
-
"data-nextjs-container-errors-pseudo-html-line": true,
|
|
182
|
-
children: [
|
|
183
|
-
spaces,
|
|
184
|
-
'<' + component + '>\n'
|
|
185
|
-
]
|
|
186
|
-
}));
|
|
187
|
-
} else if (isHtmlCollapsed && lastText !== '...') {
|
|
188
|
-
lastText = '...';
|
|
189
|
-
nestedHtmlStack.push(/*#__PURE__*/ (0, _react.createElement)("span", {
|
|
190
|
-
...adjProps,
|
|
191
|
-
key: nestedHtmlStack.length,
|
|
192
|
-
"data-nextjs-container-errors-pseudo-html-line": true,
|
|
193
|
-
children: [
|
|
194
|
-
spaces,
|
|
195
|
-
'...\n'
|
|
196
|
-
]
|
|
197
|
-
}));
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
// Hydration mismatch: text or text-tag
|
|
202
|
-
if (!isHtmlTagsWarning) {
|
|
203
|
-
const spaces = ' '.repeat(nestedHtmlStack.length * 2);
|
|
204
|
-
let wrappedCodeLine;
|
|
205
|
-
if (hydrationMismatchType === 'text') {
|
|
206
|
-
// hydration type is "text", represent [server content, client content]
|
|
207
|
-
wrappedCodeLine = /*#__PURE__*/ (0, _jsxruntime.jsxs)(_react.Fragment, {
|
|
208
|
-
children: [
|
|
209
|
-
/*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
|
|
210
|
-
"data-nextjs-container-errors-pseudo-html-line": true,
|
|
211
|
-
"data-nextjs-container-errors-pseudo-html--diff": "remove",
|
|
212
|
-
children: spaces + ('"' + firstContent + '"\n')
|
|
213
|
-
}),
|
|
214
|
-
/*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
|
|
215
|
-
"data-nextjs-container-errors-pseudo-html-line": true,
|
|
216
|
-
"data-nextjs-container-errors-pseudo-html--diff": "add",
|
|
217
|
-
children: spaces + ('"' + secondContent + '"\n')
|
|
218
|
-
})
|
|
219
|
-
]
|
|
220
|
-
}, nestedHtmlStack.length);
|
|
221
|
-
} else if (hydrationMismatchType === 'text-in-tag') {
|
|
222
|
-
// hydration type is "text-in-tag", represent [parent tag, mismatch content]
|
|
223
|
-
wrappedCodeLine = /*#__PURE__*/ (0, _jsxruntime.jsxs)(_react.Fragment, {
|
|
224
|
-
children: [
|
|
225
|
-
/*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
|
|
226
|
-
"data-nextjs-container-errors-pseudo-html-line": true,
|
|
227
|
-
"data-nextjs-container-errors-pseudo-html--tag-adjacent": true,
|
|
228
|
-
children: spaces + ("<" + secondContent + ">\n")
|
|
229
|
-
}),
|
|
230
|
-
/*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
|
|
231
|
-
"data-nextjs-container-errors-pseudo-html-line": true,
|
|
232
|
-
"data-nextjs-container-errors-pseudo-html--diff": "remove",
|
|
233
|
-
children: spaces + (' "' + firstContent + '"\n')
|
|
234
|
-
})
|
|
235
|
-
]
|
|
236
|
-
}, nestedHtmlStack.length);
|
|
237
|
-
}
|
|
238
|
-
nestedHtmlStack.push(wrappedCodeLine);
|
|
239
|
-
}
|
|
240
|
-
return nestedHtmlStack;
|
|
241
|
-
}, [
|
|
242
|
-
componentStackFrames,
|
|
243
|
-
isHtmlCollapsed,
|
|
244
|
-
firstContent,
|
|
245
|
-
secondContent,
|
|
246
|
-
isHtmlTagsWarning,
|
|
247
|
-
hydrationMismatchType,
|
|
248
|
-
MAX_NON_COLLAPSED_FRAMES,
|
|
249
|
-
isReactHydrationDiff,
|
|
250
|
-
reactOutputComponentDiff
|
|
251
|
-
]);
|
|
252
|
-
return /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
|
|
253
|
-
"data-nextjs-container-errors-pseudo-html": true,
|
|
254
|
-
children: [
|
|
255
|
-
/*#__PURE__*/ (0, _jsxruntime.jsx)("button", {
|
|
256
|
-
tabIndex: 10,
|
|
257
|
-
"data-nextjs-container-errors-pseudo-html-collapse": true,
|
|
258
|
-
onClick: ()=>toggleCollapseHtml(!isHtmlCollapsed),
|
|
259
|
-
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_collapseicon.CollapseIcon, {
|
|
260
|
-
collapsed: isHtmlCollapsed
|
|
261
|
-
})
|
|
262
|
-
}),
|
|
263
|
-
/*#__PURE__*/ (0, _jsxruntime.jsx)("pre", {
|
|
264
|
-
...props,
|
|
265
|
-
children: /*#__PURE__*/ (0, _jsxruntime.jsx)("code", {
|
|
266
|
-
children: htmlComponents
|
|
267
|
-
})
|
|
268
|
-
})
|
|
269
|
-
]
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
36
|
const PSEUDO_HTML_DIFF_STYLES = (0, _nooptemplate.noop)(_templateObject(), '');
|
|
273
37
|
|
|
274
38
|
if ((typeof exports.default === 'function' || (typeof exports.default === 'object' && exports.default !== null)) && typeof exports.default.__esModule === 'undefined') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../src/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/component-stack-pseudo-html.tsx"],"sourcesContent":["import { useMemo, Fragment, useState } from 'react'\nimport type { ComponentStackFrame } from '../../helpers/parse-component-stack'\nimport { CollapseIcon } from '../../icons/collapse-icon'\nimport { noop as css } from '../../helpers/noop-template'\n\nfunction getAdjacentProps(isAdj: boolean) {\n return { 'data-nextjs-container-errors-pseudo-html--tag-adjacent': isAdj }\n}\n\n/**\n *\n * Format component stack into pseudo HTML\n * component stack is an array of strings, e.g.: ['p', 'p', 'Page', ...]\n *\n * For html tags mismatch, it will render it for the code block\n *\n * ```\n * <pre>\n * <code>{`\n * <Page>\n * <p red>\n * <p red>\n * `}</code>\n * </pre>\n * ```\n *\n * For text mismatch, it will render it for the code block\n *\n * ```\n * <pre>\n * <code>{`\n * <Page>\n * <p>\n * \"Server Text\" (green)\n * \"Client Text\" (red)\n * </p>\n * </Page>\n * `}</code>\n * ```\n *\n * For bad text under a tag it will render it for the code block,\n * e.g. \"Mismatched Text\" under <p>\n *\n * ```\n * <pre>\n * <code>{`\n * <Page>\n * <div>\n * <p>\n * \"Mismatched Text\" (red)\n * </p>\n * </div>\n * </Page>\n * `}</code>\n * ```\n *\n */\nexport function PseudoHtmlDiff({\n componentStackFrames,\n firstContent,\n secondContent,\n hydrationMismatchType,\n reactOutputComponentDiff,\n ...props\n}: {\n componentStackFrames: ComponentStackFrame[]\n firstContent: string\n secondContent: string\n reactOutputComponentDiff: string | undefined\n hydrationMismatchType: 'tag' | 'text' | 'text-in-tag'\n} & React.HTMLAttributes<HTMLPreElement>) {\n const isHtmlTagsWarning = hydrationMismatchType === 'tag'\n const isReactHydrationDiff = !!reactOutputComponentDiff\n\n // For text mismatch, mismatched text will take 2 rows, so we display 4 rows of component stack\n const MAX_NON_COLLAPSED_FRAMES = isHtmlTagsWarning ? 6 : 4\n const [isHtmlCollapsed, toggleCollapseHtml] = useState(true)\n\n const htmlComponents = useMemo(() => {\n const componentStacks: React.ReactNode[] = []\n // React 19 unified mismatch\n if (isReactHydrationDiff) {\n let currentComponentIndex = componentStackFrames.length - 1\n const reactComponentDiffLines = reactOutputComponentDiff.split('\\n')\n const diffHtmlStack: React.ReactNode[] = []\n reactComponentDiffLines.forEach((line, index) => {\n let trimmedLine = line.trim()\n const isDiffLine = trimmedLine[0] === '+' || trimmedLine[0] === '-'\n const spaces = ' '.repeat(Math.max(componentStacks.length * 2, 1))\n\n if (isDiffLine) {\n const sign = trimmedLine[0]\n trimmedLine = trimmedLine.slice(1).trim() // trim spaces after sign\n diffHtmlStack.push(\n <span\n key={'comp-diff' + index}\n data-nextjs-container-errors-pseudo-html-line\n data-nextjs-container-errors-pseudo-html--diff={\n sign === '+' ? 'add' : 'remove'\n }\n >\n <span>\n {/* Slice 2 spaces for the icon */}\n {spaces.slice(2)}\n {trimmedLine}\n {'\\n'}\n </span>\n </span>\n )\n } else if (currentComponentIndex >= 0) {\n const isUserLandComponent = trimmedLine.startsWith(\n '<' + componentStackFrames[currentComponentIndex].component\n )\n // If it's matched userland component or it's ... we will keep the component stack in diff\n if (isUserLandComponent || trimmedLine === '...') {\n currentComponentIndex--\n componentStacks.push(\n <span\n data-nextjs-container-errors-pseudo-html-line\n key={'comp-diff' + index}\n >\n {spaces}\n {trimmedLine}\n {'\\n'}\n </span>\n )\n } else if (!isHtmlCollapsed) {\n componentStacks.push(\n <span\n data-nextjs-container-errors-pseudo-html-line\n key={'comp-diff' + index}\n >\n {spaces}\n {trimmedLine}\n {'\\n'}\n </span>\n )\n }\n } else if (!isHtmlCollapsed) {\n // In general, if it's not collapsed, show the whole diff\n componentStacks.push(\n <span\n data-nextjs-container-errors-pseudo-html-line\n key={'comp-diff' + index}\n >\n {spaces}\n {trimmedLine}\n {'\\n'}\n </span>\n )\n }\n })\n return componentStacks.concat(diffHtmlStack)\n }\n\n const nestedHtmlStack: React.ReactNode[] = []\n const tagNames = isHtmlTagsWarning\n ? // tags could have < or > in the name, so we always remove them to match\n [firstContent.replace(/<|>/g, ''), secondContent.replace(/<|>/g, '')]\n : []\n\n let lastText = ''\n\n const componentStack = componentStackFrames\n .map((frame) => frame.component)\n .reverse()\n\n // [child index, parent index]\n const matchedIndex = [-1, -1]\n if (isHtmlTagsWarning) {\n // Reverse search for the child tag\n for (let i = componentStack.length - 1; i >= 0; i--) {\n if (componentStack[i] === tagNames[0]) {\n matchedIndex[0] = i\n break\n }\n }\n // Start searching parent tag from child tag above\n for (let i = matchedIndex[0] - 1; i >= 0; i--) {\n if (componentStack[i] === tagNames[1]) {\n matchedIndex[1] = i\n break\n }\n }\n }\n\n componentStack.forEach((component, index, componentList) => {\n const spaces = ' '.repeat(nestedHtmlStack.length * 2)\n\n // When component is the server or client tag name, highlight it\n const isHighlightedTag = isHtmlTagsWarning\n ? index === matchedIndex[0] || index === matchedIndex[1]\n : tagNames.includes(component)\n const isAdjacentTag =\n isHighlightedTag ||\n Math.abs(index - matchedIndex[0]) <= 1 ||\n Math.abs(index - matchedIndex[1]) <= 1\n\n const isLastFewFrames =\n !isHtmlTagsWarning && index >= componentList.length - 6\n\n const adjProps = getAdjacentProps(isAdjacentTag)\n\n if ((isHtmlTagsWarning && isAdjacentTag) || isLastFewFrames) {\n const codeLine = (\n <span\n data-nextjs-container-errors-pseudo-html-line\n {...(isHighlightedTag\n ? {\n 'data-nextjs-container-errors-pseudo-html-line--error': true,\n }\n : undefined)}\n >\n {spaces}\n <span {...adjProps}>{`<${component}>\\n`}</span>\n </span>\n )\n lastText = component\n\n const wrappedCodeLine = (\n <Fragment key={nestedHtmlStack.length}>\n {codeLine}\n {/* Add ^^^^ to the target tags used for snapshots but not displayed for users */}\n {isHighlightedTag && (\n <span data-nextjs-container-errors-pseudo-html--hint>\n {spaces + '^'.repeat(component.length + 2) + '\\n'}\n </span>\n )}\n </Fragment>\n )\n nestedHtmlStack.push(wrappedCodeLine)\n } else {\n if (\n nestedHtmlStack.length >= MAX_NON_COLLAPSED_FRAMES &&\n isHtmlCollapsed\n ) {\n return\n }\n\n if (!isHtmlCollapsed || isLastFewFrames) {\n nestedHtmlStack.push(\n <span\n {...adjProps}\n key={nestedHtmlStack.length}\n data-nextjs-container-errors-pseudo-html-line\n >\n {spaces}\n {'<' + component + '>\\n'}\n </span>\n )\n } else if (isHtmlCollapsed && lastText !== '...') {\n lastText = '...'\n nestedHtmlStack.push(\n <span\n {...adjProps}\n key={nestedHtmlStack.length}\n data-nextjs-container-errors-pseudo-html-line\n >\n {spaces}\n {'...\\n'}\n </span>\n )\n }\n }\n })\n // Hydration mismatch: text or text-tag\n if (!isHtmlTagsWarning) {\n const spaces = ' '.repeat(nestedHtmlStack.length * 2)\n let wrappedCodeLine\n if (hydrationMismatchType === 'text') {\n // hydration type is \"text\", represent [server content, client content]\n wrappedCodeLine = (\n <Fragment key={nestedHtmlStack.length}>\n <span\n data-nextjs-container-errors-pseudo-html-line\n data-nextjs-container-errors-pseudo-html--diff=\"remove\"\n >\n {spaces + `\"${firstContent}\"\\n`}\n </span>\n <span\n data-nextjs-container-errors-pseudo-html-line\n data-nextjs-container-errors-pseudo-html--diff=\"add\"\n >\n {spaces + `\"${secondContent}\"\\n`}\n </span>\n </Fragment>\n )\n } else if (hydrationMismatchType === 'text-in-tag') {\n // hydration type is \"text-in-tag\", represent [parent tag, mismatch content]\n wrappedCodeLine = (\n <Fragment key={nestedHtmlStack.length}>\n <span\n data-nextjs-container-errors-pseudo-html-line\n data-nextjs-container-errors-pseudo-html--tag-adjacent\n >\n {spaces + `<${secondContent}>\\n`}\n </span>\n <span\n data-nextjs-container-errors-pseudo-html-line\n data-nextjs-container-errors-pseudo-html--diff=\"remove\"\n >\n {spaces + ` \"${firstContent}\"\\n`}\n </span>\n </Fragment>\n )\n }\n nestedHtmlStack.push(wrappedCodeLine)\n }\n\n return nestedHtmlStack\n }, [\n componentStackFrames,\n isHtmlCollapsed,\n firstContent,\n secondContent,\n isHtmlTagsWarning,\n hydrationMismatchType,\n MAX_NON_COLLAPSED_FRAMES,\n isReactHydrationDiff,\n reactOutputComponentDiff,\n ])\n\n return (\n <div data-nextjs-container-errors-pseudo-html>\n <button\n tabIndex={10} // match CallStackFrame\n data-nextjs-container-errors-pseudo-html-collapse\n onClick={() => toggleCollapseHtml(!isHtmlCollapsed)}\n >\n <CollapseIcon collapsed={isHtmlCollapsed} />\n </button>\n <pre {...props}>\n <code>{htmlComponents}</code>\n </pre>\n </div>\n )\n}\n\nexport const PSEUDO_HTML_DIFF_STYLES = css`\n [data-nextjs-container-errors-pseudo-html] {\n padding: var(--size-3) 0;\n margin: var(--size-2) var(--size-4) var(--size-4);\n border: 1px solid var(--color-gray-400);\n background: var(--color-background-200);\n color: var(--color-syntax-constant);\n font-family: var(--font-stack-monospace);\n font-size: var(--size-font-smaller);\n line-height: var(--size-4);\n border-radius: var(--size-2);\n }\n [data-nextjs-container-errors-pseudo-html-line] {\n display: inline-block;\n width: 100%;\n padding-left: var(--size-10);\n line-height: calc(5 / 3);\n }\n [data-nextjs-container-errors-pseudo-html-line--error] {\n background: var(--color-amber-300);\n font-weight: bold;\n }\n [data-nextjs-container-errors-pseudo-html-line--error]::before {\n content: '>';\n color: var(--color-red-900);\n float: left;\n width: 0;\n margin-left: calc(var(--size-6) * -1);\n margin-right: var(--size-8);\n }\n\n [data-nextjs-container-errors-pseudo-html-collapse] {\n all: unset;\n margin-left: var(--size-3);\n &:focus {\n outline: none;\n }\n }\n [data-nextjs-container-errors-pseudo-html--diff='add'] {\n background: var(--color-green-300);\n }\n [data-nextjs-container-errors-pseudo-html--diff='add']::before {\n content: '+';\n color: var(--color-green-900);\n float: left;\n width: 0;\n margin-left: calc(var(--size-6) * -1);\n margin-right: var(--size-8);\n }\n [data-nextjs-container-errors-pseudo-html--diff='remove'] {\n background: var(--color-red-300);\n }\n [data-nextjs-container-errors-pseudo-html--diff='remove']::before {\n content: '-';\n color: var(--color-red-900);\n float: left;\n width: 0;\n margin-left: calc(var(--size-6) * -1);\n margin-right: var(--size-8);\n }\n ${/* hide but text are still accessible in DOM */ ''}\n [data-nextjs-container-errors-pseudo-html--hint] {\n display: inline-block;\n font-size: 0;\n height: 0;\n }\n [data-nextjs-container-errors-pseudo-html--tag-adjacent='false'] {\n color: var(--color-accents-1);\n }\n .nextjs__container_errors__component-stack {\n margin: 0;\n }\n .nextjs__container_errors__component-stack code {\n display: block;\n width: 100%;\n white-space: pre-wrap;\n }\n .error-overlay-hydration-error-diff-plus-icon {\n color: var(--color-green-900);\n }\n .error-overlay-hydration-error-diff-minus-icon {\n color: var(--color-red-900);\n }\n`\n"],"names":["PSEUDO_HTML_DIFF_STYLES","PseudoHtmlDiff","getAdjacentProps","isAdj","componentStackFrames","firstContent","secondContent","hydrationMismatchType","reactOutputComponentDiff","props","isHtmlTagsWarning","isReactHydrationDiff","MAX_NON_COLLAPSED_FRAMES","isHtmlCollapsed","toggleCollapseHtml","useState","htmlComponents","useMemo","componentStacks","currentComponentIndex","length","reactComponentDiffLines","split","diffHtmlStack","forEach","line","index","trimmedLine","trim","isDiffLine","spaces","repeat","Math","max","sign","slice","push","span","data-nextjs-container-errors-pseudo-html-line","data-nextjs-container-errors-pseudo-html--diff","isUserLandComponent","startsWith","component","concat","nestedHtmlStack","tagNames","replace","lastText","componentStack","map","frame","reverse","matchedIndex","i","componentList","isHighlightedTag","includes","isAdjacentTag","abs","isLastFewFrames","adjProps","codeLine","undefined","wrappedCodeLine","Fragment","data-nextjs-container-errors-pseudo-html--hint","key","data-nextjs-container-errors-pseudo-html--tag-adjacent","div","data-nextjs-container-errors-pseudo-html","button","tabIndex","data-nextjs-container-errors-pseudo-html-collapse","onClick","CollapseIcon","collapsed","pre","code","css"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../src/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/component-stack-pseudo-html.tsx"],"sourcesContent":["import { noop as css } from '../../helpers/noop-template'\n\nexport { PseudoHtmlDiff } from '../../../../hydration-diff/diff-view'\n\nexport const PSEUDO_HTML_DIFF_STYLES = css`\n [data-nextjs-container-errors-pseudo-html] {\n padding: var(--size-3) 0;\n margin: var(--size-2) var(--size-4) var(--size-4);\n border: 1px solid var(--color-gray-400);\n background: var(--color-background-200);\n color: var(--color-syntax-constant);\n font-family: var(--font-stack-monospace);\n font-size: var(--size-font-smaller);\n line-height: var(--size-4);\n border-radius: var(--size-2);\n }\n [data-nextjs-container-errors-pseudo-html-line] {\n display: inline-block;\n width: 100%;\n padding-left: var(--size-10);\n line-height: calc(5 / 3);\n }\n [data-nextjs-container-errors-pseudo-html-line--error] {\n background: var(--color-amber-100);\n font-weight: bold;\n }\n [data-nextjs-container-errors-pseudo-html-collapse-button] {\n all: unset;\n margin-left: var(--size-3);\n &:focus {\n outline: none;\n }\n }\n [data-nextjs-container-errors-pseudo-html--diff='add'] {\n background: var(--color-green-300);\n }\n [data-nextjs-container-errors-pseudo-html-line-sign] {\n margin-left: calc(var(--size-6) * -1);\n margin-right: var(--size-6);\n }\n [data-nextjs-container-errors-pseudo-html--diff='add']\n [data-nextjs-container-errors-pseudo-html-line-sign] {\n color: var(--color-green-900);\n }\n [data-nextjs-container-errors-pseudo-html--diff='remove'] {\n background: var(--color-red-300);\n }\n [data-nextjs-container-errors-pseudo-html--diff='remove']\n [data-nextjs-container-errors-pseudo-html-line-sign] {\n color: var(--color-red-900);\n margin-left: calc(var(--size-6) * -1);\n margin-right: var(--size-6);\n }\n [data-nextjs-container-errors-pseudo-html-line--error]\n [data-nextjs-container-errors-pseudo-html-line-sign] {\n color: var(--color-amber-900);\n }\n ${/* hide but text are still accessible in DOM */ ''}\n [data-nextjs-container-errors-pseudo-html--hint] {\n display: inline-block;\n font-size: 0;\n height: 0;\n }\n [data-nextjs-container-errors-pseudo-html--tag-adjacent='false'] {\n color: var(--color-accents-1);\n }\n .nextjs__container_errors__component-stack {\n margin: 0;\n }\n [data-nextjs-container-errors-pseudo-html-collapse='true']\n .nextjs__container_errors__component-stack\n code {\n max-height: 100px;\n mask-image: linear-gradient(to top, rgba(0, 0, 0, 0) 0%, black 50%);\n }\n .nextjs__container_errors__component-stack code {\n display: block;\n width: 100%;\n white-space: pre-wrap;\n scroll-snap-type: y mandatory;\n overflow-y: hidden;\n }\n [data-nextjs-container-errors-pseudo-html--diff],\n [data-nextjs-container-errors-pseudo-html-line--error] {\n scroll-snap-align: center;\n }\n .error-overlay-hydration-error-diff-plus-icon {\n color: var(--color-green-900);\n }\n .error-overlay-hydration-error-diff-minus-icon {\n color: var(--color-red-900);\n }\n`\n"],"names":["PSEUDO_HTML_DIFF_STYLES","PseudoHtmlDiff","css"],"mappings":";;;;;;;;;;;;;;;IAIaA,uBAAuB;eAAvBA;;IAFJC,cAAc;eAAdA,wBAAc;;;;8BAFK;0BAEG;;;;;;;;;;;AAExB,MAAMD,8BAA0BE,kBAAG,qBAqDU"}
|
|
@@ -40,27 +40,8 @@ const meta = {
|
|
|
40
40
|
]
|
|
41
41
|
};
|
|
42
42
|
const _default = meta;
|
|
43
|
-
const sampleComponentStack = [
|
|
44
|
-
{
|
|
45
|
-
component: 'div',
|
|
46
|
-
canOpenInEditor: false
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
component: 'article',
|
|
50
|
-
canOpenInEditor: false
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
component: 'main',
|
|
54
|
-
canOpenInEditor: false
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
component: 'Home',
|
|
58
|
-
canOpenInEditor: false
|
|
59
|
-
}
|
|
60
|
-
];
|
|
61
43
|
const TextMismatch = {
|
|
62
44
|
args: {
|
|
63
|
-
componentStackFrames: sampleComponentStack,
|
|
64
45
|
firstContent: 'Server rendered content',
|
|
65
46
|
secondContent: 'Client rendered content',
|
|
66
47
|
hydrationMismatchType: 'text',
|
|
@@ -69,7 +50,6 @@ const TextMismatch = {
|
|
|
69
50
|
};
|
|
70
51
|
const TextInTagMismatch = {
|
|
71
52
|
args: {
|
|
72
|
-
componentStackFrames: sampleComponentStack,
|
|
73
53
|
firstContent: 'Mismatched content',
|
|
74
54
|
secondContent: 'p',
|
|
75
55
|
hydrationMismatchType: 'text-in-tag',
|
|
@@ -78,7 +58,6 @@ const TextInTagMismatch = {
|
|
|
78
58
|
};
|
|
79
59
|
const ReactUnifiedMismatch = {
|
|
80
60
|
args: {
|
|
81
|
-
componentStackFrames: sampleComponentStack,
|
|
82
61
|
hydrationMismatchType: 'tag',
|
|
83
62
|
reactOutputComponentDiff: "<Page>\n <Layout>\n <div>\n- <p>Server content</p>\n+ <p>Client content</p>"
|
|
84
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../src/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/component-stack-pseudo-html.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from '@storybook/react'\nimport { PseudoHtmlDiff } from './component-stack-pseudo-html'\nimport { withShadowPortal } from '../../storybook/with-shadow-portal'\n\nconst meta: Meta<typeof PseudoHtmlDiff> = {\n component: PseudoHtmlDiff,\n parameters: {\n layout: 'fullscreen',\n },\n decorators: [withShadowPortal],\n}\n\nexport default meta\ntype Story = StoryObj<typeof PseudoHtmlDiff>\n\
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../src/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/component-stack-pseudo-html.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from '@storybook/react'\nimport { PseudoHtmlDiff } from './component-stack-pseudo-html'\nimport { withShadowPortal } from '../../storybook/with-shadow-portal'\n\nconst meta: Meta<typeof PseudoHtmlDiff> = {\n component: PseudoHtmlDiff,\n parameters: {\n layout: 'fullscreen',\n },\n decorators: [withShadowPortal],\n}\n\nexport default meta\ntype Story = StoryObj<typeof PseudoHtmlDiff>\n\nexport const TextMismatch: Story = {\n args: {\n firstContent: 'Server rendered content',\n secondContent: 'Client rendered content',\n hydrationMismatchType: 'text',\n reactOutputComponentDiff: undefined,\n },\n}\n\nexport const TextInTagMismatch: Story = {\n args: {\n firstContent: 'Mismatched content',\n secondContent: 'p',\n hydrationMismatchType: 'text-in-tag',\n reactOutputComponentDiff: undefined,\n },\n}\n\nexport const ReactUnifiedMismatch: Story = {\n args: {\n hydrationMismatchType: 'tag',\n reactOutputComponentDiff: `<Page>\n <Layout>\n <div>\n- <p>Server content</p>\n+ <p>Client content</p>`,\n },\n}\n"],"names":["ReactUnifiedMismatch","TextInTagMismatch","TextMismatch","meta","component","PseudoHtmlDiff","parameters","layout","decorators","withShadowPortal","args","firstContent","secondContent","hydrationMismatchType","reactOutputComponentDiff","undefined"],"mappings":";;;;;;;;;;;;;;;;;IAiCaA,oBAAoB;eAApBA;;IATAC,iBAAiB;eAAjBA;;IATAC,YAAY;eAAZA;;IAHb,OAAmB;eAAnB;;;0CAX+B;kCACE;AAEjC,MAAMC,OAAoC;IACxCC,WAAWC,wCAAc;IACzBC,YAAY;QACVC,QAAQ;IACV;IACAC,YAAY;QAACC,kCAAgB;KAAC;AAChC;MAEA,WAAeN;AAGR,MAAMD,eAAsB;IACjCQ,MAAM;QACJC,cAAc;QACdC,eAAe;QACfC,uBAAuB;QACvBC,0BAA0BC;IAC5B;AACF;AAEO,MAAMd,oBAA2B;IACtCS,MAAM;QACJC,cAAc;QACdC,eAAe;QACfC,uBAAuB;QACvBC,0BAA0BC;IAC5B;AACF;AAEO,MAAMf,uBAA8B;IACzCU,MAAM;QACJG,uBAAuB;QACvBC,0BAA2B;IAK7B;AACF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Format component stack into pseudo HTML
|
|
4
|
+
* component stack is an array of strings, e.g.: ['p', 'p', 'Page', ...]
|
|
5
|
+
*
|
|
6
|
+
* For html tags mismatch, it will render it for the code block
|
|
7
|
+
*
|
|
8
|
+
* ```
|
|
9
|
+
* <pre>
|
|
10
|
+
* <code>{`
|
|
11
|
+
* <Page>
|
|
12
|
+
* <p red>
|
|
13
|
+
* <p red>
|
|
14
|
+
* `}</code>
|
|
15
|
+
* </pre>
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* For text mismatch, it will render it for the code block
|
|
19
|
+
*
|
|
20
|
+
* ```
|
|
21
|
+
* <pre>
|
|
22
|
+
* <code>{`
|
|
23
|
+
* <Page>
|
|
24
|
+
* <p>
|
|
25
|
+
* "Server Text" (green)
|
|
26
|
+
* "Client Text" (red)
|
|
27
|
+
* </p>
|
|
28
|
+
* </Page>
|
|
29
|
+
* `}</code>
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* For bad text under a tag it will render it for the code block,
|
|
33
|
+
* e.g. "Mismatched Text" under <p>
|
|
34
|
+
*
|
|
35
|
+
* ```
|
|
36
|
+
* <pre>
|
|
37
|
+
* <code>{`
|
|
38
|
+
* <Page>
|
|
39
|
+
* <div>
|
|
40
|
+
* <p>
|
|
41
|
+
* "Mismatched Text" (red)
|
|
42
|
+
* </p>
|
|
43
|
+
* </div>
|
|
44
|
+
* </Page>
|
|
45
|
+
* `}</code>
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
*/
|
|
49
|
+
export declare function PseudoHtmlDiff({ firstContent, secondContent, hydrationMismatchType, reactOutputComponentDiff, ...props }: {
|
|
50
|
+
firstContent: string;
|
|
51
|
+
secondContent: string;
|
|
52
|
+
reactOutputComponentDiff: string;
|
|
53
|
+
hydrationMismatchType: 'tag' | 'text' | 'text-in-tag';
|
|
54
|
+
} & React.HTMLAttributes<HTMLPreElement>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "PseudoHtmlDiff", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return PseudoHtmlDiff;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _jsxruntime = require("react/jsx-runtime");
|
|
12
|
+
const _react = require("react");
|
|
13
|
+
const _CollapseIcon = require("../internal/icons/CollapseIcon");
|
|
14
|
+
function PseudoHtmlDiff(param) {
|
|
15
|
+
let { firstContent, secondContent, hydrationMismatchType, reactOutputComponentDiff, ...props } = param;
|
|
16
|
+
const [isDiffCollapsed, toggleCollapseHtml] = (0, _react.useState)(true);
|
|
17
|
+
const htmlComponents = (0, _react.useMemo)(()=>{
|
|
18
|
+
const componentStacks = [];
|
|
19
|
+
const reactComponentDiffLines = reactOutputComponentDiff.split('\n');
|
|
20
|
+
reactComponentDiffLines.forEach((line, index)=>{
|
|
21
|
+
let trimmedLine = line.trim();
|
|
22
|
+
const isDiffLine = trimmedLine[0] === '+' || trimmedLine[0] === '-';
|
|
23
|
+
const isHighlightedLine = trimmedLine[0] === '>';
|
|
24
|
+
const hasSign = isDiffLine || isHighlightedLine;
|
|
25
|
+
const sign = hasSign ? trimmedLine[0] : '';
|
|
26
|
+
const signIndex = hasSign ? line.indexOf(sign) : -1;
|
|
27
|
+
const [prefix, suffix] = hasSign ? [
|
|
28
|
+
line.slice(0, signIndex),
|
|
29
|
+
line.slice(signIndex + 1)
|
|
30
|
+
] : [
|
|
31
|
+
line,
|
|
32
|
+
''
|
|
33
|
+
];
|
|
34
|
+
if (isDiffLine) {
|
|
35
|
+
componentStacks.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
|
|
36
|
+
"data-nextjs-container-errors-pseudo-html-line": true,
|
|
37
|
+
"data-nextjs-container-errors-pseudo-html--diff": sign === '+' ? 'add' : 'remove',
|
|
38
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsxs)("span", {
|
|
39
|
+
children: [
|
|
40
|
+
prefix,
|
|
41
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
|
|
42
|
+
"data-nextjs-container-errors-pseudo-html-line-sign": true,
|
|
43
|
+
children: sign
|
|
44
|
+
}),
|
|
45
|
+
suffix,
|
|
46
|
+
'\n'
|
|
47
|
+
]
|
|
48
|
+
})
|
|
49
|
+
}, 'comp-diff' + index));
|
|
50
|
+
} else {
|
|
51
|
+
// In general, if it's not collapsed, show the whole diff
|
|
52
|
+
componentStacks.push(/*#__PURE__*/ (0, _jsxruntime.jsxs)("span", {
|
|
53
|
+
"data-nextjs-container-errors-pseudo-html-line": true,
|
|
54
|
+
...isHighlightedLine ? {
|
|
55
|
+
'data-nextjs-container-errors-pseudo-html-line--error': true
|
|
56
|
+
} : undefined,
|
|
57
|
+
children: [
|
|
58
|
+
prefix,
|
|
59
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
|
|
60
|
+
"data-nextjs-container-errors-pseudo-html-line-sign": true,
|
|
61
|
+
children: sign
|
|
62
|
+
}),
|
|
63
|
+
suffix,
|
|
64
|
+
'\n'
|
|
65
|
+
]
|
|
66
|
+
}, 'comp-diff' + index));
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
return componentStacks;
|
|
70
|
+
}, [
|
|
71
|
+
reactOutputComponentDiff
|
|
72
|
+
]);
|
|
73
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
|
|
74
|
+
"data-nextjs-container-errors-pseudo-html": true,
|
|
75
|
+
"data-nextjs-container-errors-pseudo-html-collapse": isDiffCollapsed,
|
|
76
|
+
children: [
|
|
77
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)("button", {
|
|
78
|
+
tabIndex: 10,
|
|
79
|
+
"data-nextjs-container-errors-pseudo-html-collapse-button": true,
|
|
80
|
+
onClick: ()=>toggleCollapseHtml(!isDiffCollapsed),
|
|
81
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_CollapseIcon.CollapseIcon, {
|
|
82
|
+
collapsed: isDiffCollapsed
|
|
83
|
+
})
|
|
84
|
+
}),
|
|
85
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)("pre", {
|
|
86
|
+
...props,
|
|
87
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsx)("code", {
|
|
88
|
+
children: htmlComponents
|
|
89
|
+
})
|
|
90
|
+
})
|
|
91
|
+
]
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if ((typeof exports.default === 'function' || (typeof exports.default === 'object' && exports.default !== null)) && typeof exports.default.__esModule === 'undefined') {
|
|
96
|
+
Object.defineProperty(exports.default, '__esModule', { value: true });
|
|
97
|
+
Object.assign(exports.default, exports);
|
|
98
|
+
module.exports = exports.default;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
//# sourceMappingURL=diff-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/client/components/react-dev-overlay/hydration-diff/diff-view.tsx"],"sourcesContent":["import { useMemo, useState } from 'react'\nimport { CollapseIcon } from '../internal/icons/CollapseIcon'\n\n/**\n *\n * Format component stack into pseudo HTML\n * component stack is an array of strings, e.g.: ['p', 'p', 'Page', ...]\n *\n * For html tags mismatch, it will render it for the code block\n *\n * ```\n * <pre>\n * <code>{`\n * <Page>\n * <p red>\n * <p red>\n * `}</code>\n * </pre>\n * ```\n *\n * For text mismatch, it will render it for the code block\n *\n * ```\n * <pre>\n * <code>{`\n * <Page>\n * <p>\n * \"Server Text\" (green)\n * \"Client Text\" (red)\n * </p>\n * </Page>\n * `}</code>\n * ```\n *\n * For bad text under a tag it will render it for the code block,\n * e.g. \"Mismatched Text\" under <p>\n *\n * ```\n * <pre>\n * <code>{`\n * <Page>\n * <div>\n * <p>\n * \"Mismatched Text\" (red)\n * </p>\n * </div>\n * </Page>\n * `}</code>\n * ```\n *\n */\nexport function PseudoHtmlDiff({\n firstContent,\n secondContent,\n hydrationMismatchType,\n reactOutputComponentDiff,\n ...props\n}: {\n firstContent: string\n secondContent: string\n reactOutputComponentDiff: string\n hydrationMismatchType: 'tag' | 'text' | 'text-in-tag'\n} & React.HTMLAttributes<HTMLPreElement>) {\n const [isDiffCollapsed, toggleCollapseHtml] = useState(true)\n\n const htmlComponents = useMemo(() => {\n const componentStacks: React.ReactNode[] = []\n const reactComponentDiffLines = reactOutputComponentDiff!.split('\\n')\n reactComponentDiffLines.forEach((line, index) => {\n let trimmedLine = line.trim()\n const isDiffLine = trimmedLine[0] === '+' || trimmedLine[0] === '-'\n const isHighlightedLine = trimmedLine[0] === '>'\n const hasSign = isDiffLine || isHighlightedLine\n const sign = hasSign ? trimmedLine[0] : ''\n const signIndex = hasSign ? line.indexOf(sign) : -1\n const [prefix, suffix] = hasSign\n ? [line.slice(0, signIndex), line.slice(signIndex + 1)]\n : [line, '']\n\n if (isDiffLine) {\n componentStacks.push(\n <span\n key={'comp-diff' + index}\n data-nextjs-container-errors-pseudo-html-line\n data-nextjs-container-errors-pseudo-html--diff={\n sign === '+' ? 'add' : 'remove'\n }\n >\n <span>\n {/* Slice 2 spaces for the icon */}\n {prefix}\n <span data-nextjs-container-errors-pseudo-html-line-sign>\n {sign}\n </span>\n {suffix}\n {'\\n'}\n </span>\n </span>\n )\n } else {\n // In general, if it's not collapsed, show the whole diff\n componentStacks.push(\n <span\n data-nextjs-container-errors-pseudo-html-line\n key={'comp-diff' + index}\n {...(isHighlightedLine\n ? {\n 'data-nextjs-container-errors-pseudo-html-line--error': true,\n }\n : undefined)}\n >\n {prefix}\n <span data-nextjs-container-errors-pseudo-html-line-sign>\n {sign}\n </span>\n {suffix}\n {'\\n'}\n </span>\n )\n }\n })\n return componentStacks\n }, [reactOutputComponentDiff])\n\n return (\n <div\n data-nextjs-container-errors-pseudo-html\n data-nextjs-container-errors-pseudo-html-collapse={isDiffCollapsed}\n >\n <button\n tabIndex={10} // match CallStackFrame\n data-nextjs-container-errors-pseudo-html-collapse-button\n onClick={() => toggleCollapseHtml(!isDiffCollapsed)}\n >\n <CollapseIcon collapsed={isDiffCollapsed} />\n </button>\n <pre {...props}>\n <code>{htmlComponents}</code>\n </pre>\n </div>\n )\n}\n"],"names":["PseudoHtmlDiff","firstContent","secondContent","hydrationMismatchType","reactOutputComponentDiff","props","isDiffCollapsed","toggleCollapseHtml","useState","htmlComponents","useMemo","componentStacks","reactComponentDiffLines","split","forEach","line","index","trimmedLine","trim","isDiffLine","isHighlightedLine","hasSign","sign","signIndex","indexOf","prefix","suffix","slice","push","span","data-nextjs-container-errors-pseudo-html-line","data-nextjs-container-errors-pseudo-html--diff","data-nextjs-container-errors-pseudo-html-line-sign","undefined","div","data-nextjs-container-errors-pseudo-html","data-nextjs-container-errors-pseudo-html-collapse","button","tabIndex","data-nextjs-container-errors-pseudo-html-collapse-button","onClick","CollapseIcon","collapsed","pre","code"],"mappings":";;;;+BAmDgBA;;;eAAAA;;;;uBAnDkB;8BACL;AAkDtB,SAASA,eAAe,KAWS;IAXT,IAAA,EAC7BC,YAAY,EACZC,aAAa,EACbC,qBAAqB,EACrBC,wBAAwB,EACxB,GAAGC,OAMmC,GAXT;IAY7B,MAAM,CAACC,iBAAiBC,mBAAmB,GAAGC,IAAAA,eAAQ,EAAC;IAEvD,MAAMC,iBAAiBC,IAAAA,cAAO,EAAC;QAC7B,MAAMC,kBAAqC,EAAE;QAC7C,MAAMC,0BAA0BR,yBAA0BS,KAAK,CAAC;QAChED,wBAAwBE,OAAO,CAAC,CAACC,MAAMC;YACrC,IAAIC,cAAcF,KAAKG,IAAI;YAC3B,MAAMC,aAAaF,WAAW,CAAC,EAAE,KAAK,OAAOA,WAAW,CAAC,EAAE,KAAK;YAChE,MAAMG,oBAAoBH,WAAW,CAAC,EAAE,KAAK;YAC7C,MAAMI,UAAUF,cAAcC;YAC9B,MAAME,OAAOD,UAAUJ,WAAW,CAAC,EAAE,GAAG;YACxC,MAAMM,YAAYF,UAAUN,KAAKS,OAAO,CAACF,QAAQ,CAAC;YAClD,MAAM,CAACG,QAAQC,OAAO,GAAGL,UACrB;gBAACN,KAAKY,KAAK,CAAC,GAAGJ;gBAAYR,KAAKY,KAAK,CAACJ,YAAY;aAAG,GACrD;gBAACR;gBAAM;aAAG;YAEd,IAAII,YAAY;gBACdR,gBAAgBiB,IAAI,eAClB,qBAACC;oBAECC,+CAA6C;oBAC7CC,kDACET,SAAS,MAAM,QAAQ;8BAGzB,cAAA,sBAACO;;4BAEEJ;0CACD,qBAACI;gCAAKG,oDAAkD;0CACrDV;;4BAEFI;4BACA;;;mBAbE,cAAcV;YAiBzB,OAAO;gBACL,yDAAyD;gBACzDL,gBAAgBiB,IAAI,eAClB,sBAACC;oBACCC,+CAA6C;oBAE5C,GAAIV,oBACD;wBACE,wDAAwD;oBAC1D,IACAa,SAAS;;wBAEZR;sCACD,qBAACI;4BAAKG,oDAAkD;sCACrDV;;wBAEFI;wBACA;;mBAZI,cAAcV;YAezB;QACF;QACA,OAAOL;IACT,GAAG;QAACP;KAAyB;IAE7B,qBACE,sBAAC8B;QACCC,0CAAwC;QACxCC,qDAAmD9B;;0BAEnD,qBAAC+B;gBACCC,UAAU;gBACVC,0DAAwD;gBACxDC,SAAS,IAAMjC,mBAAmB,CAACD;0BAEnC,cAAA,qBAACmC,0BAAY;oBAACC,WAAWpC;;;0BAE3B,qBAACqC;gBAAK,GAAGtC,KAAK;0BACZ,cAAA,qBAACuC;8BAAMnC;;;;;AAIf"}
|
|
@@ -360,10 +360,9 @@ function Errors(param) {
|
|
|
360
360
|
hydrationWarning && (((_activeError_componentStackFrames = activeError.componentStackFrames) == null ? void 0 : _activeError_componentStackFrames.length) || !!errorDetails.reactOutputComponentDiff) ? /*#__PURE__*/ (0, _jsxruntime.jsx)(_componentstackpseudohtml.PseudoHtmlDiff, {
|
|
361
361
|
className: "nextjs__container_errors__component-stack",
|
|
362
362
|
hydrationMismatchType: hydrationErrorType,
|
|
363
|
-
componentStackFrames: activeError.componentStackFrames || [],
|
|
364
363
|
firstContent: serverContent,
|
|
365
364
|
secondContent: clientContent,
|
|
366
|
-
reactOutputComponentDiff: errorDetails.reactOutputComponentDiff
|
|
365
|
+
reactOutputComponentDiff: errorDetails.reactOutputComponentDiff || ''
|
|
367
366
|
}) : null,
|
|
368
367
|
isServerError ? /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
|
|
369
368
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)("small", {
|