forked from vitejs/devtools
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.ts
More file actions
84 lines (79 loc) · 2.64 KB
/
server.ts
File metadata and controls
84 lines (79 loc) · 2.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import type { ClientScriptEntry, DevToolsDockEntry, DevToolsNodeContext } from '@vitejs/devtools-kit'
import type { Plugin } from 'vite'
import {
DEVTOOLS_DOCK_IMPORTS_VIRTUAL_ID,
DEVTOOLS_MOUNT_PATH,
DEVTOOLS_MOUNT_PATH_NO_TRAILING_SLASH,
} from '@vitejs/devtools-kit/constants'
import { createDevToolsContext } from '../context'
import { createDevToolsMiddleware } from '../server'
import '../rpc'
/**
* Core plugin for enabling Vite DevTools
*/
export function renderDockImportsMap(docks: Iterable<DevToolsDockEntry>): string {
const map = new Map<string, ClientScriptEntry>()
for (const dock of docks) {
const id = `${dock.type}:${dock.id}`
if (dock.type === 'action') {
map.set(id, dock.action)
}
else if (dock.type === 'custom-render') {
map.set(id, dock.renderer)
}
else if (dock.type === 'iframe' && dock.clientScript) {
map.set(id, dock.clientScript)
}
}
return [
`export const importsMap = {`,
...[...map.entries()]
.filter(([, entry]) => entry != null)
.map(([id, { importFrom, importName }]) => ` [${JSON.stringify(id)}]: () => import(${JSON.stringify(importFrom)}).then(r => r[${JSON.stringify(importName ?? 'default')}]),`),
'}',
].join('\n')
}
export function DevToolsServer(): Plugin {
let context: DevToolsNodeContext
return {
name: 'vite:devtools:server',
enforce: 'post',
apply: 'serve',
async configureServer(viteDevServer) {
context = await createDevToolsContext(viteDevServer.config, viteDevServer)
const host = viteDevServer.config.server.host === true
? '0.0.0.0'
: viteDevServer.config.server.host || 'localhost'
const { middleware } = await createDevToolsMiddleware({
cwd: viteDevServer.config.root,
websocket: {
host,
},
context,
})
viteDevServer.middlewares.use((req, res, next) => {
if (req.url === DEVTOOLS_MOUNT_PATH_NO_TRAILING_SLASH || req.url?.startsWith(`${DEVTOOLS_MOUNT_PATH_NO_TRAILING_SLASH}?`)) {
res.statusCode = 302
res.setHeader('Location', `${DEVTOOLS_MOUNT_PATH}${req.url.slice(DEVTOOLS_MOUNT_PATH_NO_TRAILING_SLASH.length)}`)
res.end()
return
}
next()
})
viteDevServer.middlewares.use(DEVTOOLS_MOUNT_PATH, middleware)
},
resolveId(id) {
if (id === DEVTOOLS_DOCK_IMPORTS_VIRTUAL_ID) {
return id
}
},
load(id) {
if (id === DEVTOOLS_DOCK_IMPORTS_VIRTUAL_ID) {
if (!context) {
throw new Error('DevTools context is not initialized')
}
return renderDockImportsMap(context.docks.values())
}
},
}
}