Skip to content

Commit 13c7be3

Browse files
authored
fix: Fix an issue when words are null (#4354)
1 parent 1c0c3eb commit 13c7be3

File tree

3 files changed

+17
-18
lines changed

3 files changed

+17
-18
lines changed

packages/cspell-lib/src/lib/Settings/CSpellSettingsServer.test.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -168,13 +168,16 @@ describe('Validate CSpellSettingsServer', () => {
168168
test.each`
169169
left | right | expected
170170
${{}} | ${{}} | ${csi({})}
171+
${{ words: null }} | ${{}} | ${csi({})}
172+
${{}} | ${{ words: null }} | ${csi({})}
171173
${{ dictionaries: ['a'] }} | ${{ dictionaries: ['b'] }} | ${oc(csi({ dictionaries: ['a', 'b'] }))}
172174
${{ features: {} }} | ${{}} | ${oc(csi({ features: {} }))}
173175
${{ features: { 'weighted-suggestions': true } }} | ${{}} | ${oc(csi({ features: { 'weighted-suggestions': true } }))}
174176
${{ features: { 'weighted-suggestions': true } }} | ${{ features: { 'weighted-suggestions': false } }} | ${oc(csi({ features: { 'weighted-suggestions': false } }))}
175177
${{ features: { 'weighted-suggestions': true } }} | ${{ features: { 'new-feature': true } }} | ${oc({ features: { 'weighted-suggestions': true, 'new-feature': true } })}
176178
`('mergeSettings $left with $right', ({ left, right, expected }) => {
177-
expect(mergeSettings(left, right)).toEqual(expected);
179+
const merged = mergeSettings(left, right);
180+
expect(merged).toEqual(expected);
178181
});
179182

180183
test.each`

packages/cspell-lib/src/lib/Settings/CSpellSettingsServer.ts

+11-15
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,6 @@ type CSpellSettingsWST = AdvancedCSpellSettingsWithSourceTrace;
2525
type CSpellSettingsWSTO = OptionalOrUndefined<AdvancedCSpellSettingsWithSourceTrace>;
2626
type CSpellSettingsI = CSpellSettingsInternal;
2727

28-
function _unique<T>(a: T[]): T[] {
29-
return [...new Set(a)];
30-
}
31-
3228
/**
3329
* Merges two lists and removes duplicates. Order is NOT preserved.
3430
*/
@@ -38,11 +34,11 @@ function mergeListUnique<T>(left: undefined, right: T[]): T[];
3834
function mergeListUnique<T>(left: T[], right: undefined): T[];
3935
function mergeListUnique<T>(left: T[] | undefined, right: T[] | undefined): T[] | undefined;
4036
function mergeListUnique<T>(left: T[] | undefined, right: T[] | undefined): T[] | undefined {
41-
if (left === undefined) return right;
42-
if (right === undefined) return left;
37+
if (!Array.isArray(left)) return Array.isArray(right) ? right : undefined;
38+
if (!Array.isArray(right)) return left;
4339
if (!right.length) return left;
4440
if (!left.length) return right;
45-
return _unique([...left, ...right]);
41+
return [...new Set([...left, ...right])];
4642
}
4743

4844
/**
@@ -55,8 +51,8 @@ function mergeList<T>(left: undefined, right: T[]): T[];
5551
function mergeList<T>(left: T[], right: undefined): T[];
5652
function mergeList<T>(left: T[] | undefined, right: T[] | undefined): T[] | undefined;
5753
function mergeList<T>(left: T[] | undefined, right: T[] | undefined): T[] | undefined {
58-
if (left === undefined) return right;
59-
if (right === undefined) return left;
54+
if (!Array.isArray(left)) return Array.isArray(right) ? right : undefined;
55+
if (!Array.isArray(right)) return left;
6056
if (!left.length) return right;
6157
if (!right.length) return left;
6258
return left.concat(right);
@@ -82,10 +78,10 @@ function mergeWordsCached(left: undefined, right: string[]): string[];
8278
function mergeWordsCached(left: string[], right: undefined): string[];
8379
function mergeWordsCached(left: string[] | undefined, right: string[] | undefined): string[] | undefined;
8480
function mergeWordsCached(left: string[] | undefined, right: string[] | undefined): string[] | undefined {
85-
if (left === undefined) return !right || right.length ? right : emptyWords;
86-
if (right === undefined) return !left || left.length ? left : emptyWords;
87-
if (!left.length) return !right || right.length ? right : emptyWords;
88-
if (!right.length) return !left || left.length ? left : emptyWords;
81+
if (!Array.isArray(left) || !left.length) {
82+
return Array.isArray(right) ? (right.length ? right : emptyWords) : undefined;
83+
}
84+
if (!Array.isArray(right) || !right.length) return left;
8985

9086
return _mergeWordsCached(left, right);
9187
}
@@ -95,8 +91,8 @@ function mergeObjects<T>(left: T, right: undefined): T;
9591
function mergeObjects<T>(left: T, right: T): T;
9692
function mergeObjects<T>(left: undefined, right: T): T;
9793
function mergeObjects<T>(left?: T, right?: T): T | undefined {
98-
if (left === undefined) return right;
99-
if (right === undefined) return left;
94+
if (!left || typeof left !== 'object') return !right || typeof right !== 'object' ? undefined : right;
95+
if (!right || typeof right !== 'object') return left;
10096
return { ...left, ...right };
10197
}
10298

packages/cspell-lib/src/lib/util/util.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ export function unique<T>(src: T[]): T[] {
2121
}
2222

2323
/**
24-
* Delete all `undefined` fields from an object.
24+
* Delete all `undefined` and `null` fields from an object.
2525
* @param src - object to be cleaned
2626
*/
2727
export function clean<T extends object>(src: T): RemoveUndefined<T> {
2828
const r = src;
2929
type keyOfT = keyof T;
3030
type keysOfT = keyOfT[];
3131
for (const key of Object.keys(r) as keysOfT) {
32-
if (r[key] === undefined) {
32+
if (r[key] === undefined || r[key] === null) {
3333
delete r[key];
3434
}
3535
}

0 commit comments

Comments
 (0)