Skip to content

Commit 8cea380

Browse files
committed
fix(custom-elements): cast numbers with Number rules
Fix vuejs#4370
1 parent 872b3f7 commit 8cea380

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { toNumber } from '../src/apiCustomElement'
2+
3+
describe('Custom Element', () => {
4+
describe('toNumber', () => {
5+
it('handles strings', () => {
6+
expect(toNumber('')).toBe('')
7+
expect(toNumber(null)).toBe('')
8+
expect(toNumber('Something else')).toBe('Something else')
9+
})
10+
11+
it('numbers', () => {
12+
expect(toNumber('0')).toBe(0)
13+
expect(toNumber('1')).toBe(1)
14+
expect(toNumber('1.1')).toBe(1.1)
15+
expect(toNumber('123e-1')).toBe(12.3)
16+
expect(toNumber('Infinity')).toBe(Infinity)
17+
})
18+
19+
it('NaN', () => {
20+
expect(toNumber('NaN')).toBeNaN()
21+
expect(toNumber('nan')).not.toBeNaN()
22+
})
23+
24+
// all of these are handled by Number
25+
it('string non decimal bases', () => {
26+
expect(toNumber('0b0')).toBe(0)
27+
expect(toNumber('0b1')).toBe(1)
28+
29+
expect(toNumber('0o3')).toBe(3)
30+
expect(toNumber('0o0')).toBe(0)
31+
32+
expect(toNumber('0x0')).toBe(0)
33+
expect(toNumber('0xf')).toBe(15)
34+
})
35+
})
36+
})

packages/runtime-dom/src/apiCustomElement.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import {
2121
ConcreteComponent,
2222
ComponentOptions
2323
} from '@vue/runtime-core'
24-
import { camelize, extend, hyphenate, isArray, toNumber } from '@vue/shared'
24+
import { camelize, extend, hyphenate, isArray } from '@vue/shared'
2525
import { hydrate, render } from '.'
2626

2727
export type VueElementConstructor<P = {}> = {
@@ -342,3 +342,10 @@ export class VueElement extends BaseClass {
342342
}
343343
}
344344
}
345+
346+
export function toNumber(value: string | null): number | string {
347+
// for Number('') and Number(null) as they both become 0
348+
if (!value) return ''
349+
const casted = Number(value)
350+
return value === 'NaN' || !Number.isNaN(casted) ? casted : value
351+
}

0 commit comments

Comments
 (0)