diff --git a/packages/core/src/cli/build.ts b/packages/core/src/cli/build.ts index b1a7ec41e..a44ce4688 100644 --- a/packages/core/src/cli/build.ts +++ b/packages/core/src/cli/build.ts @@ -12,6 +12,7 @@ export async function build( const rsbuildInstance = await createRsbuild({ rsbuildConfig: { plugins: config.plugins, + server: config.server, environments: pruneEnvironments(environments, options.lib), }, }); diff --git a/packages/core/src/cli/inspect.ts b/packages/core/src/cli/inspect.ts index 1710e8d74..350da1436 100644 --- a/packages/core/src/cli/inspect.ts +++ b/packages/core/src/cli/inspect.ts @@ -11,6 +11,7 @@ export async function inspect( const rsbuildInstance = await createRsbuild({ rsbuildConfig: { plugins: config.plugins, + server: config.server, environments: pruneEnvironments(environments, options.lib), }, }); diff --git a/packages/core/src/cli/mf.ts b/packages/core/src/cli/mf.ts index d2bfcc46c..42d99e370 100644 --- a/packages/core/src/cli/mf.ts +++ b/packages/core/src/cli/mf.ts @@ -33,8 +33,13 @@ async function initMFRsbuild( ...(rslibConfig.plugins || []), ...(mfRsbuildConfig.config.plugins || []), ], + server: mergeRsbuildConfig( + rslibConfig.server, + mfRsbuildConfig.config.server, + ), }, }); + const devServer = await rsbuildInstance.startDevServer(); onBeforeRestart(devServer.server.close); diff --git a/packages/core/src/config.ts b/packages/core/src/config.ts index 0e6af6556..7d9f23292 100644 --- a/packages/core/src/config.ts +++ b/packages/core/src/config.ts @@ -1335,6 +1335,7 @@ export async function composeCreateRsbuildConfig( const { lib: libConfigsArray, plugins: sharedPlugins, + server, ...sharedRsbuildConfig } = rslibConfig; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd9054fdf..f16f76e13 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -750,6 +750,10 @@ importers: tests/integration/resolve/with-main-fields: {} + tests/integration/server/basic: {} + + tests/integration/server/mf-dev: {} + tests/integration/shims/cjs: {} tests/integration/shims/esm: {} diff --git a/tests/integration/server/basic/package.json b/tests/integration/server/basic/package.json new file mode 100644 index 000000000..047f31a02 --- /dev/null +++ b/tests/integration/server/basic/package.json @@ -0,0 +1,6 @@ +{ + "name": "server-basic-test", + "version": "1.0.0", + "private": true, + "type": "module" +} diff --git a/tests/integration/server/basic/public/logo.svg b/tests/integration/server/basic/public/logo.svg new file mode 100644 index 000000000..e69de29bb diff --git a/tests/integration/server/basic/rslib.config.ts b/tests/integration/server/basic/rslib.config.ts new file mode 100644 index 000000000..1b74d620b --- /dev/null +++ b/tests/integration/server/basic/rslib.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from '@rslib/core'; +import { generateBundleEsmConfig } from 'test-helper'; + +export default defineConfig({ + lib: [generateBundleEsmConfig()], + server: { + publicDir: { + copyOnBuild: false, + }, + }, +}); diff --git a/tests/integration/server/basic/src/index.ts b/tests/integration/server/basic/src/index.ts new file mode 100644 index 000000000..3329a7d97 --- /dev/null +++ b/tests/integration/server/basic/src/index.ts @@ -0,0 +1 @@ +export const foo = 'foo'; diff --git a/tests/integration/server/index.test.ts b/tests/integration/server/index.test.ts new file mode 100644 index 000000000..6b6d49476 --- /dev/null +++ b/tests/integration/server/index.test.ts @@ -0,0 +1,43 @@ +import { exec } from 'node:child_process'; +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; +import fse from 'fs-extra'; +import { awaitFileExists, buildAndGetResults } from 'test-helper'; +import { describe, expect, test } from 'vitest'; + +describe('server config', async () => { + test('basic config', async () => { + const fixturePath = join(__dirname, 'basic'); + await buildAndGetResults({ fixturePath }); + + // Check if logo.svg in public is copied to dist/esm + const logoPath = join(__dirname, 'dist', 'esm', 'logo.svg'); + const logoExists = existsSync(logoPath); + expect(logoExists).toBe(false); + }); + + test('mf dev command', async () => { + const fixturePath = join(__dirname, 'mf-dev'); + const distPath = join(fixturePath, 'dist'); + const rsbuildConfigFile = join(distPath, '.rsbuild/rsbuild.config.mjs'); + fse.removeSync(distPath); + + const childProcess = exec('npx rslib mf dev', { + cwd: fixturePath, + env: { + ...process.env, + DEBUG: 'rsbuild', + }, + }); + + await awaitFileExists(rsbuildConfigFile); + childProcess.kill(); + + // Check if the server config is merged correctly + const rsbuildConfigContent = await fse.readFile(rsbuildConfigFile, 'utf-8'); + expect(rsbuildConfigContent).toContain(`base: '/'`); + expect(rsbuildConfigContent).toContain('open: true'); + expect(rsbuildConfigContent).toContain('port: 3002'); + expect(rsbuildConfigContent).toContain('printUrls: false'); + }); +}); diff --git a/tests/integration/server/mf-dev/package.json b/tests/integration/server/mf-dev/package.json new file mode 100644 index 000000000..d5a4cfb97 --- /dev/null +++ b/tests/integration/server/mf-dev/package.json @@ -0,0 +1,6 @@ +{ + "name": "server-mf-dev-test", + "version": "1.0.0", + "private": true, + "type": "module" +} diff --git a/tests/integration/server/mf-dev/rslib.config.ts b/tests/integration/server/mf-dev/rslib.config.ts new file mode 100644 index 000000000..3ad7e4e96 --- /dev/null +++ b/tests/integration/server/mf-dev/rslib.config.ts @@ -0,0 +1,23 @@ +import { pluginModuleFederation } from '@module-federation/rsbuild-plugin'; +import { defineConfig } from '@rslib/core'; + +export default defineConfig({ + lib: [ + { + format: 'mf', + server: { + port: 3002, + printUrls: false, + }, + }, + ], + server: { + port: 3001, + open: true, + }, + plugins: [ + pluginModuleFederation({ + name: 'test', + }), + ], +}); diff --git a/tests/integration/server/mf-dev/src/index.ts b/tests/integration/server/mf-dev/src/index.ts new file mode 100644 index 000000000..3329a7d97 --- /dev/null +++ b/tests/integration/server/mf-dev/src/index.ts @@ -0,0 +1 @@ +export const foo = 'foo';