Skip to content

Commit 3b8a18f

Browse files
authored
feat(core): migrate h3 v1 to v2 to align with devframe (#346)
1 parent 3f460d2 commit 3b8a18f

6 files changed

Lines changed: 52 additions & 43 deletions

File tree

packages/core/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ export { createDevToolsContext } from './node/context'
22
export { DevTools } from './node/plugins'
33
export type { BuiltinServerFunctions } from './node/rpc'
44
export { createDevToolsMiddleware } from './node/server'
5+
export type { DevToolsMiddleware } from './node/server'
56
export type { DevToolsInternalContext, InternalAnonymousAuthStorage } from 'devframe/node/internal'

packages/core/src/node/cli-commands.ts

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,22 +43,18 @@ export async function start(options: StartOptions) {
4343
})
4444

4545
const { createServer } = await import('node:http')
46-
const { createApp, eventHandler, sendRedirect, toNodeListener } = await import('h3')
47-
const { serveStaticHandler } = await import('devframe/utils/serve-static')
46+
const { defineHandler, H3, sendRedirect, toNodeHandler } = await import('h3')
47+
const { mountStaticHandler } = await import('devframe/utils/serve-static')
4848

49-
const app = createApp()
49+
const app = new H3()
5050

51-
for (const { baseUrl, distDir } of devtools.context.views.buildStaticDirs) {
52-
app.use(baseUrl, serveStaticHandler(distDir))
53-
}
51+
for (const { baseUrl, distDir } of devtools.context.views.buildStaticDirs)
52+
mountStaticHandler(app, baseUrl, distDir)
5453

55-
app.use(DEVTOOLS_MOUNT_PATH, h3.handler)
56-
app.use('/', eventHandler(async (event) => {
57-
if (event.node.req.url === '/')
58-
return sendRedirect(event, DEVTOOLS_MOUNT_PATH)
59-
}))
54+
app.use(DEVTOOLS_MOUNT_PATH, h3)
55+
app.use('/', defineHandler(event => sendRedirect(event, DEVTOOLS_MOUNT_PATH, 302)))
6056

61-
const server = createServer(toNodeListener(app))
57+
const server = createServer(toNodeHandler(app))
6258

