Skip to content

Commit 7d33cd1

Browse files
Better prerender crash message when error originates in node_modules/ (#1426)
* Better prerender crash message when error originates in node_modules/ * chore: Formatting * docs: Adding changeset Co-authored-by: Ryan Christian <[email protected]>
1 parent 7afd8bb commit 7d33cd1

File tree

2 files changed

+32
-15
lines changed

2 files changed

+32
-15
lines changed

.changeset/twenty-cycles-tickle.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'preact-cli': patch
3+
---
4+
5+
Improves prerender error message when offending use of browser globals cannot be found

packages/cli/lib/lib/webpack/prerender.js

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ async function handlePrerenderError(err, env, stack, entry) {
4848
let sourceMapContent, position, sourcePath, sourceLines, sourceCodeHighlight;
4949

5050
try {
51-
sourceMapContent = JSON.parse(readFileSync(`${entry}.map`));
51+
sourceMapContent = JSON.parse(readFileSync(`${entry}.map`, 'utf-8'));
5252
} catch (err) {
5353
process.stderr.write(red(`Unable to read sourcemap: ${entry}.map\n`));
5454
}
@@ -100,39 +100,51 @@ async function handlePrerenderError(err, env, stack, entry) {
100100

101101
process.stderr.write('\n');
102102
process.stderr.write(red(`${errorMessage}\n`));
103-
process.stderr.write(`method: ${methodName}\n`);
104-
if (sourceMapContent) {
103+
// check if we have methodName (ie, the error originated in user code)
104+
if (methodName) {
105+
process.stderr.write(`method: ${methodName}\n`);
106+
if (sourceMapContent & sourceCodeHighlight) {
107+
process.stderr.write(
108+
`at: ${sourcePath}:${position.line}:${position.column}\n`
109+
);
110+
process.stderr.write('\n');
111+
process.stderr.write('Source code:\n\n');
112+
process.stderr.write(sourceCodeHighlight);
113+
process.stderr.write('\n');
114+
} else {
115+
process.stderr.write('\n');
116+
process.stderr.write('Stack:\n\n');
117+
process.stderr.write(JSON.stringify(stack, null, 4) + '\n');
118+
}
119+
} else {
105120
process.stderr.write(
106-
`at: ${sourcePath}:${position.line}:${position.column}\n`
121+
yellow(
122+
'Cannot determine error position. This most likely means it originated in node_modules.'
123+
)
107124
);
108-
process.stderr.write('\n');
109-
process.stderr.write('Source code:\n\n');
110-
process.stderr.write(sourceCodeHighlight);
111-
process.stderr.write('\n');
112-
} else {
113-
process.stderr.write(stack.toString() + '\n');
125+
process.stderr.write('\n\n');
114126
}
115127
process.stderr.write(
116128
`This ${
117129
isReferenceError ? 'is most likely' : 'could be'
118130
} caused by using DOM or Web APIs.\n`
119131
);
120132
process.stderr.write(
121-
`Pre-render runs in node and has no access to globals available in browsers.\n\n`
133+
'Pre-render runs in node and has no access to globals available in browsers.\n\n'
122134
);
123135
process.stderr.write(
124-
`Consider wrapping code producing error in: 'if (typeof window !== "undefined") { ... }'\n`
136+
'Consider wrapping code producing error in: "if (typeof window !== "undefined") { ... }"\n'
125137
);
126138

127139
if (methodName === 'componentWillMount') {
128-
process.stderr.write(`or place logic in 'componentDidMount' method.\n`);
140+
process.stderr.write('or place logic in "componentDidMount" method.\n');
129141
}
130142
process.stderr.write('\n');
131143
process.stderr.write(
132-
`Alternatively use 'preact build --no-prerender' to disable prerendering.\n\n`
144+
'Alternatively use "preact build --no-prerender" to disable prerendering.\n\n'
133145
);
134146
process.stderr.write(
135-
'See https://github.com/developit/preact-cli#pre-rendering for further information.'
147+
'See https://github.com/preactjs/preact-cli#pre-rendering for further information.\n\n'
136148
);
137149
process.exit(1);
138150
}

0 commit comments

Comments
 (0)