From 10973476ff0aa7aad7e738a1f9166c861ba6be01 Mon Sep 17 00:00:00 2001 From: Umair Kamran Date: Mon, 5 Oct 2020 18:20:03 +0500 Subject: [PATCH] fix(v2): Fixes serve cli --port option (#3531) * fix(v2): Fixes serve cli --port option * refactor a bit the start/serve cli options management Co-authored-by: slorber --- package.json | 2 +- packages/docusaurus-types/src/index.d.ts | 16 +++++++++---- .../docusaurus/src/commands/commandUtils.ts | 23 +++++++++++++++++++ packages/docusaurus/src/commands/serve.ts | 14 ++++++++--- packages/docusaurus/src/commands/start.ts | 23 ++++--------------- website/package.json | 1 + 6 files changed, 53 insertions(+), 26 deletions(-) create mode 100644 packages/docusaurus/src/commands/commandUtils.ts diff --git a/package.json b/package.json index 9f4609dece..eaf75f1016 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "build:v2:baseUrl": "yarn workspace docusaurus-2-website build:baseUrl", "build:v2:blogOnly": "yarn workspace docusaurus-2-website build:blogOnly", "serve:v1": "serve website-1.x/build/docusaurus", - "serve:v2": "serve website/build", + "serve:v2": "yarn workspace docusaurus-2-website serve", "serve:v2:baseUrl": "serve website", "serve:v2:ssl": "yarn serve:v2:ssl:gencert && yarn serve:v2:ssl:message && yarn serve:v2:ssl:serve", "serve:v2:ssl:gencert": "openssl req -x509 -nodes -days 365 -newkey rsa:4096 -subj \"/C=US/ST=Docusaurus/L=Anywhere/O=Dis/CN=localhost\" -keyout ./website/.docusaurus/selfsigned.key -out ./website/.docusaurus/selfsigned.crt", diff --git a/packages/docusaurus-types/src/index.d.ts b/packages/docusaurus-types/src/index.d.ts index ad09f681a6..488638e55f 100644 --- a/packages/docusaurus-types/src/index.d.ts +++ b/packages/docusaurus-types/src/index.d.ts @@ -91,13 +91,21 @@ export type PresetConfig = | [string] | string; -export interface StartCLIOptions { - port: string; - host: string; +export type HostPortCLIOptions = { + host?: string; + port?: string; +}; + +export type StartCLIOptions = HostPortCLIOptions & { hotOnly: boolean; open: boolean; poll: boolean; -} +}; + +export type ServeCLIOptions = HostPortCLIOptions & { + build: boolean; + dir: string; +}; export interface BuildCLIOptions { bundleAnalyzer: boolean; diff --git a/packages/docusaurus/src/commands/commandUtils.ts b/packages/docusaurus/src/commands/commandUtils.ts new file mode 100644 index 0000000000..1a7edbc5b1 --- /dev/null +++ b/packages/docusaurus/src/commands/commandUtils.ts @@ -0,0 +1,23 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +import choosePort from '../choosePort'; +import {HostPortCLIOptions} from '@docusaurus/types'; +import {DEFAULT_PORT} from '../constants'; + +export function getCLIOptionHost( + hostOption: HostPortCLIOptions['host'], +): string { + return hostOption || 'localhost'; +} + +export async function getCLIOptionPort( + portOption: HostPortCLIOptions['port'], + host: string, +): Promise { + const basePort = portOption ? parseInt(portOption, 10) : DEFAULT_PORT; + return choosePort(host, basePort); +} diff --git a/packages/docusaurus/src/commands/serve.ts b/packages/docusaurus/src/commands/serve.ts index 6c6c4ba87a..8b0952d262 100644 --- a/packages/docusaurus/src/commands/serve.ts +++ b/packages/docusaurus/src/commands/serve.ts @@ -12,11 +12,12 @@ import chalk from 'chalk'; import path from 'path'; import build from './build'; -import choosePort from '../choosePort'; +import {getCLIOptionHost, getCLIOptionPort} from './commandUtils'; +import {ServeCLIOptions} from '@docusaurus/types'; export default async function serve( siteDir: string, - cliOptions: {port: number; build: boolean; dir: string; host: string}, + cliOptions: ServeCLIOptions, ): Promise { let dir = path.join(siteDir, cliOptions.dir); if (cliOptions.build) { @@ -28,7 +29,14 @@ export default async function serve( false, ); } - const port = await choosePort(cliOptions.host, cliOptions.port); + + const host: string = getCLIOptionHost(cliOptions.host); + const port: number | null = await getCLIOptionPort(cliOptions.port, host); + + if (port === null) { + process.exit(); + } + const server = http.createServer((req, res) => { serveHandler(req, res, { cleanUrls: true, diff --git a/packages/docusaurus/src/commands/start.ts b/packages/docusaurus/src/commands/start.ts index 0a65982dbb..0e6ab94884 100644 --- a/packages/docusaurus/src/commands/start.ts +++ b/packages/docusaurus/src/commands/start.ts @@ -21,27 +21,14 @@ import merge from 'webpack-merge'; import HotModuleReplacementPlugin from 'webpack/lib/HotModuleReplacementPlugin'; import {load} from '../server'; import {StartCLIOptions} from '@docusaurus/types'; -import {CONFIG_FILE_NAME, STATIC_DIR_NAME, DEFAULT_PORT} from '../constants'; +import {CONFIG_FILE_NAME, STATIC_DIR_NAME} from '../constants'; import createClientConfig from '../webpack/client'; import {applyConfigureWebpack} from '../webpack/utils'; -import choosePort from '../choosePort'; - -function getHost(reqHost: string | undefined): string { - return reqHost || 'localhost'; -} - -async function getPort( - reqPort: string | undefined, - host: string, -): Promise { - const basePort = reqPort ? parseInt(reqPort, 10) : DEFAULT_PORT; - const port = await choosePort(host, basePort); - return port; -} +import {getCLIOptionHost, getCLIOptionPort} from './commandUtils'; export default async function start( siteDir: string, - cliOptions: Partial = {}, + cliOptions: Partial, ): Promise { process.env.NODE_ENV = 'development'; process.env.BABEL_ENV = 'development'; @@ -82,8 +69,8 @@ export default async function start( const protocol: string = process.env.HTTPS === 'true' ? 'https' : 'http'; - const host: string = getHost(cliOptions.host); - const port: number | null = await getPort(cliOptions.port, host); + const host: string = getCLIOptionHost(cliOptions.host); + const port: number | null = await getCLIOptionPort(cliOptions.port, host); if (port === null) { process.exit(); diff --git a/website/package.json b/website/package.json index 2cf6d67795..382904fdd5 100644 --- a/website/package.json +++ b/website/package.json @@ -9,6 +9,7 @@ "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", "clear": "docusaurus clear", + "serve": "docusaurus serve", "start:baseUrl": "BASE_URL='/build/' yarn start", "build:baseUrl": "BASE_URL='/build/' yarn build", "start:bootstrap": "DOCUSAURUS_PRESET=bootstrap yarn start",