]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(custom-elements): cast numbers with Number rules
authorEduardo San Martin Morote <posva13@gmail.com>
Thu, 19 Aug 2021 19:41:32 +0000 (21:41 +0200)
committerEduardo San Martin Morote <posva13@gmail.com>
Thu, 19 Aug 2021 19:47:22 +0000 (21:47 +0200)
Fix #4370

packages/runtime-dom/__tests__/apiCustomElement.spec.ts [new file with mode: 0644]
packages/runtime-dom/src/apiCustomElement.ts

diff --git a/packages/runtime-dom/__tests__/apiCustomElement.spec.ts b/packages/runtime-dom/__tests__/apiCustomElement.spec.ts
new file mode 100644 (file)
index 0000000..accd1d3
--- /dev/null
@@ -0,0 +1,36 @@
+import { toNumber } from '../src/apiCustomElement'
+
+describe('Custom Element', () => {
+  describe('toNumber', () => {
+    it('handles strings', () => {
+      expect(toNumber('')).toBe('')
+      expect(toNumber(null)).toBe('')
+      expect(toNumber('Something else')).toBe('Something else')
+    })
+
+    it('numbers', () => {
+      expect(toNumber('0')).toBe(0)
+      expect(toNumber('1')).toBe(1)
+      expect(toNumber('1.1')).toBe(1.1)
+      expect(toNumber('123e-1')).toBe(12.3)
+      expect(toNumber('Infinity')).toBe(Infinity)
+    })
+
+    it('NaN', () => {
+      expect(toNumber('NaN')).toBeNaN()
+      expect(toNumber('nan')).not.toBeNaN()
+    })
+
+    // all of these are handled by Number
+    it('string non decimal bases', () => {
+      expect(toNumber('0b0')).toBe(0)
+      expect(toNumber('0b1')).toBe(1)
+
+      expect(toNumber('0o3')).toBe(3)
+      expect(toNumber('0o0')).toBe(0)
+
+      expect(toNumber('0x0')).toBe(0)
+      expect(toNumber('0xf')).toBe(15)
+    })
+  })
+})
index ca29a436c722eaa1c8606d1fb29a2b00d480e072..bbea883ef4ca39de7f704ef68297d646d85833a7 100644 (file)
@@ -21,7 +21,7 @@ import {
   ConcreteComponent,
   ComponentOptions
 } from '@vue/runtime-core'
-import { camelize, extend, hyphenate, isArray, toNumber } from '@vue/shared'
+import { camelize, extend, hyphenate, isArray } from '@vue/shared'
 import { hydrate, render } from '.'
 
 export type VueElementConstructor<P = {}> = {
@@ -342,3 +342,10 @@ export class VueElement extends BaseClass {
     }
   }
 }
+
+export function toNumber(value: string | null): number | string {
+  // for Number('') and Number(null) as they both become 0
+  if (!value) return ''
+  const casted = Number(value)
+  return value === 'NaN' || !Number.isNaN(casted) ? casted : value
+}