-
Notifications
You must be signed in to change notification settings - Fork 57
Expand file tree
/
Copy pathemulatePrerender.js
More file actions
77 lines (75 loc) · 1.53 KB
/
emulatePrerender.js
File metadata and controls
77 lines (75 loc) · 1.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
function createRequest(url) {
return {
method: 'GET',
host: '',
cookies: {},
query: {},
url,
headers: {},
}
}
function createResponse(callback) {
const res = {
_removedHeader: {},
_statusCode: 200,
statusMessage: 'OK',
get statusCode() {
return this._statusCode
},
set statusCode(status) {
this._statusCode = status
this.status(status)
},
}
const headers = {}
let code = 200
res.set = res.header = (x, y) => {
if (arguments.length === 2) {
res.setHeader(x, y)
} else {
for (const key in x) {
res.setHeader(key, x[key])
}
}
return res
}
res.setHeader = (x, y) => {
headers[x] = y
headers[x.toLowerCase()] = y
return res
}
res.getHeader = (x) => headers[x]
res.redirect = function (_code, url) {
if (typeof _code !== 'number') {
code = 301
url = _code
} else {
code = _code
}
res.setHeader('Location', url)
res.end()
}
res.status = res.sendStatus = function (number) {
code = number
return res
}
res.end =
res.send =
res.write =
function (data = '') {
if (callback) callback(code, data, headers)
}
return res
}
export default function emulatePrerender(server) {
server.prerender = async function prerender(originalUrl) {
server.start()
return new Promise((resolve) => {
server._router.handle(
createRequest(originalUrl),
createResponse((code, data) => resolve(data)),
() => { },
)
})
}
}