Skip to content

Commit 5ff4d2d

Browse files
authored
Factor out redirect middleware and run in dev server (#513)
Previously, our redirect logic did not work when running in dev mode, since that code was only present in the production server. Now that logic is factored out into a Koa middleware, so that it can run in both places. I also made a few other changes to make working on the server easier going forward. In an upcoming PR, I'll be adding a middleware to deal with GitHub auth tokens, so now it will be easier to run that both in production and during local development.
1 parent 153d001 commit 5ff4d2d

File tree

9 files changed

+55
-43
lines changed

9 files changed

+55
-43
lines changed

.gitignore

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,9 @@
33
node_modules
44

55
packages/*/lib/
6-
packages/*/index.js
7-
packages/*/index.js.map
8-
packages/*/index.d.ts
9-
packages/*/index.d.ts.map
10-
11-
packages/lit-dev-server/redirects.js
12-
packages/lit-dev-server/redirects.js.map
13-
packages/lit-dev-server/redirects.d.ts
14-
packages/lit-dev-server/redirects.d.ts.map
156

167
packages/lit-dev-content/_site
178
packages/lit-dev-content/_dev
18-
packages/lit-dev-content/playground-plugin
199
packages/lit-dev-content/rollupout
2010
packages/lit-dev-content/site/fonts
2111
packages/lit-dev-content/temp

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,4 @@ RUN npx lerna run build --scope lit-dev-content --stream
7575
#
7676
# [0] https://nodejs.org/api/cli.html#cli_max_old_space_size_size_in_megabytes
7777
# [1] https://github.com/nodejs/node/pull/25576
78-
CMD [ "node", "--max-old-space-size=768", "packages/lit-dev-server/index.js" ]
78+
CMD [ "node", "--max-old-space-size=768", "packages/lit-dev-server/lib/server.js" ]

packages/lit-dev-content/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77
"license": "BSD-3-Clause",
88
"main": "_site/index.html",
99
"scripts": {
10-
"postinstall": "npm run fonts:manrope && npm run temp:fixup-invalid-mwc-import",
11-
"temp:fixup-invalid-mwc-import": "sed -i=\"\" \"s#'lit-html/directive';#'lit-html/directive.js';#\" node_modules/@material/mwc-snackbar/accessible-snackbar-label-directive.js",
10+
"postinstall": "npm run fonts:manrope",
1211
"build": "rm -rf _site && npm run build:ts && npm run build:rollup && npm run build:samples && npm run build:site",
1312
"build:ts": "../../node_modules/.bin/tsc",
1413
"build:ts:watch": "../../node_modules/.bin/tsc --watch",
@@ -35,6 +34,7 @@
3534
"fast-glob": "^3.2.5",
3635
"html-minifier": "^4.0.0",
3736
"lit-dev-api": "^0.0.0",
37+
"lit-dev-server": "^0.0.0",
3838
"lit-dev-tools": "^0.0.0",
3939
"lit-dev-tools-esm": "^0.0.0",
4040
"luxon": "^2.0.2",

packages/lit-dev-content/web-dev-server.config.js renamed to packages/lit-dev-content/web-dev-server.config.mjs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
1-
module.exports = {
1+
/**
2+
* @license
3+
* Copyright 2021 Google LLC
4+
* SPDX-License-Identifier: BSD-3-Clause
5+
*/
6+
7+
import {redirectMiddleware} from 'lit-dev-server/lib/middleware/redirect-middleware.js';
8+
9+
export default {
10+
middleware: [redirectMiddleware()],
211
plugins: [
312
{
413
name: 'dont-resolve-sample-modules',

packages/lit-dev-server/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
"author": "Google LLC",
77
"license": "BSD-3-Clause",
88
"type": "module",
9-
"main": "index.js",
9+
"main": "lib/server.js",
1010
"scripts": {
1111
"build": "npm run build:ts",
1212
"build:ts": "../../node_modules/.bin/tsc",
13-
"start": "MODE=main PORT=8080 node index.js",
13+
"start": "MODE=main PORT=8080 node lib/server.js",
1414
"format": "../../node_modules/.bin/prettier \"**/*.{ts,js,json,html,css,md}\" --write"
1515
},
1616
"dependencies": {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* @license
3+
* Copyright 2021 Google LLC
4+
* SPDX-License-Identifier: BSD-3-Clause
5+
*/
6+
7+
import {pageRedirects} from '../redirects.js';
8+
import type Koa from 'koa';
9+
10+
/**
11+
* Creates a Koa middleware that performs lit.dev redirection logic.
12+
*/
13+
export const redirectMiddleware = (): Koa.Middleware => async (ctx, next) => {
14+
// If there would be multiple redirects, resolve them all here so that we
15+
// serve just one HTTP redirect instead of a chain.
16+
let path = ctx.path;
17+
if (path.match(/\/[^\/\.]+$/)) {
18+
// Canonicalize paths to have a trailing slash, except for files with
19+
// extensions.
20+
path += '/';
21+
}
22+
if (path.endsWith('//')) {
23+
// Koa static doesn't care if there are any number of trailing slashes.
24+
// Normalize this too.
25+
path = path.replace(/\/+$/, '/');
26+
}
27+
path = pageRedirects.get(path) ?? path;
28+
if (path !== ctx.path) {
29+
ctx.status = 301;
30+
ctx.redirect(path + (ctx.querystring ? '?' + ctx.querystring : ''));
31+
} else {
32+
await next();
33+
}
34+
};

packages/lit-dev-server/src/index.ts renamed to packages/lit-dev-server/src/server.ts

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import koaConditionalGet from 'koa-conditional-get';
1010
import koaEtag from 'koa-etag';
1111
import {fileURLToPath} from 'url';
1212
import * as path from 'path';
13-
import {pageRedirects} from './redirects.js';
13+
import {redirectMiddleware} from './middleware/redirect-middleware.js';
1414

1515
const mode = process.env.MODE;
1616
if (mode !== 'main' && mode !== 'playground') {
@@ -28,6 +28,7 @@ const __dirname = path.dirname(__filename);
2828
const contentPackage = path.resolve(
2929
__dirname,
3030
'..',
31+
'..',
3132
'lit-dev-content',
3233
'_site'
3334
);
@@ -48,29 +49,7 @@ if (mode === 'playground') {
4849
});
4950
}
5051

51-
app.use(async (ctx, next) => {
52-
// If there would be multiple redirects, resolve them all here so that we
53-
// serve just one HTTP redirect instead of a chain.
54-
let path = ctx.path;
55-
if (path.match(/\/[^\/\.]+$/)) {
56-
// Canonicalize paths to have a trailing slash, except for files with
57-
// extensions.
58-
path += '/';
59-
}
60-
if (path.endsWith('//')) {
61-
// Koa static doesn't care if there are any number of trailing slashes.
62-
// Normalize this too.
63-
path = path.replace(/\/+$/, '/');
64-
}
65-
path = pageRedirects.get(path) ?? path;
66-
if (path !== ctx.path) {
67-
ctx.status = 301;
68-
ctx.redirect(path + (ctx.querystring ? '?' + ctx.querystring : ''));
69-
} else {
70-
await next();
71-
}
72-
});
73-
52+
app.use(redirectMiddleware());
7453
app.use(koaConditionalGet()); // Needed for etag
7554
app.use(koaEtag());
7655
app.use(

packages/lit-dev-server/tsconfig.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
{
22
"compilerOptions": {
33
"incremental": true,
4-
"tsBuildInfoFile": "./tsconfig.tsbuildinfo",
4+
"tsBuildInfoFile": "./lib/.tsbuildinfo",
55
"target": "es2020",
66
"module": "esnext",
77
"declaration": true,
88
"declarationMap": true,
99
"sourceMap": true,
10-
"outDir": "./",
10+
"outDir": "./lib",
1111
"rootDir": "./src",
1212
"composite": true,
1313
"strict": true,

packages/lit-dev-tools-esm/src/check-redirects.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import * as pathLib from 'path';
88
import * as fs from 'fs/promises';
99
import ansi from 'ansi-escape-sequences';
1010
import fetch from 'node-fetch';
11-
import {pageRedirects} from 'lit-dev-server/redirects.js';
11+
import {pageRedirects} from 'lit-dev-server/lib/redirects.js';
1212
import {fileURLToPath} from 'url';
1313

1414
const __filename = fileURLToPath(import.meta.url);

0 commit comments

Comments
 (0)