Skip to content

Commit 46a5c60

Browse files
committed
refactor(compiler-vapor): skip unnecessary attribute quoting in templates
1 parent 56a7f9d commit 46a5c60

File tree

7 files changed

+26
-13
lines changed

7 files changed

+26
-13
lines changed

packages/compiler-vapor/__tests__/__snapshots__/compile.spec.ts.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ export function render(_ctx) {
140140

141141
exports[`compile > directives > v-pre > basic 1`] = `
142142
"import { template as _template } from 'vue';
143-
const t0 = _template("<div :id=\\"foo\\"><Comp></Comp>{{ bar }}</div>", true)
143+
const t0 = _template("<div :id=foo><Comp></Comp>{{ bar }}</div>", true)
144144
145145
export function render(_ctx, $props, $emit, $attrs, $slots) {
146146
const n0 = t0()
@@ -150,7 +150,7 @@ export function render(_ctx, $props, $emit, $attrs, $slots) {
150150
151151
exports[`compile > directives > v-pre > should not affect siblings after it 1`] = `
152152
"import { resolveComponent as _resolveComponent, setInsertionState as _setInsertionState, createComponentWithFallback as _createComponentWithFallback, child as _child, setProp as _setProp, toDisplayString as _toDisplayString, setText as _setText, renderEffect as _renderEffect, template as _template } from 'vue';
153-
const t0 = _template("<div :id=\\"foo\\"><Comp></Comp>{{ bar }}</div>")
153+
const t0 = _template("<div :id=foo><Comp></Comp>{{ bar }}</div>")
154154
const t1 = _template("<div> </div>")
155155
156156
export function render(_ctx, $props, $emit, $attrs, $slots) {

packages/compiler-vapor/__tests__/compile.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ describe('compile', () => {
7171

7272
expect(code).toMatchSnapshot()
7373
expect(code).contains(
74-
JSON.stringify('<div :id="foo"><Comp></Comp>{{ bar }}</div>'),
74+
JSON.stringify('<div :id=foo><Comp></Comp>{{ bar }}</div>'),
7575
)
7676
expect(code).not.contains('effect')
7777
})

packages/compiler-vapor/__tests__/transforms/__snapshots__/transformElement.spec.ts.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ export function render(_ctx) {
354354

355355
exports[`compiler: element transform > props + children 1`] = `
356356
"import { template as _template } from 'vue';
357-
const t0 = _template("<div id=\\"foo\\"><span></span></div>", true)
357+
const t0 = _template("<div id=foo><span></span></div>", true)
358358
359359
export function render(_ctx) {
360360
const n0 = t0()
@@ -399,7 +399,7 @@ export function render(_ctx) {
399399
400400
exports[`compiler: element transform > static props 1`] = `
401401
"import { template as _template } from 'vue';
402-
const t0 = _template("<div id=\\"foo\\" class=\\"bar\\"></div>", true)
402+
const t0 = _template("<div id=foo class=bar title=\\"has whitespace\\" data-targets=\\"foo>bar\\"></div>", true)
403403
404404
export function render(_ctx) {
405405
const n0 = t0()

packages/compiler-vapor/__tests__/transforms/__snapshots__/vBind.spec.ts.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,7 @@ export function render(_ctx) {
633633
634634
exports[`compiler v-bind > with constant value 1`] = `
635635
"import { setProp as _setProp, template as _template } from 'vue';
636-
const t0 = _template("<div f=\\"foo1\\" h=\\"1\\"></div>", true)
636+
const t0 = _template("<div f=foo1 h=1></div>", true)
637637
638638
export function render(_ctx, $props, $emit, $attrs, $slots) {
639639
const n0 = t0()

packages/compiler-vapor/__tests__/transforms/__snapshots__/vModel.spec.ts.snap

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ export function render(_ctx) {
116116
117117
exports[`compiler: vModel transform > should support input (checkbox) 1`] = `
118118
"import { applyCheckboxModel as _applyCheckboxModel, template as _template } from 'vue';
119-
const t0 = _template("<input type=\\"checkbox\\">", true)
119+
const t0 = _template("<input type=checkbox>", true)
120120
121121
export function render(_ctx) {
122122
const n0 = t0()
@@ -138,7 +138,7 @@ export function render(_ctx) {
138138
139139
exports[`compiler: vModel transform > should support input (radio) 1`] = `
140140
"import { applyRadioModel as _applyRadioModel, template as _template } from 'vue';
141-
const t0 = _template("<input type=\\"radio\\">", true)
141+
const t0 = _template("<input type=radio>", true)
142142
143143
export function render(_ctx) {
144144
const n0 = t0()
@@ -149,7 +149,7 @@ export function render(_ctx) {
149149
150150
exports[`compiler: vModel transform > should support input (text) 1`] = `
151151
"import { applyTextModel as _applyTextModel, template as _template } from 'vue';
152-
const t0 = _template("<input type=\\"text\\">", true)
152+
const t0 = _template("<input type=text>", true)
153153
154154
export function render(_ctx) {
155155
const n0 = t0()

packages/compiler-vapor/__tests__/transforms/transformElement.spec.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -573,10 +573,11 @@ describe('compiler: element transform', () => {
573573

574574
test('static props', () => {
575575
const { code, ir } = compileWithElementTransform(
576-
`<div id="foo" class="bar" />`,
576+
`<div id="foo" class="bar" title="has whitespace" data-targets="foo>bar" />`,
577577
)
578578

579-
const template = '<div id="foo" class="bar"></div>'
579+
const template =
580+
'<div id=foo class=bar title="has whitespace" data-targets="foo>bar"></div>'
580581
expect(code).toMatchSnapshot()
581582
expect(code).contains(JSON.stringify(template))
582583
expect(ir.template).toMatchObject([template])
@@ -588,7 +589,7 @@ describe('compiler: element transform', () => {
588589
`<div id="foo"><span/></div>`,
589590
)
590591

591-
const template = '<div id="foo"><span></span></div>'
592+
const template = '<div id=foo><span></span></div>'
592593
expect(code).toMatchSnapshot()
593594
expect(code).contains(JSON.stringify(template))
594595
expect(ir.template).toMatchObject([template])

packages/compiler-vapor/src/transforms/transformElement.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,20 @@ function transformNativeElement(
224224
for (const prop of propsResult[1]) {
225225
const { key, values } = prop
226226
if (key.isStatic && values.length === 1 && values[0].isStatic) {
227+
const value = values[0].content
228+
227229
template += ` ${key.content}`
228-
if (values[0].content) template += `="${values[0].content}"`
230+
231+
if (value) {
232+
// https://html.spec.whatwg.org/multipage/introduction.html#intro-early-example
233+
const needsQuoting = /[\s>]|^["'=]/.test(value)
234+
235+
if (needsQuoting) {
236+
template += `="${value}"`
237+
} else {
238+
template += `=${value}`
239+
}
240+
}
229241
} else {
230242
dynamicProps.push(key.content)
231243
context.registerEffect(

0 commit comments

Comments
 (0)