Skip to content

Commit a0e59ba

Browse files
authored
Report page errors (#5)
1 parent 4c80cba commit a0e59ba

File tree

3 files changed

+50
-0
lines changed

3 files changed

+50
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ render(url, {
3434
delayLaunch: 0, // milliseconds
3535
delayPageLoad: 0, // milliseconds
3636
chromeFlags: [], // list of flags
37+
onPageError() {} // callback
3738
});
3839
```
3940

@@ -42,6 +43,7 @@ The second parameter of `render` function can either be an array of chrome flags
4243
* `delayLaunch` Wait to launch Chrome browser, in case you need more time to set up the server
4344
* `delayPageLoad` Wait after the page load event for your JS to run
4445
* `chromeFlags` List of chrome flags
46+
* `onPageError` Function called when an uncaught exception happens within the page. You can use this function for instance to fail your build if error happens during the generation of the page
4547

4648

4749
## Continuous integration

__tests__/prerender.test.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const render = require('../index');
2+
const http = require('http');
23

34
describe('Pre-renderer', () => {
45
it('pre-renders a web page', () => {
@@ -11,4 +12,46 @@ describe('Pre-renderer', () => {
1112
delayPageLoad: 100,
1213
})).resolves.toMatch(/google/i);
1314
});
15+
16+
it('reports console messages', () => {
17+
const onPageError = jest.fn();
18+
return listen(() => render('http://localhost:4100', { onPageError }))
19+
.then((result) => {
20+
expect(result).toMatch(/test page/);
21+
expect(onPageError).toHaveBeenCalledWith(expect.any(Error));
22+
const error = onPageError.mock.calls[0][0];
23+
expect(error.message).toMatch(/object is not defined/);
24+
});
25+
})
1426
});
27+
28+
function listen(cb) {
29+
return new Promise((resolve, reject) => {
30+
const server = http.createServer((req, res) => {
31+
res.writeHead(200, {
32+
'Content-Type': 'text/html'
33+
});
34+
res.end(`
35+
<html>
36+
<head>
37+
<title>test page</title>
38+
</head>
39+
<body>
40+
<script>
41+
object.fn();
42+
</script>
43+
</body>
44+
</html>
45+
`);
46+
})
47+
.listen(4100, () => {
48+
cb().then((args) => {
49+
server.close();
50+
resolve(args);
51+
}).catch((err) => {
52+
server.close();
53+
reject(err);
54+
});
55+
});
56+
});
57+
}

index.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ module.exports = function (source, options = {}) {
1818
'browser.newPage',
1919
(browser) => browser.newPage(),
2020

21+
`adding console listeners`,
22+
(page) => page.on('pageerror', options.onPageError || noop) || page,
23+
2124
`page.goto('${source}')`,
2225
(page) => page.goto(source)
2326
)
@@ -72,3 +75,5 @@ function wait(time) {
7275
}
7376
return Promise.resolve();
7477
}
78+
79+
function noop () {}

0 commit comments

Comments
 (0)