Skip to content

Commit

Permalink
dx(runtime-dom): warn when a style value ends in a semicolon (#7062)
Browse files Browse the repository at this point in the history
  • Loading branch information
skirtles-code authored Nov 9, 2022
1 parent fccfb18 commit 9a816dc
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
19 changes: 19 additions & 0 deletions packages/runtime-dom/__tests__/patchStyle.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,25 @@ describe(`runtime-dom: style patching`, () => {
expect(el.style.cssText).toBe('')
})

it('should warn for trailing semicolons', () => {
const el = document.createElement('div')
patchProp(el, 'style', null, { color: 'red;' })
expect(
`Unexpected semicolon at the end of 'color' style value: 'red;'`
).toHaveBeenWarned()

patchProp(el, 'style', null, { '--custom': '100; ' })
expect(
`Unexpected semicolon at the end of '--custom' style value: '100; '`
).toHaveBeenWarned()
})

it('should not warn for escaped trailing semicolons', () => {
const el = document.createElement('div')
patchProp(el, 'style', null, { '--custom': '100\\;' })
expect(el.style.getPropertyValue('--custom')).toBe('100\\;')
})

// JSDOM doesn't support custom properties on style object so we have to
// mock it here.
function mockElementWithStyle() {
Expand Down
10 changes: 9 additions & 1 deletion packages/runtime-dom/src/modules/style.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { isString, hyphenate, capitalize, isArray } from '@vue/shared'
import { camelize } from '@vue/runtime-core'
import { camelize, warn } from '@vue/runtime-core'

type Style = string | Record<string, string | string[]> | null

Expand Down Expand Up @@ -35,6 +35,7 @@ export function patchStyle(el: Element, prev: Style, next: Style) {
}
}

const semicolonRE = /[^\\];\s*$/
const importantRE = /\s*!important$/

function setStyle(
Expand All @@ -46,6 +47,13 @@ function setStyle(
val.forEach(v => setStyle(style, name, v))
} else {
if (val == null) val = ''
if (__DEV__) {
if (semicolonRE.test(val)) {
warn(
`Unexpected semicolon at the end of '${name}' style value: '${val}'`
)
}
}
if (name.startsWith('--')) {
// custom property definition
style.setProperty(name, val)
Expand Down

0 comments on commit 9a816dc

Please sign in to comment.