@@ -9,7 +9,7 @@ import { createServer as createHttpsServer } from 'node:https'
99import { networkInterfaces , release } from 'node:os'
1010import process from 'node:process'
1111
12- import { getPort } from 'get-port-please'
12+ import { checkPort , getPort } from 'get-port-please'
1313import colors from 'picocolors'
1414
1515import { debug , logger } from '../utils/logger'
@@ -19,6 +19,8 @@ import { startTunnel } from './tunnel'
1919
2020export interface ListenOptions {
2121 port ?: string | number
22+ /** Fail instead of falling back to another port when `port` is unavailable. */
23+ strictPort ?: boolean
2224 hostname ?: string
2325 baseURL ?: string
2426 showURL ?: boolean
@@ -98,16 +100,7 @@ export async function listen(handler: RequestListener, options: ListenOptions =
98100 const hostname = options . hostname ?? ( options . public ? '' : 'localhost' )
99101
100102 const requestedPort = options . port === undefined || options . port === '' ? undefined : Number ( options . port )
101- const port = requestedPort === 0
102- ? await getPort ( { random : true , host : hostname || undefined } )
103- : await getPort ( {
104- port : requestedPort ,
105- alternativePortRange : [ 3000 , 3100 ] ,
106- host : hostname || undefined ,
107- } )
108- if ( requestedPort && port !== requestedPort ) {
109- logger . warn ( `Port ${ requestedPort } is in use, using port ${ port } instead.` )
110- }
103+ const port = await resolvePort ( requestedPort , hostname , options . strictPort )
111104
112105 const httpsOptions = options . https === true ? { } : options . https
113106 const certificate = httpsOptions ? await resolveCertificate ( httpsOptions ) : false
@@ -228,6 +221,30 @@ export async function listen(handler: RequestListener, options: ListenOptions =
228221 }
229222}
230223
224+ async function resolvePort ( requestedPort : number | undefined , hostname : string , strictPort ?: boolean ) : Promise < number > {
225+ if ( requestedPort === 0 ) {
226+ return getPort ( { random : true , host : hostname || undefined } )
227+ }
228+
229+ if ( strictPort ) {
230+ const desiredPort = requestedPort ?? 3000
231+ if ( await checkPort ( desiredPort , hostname || undefined ) === false ) {
232+ throw new Error ( `Port ${ desiredPort } is already in use (\`--strictPort\` is enabled).` )
233+ }
234+ return desiredPort
235+ }
236+
237+ const port = await getPort ( {
238+ port : requestedPort ,
239+ alternativePortRange : [ 3000 , 3100 ] ,
240+ host : hostname || undefined ,
241+ } )
242+ if ( requestedPort && port !== requestedPort ) {
243+ logger . warn ( `Port ${ requestedPort } is in use, using port ${ port } instead.` )
244+ }
245+ return port
246+ }
247+
231248function centerBlock ( block : string ) : string {
232249 const lines = block . split ( '\n' )
233250 const width = Math . max ( ...lines . map ( line => line . length ) )
0 commit comments