/
index.js
147 lines (130 loc) · 4.74 KB
/
index.js
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
const modernizr = require('modernizr')
const bodyParser = require('body-parser')
function modernizrExpress (options={}) {
return (req, res, next) => {
if (options.storageMethod == 'cookie') {
handleCookie(req, res, next, options)
} else if (options.storageMethod === 'session') {
bodyParser.urlencoded({ extended: false })(req, res, handleSession(req, res, next, options))
} else {
handleCookie(req, res, next, options) // default
}
}
}
function handleCookie(req, res, next, options) {
let storageName = options.storageName || 'modernizr' // default to 'modernizr'
if (req.cookies === undefined) {
throw (Error(noCookieMessage(req.cookies[storageName])))
}
if (req.cookies[storageName]) {
req.cookies[storageName] = JSON.parse(req.cookies[storageName])
// cookie already exists, continue
next()
} else {
let expires = options.expires || 0 // default to expires=Session
if (options.build) {
let build = options.build
let scriptToSend = modernizrJsBuild(build, storageName, setModernizrCookieJs, expires)
res.send(scriptToSend)
} else if (options.config) {
// use the config and make a build...
modernizr.build(options.config, build => {
let scriptToSend = modernizrJsBuild(build, storageName, setModernizrCookieJs, expires)
res.send(scriptToSend)
})
} else {
// use a pre-configured CDN
let cdn = options.cdn || 'https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js'
let scriptToSend = modernizrJsCDN(cdn, storageName, setModernizrCookieJs, expires)
res.send(scriptToSend)
}
}
}
function handleSession(req, res, next, options) {
let storageName = options.storageName || 'modernizr' // default to 'modernizr'
req.session.expires = options.expires || req.session.expires
return () => {
if (req.session === undefined) {
throw (Error('Something went wrong'))
// throw (Error(noCookieMessage(req.session[storageName])))
}
if (req.session[storageName]) {
next()
} else if (req.query[storageName] ) { // the request from the javascript
req.session[storageName] = JSON.parse(req.query[storageName])
next()
} else { // the original request
if (options.build) {
let build = options.build
let scriptToSend = modernizrJsBuild(build, storageName, setModernizrSessionJs)
res.send(scriptToSend)
} else if (options.config) {
// use the config and make a build...
modernizr.build(options.config, build => {
let scriptToSend = modernizrJsBuild(build, storageName, setModernizrSessionJs)
res.send(scriptToSend)
})
} else {
// use a pre-configured CDN
let cdn = options.cdn || 'https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js'
let scriptToSend = modernizrJsCDN(cdn, storageName, setModernizrSessionJs)
res.send(scriptToSend)
}
}
}
}
function noCookieMessage(storageName) {
return `Cannot read property '${storageName}' of undefined
Make sure you have cookie-parser installed, and is used before modernizr-server.
Try:
npm install cookie-parser
and
const cookieParser = require('cookie-parser')
const modernizrServer = require('modernizr-server')
app.use(cookieParser())
app.use(modernizrServer())
...
see https://www.github.com/rlindskog/modernizr-server/ for more information
`
}
function modernizrJsBuild (modernizrBuild, storageName, setModernizr, expires=0) {
return `
<script type="text/javascript">${modernizrBuild}</script>
<script type="text/javascript">${setModernizr(storageName, expires)}</script>
`
}
function modernizrJsCDN (modernizrCDN, storageName, setModernizr, expires=0) {
return `
<script type="text/javascript" src="${modernizrCDN}"></script>
<script type="text/javascript">${setModernizr(storageName, expires)}</script>
`
}
function setModernizrCookieJs (storageName, expires) {
let expiresStr = expires === 0 ? `let expiresDate = 0` : `
let now = new Date()
now.setTime(now.getTime()+${expires})
let expiresDate = now.toGMTString()
`
return `
${expiresStr}
try {
document.cookie = '${storageName}=' + JSON.stringify(Modernizr) + '; expires=' + expiresDate + ';';
document.location.reload();
} catch(e) {}
`
}
function setModernizrSessionJs (storageName, expires) {
return `
try {
function sendModernizr() {
let xhttp = new XMLHttpRequest();
let payload = JSON.stringify(Modernizr)
xhttp.open("GET", document.location.pathname + '?${storageName}=' + payload, true);
xhttp.send();
document.location.reload();
}
sendModernizr();
} catch(e) {};
`
}
module.exports = modernizrExpress