From 13c7be332b1ebf8e42ee3c3c2f4cd058d0bf36bc Mon Sep 17 00:00:00 2001 From: Jason Dent Date: Fri, 24 Mar 2023 17:39:06 +0100 Subject: [PATCH] fix: Fix an issue when `words` are `null` (#4354) --- .../lib/Settings/CSpellSettingsServer.test.ts | 5 +++- .../src/lib/Settings/CSpellSettingsServer.ts | 26 ++++++++----------- packages/cspell-lib/src/lib/util/util.ts | 4 +-- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/packages/cspell-lib/src/lib/Settings/CSpellSettingsServer.test.ts b/packages/cspell-lib/src/lib/Settings/CSpellSettingsServer.test.ts index 6ba06dce7d5..87a80e8f2f1 100644 --- a/packages/cspell-lib/src/lib/Settings/CSpellSettingsServer.test.ts +++ b/packages/cspell-lib/src/lib/Settings/CSpellSettingsServer.test.ts @@ -168,13 +168,16 @@ describe('Validate CSpellSettingsServer', () => { test.each` left | right | expected ${{}} | ${{}} | ${csi({})} + ${{ words: null }} | ${{}} | ${csi({})} + ${{}} | ${{ words: null }} | ${csi({})} ${{ dictionaries: ['a'] }} | ${{ dictionaries: ['b'] }} | ${oc(csi({ dictionaries: ['a', 'b'] }))} ${{ features: {} }} | ${{}} | ${oc(csi({ features: {} }))} ${{ features: { 'weighted-suggestions': true } }} | ${{}} | ${oc(csi({ features: { 'weighted-suggestions': true } }))} ${{ features: { 'weighted-suggestions': true } }} | ${{ features: { 'weighted-suggestions': false } }} | ${oc(csi({ features: { 'weighted-suggestions': false } }))} ${{ features: { 'weighted-suggestions': true } }} | ${{ features: { 'new-feature': true } }} | ${oc({ features: { 'weighted-suggestions': true, 'new-feature': true } })} `('mergeSettings $left with $right', ({ left, right, expected }) => { - expect(mergeSettings(left, right)).toEqual(expected); + const merged = mergeSettings(left, right); + expect(merged).toEqual(expected); }); test.each` diff --git a/packages/cspell-lib/src/lib/Settings/CSpellSettingsServer.ts b/packages/cspell-lib/src/lib/Settings/CSpellSettingsServer.ts index 7b61d0d57af..e4a31a77fab 100644 --- a/packages/cspell-lib/src/lib/Settings/CSpellSettingsServer.ts +++ b/packages/cspell-lib/src/lib/Settings/CSpellSettingsServer.ts @@ -25,10 +25,6 @@ type CSpellSettingsWST = AdvancedCSpellSettingsWithSourceTrace; type CSpellSettingsWSTO = OptionalOrUndefined; type CSpellSettingsI = CSpellSettingsInternal; -function _unique(a: T[]): T[] { - return [...new Set(a)]; -} - /** * Merges two lists and removes duplicates. Order is NOT preserved. */ @@ -38,11 +34,11 @@ function mergeListUnique(left: undefined, right: T[]): T[]; function mergeListUnique(left: T[], right: undefined): T[]; function mergeListUnique(left: T[] | undefined, right: T[] | undefined): T[] | undefined; function mergeListUnique(left: T[] | undefined, right: T[] | undefined): T[] | undefined { - if (left === undefined) return right; - if (right === undefined) return left; + if (!Array.isArray(left)) return Array.isArray(right) ? right : undefined; + if (!Array.isArray(right)) return left; if (!right.length) return left; if (!left.length) return right; - return _unique([...left, ...right]); + return [...new Set([...left, ...right])]; } /** @@ -55,8 +51,8 @@ function mergeList(left: undefined, right: T[]): T[]; function mergeList(left: T[], right: undefined): T[]; function mergeList(left: T[] | undefined, right: T[] | undefined): T[] | undefined; function mergeList(left: T[] | undefined, right: T[] | undefined): T[] | undefined { - if (left === undefined) return right; - if (right === undefined) return left; + if (!Array.isArray(left)) return Array.isArray(right) ? right : undefined; + if (!Array.isArray(right)) return left; if (!left.length) return right; if (!right.length) return left; return left.concat(right); @@ -82,10 +78,10 @@ function mergeWordsCached(left: undefined, right: string[]): string[]; function mergeWordsCached(left: string[], right: undefined): string[]; function mergeWordsCached(left: string[] | undefined, right: string[] | undefined): string[] | undefined; function mergeWordsCached(left: string[] | undefined, right: string[] | undefined): string[] | undefined { - if (left === undefined) return !right || right.length ? right : emptyWords; - if (right === undefined) return !left || left.length ? left : emptyWords; - if (!left.length) return !right || right.length ? right : emptyWords; - if (!right.length) return !left || left.length ? left : emptyWords; + if (!Array.isArray(left) || !left.length) { + return Array.isArray(right) ? (right.length ? right : emptyWords) : undefined; + } + if (!Array.isArray(right) || !right.length) return left; return _mergeWordsCached(left, right); } @@ -95,8 +91,8 @@ function mergeObjects(left: T, right: undefined): T; function mergeObjects(left: T, right: T): T; function mergeObjects(left: undefined, right: T): T; function mergeObjects(left?: T, right?: T): T | undefined { - if (left === undefined) return right; - if (right === undefined) return left; + if (!left || typeof left !== 'object') return !right || typeof right !== 'object' ? undefined : right; + if (!right || typeof right !== 'object') return left; return { ...left, ...right }; } diff --git a/packages/cspell-lib/src/lib/util/util.ts b/packages/cspell-lib/src/lib/util/util.ts index 58e6db49b0f..dc382da03da 100644 --- a/packages/cspell-lib/src/lib/util/util.ts +++ b/packages/cspell-lib/src/lib/util/util.ts @@ -21,7 +21,7 @@ export function unique(src: T[]): T[] { } /** - * Delete all `undefined` fields from an object. + * Delete all `undefined` and `null` fields from an object. * @param src - object to be cleaned */ export function clean(src: T): RemoveUndefined { @@ -29,7 +29,7 @@ export function clean(src: T): RemoveUndefined { type keyOfT = keyof T; type keysOfT = keyOfT[]; for (const key of Object.keys(r) as keysOfT) { - if (r[key] === undefined) { + if (r[key] === undefined || r[key] === null) { delete r[key]; } }