Skip to content

Commit c04afbc

Browse files
committed
dev and prod middleware
1 parent 5d6f407 commit c04afbc

7 files changed

Lines changed: 167 additions & 171 deletions

File tree

examples/with-strict-csp/src/middleware.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,11 @@ export default createMiddleware({
2020
// For more details, see: https://vite.dev/config/build-options.html#build-assetsinlinelimit
2121
const csp = `
2222
default-src 'self';
23-
script-src ${
24-
isProd
25-
? // Note: The `https:` and `'unsafe-inline'` directives do not reduce the effectiveness of the CSP.
26-
// They are only fallbacks for older browsers that don't support `'strict-dynamic'`.
27-
`'nonce-${nonce}' 'strict-dynamic' 'unsafe-eval' https: 'unsafe-inline'`
28-
: "'self' 'unsafe-inline' 'unsafe-eval' https: http:"
23+
script-src ${isProd
24+
? // Note: The `https:` and `'unsafe-inline'` directives do not reduce the effectiveness of the CSP.
25+
// They are only fallbacks for older browsers that don't support `'strict-dynamic'`.
26+
`'nonce-${nonce}' 'strict-dynamic' 'unsafe-eval' https: 'unsafe-inline'`
27+
: "'self' 'unsafe-inline' 'unsafe-eval' https: http:"
2928
};
3029
style-src ${isProd ? `'nonce-${nonce}'` : "'self' 'unsafe-inline'"};
3130
img-src 'self' data:;

examples/with-strict-csp/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"strict": true,
1212
"noEmit": true,
1313
"isolatedModules": true,
14+
"types": ["vite/client"],
1415
"paths": {
1516
"~/*": ["./src/*"]
1617
}

packages/start/src/config/index.ts

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ const SolidStartServerFnsPlugin = createTanStackServerFnPlugin({
4242
fileURLToPath(new URL("../server/server-runtime.js", import.meta.url))
4343
)}"`,
4444
replacer: opts =>
45-
`createServerReference(${() => {}}, '${opts.functionId}', '${opts.extractedFilename}')`
45+
`createServerReference(${() => { }}, '${opts.functionId}', '${opts.extractedFilename}')`
4646
},
4747
ssr: {
4848
getRuntimeCode: () =>
@@ -72,7 +72,8 @@ const VIRTUAL_MODULES = {
7272
serverManifest: "solid-start:server-manifest",
7373
getClientManifest: "solid-start:get-client-manifest",
7474
getSsrManifest: "solid-start:get-ssr-manifest",
75-
getManifest: "solid-start:get-manifest"
75+
getManifest: "solid-start:get-manifest",
76+
middleware: "solid-start:middleware"
7677
} as const;
7778

7879
export const CLIENT_BASE_PATH = "_build";
@@ -179,9 +180,9 @@ function solidStartVitePlugin(options?: SolidStartOptions): Array<PluginOption>
179180
"~": join(process.cwd(), start.appRoot),
180181
...(!start.ssr
181182
? {
182-
"@solidjs/start/server": "@solidjs/start/server/spa",
183-
"@solidjs/start/client": "@solidjs/start/client/spa"
184-
}
183+
"@solidjs/start/server": "@solidjs/start/server/spa",
184+
"@solidjs/start/client": "@solidjs/start/client/spa"
185+
}
185186
: {})
186187
}
187188
},
@@ -222,7 +223,7 @@ function solidStartVitePlugin(options?: SolidStartOptions): Array<PluginOption>
222223
{
223224
name: "solid-start:manifest-plugin",
224225
enforce: "pre",
225-
resolveId(id) {
226+
async resolveId(id) {
226227
if (id === VIRTUAL_MODULES.serverManifest) return `\0${VIRTUAL_MODULES.serverManifest}`;
227228
if (id === VIRTUAL_MODULES.getClientManifest)
228229
return new URL("../server/manifest/client-manifest.js", import.meta.url).pathname;
@@ -232,6 +233,11 @@ function solidStartVitePlugin(options?: SolidStartOptions): Array<PluginOption>
232233
return this.environment.config.consumer === "server"
233234
? new URL("../server/manifest/ssr-manifest.js", import.meta.url).pathname
234235
: new URL("../server/manifest/client-manifest.js", import.meta.url).pathname;
236+
if (id === VIRTUAL_MODULES.middleware) {
237+
if (start.middleware) return await this.resolve(start.middleware);
238+
239+
return `\0${VIRTUAL_MODULES.middleware}`;
240+
}
235241
},
236242
async load(id) {
237243
if (id === `\0${VIRTUAL_MODULES.serverManifest}`) {
@@ -264,16 +270,16 @@ function solidStartVitePlugin(options?: SolidStartOptions): Array<PluginOption>
264270
)
265271
.map(
266272
asset =>
267-
({
268-
tag: "link",
269-
attrs: {
270-
href: join("/", CLIENT_BASE_PATH, asset),
271-
key: join("/", CLIENT_BASE_PATH, asset),
272-
...(asset.endsWith(".css")
273-
? { rel: "stylesheet", fetchPriority: "high" }
274-
: { rel: "modulepreload" })
275-
}
276-
} satisfies ManifestAsset)
273+
({
274+
tag: "link",
275+
attrs: {
276+
href: join("/", CLIENT_BASE_PATH, asset),
277+
key: join("/", CLIENT_BASE_PATH, asset),
278+
...(asset.endsWith(".css")
279+
? { rel: "stylesheet", fetchPriority: "high" }
280+
: { rel: "modulepreload" })
281+
}
282+
} satisfies ManifestAsset)
277283
);
278284

279285
acc[id] = {
@@ -303,7 +309,7 @@ function solidStartVitePlugin(options?: SolidStartOptions): Array<PluginOption>
303309
await getSsrDevManifest(true, handlers.client).getAssets(id)
304310
)}`;
305311
}
306-
}
312+
} else if (id === VIRTUAL_MODULES.middleware) return "export default {};"
307313
}
308314
},
309315
nitroPlugin({ root: process.cwd() }, () => ssrBundle, start.server, start.middleware),

packages/start/src/config/nitroPlugin.ts

Lines changed: 67 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ import {
33
_ResponseMiddleware,
44
createApp,
55
createEvent,
6+
EventHandler,
67
eventHandler,
8+
EventHandlerObject,
79
getHeader,
810
H3Event,
911
sendWebResponse
@@ -52,109 +54,85 @@ export function nitroPlugin(
5254
return async () => {
5355
removeHtmlMiddlewares(viteDevServer);
5456

55-
const h3App = createApp();
56-
5757
const serverEnv = viteDevServer.environments.server;
5858

5959
if (!serverEnv) throw new Error("Server environment not found");
6060
if (!isRunnableDevEnvironment(serverEnv))
6161
throw new Error("Server environment is not runnable");
6262

63+
const h3App = createApp();
64+
6365
h3App.use(
64-
eventHandler({
65-
onRequest: async e => {
66-
if (!middleware) return;
67-
const middlewareEntry = await serverEnv.runner.import(middleware);
68-
const {
69-
onRequest
70-
}: { onRequest?: _RequestMiddleware<Request>[] | _RequestMiddleware<Request> } =
71-
middlewareEntry?.default || {};
72-
if (Array.isArray(onRequest)) {
73-
onRequest?.forEach(handler => handler(e));
74-
} else {
75-
onRequest?.(e);
76-
}
77-
},
78-
onBeforeResponse: async (e, response) => {
79-
if (!middleware) return;
80-
const middlewareEntry = await serverEnv.runner.import(middleware);
81-
const {
82-
onBeforeResponse
83-
}: {
84-
onBeforeResponse?:
85-
| _ResponseMiddleware<Request, Response>[]
86-
| _ResponseMiddleware<Request, Response>;
87-
} = middlewareEntry?.default || {};
88-
if (Array.isArray(onBeforeResponse)) {
89-
onBeforeResponse?.forEach(handler => handler(e, response));
90-
} else {
91-
onBeforeResponse?.(e, response);
92-
}
93-
},
94-
handler: async event => {
95-
try {
96-
const serverEntry: {
97-
default: (e: H3Event) => Promise<Response>;
98-
} = await serverEnv.runner.import("./src/entry-server.tsx");
66+
eventHandler(async (event) => {
67+
const serverEntry: {
68+
default: EventHandler;
69+
} = await serverEnv.runner.import("./src/entry-server.tsx");
9970

100-
return await serverEntry.default(event);
101-
} catch (e) {
102-
console.error(e);
103-
viteDevServer.ssrFixStacktrace(e as Error);
104-
if (getHeader(event, "content-type")?.includes("application/json")) {
105-
return sendWebResponse(
106-
event,
107-
new Response(
108-
JSON.stringify(
109-
{
110-
status: 500,
111-
error: "Internal Server Error",
112-
message: "An unexpected error occurred. Please try again later.",
113-
timestamp: new Date().toISOString()
114-
},
115-
null,
116-
2
117-
),
118-
{
119-
status: 500,
120-
headers: {
121-
"Content-Type": "application/json"
122-
}
123-
}
124-
)
125-
);
126-
}
71+
return await serverEntry.default(event).catch((e: unknown) => {
72+
console.error(e);
73+
viteDevServer.ssrFixStacktrace(e as Error);
74+
if (
75+
getHeader(event, "content-type")?.includes(
76+
"application/json",
77+
)
78+
) {
12779
return sendWebResponse(
12880
event,
12981
new Response(
130-
`
131-
<!DOCTYPE html>
132-
<html lang="en">
133-
<head>
134-
<meta charset="UTF-8" />
135-
<title>Error</title>
136-
<script type="module">
137-
import { ErrorOverlay } from '/@vite/client'
138-
document.body.appendChild(new ErrorOverlay(${JSON.stringify(
139-
prepareError(event.node.req, e)
140-
).replace(/</g, "\\u003c")}))
141-
</script>
142-
</head>
143-
<body>
144-
</body>
145-
</html>
146-
`,
82+
JSON.stringify(
83+
{
84+
status: 500,
85+
error: "Internal Server Error",
86+
message:
87+
"An unexpected error occurred. Please try again later.",
88+
timestamp: new Date().toISOString(),
89+
},
90+
null,
91+
2,
92+
),
14793
{
14894
status: 500,
14995
headers: {
150-
"Content-Type": "text/html"
151-
}
152-
}
153-
)
96+
"Content-Type": "application/json",
97+
},
98+
},
99+
),
154100
);
155101
}
156-
}
157-
})
102+
return sendWebResponse(
103+
event,
104+
new Response(
105+
`
106+
<!DOCTYPE html>
107+
<html lang="en">
108+
<head>
109+
<meta charset="UTF-8" />
110+
<title>Error</title>
111+
<script type="module">
112+
import { ErrorOverlay } from '/@vite/client'
113+
document.body.appendChild(new ErrorOverlay(${JSON.stringify(
114+
prepareError(
115+
event.node.req,
116+
e,
117+
),
118+
).replace(/</g, "\\u003c")}))
119+
</script>
120+
</head>
121+
<body>
122+
</body>
123+
</html>
124+
`,
125+
{
126+
status: 500,
127+
headers: {
128+
"Content-Type": "text/html",
129+
},
130+
},
131+
),
132+
);
133+
})
134+
}
135+
),
158136
);
159137

160138
viteDevServer.middlewares.use(async (req, res) => {
@@ -324,9 +302,8 @@ function removeHtmlMiddlewares(server: ViteDevServer) {
324302
function prepareError(req: Connect.IncomingMessage, error: unknown) {
325303
const e = error as Error;
326304
return {
327-
message: `An error occured while server rendering ${req.url}:\n\n\t${
328-
typeof e === "string" ? e : e.message
329-
} `,
305+
message: `An error occured while server rendering ${req.url}:\n\n\t${typeof e === "string" ? e : e.message
306+
} `,
330307
stack: typeof e === "string" ? "" : e.stack
331308
};
332309
}

packages/start/src/env.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/// <reference types="vite" />
12
// This file is an augmentation to the built-in ImportMeta interface
23
// Thus cannot contain any top-level imports
34
// <https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation>

0 commit comments

Comments
 (0)