UNPKG

@docusaurus/core

Version:

Easy to Maintain Open Source Documentation Websites

139 lines (138 loc) 5.53 kB
"use strict"; /** * 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. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.createWebpackDevServer = createWebpackDevServer; const tslib_1 = require("tslib"); const path_1 = tslib_1.__importDefault(require("path")); const webpack_merge_1 = tslib_1.__importDefault(require("webpack-merge")); const bundler_1 = require("@docusaurus/bundler"); const logger_1 = tslib_1.__importDefault(require("@docusaurus/logger")); const webpack_dev_server_1 = tslib_1.__importDefault(require("webpack-dev-server")); const evalSourceMapMiddleware_1 = tslib_1.__importDefault(require("../utils/legacy/evalSourceMapMiddleware")); const watcher_1 = require("./watcher"); const getHttpsConfig_1 = tslib_1.__importDefault(require("../../webpack/utils/getHttpsConfig")); const configure_1 = require("../../webpack/configure"); const client_1 = require("../../webpack/client"); // E2E_TEST=true docusaurus start // Makes "docusaurus start" exit immediately on success/error, for E2E test function registerWebpackE2ETestHook(compiler) { compiler.hooks.done.tap('done', (stats) => { const errorsWarnings = stats.toJson('errors-warnings'); const statsErrorMessage = (0, bundler_1.formatStatsErrorMessage)(errorsWarnings); if (statsErrorMessage) { console.error(statsErrorMessage); } (0, bundler_1.printStatsWarnings)(errorsWarnings); if (process.env.E2E_TEST) { if (stats.hasErrors()) { logger_1.default.error('E2E_TEST: Project has compiler errors.'); process.exit(1); } logger_1.default.success('E2E_TEST: Project can compile.'); process.exit(0); } }); } async function createDevServerConfig({ cliOptions, props, host, port, }) { const { baseUrl, siteDir, siteConfig } = props; const pollingOptions = (0, watcher_1.createPollingOptions)(cliOptions); const httpsConfig = await (0, getHttpsConfig_1.default)(); // https://webpack.js.org/configuration/dev-server return { hot: cliOptions.hotOnly ? 'only' : true, liveReload: false, client: { progress: true, overlay: { warnings: false, errors: true, }, webSocketURL: { hostname: '0.0.0.0', port: 0, }, }, headers: { 'access-control-allow-origin': '*', }, devMiddleware: { publicPath: siteConfig.future.experimental_router === 'hash' ? 'auto' : baseUrl, // Reduce log verbosity, see https://github.com/facebook/docusaurus/pull/5420#issuecomment-906613105 stats: 'summary', }, static: siteConfig.staticDirectories.map((dir) => ({ publicPath: baseUrl, directory: path_1.default.resolve(siteDir, dir), watch: { // Useful options for our own monorepo using symlinks! // See https://github.com/webpack/webpack/issues/11612#issuecomment-879259806 followSymlinks: true, ignored: /node_modules\/(?!@docusaurus)/, ...{ pollingOptions }, }, })), ...(httpsConfig && { server: typeof httpsConfig === 'object' ? { type: 'https', options: httpsConfig, } : 'https', }), historyApiFallback: { rewrites: [{ from: /\/*/, to: baseUrl }], }, allowedHosts: 'all', host, port, setupMiddlewares: (middlewares, devServer) => { // This lets us fetch source contents from webpack for the error overlay. middlewares.unshift((0, evalSourceMapMiddleware_1.default)(devServer)); return middlewares; }, }; } async function getStartClientConfig({ props, minify, poll, configureWebpackUtils, }) { const { plugins } = props; let { clientConfig: config } = await (0, client_1.createStartClientConfig)({ props, minify, faster: props.siteConfig.future.experimental_faster, poll, configureWebpackUtils, }); config = (0, configure_1.executePluginsConfigureWebpack)({ plugins, config, isServer: false, configureWebpackUtils, }); return config; } async function createWebpackDevServer({ props, cliOptions, openUrlContext, }) { const configureWebpackUtils = await (0, configure_1.createConfigureWebpackUtils)({ siteConfig: props.siteConfig, }); const config = await getStartClientConfig({ props, minify: cliOptions.minify ?? true, poll: cliOptions.poll, configureWebpackUtils, }); const compiler = props.currentBundler.instance(config); registerWebpackE2ETestHook(compiler); const defaultDevServerConfig = await createDevServerConfig({ cliOptions, props, host: openUrlContext.host, port: openUrlContext.port, }); // Allow plugin authors to customize/override devServer config const devServerConfig = (0, webpack_merge_1.default)([defaultDevServerConfig, config.devServer].filter(Boolean)); return new webpack_dev_server_1.default(devServerConfig, compiler); }