Skip to content

Commit 21f21f4

Browse files
committed
fix: handle undefined values in mergeRsbuildConfig
1 parent 9daac17 commit 21f21f4

File tree

4 files changed

+46
-7
lines changed

4 files changed

+46
-7
lines changed

packages/core/src/mergeConfig.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,19 +119,22 @@ const normalizeConfigStructure = <T = RsbuildConfig>(config: T): T => {
119119
};
120120

121121
export const mergeRsbuildConfig = <T = RsbuildConfig>(
122-
...originalConfigs: T[]
122+
...originalConfigs: (T | undefined)[]
123123
): T => {
124-
const configs = originalConfigs.map(normalizeConfigStructure);
124+
const configs = originalConfigs
125+
.filter((config) => config !== undefined)
126+
.map(normalizeConfigStructure);
125127

126128
// In most cases there will be two configs so we perform this check first
127129
if (configs.length === 2) {
128130
return merge(configs[0], configs[1]) as T;
129131
}
130-
131-
if (configs.length < 2) {
132+
if (configs.length === 1) {
132133
return configs[0];
133134
}
134-
135+
if (configs.length === 0) {
136+
return {} as T;
137+
}
135138
return configs.reduce(
136139
(result, config) => merge(result, config) as T,
137140
{} as T,

packages/core/tests/mergeConfig.test.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,4 +489,36 @@ describe('mergeRsbuildConfig', () => {
489489
},
490490
});
491491
});
492+
493+
it('should accept `undefined` value', () => {
494+
const config: RsbuildConfig = {
495+
source: {
496+
entry: {
497+
index: 'src/index.ts',
498+
},
499+
},
500+
};
501+
502+
expect(mergeRsbuildConfig(config, undefined)).toEqual(config);
503+
expect(mergeRsbuildConfig(undefined, config)).toEqual(config);
504+
expect(
505+
mergeRsbuildConfig(undefined, config, {
506+
source: {
507+
entry: {
508+
index2: 'src/index2.ts',
509+
},
510+
},
511+
}),
512+
).toEqual({
513+
source: {
514+
entry: {
515+
index: 'src/index.ts',
516+
index2: 'src/index2.ts',
517+
},
518+
},
519+
});
520+
expect(mergeRsbuildConfig(undefined, undefined, undefined)).toEqual(
521+
undefined,
522+
);
523+
});
492524
});

website/docs/en/api/javascript-api/core.mdx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,9 @@ The `mergeRsbuildConfig` function takes multiple configuration objects as parame
316316
- **Type:**
317317

318318
```ts
319-
function mergeRsbuildConfig(...configs: RsbuildConfig[]): RsbuildConfig;
319+
function mergeRsbuildConfig(
320+
...configs: (RsbuildConfig | undefined)[]
321+
): RsbuildConfig;
320322
```
321323

322324
### Basic example

website/docs/zh/api/javascript-api/core.mdx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,9 @@ loadEnv({ processEnv: { ...process.env } });
316316
- **类型:**
317317

318318
```ts
319-
function mergeRsbuildConfig(...configs: RsbuildConfig[]): RsbuildConfig;
319+
function mergeRsbuildConfig(
320+
...configs: (RsbuildConfig | undefined)[]
321+
): RsbuildConfig;
320322
```
321323

322324
### 基础示例

0 commit comments

Comments
 (0)