vite 2.6.0-beta.0 → 2.6.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of vite might be problematic. Click here for more details.

Files changed (110) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/LICENSE.md +161 -3011
  3. package/bin/vite.js +2 -1
  4. package/dist/node/chunks/{dep-91aa74e8.js → dep-1e0a75a8.js} +58 -32
  5. package/dist/node/chunks/dep-1e0a75a8.js.map +1 -0
  6. package/dist/node/chunks/{dep-e36486f6.js → dep-ac1b4bf9.js} +1 -1
  7. package/dist/node/chunks/dep-ac1b4bf9.js.map +1 -0
  8. package/dist/node/chunks/{dep-c7e510f9.js → dep-ba6b30a0.js} +27538 -4953
  9. package/dist/node/chunks/dep-ba6b30a0.js.map +1 -0
  10. package/dist/node/chunks/{dep-11213a75.js → dep-c4cf6e92.js} +19 -6
  11. package/dist/node/chunks/dep-c4cf6e92.js.map +1 -0
  12. package/dist/node/chunks/{dep-eb6ef720.js → dep-d574094c.js} +18 -5
  13. package/dist/node/chunks/dep-d574094c.js.map +1 -0
  14. package/dist/node/chunks/{dep-0d2f9464.js → dep-e39b05d6.js} +18 -5
  15. package/dist/node/chunks/dep-e39b05d6.js.map +1 -0
  16. package/dist/node/cli.js +60 -23992
  17. package/dist/node/cli.js.map +1 -1
  18. package/dist/node/index.d.ts +26 -8
  19. package/dist/node/index.js +18 -15
  20. package/dist/node/index.js.map +1 -1
  21. package/dist/node/terser.js +102 -55
  22. package/package.json +28 -13
  23. package/types/package.json +3 -0
  24. package/api-extractor.json +0 -54
  25. package/dist/node/chunks/dep-0d2f9464.js.map +0 -1
  26. package/dist/node/chunks/dep-11213a75.js.map +0 -1
  27. package/dist/node/chunks/dep-91aa74e8.js.map +0 -1
  28. package/dist/node/chunks/dep-c7e510f9.js.map +0 -1
  29. package/dist/node/chunks/dep-e36486f6.js.map +0 -1
  30. package/dist/node/chunks/dep-eb6ef720.js.map +0 -1
  31. package/dist/node/terser.js.map +0 -1
  32. package/rollup.config.js +0 -389
  33. package/scripts/patchTypes.js +0 -70
  34. package/src/node/__tests__/asset.spec.ts +0 -156
  35. package/src/node/__tests__/build.spec.ts +0 -67
  36. package/src/node/__tests__/config.spec.ts +0 -166
  37. package/src/node/__tests__/packages/name/package.json +0 -3
  38. package/src/node/__tests__/packages/noname/package.json +0 -1
  39. package/src/node/__tests__/plugins/css.spec.ts +0 -116
  40. package/src/node/__tests__/scan.spec.ts +0 -118
  41. package/src/node/__tests__/utils.spec.ts +0 -40
  42. package/src/node/build.ts +0 -783
  43. package/src/node/cli.ts +0 -239
  44. package/src/node/config.ts +0 -1033
  45. package/src/node/constants.ts +0 -87
  46. package/src/node/importGlob.ts +0 -173
  47. package/src/node/index.ts +0 -88
  48. package/src/node/logger.ts +0 -167
  49. package/src/node/optimizer/esbuildDepPlugin.ts +0 -216
  50. package/src/node/optimizer/index.ts +0 -410
  51. package/src/node/optimizer/registerMissing.ts +0 -102
  52. package/src/node/optimizer/scan.ts +0 -457
  53. package/src/node/plugin.ts +0 -138
  54. package/src/node/plugins/asset.ts +0 -365
  55. package/src/node/plugins/assetImportMetaUrl.ts +0 -99
  56. package/src/node/plugins/clientInjections.ts +0 -72
  57. package/src/node/plugins/css.ts +0 -1279
  58. package/src/node/plugins/dataUri.ts +0 -64
  59. package/src/node/plugins/define.ts +0 -107
  60. package/src/node/plugins/esbuild.ts +0 -280
  61. package/src/node/plugins/html.ts +0 -673
  62. package/src/node/plugins/importAnalysis.ts +0 -614
  63. package/src/node/plugins/importAnalysisBuild.ts +0 -334
  64. package/src/node/plugins/index.ts +0 -69
  65. package/src/node/plugins/json.ts +0 -75
  66. package/src/node/plugins/loadFallback.ts +0 -19
  67. package/src/node/plugins/manifest.ts +0 -123
  68. package/src/node/plugins/modulePreloadPolyfill.ts +0 -100
  69. package/src/node/plugins/preAlias.ts +0 -22
  70. package/src/node/plugins/reporter.ts +0 -244
  71. package/src/node/plugins/resolve.ts +0 -925
  72. package/src/node/plugins/terser.ts +0 -40
  73. package/src/node/plugins/wasm.ts +0 -72
  74. package/src/node/plugins/worker.ts +0 -117
  75. package/src/node/preview.ts +0 -82
  76. package/src/node/server/__tests__/fixtures/none/nested/package.json +0 -3
  77. package/src/node/server/__tests__/fixtures/pnpm/nested/package.json +0 -3
  78. package/src/node/server/__tests__/fixtures/pnpm/package.json +0 -3
  79. package/src/node/server/__tests__/fixtures/pnpm/pnpm-workspace.yaml +0 -0
  80. package/src/node/server/__tests__/fixtures/yarn/nested/package.json +0 -3
  81. package/src/node/server/__tests__/fixtures/yarn/package.json +0 -6
  82. package/src/node/server/__tests__/search-root.spec.ts +0 -31
  83. package/src/node/server/hmr.ts +0 -489
  84. package/src/node/server/http.ts +0 -198
  85. package/src/node/server/index.ts +0 -705
  86. package/src/node/server/middlewares/base.ts +0 -52
  87. package/src/node/server/middlewares/error.ts +0 -98
  88. package/src/node/server/middlewares/indexHtml.ts +0 -170
  89. package/src/node/server/middlewares/proxy.ts +0 -124
  90. package/src/node/server/middlewares/spaFallback.ts +0 -32
  91. package/src/node/server/middlewares/static.ts +0 -153
  92. package/src/node/server/middlewares/time.ts +0 -18
  93. package/src/node/server/middlewares/transform.ts +0 -196
  94. package/src/node/server/moduleGraph.ts +0 -200
  95. package/src/node/server/openBrowser.ts +0 -101
  96. package/src/node/server/pluginContainer.ts +0 -546
  97. package/src/node/server/searchRoot.ts +0 -70
  98. package/src/node/server/send.ts +0 -54
  99. package/src/node/server/sourcemap.ts +0 -54
  100. package/src/node/server/transformRequest.ts +0 -168
  101. package/src/node/server/ws.ts +0 -131
  102. package/src/node/ssr/__tests__/ssrTransform.spec.ts +0 -309
  103. package/src/node/ssr/ssrExternal.ts +0 -161
  104. package/src/node/ssr/ssrManifestPlugin.ts +0 -53
  105. package/src/node/ssr/ssrModuleLoader.ts +0 -214
  106. package/src/node/ssr/ssrStacktrace.ts +0 -75
  107. package/src/node/ssr/ssrTransform.ts +0 -452
  108. package/src/node/tsconfig.json +0 -14
  109. package/src/node/utils.ts +0 -565
  110. package/tsconfig.base.json +0 -11
