Skip to content

Commit 749fab9

Browse files
fix(runtime): allow classList to be null (#6118)
* fix(runtime): allow classList to be null * add /*@__PURE__*/ * prettier
1 parent 26ceed6 commit 749fab9

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

src/runtime/vdom/set-accessor.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -207,14 +207,14 @@ const parseClassListRegex = /\s/;
207207
* @param value className string, e.g. "foo bar baz"
208208
* @returns list of classes, e.g. ["foo", "bar", "baz"]
209209
*/
210-
const parseClassList = (value: string | SVGAnimatedString | undefined | null): string[] => {
210+
export const parseClassList = /*@__PURE__*/ (value: string | SVGAnimatedString | undefined | null): string[] => {
211211
// Can't use `value instanceof SVGAnimatedString` because it'll break in non-browser environments
212212
// see https://developer.mozilla.org/docs/Web/API/SVGAnimatedString for more information
213-
if (typeof value === 'object' && 'baseVal' in value) {
213+
if (typeof value === 'object' && value && 'baseVal' in value) {
214214
value = value.baseVal;
215215
}
216216

217-
if (!value) {
217+
if (!value || typeof value !== 'string') {
218218
return [];
219219
}
220220

src/runtime/vdom/test/set-accessor.spec.ts

+20-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { BUILD } from '@app-data';
22

3-
import { setAccessor } from '../set-accessor';
3+
import { parseClassList, setAccessor } from '../set-accessor';
44

55
describe('setAccessor for custom elements', () => {
66
let elm: any;
@@ -941,4 +941,23 @@ describe('setAccessor for standard html elements', () => {
941941
setAccessor(elm2, 'textContent', undefined, 'some-content', false, 0);
942942
expect(spy2.mock.calls).toEqual([]);
943943
});
944+
945+
describe('parseClassList', () => {
946+
it('should parse class list', () => {
947+
const classList = parseClassList('class1 class2 class3');
948+
expect(classList).toEqual(['class1', 'class2', 'class3']);
949+
});
950+
951+
it('should not parse class list', () => {
952+
expect(parseClassList('')).toEqual([]);
953+
// @ts-expect-error
954+
expect(parseClassList()).toEqual([]);
955+
expect(parseClassList(null)).toEqual([]);
956+
});
957+
958+
it('should parse SVGAnimatedString', () => {
959+
const classList = parseClassList({ baseVal: 'class1 class2 class3' } as SVGAnimatedString);
960+
expect(classList).toEqual(['class1', 'class2', 'class3']);
961+
});
962+
});
944963
});

0 commit comments

Comments
 (0)