6359
server.listen(port, host, async () => {
6460
const url = normalizeHttpServerUrl(host, port)

packages/core/src/node/server.ts

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
1+
import type { NodeHandler } from 'h3'
12
import type { CreateWsServerOptions } from './ws'
23
import { DEVTOOLS_CONNECTION_META_FILENAME } from '@vitejs/devtools-kit/constants'
34
import { consumeTempAuthToken } from 'devframe/node/auth'
45
import { getInternalContext } from 'devframe/node/internal'
5-
import { serveStaticHandler } from 'devframe/utils/serve-static'
6-
import { createApp, eventHandler, getQuery, toNodeListener } from 'h3'
6+
import { mountStaticHandler } from 'devframe/utils/serve-static'
7+
import { defineHandler, getQuery, H3, toNodeHandler } from 'h3'
78
import { dirClientStandalone } from '../dirs'
89
import { createWsServer } from './ws'
910

11+
export interface DevToolsMiddleware {
12+
h3: H3
13+
rpc: Awaited<ReturnType<typeof createWsServer>>['rpc']
14+
middleware: NodeHandler
15+
getConnectionMeta: Awaited<ReturnType<typeof createWsServer>>['getConnectionMeta']
16+
}
17+
1018
function generateAuthPageHtml(): string {
1119
return `<!DOCTYPE html>
1220
<html>
@@ -56,45 +64,45 @@ function generateAuthPageHtml(): string {
5664
</html>`
5765
}
5866

59-
export async function createDevToolsMiddleware(options: CreateWsServerOptions) {
60-
const h3 = createApp()
67+
export async function createDevToolsMiddleware(options: CreateWsServerOptions): Promise<DevToolsMiddleware> {
68+
const h3 = new H3()
6169
const contextInternal = getInternalContext(options.context)
6270

6371
const { rpc, getConnectionMeta } = await createWsServer(options)
6472

65-
h3.use(`/${DEVTOOLS_CONNECTION_META_FILENAME}`, eventHandler(async (event) => {
66-
event.node.res.setHeader('Content-Type', 'application/json')
67-
return event.node.res.end(JSON.stringify(await getConnectionMeta()))
73+
h3.use(`/${DEVTOOLS_CONNECTION_META_FILENAME}`, defineHandler(async (event) => {
74+
event.res.headers.set('Content-Type', 'application/json')
75+
return JSON.stringify(await getConnectionMeta())
6876
}))
6977

70-
h3.use('/auth-verify', eventHandler((event) => {
78+
h3.use('/auth-verify', defineHandler((event) => {
7179
const { id } = getQuery(event) as { id?: string }
7280
if (!id) {
73-
event.node.res.statusCode = 400
74-
return event.node.res.end('Missing id parameter')
81+
event.res.status = 400
82+
return 'Missing id parameter'
7583
}
7684

7785
const clientAuthToken = consumeTempAuthToken(id, contextInternal.storage.auth)
7886
if (!clientAuthToken) {
79-
event.node.res.statusCode = 403
80-
return event.node.res.end('Invalid or expired auth token')
87+
event.res.status = 403
88+
return 'Invalid or expired auth token'
8189
}
8290

83-
event.node.res.setHeader('Content-Type', 'application/json')
84-
return event.node.res.end(JSON.stringify({ authToken: clientAuthToken }))
91+
event.res.headers.set('Content-Type', 'application/json')
92+
return JSON.stringify({ authToken: clientAuthToken })
8593
}))
8694

87-
h3.use('/auth', eventHandler((event) => {
88-
event.node.res.setHeader('Content-Type', 'text/html')
89-
return event.node.res.end(generateAuthPageHtml())
95+
h3.use('/auth', defineHandler((event) => {
96+
event.res.headers.set('Content-Type', 'text/html; charset=utf-8')
97+
return generateAuthPageHtml()
9098
}))
9199

92-
h3.use(serveStaticHandler(dirClientStandalone))
100+
mountStaticHandler(h3, '', dirClientStandalone)
93101

94102
return {
95103
h3,
96104
rpc,
97-
middleware: toNodeListener(h3),
105+
middleware: toNodeHandler(h3),
98106
getConnectionMeta,
99107
}
100108
}

pnpm-lock.yaml

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

pnpm-workspace.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ catalogs:
6161
diff: ^9.0.0
6262
envinfo: ^7.21.0
6363
get-port-please: ^3.2.0
64-
h3: ^1.15.11
64+
h3: 2.0.1-rc.22
6565
logs-sdk: ^0.0.6
6666
mlly: ^1.8.2
6767
mrmime: ^2.0.1

test/__snapshots__/tsnapi/@vitejs/devtools/index.snapshot.d.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
/**
22
* Generated by tsnapi — public API snapshot of `@vitejs/devtools`
33
*/
4+
// #region Interfaces
5+
export interface DevToolsMiddleware {
6+
h3: H3;
7+
rpc: Awaited<ReturnType<typeof createWsServer>>['rpc'];
8+
middleware: NodeHandler;
9+
getConnectionMeta: Awaited<ReturnType<typeof createWsServer>>['getConnectionMeta'];
10+
}
11+
// #endregion
12+
413
// #region Types
514
export type BuiltinServerFunctions = RpcDefinitionsToFunctions<typeof builtinRpcDeclarations>;
615
// #endregion
716

817
// #region Functions
918
export declare function createDevToolsContext(_: ResolvedConfig, _?: ViteDevServer): Promise<ViteDevToolsNodeContext>;
10-
export declare function createDevToolsMiddleware(_: CreateWsServerOptions): Promise<{
11-
h3: _$h3.App;
12-
rpc: _$birpc.BirpcGroup<_$devframe_types0.DevToolsRpcClientFunctions, _$_vitejs_devtools_kit0.DevToolsRpcServerFunctions, false>;
13-
middleware: _$h3.NodeListener;
14-
getConnectionMeta: () => Promise<_$devframe_types0.ConnectionMeta>;
15-
}>;
19+
export declare function createDevToolsMiddleware(_: CreateWsServerOptions): Promise<DevToolsMiddleware>;
1620
export declare function DevTools(_?: DevToolsOptions): Promise<Plugin[]>;
1721
// #endregion
1822

0 commit comments

Comments
 (0)