Skip to content

Commit 21f8615

Browse files
committed
fix: apply middleware before internal middleware; add CORS support
1 parent 0ef5f0f commit 21f8615

File tree

5 files changed

+73
-28
lines changed

5 files changed

+73
-28
lines changed

lib/__tests__/middleware.test.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Connect } from "vite";
55
import { beforeEach, describe, expect, it, vi } from "vitest";
66

77
import { Config } from "../config.ts";
8-
import middleware from "../middleware.ts";
8+
import { createMiddleware } from "../middleware.ts";
99

1010
vi.mock("fs");
1111
const mockCreateReadStream = vi.mocked(fs.createReadStream);
@@ -63,12 +63,12 @@ describe("middleware", () => {
6363
resolve: "./hello",
6464
},
6565
];
66-
const middlewareFn = middleware(config);
66+
const middleware = createMiddleware(config);
6767
const req = mockReq({ url: "/hello" });
6868
const res = mockRes();
6969

7070
// when
71-
middlewareFn(req, res, mockNext);
71+
middleware(req, res, mockNext);
7272

7373
// then
7474
expect(res.writeHead).toHaveBeenCalledWith(200, expectedHeaders(50, undefined));
@@ -104,7 +104,7 @@ describe("middleware", () => {
104104
},
105105
];
106106

107-
const middlewareFn = middleware(config);
107+
const middleware = createMiddleware(config);
108108

109109
for (const test of tests) {
110110
// given
@@ -113,7 +113,7 @@ describe("middleware", () => {
113113
const res = mockRes();
114114

115115
// when
116-
middlewareFn(req, res, mockNext);
116+
middleware(req, res, mockNext);
117117

118118
// then
119119
expect(res.writeHead).toHaveBeenCalledWith(200, expectedHeaders(test.size, test.type));
@@ -126,12 +126,12 @@ describe("middleware", () => {
126126
it("returns a 404 if the resolved path cannot be opened", () => {
127127
// given
128128
mockStatSync.mockReturnValue(undefined);
129-
const middlewareFn = middleware(mockConfig);
129+
const middleware = createMiddleware(mockConfig);
130130
const req = mockReq();
131131
const res = mockRes();
132132

133133
// when
134-
middlewareFn(req, res, mockNext);
134+
middleware(req, res, mockNext);
135135

136136
// then
137137
expectNotFound(res);
@@ -140,51 +140,51 @@ describe("middleware", () => {
140140
it("returns a 404 if the resolved path does not point to a file", () => {
141141
// given
142142
mockStatSync.mockReturnValue({ isFile: () => false } as Stats);
143-
const middlewareFn = middleware(mockConfig);
143+
const middleware = createMiddleware(mockConfig);
144144
const req = mockReq();
145145
const res = mockRes();
146146

147147
// when
148-
middlewareFn(req, res, mockNext);
148+
middleware(req, res, mockNext);
149149

150150
// then
151151
expectNotFound(res);
152152
});
153153

154154
it("yields if the url is undefined", () => {
155155
// given
156-
const middlewareFn = middleware(mockConfig);
156+
const middleware = createMiddleware(mockConfig);
157157
const req = mockReq({ url: undefined });
158158
const res = mockRes();
159159

160160
// when
161-
middlewareFn(req, res, mockNext);
161+
middleware(req, res, mockNext);
162162

163163
// then
164164
expectYield(res);
165165
});
166166

167167
it("yields if the config is empty", () => {
168168
// given
169-
const middlewareFn = middleware([]);
169+
const middleware = createMiddleware([]);
170170
const req = mockReq();
171171
const res = mockRes();
172172

173173
// when
174-
middlewareFn(req, res, mockNext);
174+
middleware(req, res, mockNext);
175175

176176
// then
177177
expectYield(res);
178178
});
179179

180180
it("yields if none of the config patterns match", () => {
181181
// given
182-
const middlewareFn = middleware(mockConfig);
182+
const middleware = createMiddleware(mockConfig);
183183
const req = mockReq({ url: "/index.html" });
184184
const res = mockRes();
185185

186186
// when
187-
middlewareFn(req, res, mockNext);
187+
middleware(req, res, mockNext);
188188

189189
// then
190190
expectYield(res);

lib/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import { Plugin } from "vite";
22

33
import { Config } from "./config.ts";
4-
import middleware from "./middleware.ts";
4+
import applyMiddleware from "./middleware.ts";
55

66
export default function serveStatic(config: Config): Plugin {
77
return {
88
name: "serve-static",
99
configureServer(server) {
10-
return () => server.middlewares.use(middleware(config));
10+
applyMiddleware(server, config, server.config.server.cors);
1111
},
1212
configurePreviewServer(server) {
13-
return () => server.middlewares.use(middleware(config));
13+
applyMiddleware(server, config, server.config.preview.cors);
1414
},
1515
};
1616
}

lib/middleware.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1+
import corsMiddleware from "cors";
12
import fs from "fs";
23
import { contentType } from "mime-types";
34
import path from "path";
4-
import { Connect } from "vite";
5+
import { CommonServerOptions, Connect, PreviewServer, ViteDevServer } from "vite";
56

67
import { Config } from "./config.ts";
78

8-
const middleware = (config: Config): Connect.NextHandleFunction => {
9+
export function createMiddleware(config: Config): Connect.NextHandleFunction {
910
return (req, res, next) => {
1011
if (!req.url) {
1112
return next();
@@ -39,6 +40,20 @@ const middleware = (config: Config): Connect.NextHandleFunction => {
3940

4041
return next();
4142
};
42-
};
43-
44-
export default middleware;
43+
}
44+
45+
export default function applyMiddleware(
46+
server: ViteDevServer | PreviewServer,
47+
pluginConfig: Config,
48+
corsConfig: CommonServerOptions["cors"],
49+
) {
50+
const pluginMiddleware = createMiddleware(pluginConfig);
51+
52+
// https://github.com/vitejs/vite/blob/fcf50c2e881356ea0d725cc563722712a2bf5695/packages/vite/src/node/server/index.ts#L852-L854
53+
if (corsConfig !== false) {
54+
const config = typeof corsConfig === "boolean" ? {} : corsConfig;
55+
server.middlewares.use(corsMiddleware(config));
56+
}
57+
58+
server.middlewares.use(pluginMiddleware);
59+
}

package-lock.json

Lines changed: 33 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,12 @@
3131
"vite": "^5.0.0"
3232
},
3333
"dependencies": {
34+
"cors": "^2.8.5",
3435
"mime-types": "^2.1.35"
3536
},
3637
"devDependencies": {
3738
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
39+
"@types/cors": "^2.8.17",
3840
"@types/mime-types": "^2.1.4",
3941
"@typescript-eslint/eslint-plugin": "^7.0.1",
4042
"@typescript-eslint/parser": "^7.0.1",

0 commit comments

Comments
 (0)