@rsbuild/core 2.0.0-beta.4 → 2.0.0-beta.6

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.
package/dist/131.js CHANGED
@@ -2527,8 +2527,8 @@ function initHooks() {
2527
2527
  onCloseDevServer: createAsyncHook(),
2528
2528
  onAfterStartDevServer: createAsyncHook(),
2529
2529
  onBeforeStartDevServer: createAsyncHook(),
2530
- onAfterStartProdServer: createAsyncHook(),
2531
- onBeforeStartProdServer: createAsyncHook(),
2530
+ onAfterStartPreviewServer: createAsyncHook(),
2531
+ onBeforeStartPreviewServer: createAsyncHook(),
2532
2532
  onAfterCreateCompiler: createAsyncHook(),
2533
2533
  onBeforeCreateCompiler: createAsyncHook(),
2534
2534
  modifyHTML: createEnvironmentAsyncHook(),
@@ -3282,8 +3282,8 @@ function initPluginAPI({ context, pluginManager }) {
3282
3282
  onAfterStartDevServer: hooks.onAfterStartDevServer.tap,
3283
3283
  onBeforeCreateCompiler: hooks.onBeforeCreateCompiler.tap,
3284
3284
  onBeforeStartDevServer: hooks.onBeforeStartDevServer.tap,
3285
- onAfterStartProdServer: hooks.onAfterStartProdServer.tap,
3286
- onBeforeStartProdServer: hooks.onBeforeStartProdServer.tap,
3285
+ onAfterStartPreviewServer: hooks.onAfterStartPreviewServer.tap,
3286
+ onBeforeStartPreviewServer: hooks.onBeforeStartPreviewServer.tap,
3287
3287
  modifyRsbuildConfig: hooks.modifyRsbuildConfig.tap,
3288
3288
  modifyHTML: (handler)=>{
3289
3289
  hooks.modifyHTML.tapEnvironment({
@@ -3399,7 +3399,7 @@ function createPublicContext(context) {
3399
3399
  async function createContext(options, userConfig) {
3400
3400
  let { cwd } = options, rootPath = userConfig.root ? ensureAbsolutePath(cwd, userConfig.root) : cwd, rsbuildConfig = await withDefaultConfig(rootPath, userConfig), cachePath = (0, external_node_path_.join)(rootPath, 'node_modules', '.cache'), specifiedEnvironments = options.environment && options.environment.length > 0 ? options.environment : void 0;
3401
3401
  return {
3402
- version: "2.0.0-beta.4",
3402
+ version: "2.0.0-beta.6",
3403
3403
  rootPath,
3404
3404
  distPath: '',
3405
3405
  cachePath,
@@ -4964,16 +4964,14 @@ let getPort = async ({ host, port, strictPort, tryLimits = 20 })=>{
4964
4964
  if (!found) throw Error(`${color.dim('[rsbuild:server]')} Failed to find an available port after ${tryLimits + 1} attempts, starting from ${color.yellow(original)}.`);
4965
4965
  if (port !== original && strictPort) throw Error(`${color.dim('[rsbuild:server]')} Port ${color.yellow(original)} is occupied, please choose another one.`);
4966
4966
  return port;
4967
- }, getServerConfig = async ({ config })=>{
4967
+ }, resolvePort = async (config)=>{
4968
4968
  let { host, port: originalPort, strictPort } = config.server, port = await getPort({
4969
4969
  host,
4970
4970
  port: originalPort,
4971
4971
  strictPort
4972
- }), https = !!config.server.https, portTip = port !== originalPort ? `port ${originalPort} is in use, ${color.yellow(`using port ${port}.`)}` : void 0;
4972
+ }), portTip = port !== originalPort ? `port ${originalPort} is in use, ${color.yellow(`using port ${port}.`)}` : void 0;
4973
4973
  return {
4974
4974
  port,
4975
- host,
4976
- https,
4977
4975
  portTip
4978
4976
  };
4979
4977
  }, isLoopbackHost = (host)=>new Set([
@@ -4992,7 +4990,7 @@ let getPort = async ({ host, port, strictPort, tryLimits = 20 })=>{
4992
4990
  } catch {
4993
4991
  return NETWORK_LABEL;
4994
4992
  }
4995
- }, getAddressUrls = async ({ protocol = 'http', port, host })=>{
4993
+ }, getAddressUrls = async ({ protocol, port, host })=>{
4996
4994
  if (host && host !== ALL_INTERFACES_IPV4) {
4997
4995
  let url = concatUrl({
4998
4996
  port,
@@ -5106,7 +5104,7 @@ function resolveUrl(str, base) {
5106
5104
  throw Error(`${color.dim('[rsbuild:open]')} Invalid input: ${color.yellow(str)} is not a valid URL or pathname`);
5107
5105
  }
5108
5106
  }
5109
- async function open_open({ https, port, routes, config, clearCache }) {
5107
+ async function open_open({ port, routes, config, protocol, clearCache }) {
5110
5108
  if ('true' === process.env.CSB) return;
5111
5109
  let { targets, before } = ((config)=>{
5112
5110
  let { open } = config.server;
@@ -5124,7 +5122,7 @@ async function open_open({ https, port, routes, config, clearCache }) {
5124
5122
  };
5125
5123
  })(config);
5126
5124
  clearCache && (openedURLs = []);
5127
- let urls = [], host = await getHostInUrl(config.server.host), baseUrl = `${https ? 'https' : 'http'}://${host}:${port}`;
5125
+ let urls = [], host = await getHostInUrl(config.server.host), baseUrl = `${protocol}://${host}:${port}`;
5128
5126
  for (let url of (targets.length ? urls.push(...targets.map((target)=>resolveUrl(replacePortPlaceholder(target, port), baseUrl))) : routes.length ? urls.push(`${baseUrl}${routes[0].pathname}`) : urls.push(baseUrl), before && await before(), urls))openedURLs.includes(url) || (openBrowser(url), openedURLs.push(url));
5129
5127
  }
5130
5128
  function recursiveChunkGroup(chunkGroup, visited = new Set()) {
@@ -6327,7 +6325,7 @@ class SocketServer {
6327
6325
  });
6328
6326
  }
6329
6327
  onBuildDone() {
6330
- if (this.reportedBrowserLogs.clear(), this.socketsMap.size) for (let token of this.socketsMap.keys())this.sendStats({
6328
+ if (this.reportedBrowserLogs.clear(), this.ensureInitialChunks(), this.socketsMap.size) for (let token of this.socketsMap.keys())this.sendStats({
6331
6329
  token
6332
6330
  });
6333
6331
  }
@@ -6375,9 +6373,11 @@ class SocketServer {
6375
6373
  socket.isAlive = !0;
6376
6374
  }), socket.on('message', async (data)=>{
6377
6375
  try {
6378
- let payload = JSON.parse('string' == typeof data ? data : data.toString()), { context } = this, config = context.normalizedConfig;
6379
- if (!config) return;
6380
- let { browserLogs, client } = config.dev;
6376
+ let payload = JSON.parse('string' == typeof data ? data : data.toString()), { context } = this;
6377
+ if (!context.normalizedConfig) return;
6378
+ let environment = this.getEnvironmentByToken(token);
6379
+ if (!environment) return;
6380
+ let { browserLogs, client } = environment.config.dev;
6381
6381
  if ('client-error' === payload.type && !context.buildState.hasErrors && browserLogs) {
6382
6382
  let stackTrace = isObject(browserLogs) && browserLogs.stackTrace || DEFAULT_STACK_TRACE, outputFs = this.getOutputFileSystem(), stackFrames = payload.stack ? stack_trace_parser_esm_parse(payload.stack) : null, cachedTraceMap = new Map(), log = await formatBrowserErrorLog(payload.message, context, outputFs, stackTrace, stackFrames, cachedTraceMap);
6383
6383
  if (this.reportedBrowserLogs.has(log) || (this.reportedBrowserLogs.add(log), src_logger.error(`${color.cyan('[browser]')} ${log}`)), 'object' == typeof client.overlay && client.overlay.runtime) {
@@ -6402,8 +6402,27 @@ class SocketServer {
6402
6402
  token
6403
6403
  });
6404
6404
  }
6405
+ getEnvironmentByToken(token) {
6406
+ return this.context.environmentList.find(({ webSocketToken })=>webSocketToken === token);
6407
+ }
6408
+ getInitialChunks(stats) {
6409
+ let initialChunks = new Set();
6410
+ if (!stats.entrypoints) return initialChunks;
6411
+ for (let entrypoint of Object.values(stats.entrypoints)){
6412
+ let { chunks } = entrypoint;
6413
+ if (Array.isArray(chunks)) for (let chunkName of chunks)chunkName && initialChunks.add(String(chunkName));
6414
+ }
6415
+ return initialChunks;
6416
+ }
6417
+ ensureInitialChunks() {
6418
+ for (let { webSocketToken } of this.context.environmentList){
6419
+ if (this.initialChunksMap.has(webSocketToken)) continue;
6420
+ let result = this.getStats(webSocketToken);
6421
+ result && this.initialChunksMap.set(webSocketToken, this.getInitialChunks(result.stats));
6422
+ }
6423
+ }
6405
6424
  getStats(token) {
6406
- let { stats } = this.context.buildState, environment = this.context.environmentList.find(({ webSocketToken })=>webSocketToken === token);
6425
+ let { stats } = this.context.buildState, environment = this.getEnvironmentByToken(token);
6407
6426
  if (!stats || !environment) return;
6408
6427
  let currentStats = stats;
6409
6428
  if (stats.children) {
@@ -6419,12 +6438,7 @@ class SocketServer {
6419
6438
  sendStats({ force = !1, token }) {
6420
6439
  let result = this.getStats(token);
6421
6440
  if (!result) return null;
6422
- let { stats, errors, warnings } = result, newInitialChunks = new Set();
6423
- if (stats.entrypoints) for (let entrypoint of Object.values(stats.entrypoints)){
6424
- let { chunks } = entrypoint;
6425
- if (Array.isArray(chunks)) for (let chunkName of chunks)chunkName && newInitialChunks.add(String(chunkName));
6426
- }
6427
- let initialChunks = this.initialChunksMap.get(token), shouldReload = stats.entrypoints && initialChunks && !isEqualSet(initialChunks, newInitialChunks);
6441
+ let { stats, errors, warnings } = result, newInitialChunks = this.getInitialChunks(stats), initialChunks = this.initialChunksMap.get(token), shouldReload = stats.entrypoints && initialChunks && !isEqualSet(initialChunks, newInitialChunks);
6428
6442
  if (this.initialChunksMap.set(token, newInitialChunks), shouldReload) return void this.sockWrite({
6429
6443
  type: 'static-changed'
6430
6444
  }, token);
@@ -6590,7 +6604,7 @@ function historyApiFallback_historyApiFallbackMiddleware(options = {}) {
6590
6604
  src_logger.debug('Not rewriting', req.method, req.url, 'because the client did not send an HTTP accept header.'), next();
6591
6605
  return;
6592
6606
  }
6593
- if (0 === headers.accept.indexOf('application/json')) {
6607
+ if (headers.accept.startsWith('application/json')) {
6594
6608
  src_logger.debug('Not rewriting', req.method, req.url, 'because the client prefers JSON.'), next();
6595
6609
  return;
6596
6610
  }
@@ -6608,11 +6622,11 @@ function historyApiFallback_historyApiFallbackMiddleware(options = {}) {
6608
6622
  let match = parsedUrl.pathname?.match(rewrite.from);
6609
6623
  if (!match) continue;
6610
6624
  let rule = rewrite.to;
6611
- '/' !== (rewriteTarget = 'string' == typeof rule ? rule : rule({
6625
+ (rewriteTarget = 'string' == typeof rule ? rule : rule({
6612
6626
  parsedUrl,
6613
6627
  match,
6614
6628
  request: req
6615
- })).charAt(0) && src_logger.debug('We recommend using an absolute path for the rewrite target.', 'Received a non-absolute rewrite target', rewriteTarget, 'for URL', req.url), src_logger.debug('Rewriting', req.method, req.url, 'to', rewriteTarget), req.url = rewriteTarget, next();
6629
+ })).startsWith('/') || src_logger.debug('We recommend using an absolute path for the rewrite target.', 'Received a non-absolute rewrite target', rewriteTarget, 'for URL', req.url), src_logger.debug('Rewriting', req.method, req.url, 'to', rewriteTarget), req.url = rewriteTarget, next();
6616
6630
  return;
6617
6631
  }
6618
6632
  let { pathname } = parsedUrl;
@@ -6723,33 +6737,30 @@ async function createProxyMiddleware(proxyOptions) {
6723
6737
  }
6724
6738
  };
6725
6739
  }
6726
- let applyDefaultMiddlewares = async ({ config, buildManager, context, devServerAPI, middlewares, postCallbacks })=>{
6740
+ let applyDefaultMiddlewares = async ({ config, buildManager, context, devServer, middlewares, postCallbacks })=>{
6727
6741
  let upgradeEvents = [], { server } = config;
6728
6742
  if (server.cors) {
6729
6743
  let { default: corsMiddleware } = await import("./cors.js").then(__webpack_require__.t.bind(__webpack_require__, "../../node_modules/.pnpm/cors@2.8.6/node_modules/cors/lib/index.js", 23));
6730
- middlewares.push(corsMiddleware('boolean' == typeof server.cors ? {} : server.cors));
6744
+ middlewares.use(corsMiddleware('boolean' == typeof server.cors ? {} : server.cors));
6731
6745
  }
6732
6746
  let { headers } = server;
6733
- if (headers && middlewares.push((_req, res, next)=>{
6747
+ if (headers && middlewares.use((_req, res, next)=>{
6734
6748
  for (let [key, value] of Object.entries(headers))res.setHeader(key, value);
6735
6749
  next();
6736
6750
  }), server.proxy) {
6737
6751
  let { middlewares: proxyMiddlewares, upgrade } = await createProxyMiddleware(server.proxy);
6738
- for (let middleware of (upgradeEvents.push(upgrade), proxyMiddlewares))middlewares.push(middleware);
6752
+ for (let middleware of (upgradeEvents.push(upgrade), proxyMiddlewares))middlewares.use(middleware);
6739
6753
  }
6740
6754
  let { compress } = server;
6741
- if (compress && middlewares.push(gzipMiddleware_gzipMiddleware('object' == typeof compress ? compress : void 0)), 'dev' === context.action && buildManager) {
6755
+ if (compress && middlewares.use(gzipMiddleware_gzipMiddleware('object' == typeof compress ? compress : void 0)), 'dev' === context.action && buildManager) {
6742
6756
  let { compiler } = buildManager;
6743
- (compiler_isMultiCompiler(compiler) ? compiler.compilers.some((childCompiler)=>childCompiler.options.lazyCompilation) : compiler.options.lazyCompilation) && middlewares.push(core_rspack.lazyCompilationMiddleware(compiler));
6757
+ (compiler_isMultiCompiler(compiler) ? compiler.compilers.some((childCompiler)=>childCompiler.options.lazyCompilation) : compiler.options.lazyCompilation) && middlewares.use(core_rspack.lazyCompilationMiddleware(compiler));
6744
6758
  }
6745
- server.base && '/' !== server.base && middlewares.push(getBaseUrlMiddleware({
6759
+ server.base && '/' !== server.base && middlewares.use(getBaseUrlMiddleware({
6746
6760
  base: server.base
6747
6761
  }));
6748
- let { default: launchEditorMiddleware } = await import("./launch-editor-middleware.js").then(__webpack_require__.t.bind(__webpack_require__, "../../node_modules/.pnpm/launch-editor-middleware@2.12.0/node_modules/launch-editor-middleware/index.js", 23));
6749
- if (middlewares.push([
6750
- '/__open-in-editor',
6751
- launchEditorMiddleware()
6752
- ]), middlewares.push((({ environments })=>async function viewingServedFilesMiddleware(req, res, next) {
6762
+ let { default: launchEditorMiddleware } = await import("./launch-editor-middleware.js").then(__webpack_require__.t.bind(__webpack_require__, "../../node_modules/.pnpm/launch-editor-middleware@2.13.0/node_modules/launch-editor-middleware/index.js", 23));
6763
+ if (middlewares.use('/__open-in-editor', launchEditorMiddleware()), middlewares.use((({ environments })=>async function viewingServedFilesMiddleware(req, res, next) {
6753
6764
  if ('/rsbuild-dev-server' !== req.url.replace(postfixRE, '')) return void next();
6754
6765
  res.writeHead(200, {
6755
6766
  'Content-Type': 'text/html; charset=utf-8'
@@ -6808,10 +6819,10 @@ let applyDefaultMiddlewares = async ({ config, buildManager, context, devServerA
6808
6819
  src_logger.error(err), res.writeHead(500), res.end('Failed to list the files');
6809
6820
  }
6810
6821
  })({
6811
- environments: devServerAPI.environments
6812
- })), buildManager && (middlewares.push(buildManager.assetsMiddleware), upgradeEvents.push(buildManager.socketServer.upgrade), middlewares.push(function hotUpdateJsonFallbackMiddleware(req, res, next) {
6822
+ environments: devServer.environments
6823
+ })), buildManager && (middlewares.use(buildManager.assetsMiddleware), upgradeEvents.push(buildManager.socketServer.upgrade), middlewares.use(function hotUpdateJsonFallbackMiddleware(req, res, next) {
6813
6824
  req.url?.endsWith('.hot-update.json') && 'OPTIONS' !== req.method ? notFoundMiddleware(req, res, next) : next();
6814
- })), buildManager && middlewares.push((({ distPath, buildManager })=>async function htmlCompletionMiddleware(req, res, next) {
6825
+ })), buildManager && middlewares.use((({ distPath, buildManager })=>async function htmlCompletionMiddleware(req, res, next) {
6815
6826
  if (!maybeHTMLRequest(req)) return void next();
6816
6827
  let pathname = req.url.replace(postfixRE, ''), rewrite = (newUrl)=>{
6817
6828
  req.url = newUrl, buildManager.assetsMiddleware(req, res, (...args)=>{
@@ -6838,14 +6849,14 @@ let applyDefaultMiddlewares = async ({ config, buildManager, context, devServerA
6838
6849
  etag: !0,
6839
6850
  dev: !0
6840
6851
  });
6841
- middlewares.push(function publicDirMiddleware(req, res, next) {
6852
+ middlewares.use(function publicDirMiddleware(req, res, next) {
6842
6853
  sirvMiddleware(req, res, next);
6843
6854
  });
6844
6855
  }
6845
6856
  }
6846
- for (let callback of postCallbacks)callback();
6847
- return server.historyApiFallback && (middlewares.push(historyApiFallback_historyApiFallbackMiddleware(!0 === server.historyApiFallback ? {} : server.historyApiFallback)), buildManager?.assetsMiddleware && middlewares.push(buildManager.assetsMiddleware)), buildManager && middlewares.push((({ htmlFallback, distPath, buildManager })=>async function htmlFallbackMiddleware(req, res, next) {
6848
- if (!maybeHTMLRequest(req) || '/favicon.ico' === req.url || 'index' !== htmlFallback) return void next();
6857
+ for (let callback of postCallbacks)await callback();
6858
+ return server.historyApiFallback && (middlewares.use(historyApiFallback_historyApiFallbackMiddleware(!0 === server.historyApiFallback ? {} : server.historyApiFallback)), buildManager?.assetsMiddleware && middlewares.use(buildManager.assetsMiddleware)), buildManager && server.htmlFallback && middlewares.use((({ distPath, buildManager })=>async function htmlFallbackMiddleware(req, res, next) {
6859
+ if (!maybeHTMLRequest(req) || '/favicon.ico' === req.url) return void next();
6849
6860
  let filePath = external_node_path_.default.join(distPath, 'index.html');
6850
6861
  if (await middlewares_isFileExists(filePath, buildManager.outputFileSystem)) {
6851
6862
  let newUrl = '/index.html';
@@ -6857,22 +6868,23 @@ let applyDefaultMiddlewares = async ({ config, buildManager, context, devServerA
6857
6868
  next();
6858
6869
  })({
6859
6870
  buildManager,
6860
- distPath: context.distPath,
6861
- htmlFallback: server.htmlFallback
6862
- })), middlewares.push(faviconFallbackMiddleware), {
6871
+ distPath: context.distPath
6872
+ })), middlewares.use(faviconFallbackMiddleware), {
6863
6873
  onUpgrade: (...args)=>{
6864
6874
  for (let cb of upgradeEvents)cb(...args);
6865
6875
  }
6866
6876
  };
6867
6877
  }, getDevMiddlewares = async (options)=>{
6868
- let middlewares = [], { buildManager } = options;
6869
- isVerbose() && middlewares.push(getRequestLoggerMiddleware());
6870
- let { before, after } = ((config, devServerAPI)=>{
6871
- let setupMiddlewares = config.dev.setupMiddlewares || [], serverOptions = pick(devServerAPI, [
6878
+ let { buildManager, devServer } = options, { middlewares } = devServer;
6879
+ isVerbose() && middlewares.use(getRequestLoggerMiddleware());
6880
+ let { before, after } = ((config, devServer)=>{
6881
+ let setupMiddlewares = config.dev.setupMiddlewares ? helpers_castArray(config.dev.setupMiddlewares) : [];
6882
+ setupMiddlewares.length && src_logger.warn('[rsbuild] `dev.setupMiddlewares` is deprecated, use `server.setup` instead');
6883
+ let serverOptions = pick(devServer, [
6872
6884
  'sockWrite',
6873
6885
  'environments'
6874
6886
  ]), before = [], after = [];
6875
- for (let handler of helpers_castArray(setupMiddlewares))handler({
6887
+ for (let handler of setupMiddlewares)handler({
6876
6888
  unshift: (...handlers)=>before.unshift(...handlers),
6877
6889
  push: (...handlers)=>after.push(...handlers)
6878
6890
  }, serverOptions);
@@ -6880,18 +6892,18 @@ let applyDefaultMiddlewares = async ({ config, buildManager, context, devServerA
6880
6892
  before,
6881
6893
  after
6882
6894
  };
6883
- })(options.config, options.devServerAPI);
6884
- middlewares.push(...before);
6895
+ })(options.config, options.devServer);
6896
+ for (let middleware of before)middlewares.use(middleware);
6885
6897
  let { onUpgrade } = await applyDefaultMiddlewares({
6886
6898
  ...options,
6887
6899
  middlewares
6888
6900
  });
6889
- return middlewares.push(...after), {
6901
+ for (let middleware of after)middlewares.use(middleware);
6902
+ return {
6890
6903
  close: async ()=>{
6891
6904
  await buildManager?.close();
6892
6905
  },
6893
- onUpgrade,
6894
- middlewares
6906
+ onUpgrade
6895
6907
  };
6896
6908
  }, asModule = async (something, context, unlinked)=>{
6897
6909
  let { Module, SyntheticModule } = await import("node:vm");
@@ -7162,6 +7174,14 @@ let runner_run = async ({ bundlePath, ...runnerFactoryOptions })=>{
7162
7174
  let { createServer } = await import("node:http");
7163
7175
  return createServer(middlewares);
7164
7176
  };
7177
+ async function applyServerSetup(setup, context) {
7178
+ let postCallbacks = [];
7179
+ for (let handler of helpers_castArray(setup || [])){
7180
+ let postCallback = await handler(context);
7181
+ 'function' == typeof postCallback && postCallbacks.push(postCallback);
7182
+ }
7183
+ return postCallbacks;
7184
+ }
7165
7185
  async function setupWatchFiles(options) {
7166
7186
  let { config, root, buildManager } = options, { hmr, liveReload } = config.dev;
7167
7187
  if (!hmr && !liveReload || !buildManager) return;
@@ -7227,15 +7247,13 @@ async function startWatchFiles({ paths, options, type = 'reload-page' }, buildMa
7227
7247
  }), watcher;
7228
7248
  }
7229
7249
  async function devServer_createDevServer(options, createCompiler, config, { getPortSilently, runCompile = !0 } = {}) {
7230
- let lastStats, fileWatcher, devMiddlewares;
7250
+ let lastStats, fileWatcher, devMiddlewares, buildManager;
7231
7251
  src_logger.debug('create dev server');
7232
- let { port, host, https, portTip } = await getServerConfig({
7233
- config
7234
- }), { middlewareMode } = config.server, { context } = options, routes = getRoutes(context), root = context.rootPath;
7252
+ let { port, portTip } = await resolvePort(config), { middlewareMode, host } = config.server, isHttps = !!config.server.https, { context } = options, routes = getRoutes(context);
7235
7253
  context.devServer = {
7236
7254
  hostname: host,
7237
7255
  port,
7238
- https
7256
+ https: isHttps
7239
7257
  };
7240
7258
  let waitLastCompileDoneResolve = null, waitLastCompileDone = new Promise((resolve)=>{
7241
7259
  waitLastCompileDoneResolve = resolve;
@@ -7263,7 +7281,7 @@ async function devServer_createDevServer(options, createCompiler, config, { getP
7263
7281
  resolvedPort: port
7264
7282
  });
7265
7283
  return await buildManager.init(), buildManager;
7266
- }, protocol = https ? 'https' : 'http', urls = await getAddressUrls({
7284
+ }, protocol = isHttps ? 'https' : 'http', urls = await getAddressUrls({
7267
7285
  protocol,
7268
7286
  port,
7269
7287
  host
@@ -7276,10 +7294,10 @@ async function devServer_createDevServer(options, createCompiler, config, { getP
7276
7294
  trailingLineBreak: !cliShortcutsEnabled,
7277
7295
  originalConfig: context.originalConfig
7278
7296
  }), openPage = async ()=>open_open({
7279
- https,
7280
7297
  port,
7281
7298
  routes,
7282
7299
  config,
7300
+ protocol,
7283
7301
  clearCache: !0
7284
7302
  }), cleanupGracefulShutdown = middlewareMode ? null : setupGracefulShutdown(), closingPromise = null, closeServer = async ()=>(closingPromise || (closingPromise = (async ()=>{
7285
7303
  removeCleanup(closeServer), cleanupGracefulShutdown?.(), await context.hooks.onCloseDevServer.callBatch(), await Promise.all([
@@ -7335,7 +7353,7 @@ async function devServer_createDevServer(options, createCompiler, config, { getP
7335
7353
  let { default: connect } = await import("./connect.js").then(__webpack_require__.t.bind(__webpack_require__, "../../node_modules/.pnpm/connect@3.7.0_supports-color@10.2.2/node_modules/connect/index.js", 23)), middlewares = connect(), httpServer = middlewareMode ? null : await createHttpServer({
7336
7354
  serverConfig: config.server,
7337
7355
  middlewares
7338
- }), devServerAPI = {
7356
+ }), devServer = {
7339
7357
  port,
7340
7358
  middlewares,
7341
7359
  environments: environmentAPI,
@@ -7353,12 +7371,10 @@ async function devServer_createDevServer(options, createCompiler, config, { getP
7353
7371
  port
7354
7372
  }, async (err)=>{
7355
7373
  if (err) throw err;
7356
- middlewares.use(optionsFallbackMiddleware), middlewares.use(notFoundMiddleware), devMiddlewares && httpServer.on('upgrade', devMiddlewares.onUpgrade), src_logger.debug('listen dev server done'), await devServerAPI.afterListen(), onBeforeRestartServer(devServerAPI.close), resolve({
7374
+ middlewares.use(optionsFallbackMiddleware), middlewares.use(notFoundMiddleware), devMiddlewares && httpServer.on('upgrade', devMiddlewares.onUpgrade), src_logger.debug('listen dev server done'), await devServer.afterListen(), onBeforeRestartServer(devServer.close), resolve({
7357
7375
  port,
7358
7376
  urls: urls.map((item)=>item.url),
7359
- server: {
7360
- close: devServerAPI.close
7361
- }
7377
+ server: devServer
7362
7378
  });
7363
7379
  });
7364
7380
  });
@@ -7376,134 +7392,119 @@ async function devServer_createDevServer(options, createCompiler, config, { getP
7376
7392
  close: closeServer,
7377
7393
  printUrls,
7378
7394
  open: openPage
7379
- }, postCallbacks = (await context.hooks.onBeforeStartDevServer.callBatch({
7380
- server: devServerAPI,
7395
+ }, setupPostCallbacks = await applyServerSetup(config.server.setup, {
7396
+ action: 'dev',
7397
+ server: devServer,
7381
7398
  environments: context.environments
7382
- })).filter((item)=>'function' == typeof item);
7383
- runCompile ? context.hooks.onBeforeCreateCompiler.tap(beforeCreateCompiler) : await beforeCreateCompiler();
7384
- let buildManager = runCompile ? await startCompile() : void 0;
7385
- for (let item of (fileWatcher = await setupWatchFiles({
7399
+ }), postCallbacks = [
7400
+ ...(await context.hooks.onBeforeStartDevServer.callBatch({
7401
+ server: devServer,
7402
+ environments: context.environments
7403
+ })).filter((item)=>'function' == typeof item),
7404
+ ...setupPostCallbacks
7405
+ ];
7406
+ return runCompile ? context.hooks.onBeforeCreateCompiler.tap(beforeCreateCompiler) : await beforeCreateCompiler(), buildManager = runCompile ? await startCompile() : void 0, fileWatcher = await setupWatchFiles({
7386
7407
  config,
7387
7408
  buildManager,
7388
- root
7389
- }), (devMiddlewares = await getDevMiddlewares({
7409
+ root: context.rootPath
7410
+ }), devMiddlewares = await getDevMiddlewares({
7390
7411
  buildManager,
7391
7412
  config,
7392
- devServerAPI,
7413
+ devServer,
7393
7414
  context,
7394
7415
  postCallbacks
7395
- })).middlewares))Array.isArray(item) ? middlewares.use(...item) : middlewares.use(item);
7396
- return buildManager?.watch(), src_logger.debug('create dev server done'), devServerAPI;
7416
+ }), buildManager?.watch(), src_logger.debug('create dev server done'), devServer;
7397
7417
  }
7398
- class RsbuildProdServer {
7399
- app;
7400
- options;
7401
- middlewares;
7402
- constructor(options, middlewares){
7403
- this.options = options, this.middlewares = middlewares;
7404
- }
7405
- async onInit(app) {
7406
- this.app = app, await this.applyDefaultMiddlewares();
7407
- }
7408
- async applyDefaultMiddlewares() {
7409
- let { headers, proxy, historyApiFallback, compress, base, cors } = this.options.serverConfig;
7410
- if (isVerbose() && this.middlewares.use(getRequestLoggerMiddleware()), cors) {
7411
- let { default: corsMiddleware } = await import("./cors.js").then(__webpack_require__.t.bind(__webpack_require__, "../../node_modules/.pnpm/cors@2.8.6/node_modules/cors/lib/index.js", 23));
7412
- this.middlewares.use(corsMiddleware('boolean' == typeof cors ? {} : cors));
7413
- }
7414
- if (headers && this.middlewares.use((_req, res, next)=>{
7415
- for (let [key, value] of Object.entries(headers))res.setHeader(key, value);
7416
- next();
7417
- }), proxy) {
7418
- let { middlewares, upgrade } = await createProxyMiddleware(proxy);
7419
- for (let middleware of middlewares)this.middlewares.use(middleware);
7420
- this.app.on('upgrade', upgrade);
7421
- }
7422
- if (compress) {
7423
- let { constants } = await import("node:zlib");
7424
- this.middlewares.use(gzipMiddleware_gzipMiddleware({
7425
- level: constants.Z_DEFAULT_COMPRESSION,
7426
- ...'object' == typeof compress ? compress : void 0
7427
- }));
7428
- }
7429
- base && '/' !== base && this.middlewares.use(getBaseUrlMiddleware({
7430
- base
7431
- })), await this.applyStaticAssetMiddleware(), historyApiFallback && (this.middlewares.use(historyApiFallback_historyApiFallbackMiddleware(!0 === historyApiFallback ? {} : historyApiFallback)), await this.applyStaticAssetMiddleware()), this.middlewares.use(faviconFallbackMiddleware), this.middlewares.use(optionsFallbackMiddleware), this.middlewares.use(notFoundMiddleware);
7432
- }
7433
- async applyStaticAssetMiddleware() {
7434
- let { output: { path, assetPrefixes }, serverConfig: { htmlFallback } } = this.options, { default: sirv } = await import("./sirv.js").then((mod)=>({
7418
+ async function startPreviewServer(context, config, { getPortSilently } = {}) {
7419
+ let { default: connect } = await import("./connect.js").then(__webpack_require__.t.bind(__webpack_require__, "../../node_modules/.pnpm/connect@3.7.0_supports-color@10.2.2/node_modules/connect/index.js", 23)), middlewares = connect(), { port, portTip } = await resolvePort(config), serverConfig = config.server, { host, headers, proxy, historyApiFallback, compress, base, cors } = serverConfig, protocol = serverConfig.https ? 'https' : 'http', routes = getRoutes(context), urls = await getAddressUrls({
7420
+ protocol,
7421
+ port,
7422
+ host
7423
+ }), cliShortcutsEnabled = isCliShortcutsEnabled(config), httpServer = await createHttpServer({
7424
+ serverConfig,
7425
+ middlewares
7426
+ }), cleanupGracefulShutdown = setupGracefulShutdown(), serverTerminator = getServerTerminator(httpServer), closingPromise = null, closeServer = async ()=>(closingPromise || (closingPromise = (async ()=>{
7427
+ removeCleanup(closeServer), cleanupGracefulShutdown(), await serverTerminator();
7428
+ })()), closingPromise), printUrls = ()=>printServerURLs({
7429
+ urls,
7430
+ port,
7431
+ routes,
7432
+ protocol,
7433
+ printUrls: serverConfig.printUrls,
7434
+ trailingLineBreak: !cliShortcutsEnabled,
7435
+ originalConfig: context.originalConfig
7436
+ }), openPage = async ()=>open_open({
7437
+ port,
7438
+ routes,
7439
+ config,
7440
+ protocol,
7441
+ clearCache: !0
7442
+ }), previewServer = {
7443
+ httpServer,
7444
+ port,
7445
+ middlewares,
7446
+ close: closeServer,
7447
+ printUrls,
7448
+ open: openPage
7449
+ }, postSetupCallbacks = await applyServerSetup(serverConfig.setup, {
7450
+ action: 'preview',
7451
+ server: previewServer,
7452
+ environments: context.environments
7453
+ });
7454
+ await context.hooks.onBeforeStartPreviewServer.callBatch({
7455
+ server: previewServer,
7456
+ environments: context.environments
7457
+ });
7458
+ let applyStaticAssetMiddleware = async ()=>{
7459
+ let { default: sirv } = await import("./sirv.js").then((mod)=>({
7435
7460
  default: mod.build
7436
- })), assetsMiddleware = sirv(path, {
7461
+ })), assetsMiddleware = sirv(context.distPath, {
7437
7462
  etag: !0,
7438
7463
  dev: !0,
7439
7464
  ignores: [
7440
7465
  'favicon.ico'
7441
7466
  ],
7442
- single: 'index' === htmlFallback
7443
- });
7444
- this.middlewares.use(function staticAssetMiddleware(req, res, next) {
7445
- let url = req.url, assetPrefix = url && assetPrefixes.find((prefix)=>url.startsWith(prefix));
7467
+ single: 'index' === serverConfig.htmlFallback
7468
+ }), assetPrefixes = context.environmentList.map((e)=>getPathnameFromUrl(e.config.output.assetPrefix));
7469
+ middlewares.use(function staticAssetMiddleware(req, res, next) {
7470
+ let { url } = req, assetPrefix = url && assetPrefixes.find((prefix)=>url.startsWith(prefix));
7446
7471
  assetPrefix && url?.startsWith(assetPrefix) ? (req.url = url.slice(assetPrefix.length), assetsMiddleware(req, res, (...args)=>{
7447
7472
  req.url = url, next(...args);
7448
7473
  })) : assetsMiddleware(req, res, next);
7449
7474
  });
7475
+ };
7476
+ if (isVerbose() && middlewares.use(getRequestLoggerMiddleware()), cors) {
7477
+ let { default: corsMiddleware } = await import("./cors.js").then(__webpack_require__.t.bind(__webpack_require__, "../../node_modules/.pnpm/cors@2.8.6/node_modules/cors/lib/index.js", 23));
7478
+ middlewares.use(corsMiddleware('boolean' == typeof cors ? {} : cors));
7450
7479
  }
7451
- async close() {}
7452
- }
7453
- async function startProdServer(context, config, { getPortSilently } = {}) {
7454
- let { port, host, https, portTip } = await getServerConfig({
7455
- config
7456
- }), { default: connect } = await import("./connect.js").then(__webpack_require__.t.bind(__webpack_require__, "../../node_modules/.pnpm/connect@3.7.0_supports-color@10.2.2/node_modules/connect/index.js", 23)), middlewares = connect(), serverConfig = config.server, server = new RsbuildProdServer({
7457
- pwd: context.rootPath,
7458
- output: {
7459
- path: context.distPath,
7460
- assetPrefixes: context.environmentList.map((e)=>getPathnameFromUrl(e.config.output.assetPrefix))
7461
- },
7462
- serverConfig
7463
- }, middlewares);
7464
- await context.hooks.onBeforeStartProdServer.callBatch();
7465
- let httpServer = await createHttpServer({
7466
- serverConfig,
7467
- middlewares: server.middlewares
7468
- }), serverTerminator = getServerTerminator(httpServer);
7469
- return await server.onInit(httpServer), new Promise((resolve)=>{
7480
+ if (headers && middlewares.use((_req, res, next)=>{
7481
+ for (let [key, value] of Object.entries(headers))res.setHeader(key, value);
7482
+ next();
7483
+ }), proxy) {
7484
+ let { middlewares: proxyMiddlewares, upgrade } = await createProxyMiddleware(proxy);
7485
+ for (let middleware of proxyMiddlewares)middlewares.use(middleware);
7486
+ httpServer.on('upgrade', upgrade);
7487
+ }
7488
+ if (compress) {
7489
+ let { constants } = await import("node:zlib");
7490
+ middlewares.use(gzipMiddleware_gzipMiddleware({
7491
+ level: constants.Z_DEFAULT_COMPRESSION,
7492
+ ...'object' == typeof compress ? compress : void 0
7493
+ }));
7494
+ }
7495
+ for (let callback of (base && '/' !== base && middlewares.use(getBaseUrlMiddleware({
7496
+ base
7497
+ })), await applyStaticAssetMiddleware(), historyApiFallback && (middlewares.use(historyApiFallback_historyApiFallbackMiddleware(!0 === historyApiFallback ? {} : historyApiFallback)), await applyStaticAssetMiddleware()), postSetupCallbacks))await callback();
7498
+ return middlewares.use(faviconFallbackMiddleware), middlewares.use(optionsFallbackMiddleware), middlewares.use(notFoundMiddleware), new Promise((resolve)=>{
7470
7499
  httpServer.listen({
7471
7500
  host,
7472
7501
  port
7473
7502
  }, async ()=>{
7474
- let routes = getRoutes(context);
7475
- await context.hooks.onAfterStartProdServer.callBatch({
7503
+ if (await context.hooks.onAfterStartPreviewServer.callBatch({
7476
7504
  port,
7477
7505
  routes,
7478
7506
  environments: context.environments
7479
- });
7480
- let protocol = https ? 'https' : 'http', urls = await getAddressUrls({
7481
- protocol,
7482
- port,
7483
- host
7484
- }), cliShortcutsEnabled = isCliShortcutsEnabled(config), cleanupGracefulShutdown = setupGracefulShutdown(), closingPromise = null, closeServer = async ()=>(closingPromise || (closingPromise = (async ()=>{
7485
- removeCleanup(closeServer), cleanupGracefulShutdown(), await Promise.all([
7486
- server.close(),
7487
- serverTerminator()
7488
- ]);
7489
- })()), closingPromise);
7490
- registerCleanup(closeServer);
7491
- let printUrls = ()=>printServerURLs({
7492
- urls,
7493
- port,
7494
- routes,
7495
- protocol,
7496
- printUrls: serverConfig.printUrls,
7497
- trailingLineBreak: !cliShortcutsEnabled,
7498
- originalConfig: context.originalConfig
7499
- }), openPage = async ()=>open_open({
7500
- https,
7501
- port,
7502
- routes,
7503
- config,
7504
- clearCache: !0
7505
- });
7506
- if (printUrls(), cliShortcutsEnabled) {
7507
+ }), registerCleanup(closeServer), printUrls(), cliShortcutsEnabled) {
7507
7508
  let shortcutsOptions = 'boolean' == typeof config.dev.cliShortcuts ? {} : config.dev.cliShortcuts;
7508
7509
  await setupCliShortcuts({
7509
7510
  openPage,
@@ -7516,9 +7517,7 @@ async function startProdServer(context, config, { getPortSilently } = {}) {
7516
7517
  !getPortSilently && portTip && src_logger.info(portTip), resolve({
7517
7518
  port,
7518
7519
  urls: urls.map((item)=>item.url),
7519
- server: {
7520
- close: closeServer
7521
- }
7520
+ server: previewServer
7522
7521
  });
7523
7522
  });
7524
7523
  });
@@ -8534,14 +8533,17 @@ try {
8534
8533
  setup (api) {
8535
8534
  let onStartServer = ({ port, routes })=>{
8536
8535
  let config = api.getNormalizedConfig();
8537
- config.server.open && open_open({
8538
- https: api.context.devServer?.https,
8539
- port,
8540
- routes,
8541
- config
8542
- });
8536
+ if (config.server.open) {
8537
+ let protocol = config.server.https ? 'https' : 'http';
8538
+ open_open({
8539
+ port,
8540
+ routes,
8541
+ config,
8542
+ protocol
8543
+ });
8544
+ }
8543
8545
  };
8544
- api.onAfterStartDevServer(onStartServer), api.onAfterStartProdServer(onStartServer), api.onBeforeBuild(async ({ isFirstCompile, environments })=>{
8546
+ api.onAfterStartDevServer(onStartServer), api.onAfterStartPreviewServer(onStartServer), api.onBeforeBuild(async ({ isFirstCompile, environments })=>{
8545
8547
  if (isFirstCompile) for (let { name: publicDir, copyOnBuild, ignore } of api.getNormalizedConfig().server.publicDir){
8546
8548
  let shouldCopy;
8547
8549
  if (!1 === copyOnBuild || !external_node_fs_.default.existsSync(publicDir)) continue;
@@ -8588,7 +8590,7 @@ try {
8588
8590
  api.modifyBundlerChain(async (chain, { CHAIN_ID, environment, isDev })=>{
8589
8591
  let { output: { manifest }, dev: { writeToDisk } } = environment.config;
8590
8592
  if (!1 === manifest) return;
8591
- let manifestOptions = normalizeManifestObjectConfig(manifest), { RspackManifestPlugin } = await import("./manifest-plugin.js").then(__webpack_require__.bind(__webpack_require__, "../../node_modules/.pnpm/rspack-manifest-plugin@5.2.1_@rspack+core@2.0.0-beta.2_@module-federation+runtime-tools@2.0.0_@swc+helpers@0.5.18_/node_modules/rspack-manifest-plugin/dist/index.js")), { htmlPaths } = environment, filter = manifestOptions.filter ?? ((file)=>!file.name.endsWith('.LICENSE.txt'));
8593
+ let manifestOptions = normalizeManifestObjectConfig(manifest), { RspackManifestPlugin } = await import("./manifest-plugin.js").then(__webpack_require__.bind(__webpack_require__, "../../node_modules/.pnpm/rspack-manifest-plugin@5.2.1_@rspack+core@2.0.0-beta.3_@module-federation+runtime-tools@2.0.1_@swc+helpers@0.5.19_/node_modules/rspack-manifest-plugin/dist/index.js")), { htmlPaths } = environment, filter = manifestOptions.filter ?? ((file)=>!file.name.endsWith('.LICENSE.txt'));
8592
8594
  manifestFilenames.set(environment.name, manifestOptions.filename);
8593
8595
  let pluginOptions = {
8594
8596
  fileName: manifestOptions.filename,
@@ -8823,7 +8825,7 @@ async function createRsbuild(options = {}) {
8823
8825
  if (!(0, external_node_fs_.existsSync)(distPath)) throw Error(`${color.dim('[rsbuild:preview]')} The output directory ${color.yellow(distPath)} does not exist, please build the project before previewing.`);
8824
8826
  if (isEmptyDir(distPath)) throw Error(`${color.dim('[rsbuild:preview]')} The output directory ${color.yellow(distPath)} is empty, please build the project before previewing.`);
8825
8827
  }
8826
- return startProdServer(context, config, options);
8828
+ return startPreviewServer(context, config, options);
8827
8829
  },
8828
8830
  startDevServer: async (options)=>{
8829
8831
  context.action = 'dev', process.env.NODE_ENV || setNodeEnv('development');
@@ -8885,13 +8887,13 @@ async function createRsbuild(options = {}) {
8885
8887
  'onAfterDevCompile',
8886
8888
  'onAfterEnvironmentCompile',
8887
8889
  'onAfterStartDevServer',
8888
- 'onAfterStartProdServer',
8890
+ 'onAfterStartPreviewServer',
8889
8891
  'onBeforeBuild',
8890
8892
  'onBeforeCreateCompiler',
8891
8893
  'onBeforeDevCompile',
8892
8894
  'onBeforeEnvironmentCompile',
8893
8895
  'onBeforeStartDevServer',
8894
- 'onBeforeStartProdServer',
8896
+ 'onBeforeStartPreviewServer',
8895
8897
  'onCloseBuild',
8896
8898
  'onCloseDevServer',
8897
8899
  'onDevCompileDone',
@@ -9093,7 +9095,7 @@ let applyServerOptions = (command)=>{
9093
9095
  };
9094
9096
  function setupCommands() {
9095
9097
  let cli = ((name = "")=>new CAC(name))('rsbuild');
9096
- cli.version("2.0.0-beta.4"), cli.option('--base <base>', 'Set the base path of the server').option('-c, --config <config>', 'Set the configuration file (relative or absolute path)').option('--config-loader <loader>', 'Set the config file loader (auto | jiti | native)', {
9098
+ cli.version("2.0.0-beta.6"), cli.option('--base <base>', 'Set the base path of the server').option('-c, --config <config>', 'Set the configuration file (relative or absolute path)').option('--config-loader <loader>', 'Set the config file loader (auto | jiti | native)', {
9097
9099
  default: 'auto'
9098
9100
  }).option('--env-dir <dir>', 'Set the directory for loading `.env` files').option('--env-mode <mode>', 'Set the env mode to load the `.env.[mode]` file').option('--environment <name>', 'Set the environment name(s) to build', {
9099
9101
  type: [
@@ -9162,7 +9164,7 @@ function initNodeEnv() {
9162
9164
  }
9163
9165
  function showGreeting() {
9164
9166
  let { npm_execpath, npm_lifecycle_event, NODE_RUN_SCRIPT_NAME } = process.env, isBun = npm_execpath?.includes('.bun');
9165
- src_logger.greet(`${'npx' === npm_lifecycle_event || isBun || NODE_RUN_SCRIPT_NAME ? '\n' : ''}Rsbuild v2.0.0-beta.4\n`);
9167
+ src_logger.greet(`${'npx' === npm_lifecycle_event || isBun || NODE_RUN_SCRIPT_NAME ? '\n' : ''}Rsbuild v2.0.0-beta.6\n`);
9166
9168
  }
9167
9169
  function setupLogLevel() {
9168
9170
  let logLevelIndex = process.argv.findIndex((item)=>'--log-level' === item || '--logLevel' === item);
@@ -9183,5 +9185,5 @@ function runCLI() {
9183
9185
  src_logger.error('Failed to start Rsbuild CLI.'), src_logger.error(err), process.exit(1);
9184
9186
  }
9185
9187
  }
9186
- let src_version = "2.0.0-beta.4";
9188
+ let src_version = "2.0.0-beta.6";
9187
9189
  export { PLUGIN_CSS_NAME, PLUGIN_SWC_NAME, core_rspack as rspack, createRsbuild, defaultAllowedOrigins, defineConfig, ensureAssetPrefix, external_node_util_promisify, loadConfig_loadConfig as loadConfig, loadEnv, mergeRsbuildConfig, runCLI, src_logger as logger, src_version as version };