@@ -1,705 +0,0 @@
1
- import fs from 'fs'
2
- import path from 'path'
3
- import * as net from 'net'
4
- import * as http from 'http'
5
- import * as https from 'https'
6
- import connect from 'connect'
7
- import corsMiddleware from 'cors'
8
- import chalk from 'chalk'
9
- import { AddressInfo } from 'net'
10
- import chokidar from 'chokidar'
11
- import { resolveHttpsConfig, resolveHttpServer, httpServerStart } from './http'
12
- import { resolveConfig, InlineConfig, ResolvedConfig } from '../config'
13
- import { createPluginContainer, PluginContainer } from './pluginContainer'
14
- import { FSWatcher, WatchOptions } from 'types/chokidar'
15
- import { createWebSocketServer, WebSocketServer } from './ws'
16
- import { baseMiddleware } from './middlewares/base'
17
- import { proxyMiddleware, ProxyOptions } from './middlewares/proxy'
18
- import { spaFallbackMiddleware } from './middlewares/spaFallback'
19
- import { transformMiddleware } from './middlewares/transform'
20
- import {
21
- createDevHtmlTransformFn,
22
- indexHtmlMiddleware
23
- } from './middlewares/indexHtml'
24
- import {
25
- serveRawFsMiddleware,
26
- servePublicMiddleware,
27
- serveStaticMiddleware
28
- } from './middlewares/static'
29
- import { timeMiddleware } from './middlewares/time'
30
- import { ModuleGraph, ModuleNode } from './moduleGraph'
31
- import { Connect } from 'types/connect'
32
- import { ensureLeadingSlash, normalizePath } from '../utils'
33
- import { errorMiddleware, prepareError } from './middlewares/error'
34
- import { handleHMRUpdate, HmrOptions, handleFileAddUnlink } from './hmr'
35
- import { openBrowser } from './openBrowser'
36
- import launchEditorMiddleware from 'launch-editor-middleware'
37
- import { TransformResult } from 'rollup'
38
- import { TransformOptions, transformRequest } from './transformRequest'
39
- import {
40
- transformWithEsbuild,
41
- ESBuildTransformResult
42
- } from '../plugins/esbuild'
43
- import { TransformOptions as EsbuildTransformOptions } from 'esbuild'
44
- import { DepOptimizationMetadata, optimizeDeps } from '../optimizer'
45
- import { ssrLoadModule } from '../ssr/ssrModuleLoader'
46
- import { resolveSSRExternal } from '../ssr/ssrExternal'
47
- import {
48
- rebindErrorStacktrace,
49
- ssrRewriteStacktrace
50
- } from '../ssr/ssrStacktrace'
51
- import { createMissingImporterRegisterFn } from '../optimizer/registerMissing'
52
- import { printServerUrls } from '../logger'
53
- import { resolveHostname } from '../utils'
54
- import { searchForWorkspaceRoot } from './searchRoot'
55
- import { CLIENT_DIR } from '../constants'
56
-
57
- export interface ServerOptions {
58
- host?: string | boolean
59
- port?: number
60
- /**
61
- * Enable TLS + HTTP/2.
62
- * Note: this downgrades to TLS only when the proxy option is also used.
63
- */
64
- https?: boolean | https.ServerOptions
65
- /**
66
- * Open browser window on startup
67
- */
68
- open?: boolean | string
69
- /**
70
- * Force dep pre-optimization regardless of whether deps have changed.
71
- */
72
- force?: boolean
73
- /**
74
- * Configure HMR-specific options (port, host, path & protocol)
75
- */
76
- hmr?: HmrOptions | boolean
77
- /**
78
- * chokidar watch options
79
- * https://github.com/paulmillr/chokidar#api
80
- */
81
- watch?: WatchOptions
82
- /**
83
- * Configure custom proxy rules for the dev server. Expects an object
84
- * of `{ key: options }` pairs.
85
- * Uses [`http-proxy`](https://github.com/http-party/node-http-proxy).
86
- * Full options [here](https://github.com/http-party/node-http-proxy#options).
87
- *
88
- * Example `vite.config.js`:
89
- * ``` js
90
- * module.exports = {
91
- * proxy: {
92
- * // string shorthand
93
- * '/foo': 'http://localhost:4567/foo',
94
- * // with options
95
- * '/api': {
96
- * target: 'http://jsonplaceholder.typicode.com',
97
- * changeOrigin: true,
98
- * rewrite: path => path.replace(/^\/api/, '')
99
- * }
100
- * }
101
- * }
102
- * ```
103
- */
104
- proxy?: Record<string, string | ProxyOptions>
105
- /**
106
- * Configure CORS for the dev server.
107
- * Uses https://github.com/expressjs/cors.
108
- * Set to `true` to allow all methods from any origin, or configure separately
109
- * using an object.
110
- */
111
- cors?: CorsOptions | boolean
112
- /**
113
- * If enabled, vite will exit if specified port is already in use
114
- */
115
- strictPort?: boolean
116
- /**
117
- * Create Vite dev server to be used as a middleware in an existing server
118
- */
119
- middlewareMode?: boolean | 'html' | 'ssr'
120
- /**
121
- * Prepend this folder to http requests, for use when proxying vite as a subfolder
122
- * Should start and end with the `/` character
123
- */
124
- base?: string
125
- /**
126
- * Options for files served via '/\@fs/'.
127
- */
128
- fs?: FileSystemServeOptions
129
- }
130
-
131
- export interface ResolvedServerOptions extends ServerOptions {
132
- fs: Required<FileSystemServeOptions>
133
- }
134
-
135
- export interface FileSystemServeOptions {
136
- /**
137
- * Strictly restrict file accessing outside of allowing paths.
138
- *
139
- * Set to `false` to disable the warning
140
- * Default to false at this moment, will enabled by default in the future versions.
141
- *
142
- * @expiremental
143
- * @default undefined
144
- */
145
- strict?: boolean | undefined
146
-
147
- /**
148
- * Restrict accessing files outside the allowed directories.
149
- *
150
- * Accepts absolute path or a path relative to project root.
151
- * Will try to search up for workspace root by default.
152
- *
153
- * @expiremental
154
- */
155
- allow?: string[]
156
- }
157
-
158
- /**
159
- * https://github.com/expressjs/cors#configuration-options
160
- */
161
- export interface CorsOptions {
162
- origin?:
163
- | CorsOrigin
164
- | ((origin: string, cb: (err: Error, origins: CorsOrigin) => void) => void)
165
- methods?: string | string[]
166
- allowedHeaders?: string | string[]
167
- exposedHeaders?: string | string[]
168
- credentials?: boolean
169
- maxAge?: number
170
- preflightContinue?: boolean
171
- optionsSuccessStatus?: number
172
- }
173
-
174
- export type CorsOrigin = boolean | string | RegExp | (string | RegExp)[]
175
-
176
- export type ServerHook = (
177
- server: ViteDevServer
178
- ) => (() => void) | void | Promise<(() => void) | void>
179
-
180
- export interface ViteDevServer {
181
- /**
182
- * The resolved vite config object
183
- */
184
- config: ResolvedConfig
185
- /**
186
- * A connect app instance.
187
- * - Can be used to attach custom middlewares to the dev server.
188
- * - Can also be used as the handler function of a custom http server
189
- * or as a middleware in any connect-style Node.js frameworks
190
- *
191
- * https://github.com/senchalabs/connect#use-middleware
192
- */
193
- middlewares: Connect.Server
194
- /**
195
- * @deprecated use `server.middlewares` instead
196
- */
197
- app: Connect.Server
198
- /**
199
- * native Node http server instance
200
- * will be null in middleware mode
201
- */
202
- httpServer: http.Server | null
203
- /**
204
- * chokidar watcher instance
205
- * https://github.com/paulmillr/chokidar#api
206
- */
207
- watcher: FSWatcher
208
- /**
209
- * web socket server with `send(payload)` method
210
- */
211
- ws: WebSocketServer
212
- /**
213
- * Rollup plugin container that can run plugin hooks on a given file
214
- */
215
- pluginContainer: PluginContainer
216
- /**
217
- * Module graph that tracks the import relationships, url to file mapping
218
- * and hmr state.
219
- */
220
- moduleGraph: ModuleGraph
221
- /**
222
- * Programmatically resolve, load and transform a URL and get the result
223
- * without going through the http request pipeline.
224
- */
225
- transformRequest(
226
- url: string,
227
- options?: TransformOptions
228
- ): Promise<TransformResult | null>
229
- /**
230
- * Apply vite built-in HTML transforms and any plugin HTML transforms.
231
- */
232
- transformIndexHtml(
233
- url: string,
234
- html: string,
235
- originalUrl?: string
236
- ): Promise<string>
237
- /**
238
- * Util for transforming a file with esbuild.
239
- * Can be useful for certain plugins.
240
- *
241
- * @deprecated import `transformWithEsbuild` from `vite` instead
242
- */
243
- transformWithEsbuild(
244
- code: string,
245
- filename: string,
246
- options?: EsbuildTransformOptions,
247
- inMap?: object
248
- ): Promise<ESBuildTransformResult>
249
- /**
250
- * Load a given URL as an instantiated module for SSR.
251
- */
252
- ssrLoadModule(url: string): Promise<Record<string, any>>
253
- /**
254
- * Fix ssr error stacktrace
255
- */
256
- ssrFixStacktrace(e: Error): void
257
- /**
258
- * Start the server.
259
- */
260
- listen(port?: number, isRestart?: boolean): Promise<ViteDevServer>
261
- /**
262
- * Stop the server.
263
- */
264
- close(): Promise<void>
265
- /**
266
- * @internal
267
- */
268
- _optimizeDepsMetadata: DepOptimizationMetadata | null
269
- /**
270
- * Deps that are externalized
271
- * @internal
272
- */
273
- _ssrExternals: string[] | null
274
- /**
275
- * @internal
276
- */
277
- _globImporters: Record<
278
- string,
279
- {
280
- module: ModuleNode
281
- importGlobs: {
282
- base: string
283
- pattern: string
284
- }[]
285
- }
286
- >
287
- /**
288
- * @internal
289
- */
290
- _isRunningOptimizer: boolean
291
- /**
292
- * @internal
293
- */
294
- _registerMissingImport:
295
- | ((id: string, resolved: string, ssr: boolean | undefined) => void)
296
- | null
297
- /**
298
- * @internal
299
- */
300
- _pendingReload: Promise<void> | null
301
- }
302
-
303
- export async function createServer(
304
- inlineConfig: InlineConfig = {}
305
- ): Promise<ViteDevServer> {
306
- const config = await resolveConfig(inlineConfig, 'serve', 'development')
307
- const root = config.root
308
- const serverConfig = config.server
309
- const httpsOptions = await resolveHttpsConfig(config)
310
- let { middlewareMode } = serverConfig
311
- if (middlewareMode === true) {
312
- middlewareMode = 'ssr'
313
- }
314
-
315
- const middlewares = connect() as Connect.Server
316
- const httpServer = middlewareMode
317
- ? null
318
- : await resolveHttpServer(serverConfig, middlewares, httpsOptions)
319
- const ws = createWebSocketServer(httpServer, config, httpsOptions)
320
-
321
- const { ignored = [], ...watchOptions } = serverConfig.watch || {}
322
- const watcher = chokidar.watch(path.resolve(root), {
323
- ignored: [
324
- '**/node_modules/**',
325
- '**/.git/**',
326
- ...(Array.isArray(ignored) ? ignored : [ignored])
327
- ],
328
- ignoreInitial: true,
329
- ignorePermissionErrors: true,
330
- disableGlobbing: true,
331
- ...watchOptions
332
- }) as FSWatcher
333
-
334
- const plugins = config.plugins
335
- const container = await createPluginContainer(config, watcher)
336
- const moduleGraph = new ModuleGraph(container)
337
- const closeHttpServer = createServerCloseFn(httpServer)
338
-
339
- // eslint-disable-next-line prefer-const
340
- let exitProcess: () => void
341
-
342
- const server: ViteDevServer = {
343
- config,
344
- middlewares,
345
- get app() {
346
- config.logger.warn(
347
- `ViteDevServer.app is deprecated. Use ViteDevServer.middlewares instead.`
348
- )
349
- return middlewares
350
- },
351
- httpServer,
352
- watcher,
353
- pluginContainer: container,
354
- ws,
355
- moduleGraph,
356
- transformWithEsbuild,
357
- transformRequest(url, options) {
358
- return transformRequest(url, server, options)
359
- },
360
- transformIndexHtml: null!, // to be immediately set
361
- ssrLoadModule(url) {
362
- if (!server._ssrExternals) {
363
- server._ssrExternals = resolveSSRExternal(
364
- config,
365
- server._optimizeDepsMetadata
366
- ? Object.keys(server._optimizeDepsMetadata.optimized)
367
- : []
368
- )
369
- }
370
- return ssrLoadModule(url, server)
371
- },
372
- ssrFixStacktrace(e) {
373
- if (e.stack) {
374
- const stacktrace = ssrRewriteStacktrace(e.stack, moduleGraph)
375
- rebindErrorStacktrace(e, stacktrace)
376
- }
377
- },
378
- listen(port?: number, isRestart?: boolean) {
379
- return startServer(server, port, isRestart)
380
- },
381
- async close() {
382
- process.off('SIGTERM', exitProcess)
383
-
384
- if (!middlewareMode && process.env.CI !== 'true') {
385
- process.stdin.off('end', exitProcess)
386
- }
387
-
388
- await Promise.all([
389
- watcher.close(),
390
- ws.close(),
391
- container.close(),
392
- closeHttpServer()
393
- ])
394
- },
395
- _optimizeDepsMetadata: null,
396
- _ssrExternals: null,
397
- _globImporters: {},
398
- _isRunningOptimizer: false,
399
- _registerMissingImport: null,
400
- _pendingReload: null
401
- }
402
-
403
- server.transformIndexHtml = createDevHtmlTransformFn(server)
404
-
405
- exitProcess = async () => {
406
- try {
407
- await server.close()
408
- } finally {
409
- process.exit(0)
410
- }
411
- }
412
-
413
- process.once('SIGTERM', exitProcess)
414
-
415
- if (!middlewareMode && process.env.CI !== 'true') {
416
- process.stdin.on('end', exitProcess)
417
- }
418
-
419
- watcher.on('change', async (file) => {
420
- file = normalizePath(file)
421
- // invalidate module graph cache on file change
422
- moduleGraph.onFileChange(file)
423
- if (serverConfig.hmr !== false) {
424
- try {
425
- await handleHMRUpdate(file, server)
426
- } catch (err) {
427
- ws.send({
428
- type: 'error',
429
- err: prepareError(err)
430
- })
431
- }
432
- }
433
- })
434
-
435
- watcher.on('add', (file) => {
436
- handleFileAddUnlink(normalizePath(file), server)
437
- })
438
-
439
- watcher.on('unlink', (file) => {
440
- handleFileAddUnlink(normalizePath(file), server, true)
441
- })
442
-
443
- if (!middlewareMode && httpServer) {
444
- httpServer.once('listening', () => {
445
- // update actual port since this may be different from initial value
446
- serverConfig.port = (httpServer.address() as AddressInfo).port
447
- })
448
- }
449
-
450
- // apply server configuration hooks from plugins
451
- const postHooks: ((() => void) | void)[] = []
452
- for (const plugin of plugins) {
453
- if (plugin.configureServer) {
454
- postHooks.push(await plugin.configureServer(server))
455
- }
456
- }
457
-
458
- // Internal middlewares ------------------------------------------------------
459
-
460
- // request timer
461
- if (process.env.DEBUG) {
462
- middlewares.use(timeMiddleware(root))
463
- }
464
-
465
- // cors (enabled by default)
466
- const { cors } = serverConfig
467
- if (cors !== false) {
468
- middlewares.use(corsMiddleware(typeof cors === 'boolean' ? {} : cors))
469
- }
470
-
471
- // proxy
472
- const { proxy } = serverConfig
473
- if (proxy) {
474
- middlewares.use(proxyMiddleware(httpServer, config))
475
- }
476
-
477
- // base
478
- if (config.base !== '/') {
479
- middlewares.use(baseMiddleware(server))
480
- }
481
-
482
- // open in editor support
483
- middlewares.use('/__open-in-editor', launchEditorMiddleware())
484
-
485
- // hmr reconnect ping
486
- // Keep the named function. The name is visible in debug logs via `DEBUG=connect:dispatcher ...`
487
- middlewares.use('/__vite_ping', function viteHMRPingMiddleware(_, res) {
488
- res.end('pong')
489
- })
490
-
491
- // serve static files under /public
492
- // this applies before the transform middleware so that these files are served
493
- // as-is without transforms.
494
- if (config.publicDir) {
495
- middlewares.use(servePublicMiddleware(config.publicDir))
496
- }
497
-
498
- // main transform middleware
499
- middlewares.use(transformMiddleware(server))
500
-
501
- // serve static files
502
- middlewares.use(serveRawFsMiddleware(server))
503
- middlewares.use(serveStaticMiddleware(root, config))
504
-
505
- // spa fallback
506
- if (!middlewareMode || middlewareMode === 'html') {
507
- middlewares.use(spaFallbackMiddleware(root))
508
- }
509
-
510
- // run post config hooks
511
- // This is applied before the html middleware so that user middleware can
512
- // serve custom content instead of index.html.
513
- postHooks.forEach((fn) => fn && fn())
514
-
515
- if (!middlewareMode || middlewareMode === 'html') {
516
- // transform index.html
517
- middlewares.use(indexHtmlMiddleware(server))
518
- // handle 404s
519
- // Keep the named function. The name is visible in debug logs via `DEBUG=connect:dispatcher ...`
520
- middlewares.use(function vite404Middleware(_, res) {
521
- res.statusCode = 404
522
- res.end()
523
- })
524
- }
525
-
526
- // error handler
527
- middlewares.use(errorMiddleware(server, !!middlewareMode))
528
-
529
- const runOptimize = async () => {
530
- if (config.cacheDir) {
531
- server._isRunningOptimizer = true
532
- try {
533
- server._optimizeDepsMetadata = await optimizeDeps(config)
534
- } finally {
535
- server._isRunningOptimizer = false
536
- }
537
- server._registerMissingImport = createMissingImporterRegisterFn(server)
538
- }
539
- }
540
-
541
- if (!middlewareMode && httpServer) {
542
- let isOptimized = false
543
- // overwrite listen to run optimizer before server start
544
- const listen = httpServer.listen.bind(httpServer)
545
- httpServer.listen = (async (port: number, ...args: any[]) => {
546
- if (!isOptimized) {
547
- try {
548
- await container.buildStart({})
549
- await runOptimize()
550
- isOptimized = true
551
- } catch (e) {
552
- httpServer.emit('error', e)
553
- return
554
- }
555
- }
556
- return listen(port, ...args)
557
- }) as any
558
- } else {
559
- await container.buildStart({})
560
- await runOptimize()
561
- }
562
-
563
- return server
564
- }
565
-
566
- async function startServer(
567
- server: ViteDevServer,
568
- inlinePort?: number,
569
- isRestart: boolean = false
570
- ): Promise<ViteDevServer> {
571
- const httpServer = server.httpServer
572
- if (!httpServer) {
573
- throw new Error('Cannot call server.listen in middleware mode.')
574
- }
575
-
576
- const options = server.config.server
577
- const port = inlinePort || options.port || 3000
578
- const hostname = resolveHostname(options.host)
579
-
580
- const protocol = options.https ? 'https' : 'http'
581
- const info = server.config.logger.info
582
- const base = server.config.base
583
-
584
- const serverPort = await httpServerStart(httpServer, {
585
- port,
586
- strictPort: options.strictPort,
587
- host: hostname.host,
588
- logger: server.config.logger
589
- })
590
-
591
- info(
592
- chalk.cyan(`\n vite v${require('vite/package.json').version}`) +
593
- chalk.green(` dev server running at:\n`),
594
- {
595
- clear: !server.config.logger.hasWarned
596
- }
597
- )
598
-
599
- printServerUrls(hostname, protocol, serverPort, base, info)
600
-
601
- // @ts-ignore
602
- if (global.__vite_start_time) {
603
- info(
604
- chalk.cyan(
605
- // @ts-ignore
606
- `\n ready in ${Date.now() - global.__vite_start_time}ms.\n`
607
- )
608
- )
609
- }
610
-
611
- // @ts-ignore
612
- const profileSession = global.__vite_profile_session
613
- if (profileSession) {
614
- profileSession.post('Profiler.stop', (err: any, { profile }: any) => {
615
- // Write profile to disk, upload, etc.
616
- if (!err) {
617
- const outPath = path.resolve('./vite-profile.cpuprofile')
618
- fs.writeFileSync(outPath, JSON.stringify(profile))
619
- info(
620
- chalk.yellow(` CPU profile written to ${chalk.white.dim(outPath)}\n`)
621
- )
622
- } else {
623
- throw err
624
- }
625
- })
626
- }
627
-
628
- if (options.open && !isRestart) {
629
- const path = typeof options.open === 'string' ? options.open : base
630
- openBrowser(
631
- `${protocol}://${hostname.name}:${serverPort}${path}`,
632
- true,
633
- server.config.logger
634
- )
635
- }
636
-
637
- return server
638
- }
639
-
640
- function createServerCloseFn(server: http.Server | null) {
641
- if (!server) {
642
- return () => {}
643
- }
644
-
645
- let hasListened = false
646
- const openSockets = new Set<net.Socket>()
647
-
648
- server.on('connection', (socket) => {
649
- openSockets.add(socket)
650
- socket.on('close', () => {
651
- openSockets.delete(socket)
652
- })
653
- })
654
-
655
- server.once('listening', () => {
656
- hasListened = true
657
- })
658
-
659
- return () =>
660
- new Promise<void>((resolve, reject) => {
661
- openSockets.forEach((s) => s.destroy())
662
- if (hasListened) {
663
- server.close((err) => {
664
- if (err) {
665
- reject(err)
666
- } else {
667
- resolve()
668
- }
669
- })
670
- } else {
671
- resolve()
672
- }
673
- })
674
- }
675
-
676
- function resolvedAllowDir(root: string, dir: string): string {
677
- return ensureLeadingSlash(normalizePath(path.resolve(root, dir)))
678
- }
679
-
680
- export function resolveServerOptions(
681
- root: string,
682
- raw?: ServerOptions
683
- ): ResolvedServerOptions {
684
- const server = raw || {}
685
- let allowDirs = server.fs?.allow
686
-
687
- if (!allowDirs) {
688
- allowDirs = [searchForWorkspaceRoot(root)]
689
- }
690
-
691
- allowDirs = allowDirs.map((i) => resolvedAllowDir(root, i))
692
-
693
- // only push client dir when vite itself is outside-of-root
694
- const resolvedClientDir = resolvedAllowDir(root, CLIENT_DIR)
695
- if (!allowDirs.some((i) => resolvedClientDir.startsWith(i))) {
696
- allowDirs.push(resolvedClientDir)
697
- }
698
-
699
- server.fs = {
700
- // TODO: make strict by default
701
- strict: server.fs?.strict,
702
- allow: allowDirs
703
- }
704
- return server as ResolvedServerOptions
705
- }