From 941beac6858e10c8003880db41797aec5cf81fdb Mon Sep 17 00:00:00 2001 From: Qingyu Wang <40660121+colinaaa@users.noreply.github.com> Date: Tue, 11 Mar 2025 14:25:44 +0800 Subject: [PATCH] feat(rspeedy/core): add `mergeRspeedyConfig` --- .changeset/mean-frogs-shop.md | 5 ++ packages/rspeedy/core/etc/rspeedy.api.md | 3 + .../core/src/config/mergeRspeedyConfig.ts | 47 +++++++++++ packages/rspeedy/core/src/index.ts | 1 + .../test/config/mergeRspeedyConfig.test.ts | 78 +++++++++++++++++++ 5 files changed, 134 insertions(+) create mode 100644 .changeset/mean-frogs-shop.md create mode 100644 packages/rspeedy/core/src/config/mergeRspeedyConfig.ts create mode 100644 packages/rspeedy/core/test/config/mergeRspeedyConfig.test.ts diff --git a/.changeset/mean-frogs-shop.md b/.changeset/mean-frogs-shop.md new file mode 100644 index 0000000000..f941542b0f --- /dev/null +++ b/.changeset/mean-frogs-shop.md @@ -0,0 +1,5 @@ +--- +"@lynx-js/rspeedy": patch +--- + +Add `mergeRspeedyConfig` function for merging multiple Rspeedy configuration object. diff --git a/packages/rspeedy/core/etc/rspeedy.api.md b/packages/rspeedy/core/etc/rspeedy.api.md index ac78a4be14..d87083ef41 100644 --- a/packages/rspeedy/core/etc/rspeedy.api.md +++ b/packages/rspeedy/core/etc/rspeedy.api.md @@ -199,6 +199,9 @@ export interface LoadConfigResult { export { logger } +// @public +export function mergeRspeedyConfig(...configs: Config[]): Config; + // @public export interface Minify { css?: boolean | undefined; diff --git a/packages/rspeedy/core/src/config/mergeRspeedyConfig.ts b/packages/rspeedy/core/src/config/mergeRspeedyConfig.ts new file mode 100644 index 0000000000..c41c36bb28 --- /dev/null +++ b/packages/rspeedy/core/src/config/mergeRspeedyConfig.ts @@ -0,0 +1,47 @@ +// Copyright 2024 The Lynx Authors. All rights reserved. +// Licensed under the Apache License Version 2.0 that can be found in the +// LICENSE file in the root directory of this source tree. + +import { mergeRsbuildConfig } from '@rsbuild/core' + +import type { Config } from './index.js' + +/** + * Merge multiple Rspeedy configuration objects. + * + * @param configs - The Rspeedy configuration objects to merge. + * + * @returns The merged Rspeedy configuration object. + * + * @example + * + * ```ts + * import { mergeRspeedyConfig } from '@lynx-js/rspeedy'; + * + * const config1 = { + * dev: { + * writeToDisk: false, + * }, + * }; + * const config2 = { + * dev: { + * writeToDisk: true, + * }, + * }; + * + * const mergedConfig = mergeRspeedyConfig(config1, config2); + * + * console.log(mergedConfig); // { dev: { writeToDisk: true } } + * ``` + * + * @remarks + * + * This is actually an alias of {@link https://rsbuild.dev/api/javascript-api/core#mergersbuildconfig | mergeRsbuildConfig}. + * + * @public + */ +export function mergeRspeedyConfig( + ...configs: Config[] +): Config { + return mergeRsbuildConfig(...configs) +} diff --git a/packages/rspeedy/core/src/index.ts b/packages/rspeedy/core/src/index.ts index d89d3c5da8..494717df07 100644 --- a/packages/rspeedy/core/src/index.ts +++ b/packages/rspeedy/core/src/index.ts @@ -27,6 +27,7 @@ export { type CreateRspeedyOptions, } from './create-rspeedy.js' export { logger } from '@rsbuild/core' +export { mergeRspeedyConfig } from './config/mergeRspeedyConfig.js' // Config export { defineConfig } from './config/defineConfig.js' diff --git a/packages/rspeedy/core/test/config/mergeRspeedyConfig.test.ts b/packages/rspeedy/core/test/config/mergeRspeedyConfig.test.ts new file mode 100644 index 0000000000..9d36e34daa --- /dev/null +++ b/packages/rspeedy/core/test/config/mergeRspeedyConfig.test.ts @@ -0,0 +1,78 @@ +// Copyright 2024 The Lynx Authors. All rights reserved. +// Licensed under the Apache License Version 2.0 that can be found in the +// LICENSE file in the root directory of this source tree. +import { describe, expect, it } from 'vitest' + +import { mergeRspeedyConfig } from '../../src/config/mergeRspeedyConfig.js' + +describe('mergeRspeedyConfig', () => { + it('should override Rsbuild config', () => { + const config = mergeRspeedyConfig({ + source: { entry: './src/index.tsx' }, + }, { + source: { entry: './src/index2.tsx' }, + }) + + expect(config).toEqual({ + source: { entry: './src/index2.tsx' }, + }) + }) + + it('should merge Rsbuild config array', () => { + const config = mergeRspeedyConfig({ + source: { entry: ['./src/index.tsx'] }, + }, { + source: { entry: ['./src/index2.tsx'] }, + }) + + expect(config).toEqual({ + source: { entry: ['./src/index.tsx', './src/index2.tsx'] }, + }) + }) + + it('should merge Rsbuild config object', () => { + const config = mergeRspeedyConfig({ + source: { define: { FOO: 'true' } }, + }, { + source: { define: { BAR: 'false' } }, + }) + + expect(config).toEqual({ + source: { define: { FOO: 'true', BAR: 'false' } }, + }) + }) + + it('should merge Rsbuild config object and array', () => { + const config = mergeRspeedyConfig({ + source: { entry: ['./src/index.tsx'] }, + }, { + source: { define: { BAR: 'false' } }, + }) + + expect(config).toEqual({ + source: { entry: ['./src/index.tsx'], define: { BAR: 'false' } }, + }) + }) + + it('should merge Rspeedy custom config', () => { + const config = mergeRspeedyConfig({ + output: { + filename: 'foo.bundle', + }, + }, { + output: { + filename: { + bundle: 'bundle2.js', + }, + }, + }) + + expect(config).toEqual({ + output: { + filename: { + bundle: 'bundle2.js', + }, + }, + }) + }) +})