Skip to content

Commit

Permalink
feat: use PreviewServerForHook and call hook in the previous place
Browse files Browse the repository at this point in the history
  • Loading branch information
sapphi-red committed Mar 25, 2023
1 parent 5cc04df commit f963c90
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 32 deletions.
12 changes: 10 additions & 2 deletions docs/guide/api-javascript.md
Expand Up @@ -201,7 +201,15 @@ import { preview } from 'vite'
## `PreviewServer`

```ts
interface PreviewServer {
interface PreviewServer extends PreviewServerForHook {
resolvedUrls: ResolvedServerUrls
}
```

## `PreviewServerForHook`

```ts
interface PreviewServerForHook {
/**
* The resolved vite config object
*/
Expand All @@ -222,7 +230,7 @@ interface PreviewServer {
/**
* The resolved urls Vite prints on the CLI
*/
resolvedUrls: ResolvedServerUrls
resolvedUrls: ResolvedServerUrls | null
/**
* Print server urls
*/
Expand Down
2 changes: 1 addition & 1 deletion docs/guide/api-plugin.md
Expand Up @@ -309,7 +309,7 @@ Vite plugins can also provide hooks that serve Vite-specific purposes. These hoo

### `configurePreviewServer`

- **Type:** `(server: PreviewServer) => (() => void) | void | Promise<(() => void) | void>`
- **Type:** `(server: PreviewServerForHook) => (() => void) | void | Promise<(() => void) | void>`
- **Kind:** `async`, `sequential`
- **See also:** [PreviewServer](./api-javascript#previewserver)

Expand Down
1 change: 1 addition & 0 deletions packages/vite/src/node/index.ts
Expand Up @@ -34,6 +34,7 @@ export type {
export type {
PreviewOptions,
PreviewServer,
PreviewServerForHook,
PreviewServerHook,
ResolvedPreviewOptions,
} from './preview'
Expand Down
2 changes: 1 addition & 1 deletion packages/vite/src/node/plugin.ts
Expand Up @@ -91,7 +91,7 @@ export interface Plugin extends RollupPlugin {
*/
configureServer?: ObjectHook<ServerHook>
/**
* Configure the preview server. The hook receives the {@link PreviewServer}
* Configure the preview server. The hook receives the {@link PreviewServerForHook}
* instance. This can also be used to store a reference to the server
* for use in other hooks.
*
Expand Down
62 changes: 34 additions & 28 deletions packages/vite/src/node/preview.ts
Expand Up @@ -45,7 +45,8 @@ export function resolvePreviewOptions(
}
}

export interface PreviewServer {
// TODO: merge with PreviewServer in Vite 5
export interface PreviewServerForHook {
/**
* The resolved vite config object
*/
Expand All @@ -66,16 +67,20 @@ export interface PreviewServer {
/**
* The resolved urls Vite prints on the CLI
*/
resolvedUrls: ResolvedServerUrls
resolvedUrls: ResolvedServerUrls | null
/**
* Print server urls
*/
printUrls(): void
}

export interface PreviewServer extends PreviewServerForHook {
resolvedUrls: ResolvedServerUrls
}

export type PreviewServerHook = (
this: void,
server: PreviewServer,
server: PreviewServerForHook,
) => (() => void) | void | Promise<(() => void) | void>

/**
Expand Down Expand Up @@ -106,42 +111,25 @@ export async function preview(
)
}

const options = config.preview
const logger = config.logger

const app = connect() as Connect.Server

const hostname = await resolveHostname(options.host)
const port = options.port ?? DEFAULT_PREVIEW_PORT
const protocol = options.https ? 'https' : 'http'

const httpServer = await resolveHttpServer(
config.preview,
app,
await resolveHttpsConfig(config.preview?.https),
)
setClientErrorHandler(httpServer, config.logger)

const serverPort = await httpServerStart(httpServer, {
port,
strictPort: options.strictPort,
host: hostname.host,
logger,
})

const resolvedUrls = await resolveServerUrls(
httpServer,
config.preview,
config,
)

const server: PreviewServer = {
const server: PreviewServerForHook = {
config,
middlewares: app,
httpServer,
resolvedUrls,
resolvedUrls: null,
printUrls() {
printServerUrls(resolvedUrls, options.host, logger.info)
if (server.resolvedUrls) {
printServerUrls(server.resolvedUrls, options.host, logger.info)
} else {
throw new Error('cannot print server URLs before server is listening.')
}
},
}

Expand Down Expand Up @@ -190,6 +178,24 @@ export async function preview(
// apply post server hooks from plugins
postHooks.forEach((fn) => fn && fn())

const options = config.preview
const logger = config.logger
const hostname = await resolveHostname(options.host)
const port = options.port ?? DEFAULT_PREVIEW_PORT
const protocol = options.https ? 'https' : 'http'

const serverPort = await httpServerStart(httpServer, {
port,
strictPort: options.strictPort,
host: hostname.host,
logger,
})

server.resolvedUrls = await resolveServerUrls(
httpServer,
config.preview,
config,
)

if (options.open) {
const path = typeof options.open === 'string' ? options.open : previewBase
Expand All @@ -202,5 +208,5 @@ export async function preview(
)
}

return server
return server as PreviewServer
}

0 comments on commit f963c90

Please sign in to comment.