Skip to content

Commit 15d9e3f

Browse files
committed
use connect et al. instead of Express
1 parent 08cf552 commit 15d9e3f

File tree

7 files changed

+115
-261
lines changed

7 files changed

+115
-261
lines changed

app.js

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const express = require('express');
1+
const connect = require('@pirxpilot/connect');
22
const cachifyStatic = require('connect-cachify-static');
33
const gzip = require('connect-gzip-static');
44
const http = require('node:http');
@@ -9,12 +9,13 @@ const plugins = require('./lib/plugins');
99
const cookieParser = require('cookie-parser');
1010
const logger = require('morgan');
1111
const errorHandler = require('errorhandler');
12+
const renderer = require('connect-renderer');
1213

13-
const app = module.exports = express();
14+
const app = module.exports = connect();
1415

1516

1617
if (!process.env.SITE_URL) {
17-
process.env.SITE_URL = app.get('env') === 'production' ?
18+
process.env.SITE_URL = process.env.NODE_ENV === 'production' ?
1819
'https://liftie.info' :
1920
'http://localhost:3000';
2021
}
@@ -26,7 +27,7 @@ const {
2627
} = process.env;
2728
const cachify = cachifyStatic(root);
2829

29-
Object.assign(app.locals, {
30+
app.locals = {
3031
min: '.min',
3132
decorateAbout() {},
3233
siteUrl,
@@ -35,25 +36,26 @@ Object.assign(app.locals, {
3536
og: {
3637
image: `${staticHost || siteUrl}/img/snowflake-512.png`
3738
}
38-
});
39-
app.set('port', process.env.PORT || 3000);
40-
app.set('views', `${__dirname}/views`);
41-
app.engine('jade', require('@pirxpilot/jade-core').__express);
42-
app.set('view engine', 'jade');
39+
};
40+
41+
process.env.PORT ??= 3000;
42+
43+
app.use(renderer(`${__dirname}/views`).engine('jade', require('@pirxpilot/jade-core')));
4344

4445
app.use(logger('dev'));
4546
app.use(cookieParser());
4647
app.use(cachify);
47-
app.use((_req, res, next) => {
48-
cachify.helpers().then(fns => {
49-
res.locals.cachify = fns.cachify;
50-
next();
51-
});
48+
app.use(async (req, res, next) => {
49+
req.app = app;
50+
res.locals ??= {};
51+
const fns = await cachify.helpers();
52+
res.locals.cachify = fns.cachify;
53+
next();
5254
});
5355

5456
app.use(gzip(root));
5557

56-
if (app.get('env') === 'development') {
58+
if (process.env.NODE_ENV !== 'production') {
5759
app.locals.min = '';
5860
app.use(errorHandler());
5961
}
@@ -78,8 +80,8 @@ app.run = function run() {
7880
process.exit(1);
7981
return;
8082
}
81-
http.createServer(app).listen(app.get('port'), () => {
82-
console.log(`Running on: http://localhost:${app.get('port')}`);
83+
http.createServer(app).listen(process.env.PORT, () => {
84+
console.log(`Running on: http://localhost:${process.env.PORT}`);
8385
});
8486
});
8587
};

lib/routes/headers.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,20 @@ const reportTo = JSON.stringify({
3737
function csp(_req, res, next) {
3838
const cspNonce = crypto.randomBytes(16).toString('base64');
3939
res.locals.cspNonce = cspNonce;
40-
res.header(CSP_HEADER_NAME, cspPolicy.replace('$random', cspNonce));
40+
res.setHeader(CSP_HEADER_NAME, cspPolicy.replace('$random', cspNonce));
4141
if (CSP_REPORT_URI) {
42-
res.header('Report-To', reportTo);
42+
res.setHeader('Report-To', reportTo);
4343
}
4444
next();
4545
}
4646

4747
function referrer(_req, res, next) {
48-
res.header('Referrer-Policy', 'no-referrer-when-downgrade');
48+
res.setHeader('Referrer-Policy', 'no-referrer-when-downgrade');
4949
next();
5050
}
5151

5252
function feature(_req, res, next) {
53-
res.header('Feature-Policy', `fullscreen 'self'`);
53+
res.setHeader('Feature-Policy', `fullscreen 'self'`);
5454
next();
5555
}
5656

@@ -68,7 +68,7 @@ function link(_req, res, next) {
6868
}
6969
].map(linkHeader);
7070

71-
res.header('Link', preloadLinks);
71+
res.setHeader('Link', preloadLinks);
7272
next();
7373

7474
function linkHeader({ path, as, type }) {

lib/routes/index.js

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ const canonical = require('./canonical');
33
const plan = require('./plan');
44
const serviceWorker = require('./service-worker');
55
const headers = require('./headers');
6+
const Router = require('@pirxpilot/router');
7+
const parseurl = require('parseurl');
8+
const qs = require('qs');
69

710
module.exports = routes;
811

@@ -142,11 +145,12 @@ function api(req, res, next) {
142145
return next(err);
143146
}
144147
if (resorts.length !== 1) {
145-
return res.send(404, `Invalid resort name: ${req.params.resort}`);
148+
return res.writeHead(404, `Invalid resort name: ${req.params.resort}`).end();
146149
}
147150
// do not cache API responses
148-
res.header('Cache-Control', 'no-cache, max-age=0, must-revalidate');
149-
res.send(resorts[0]);
151+
res.setHeader('Cache-Control', 'no-cache, max-age=0, must-revalidate');
152+
res.setHeader('Content-Type', 'application/json');
153+
res.end(JSON.stringify(resorts[0]));
150154
});
151155
}
152156

@@ -155,49 +159,59 @@ function meta(req, res, next) {
155159
if (err) {
156160
return next(err);
157161
}
158-
res.header('Cache-Control', 'public, max-age=86400'); // good for 24hours
159-
res.send(resorts);
162+
res.setHeader('Cache-Control', 'public, max-age=86400'); // good for 24hours
163+
res.setHeader('Content-Type', 'application/json');
164+
res.end(JSON.stringify(resorts));
160165
});
161166
}
162167

163168
function routes(app) {
169+
const router = new Router();
164170

165171
function reqData(req, _res, next) {
166172
req.data = app.data;
167173
next();
168174
}
169175

170-
app.param('tag', (req, res, next, t) => {
176+
router.param('tag', (req, res, next, t) => {
171177
const data = app.data;
172178
const tags = data.tags();
173179
const requested = tags[t]?.members;
174180
if (!requested) {
175181
t = canonical(t);
176182
if (tags[t]) {
177183
// permanent redirect to canonical form of the tag
178-
return res.redirect(301, `/tag/${t}`);
184+
return res
185+
.writeHead( 301, { location: `/tag/${encodeURIComponent(t)}` })
186+
.end();
179187
}
180-
return res.send(404, `Invalid tag name: ${req.params.tag}`);
188+
return res.writeHead(404, `Invalid tag name: ${req.params.tag}`).end();
181189
}
182190
req.requested = requested;
183191
req.tag = tags[t];
184192
res.locals.tag = t;
185193
next();
186194
});
187195

188-
app.get('/', reqData, headers, index, renderResorts);
189-
app.get('/resort/:resort', reqData, headers, index, renderResorts);
190-
app.get('/widget/resort/:resort', reqData, headers, widget, renderResorts);
191-
app.get('/tag/:tag', reqData, headers, tag, renderResorts);
192-
app.get('/stars', reqData, headers, stars, renderResorts);
193-
app.get('/api/resort/:resort', reqData, api);
194-
app.get('/api/meta', reqData, meta);
195-
app.get('/sitemap.xml', reqData, sitemap);
196-
app.get('/about', headers, about);
197-
app.get('/absent', reqData, headers, absent, renderResorts);
198-
app.get('/confused', reqData, headers, confused, renderResorts);
199-
app.get('/closed', reqData, headers, closed, renderResorts);
200-
app.get('/stats/:tag', reqData, headers, stats);
201-
app.get('/stats', reqData, headers, stats);
202-
app.get('/sw.js', serviceWorker);
196+
router.use((req, _res, next) => {
197+
req.query = qs.parse(parseurl(req).query);
198+
next();
199+
});
200+
router.get('/', reqData, headers, index, renderResorts);
201+
router.get('/resort/:resort', reqData, headers, index, renderResorts);
202+
router.get('/widget/resort/:resort', reqData, headers, widget, renderResorts);
203+
router.get('/tag/:tag', reqData, headers, tag, renderResorts);
204+
router.get('/stars', reqData, headers, stars, renderResorts);
205+
router.get('/api/resort/:resort', reqData, api);
206+
router.get('/api/meta', reqData, meta);
207+
router.get('/sitemap.xml', reqData, sitemap);
208+
router.get('/about', headers, about);
209+
router.get('/absent', reqData, headers, absent, renderResorts);
210+
router.get('/confused', reqData, headers, confused, renderResorts);
211+
router.get('/closed', reqData, headers, closed, renderResorts);
212+
router.get('/stats/:tag', reqData, headers, stats);
213+
router.get('/stats', reqData, headers, stats);
214+
router.get('/sw.js', serviceWorker);
215+
216+
app.use(router);
203217
}

lib/routes/service-worker.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ const DEBUG = NODE_ENV !== 'production';
1414
function renderServiceWorker(_req, res) {
1515
createServiceWorkerScript(res.locals).then(serviceWorkerScript => {
1616
// do not cache service worker
17-
res.header('Cache-Control', 'no-cache, max-age=0, must-revalidate');
18-
res.header('Content-Type', 'text/javascript');
17+
res.setHeader('Cache-Control', 'no-cache, max-age=0, must-revalidate');
18+
res.setHeader('Content-Type', 'text/javascript');
1919
res.write(serviceWorkerScript);
2020
res.end();
2121
});

package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,14 @@
2727
"test": "make lint test"
2828
},
2929
"dependencies": {
30+
"@pirxpilot/connect": "^4.0.2",
3031
"@pirxpilot/jade-core": "^1.12.1",
3132
"@pirxpilot/k": "^1.0.0",
33+
"@pirxpilot/router": "^1.0.0",
3234
"@pirxpilot/swipe": "^2.0.2",
3335
"connect-cachify-static": "^4.0.0",
3436
"connect-gzip-static": "^4.0.0",
37+
"connect-renderer": "^0.1.1",
3538
"cookie-parser": "^1.4.3",
3639
"css-select": "~5",
3740
"debounce": "^2.0.0",
@@ -42,13 +45,13 @@
4245
"el-component": "^1.0.1",
4346
"errorhandler": "^1.5.0",
4447
"esbuild": "^0.24.0",
45-
"express": "^4.16.2",
4648
"htmlparser2": "~10",
4749
"js-cookie": "^3.0.5",
4850
"limiter": "~2.1.0",
4951
"lodash": "^4.16.6",
5052
"morgan": "^1.9.0",
51-
"qs": "^6.3.0",
53+
"parseurl": "^1.3.3",
54+
"qs": "^6.13.1",
5255
"ro-rating": "^1.0.2",
5356
"superagent": "~10.1.0",
5457
"tiny-pager": "^1.0.0",

0 commit comments

Comments
 (0)