Skip to content
This repository was archived by the owner on Jul 19, 2025. It is now read-only.

Commit 3787a43

Browse files
committed
test(compiler-vapor): add props & emits for component
1 parent e958118 commit 3787a43

File tree

4 files changed

+267
-90
lines changed

4 files changed

+267
-90
lines changed

packages/compiler-vapor/__tests__/generators/__snapshots__/component.spec.ts.snap

Lines changed: 0 additions & 59 deletions
This file was deleted.

packages/compiler-vapor/__tests__/generators/component.spec.ts

Lines changed: 0 additions & 31 deletions
This file was deleted.

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

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,24 @@ export function render(_ctx) {
99
}"
1010
`;
1111

12+
exports[`compiler: element transform > component > generate multi root component 1`] = `
13+
"import { createComponent as _createComponent } from 'vue/vapor';
14+
15+
export function render(_ctx) {
16+
const n0 = _createComponent(_ctx.Comp)
17+
return [n0, n1]
18+
}"
19+
`;
20+
21+
exports[`compiler: element transform > component > generate single root component 1`] = `
22+
"import { createComponent as _createComponent } from 'vue/vapor';
23+
24+
export function render(_ctx) {
25+
const n0 = _createComponent(_ctx.Comp, null, true)
26+
return n0
27+
}"
28+
`;
29+
1230
exports[`compiler: element transform > component > import + resolve component 1`] = `
1331
"import { resolveComponent as _resolveComponent, createComponent as _createComponent } from 'vue/vapor';
1432
@@ -18,6 +36,17 @@ export function render(_ctx) {
1836
}"
1937
`;
2038

39+
exports[`compiler: element transform > component > props merging: event handlers 1`] = `
40+
"import { resolveComponent as _resolveComponent, createComponent as _createComponent } from 'vue/vapor';
41+
42+
export function render(_ctx) {
43+
const n0 = _createComponent(_resolveComponent("Foo"), [{
44+
onClick: () => (_ctx.a)
45+
}], true)
46+
return n0
47+
}"
48+
`;
49+
2150
exports[`compiler: element transform > component > resolve component from setup bindings (inline const) 1`] = `
2251
"(() => {
2352
const n0 = _createComponent(Example, null, true)
@@ -73,6 +102,62 @@ export function render(_ctx) {
73102
}"
74103
`;
75104

105+
exports[`compiler: element transform > component > static props 1`] = `
106+
"import { resolveComponent as _resolveComponent, createComponent as _createComponent } from 'vue/vapor';
107+
108+
export function render(_ctx) {
109+
const n0 = _createComponent(_resolveComponent("Foo"), [{
110+
id: () => ("foo"),
111+
class: () => ("bar")
112+
}], true)
113+
return n0
114+
}"
115+
`;
116+
117+
exports[`compiler: element transform > component > v-bind="obj" 1`] = `
118+
"import { resolveComponent as _resolveComponent, createComponent as _createComponent } from 'vue/vapor';
119+
120+
export function render(_ctx) {
121+
const n0 = _createComponent(_resolveComponent("Foo"), [() => (_ctx.obj)], true)
122+
return n0
123+
}"
124+
`;
125+
126+
exports[`compiler: element transform > component > v-bind="obj" after static prop 1`] = `
127+
"import { resolveComponent as _resolveComponent, createComponent as _createComponent } from 'vue/vapor';
128+
129+
export function render(_ctx) {
130+
const n0 = _createComponent(_resolveComponent("Foo"), [{
131+
id: () => ("foo")
132+
}, () => (_ctx.obj)], true)
133+
return n0
134+
}"
135+
`;
136+
137+
exports[`compiler: element transform > component > v-bind="obj" before static prop 1`] = `
138+
"import { resolveComponent as _resolveComponent, createComponent as _createComponent } from 'vue/vapor';
139+
140+
export function render(_ctx) {
141+
const n0 = _createComponent(_resolveComponent("Foo"), [() => (_ctx.obj), {
142+
id: () => ("foo")
143+
}], true)
144+
return n0
145+
}"
146+
`;
147+
148+
exports[`compiler: element transform > component > v-bind="obj" between static props 1`] = `
149+
"import { resolveComponent as _resolveComponent, createComponent as _createComponent } from 'vue/vapor';
150+
151+
export function render(_ctx) {
152+
const n0 = _createComponent(_resolveComponent("Foo"), [{
153+
id: () => ("foo")
154+
}, () => (_ctx.obj), {
155+
class: () => ("bar")
156+
}], true)
157+
return n0
158+
}"
159+
`;
160+
76161
exports[`compiler: element transform > props + children 1`] = `
77162
"import { template as _template } from 'vue/vapor';
78163
const t0 = _template("<div id=\\"foo\\"><span></span></div>")

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

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,188 @@ describe('compiler: element transform', () => {
174174
},
175175
])
176176
})
177+
178+
test('generate single root component', () => {
179+
const { code } = compileWithElementTransform(`<Comp/>`, {
180+
bindingMetadata: { Comp: BindingTypes.SETUP_CONST },
181+
})
182+
expect(code).toMatchSnapshot()
183+
expect(code).contains('_createComponent(_ctx.Comp, null, true)')
184+
})
185+
186+
test('generate multi root component', () => {
187+
const { code } = compileWithElementTransform(`<Comp/>123`, {
188+
bindingMetadata: { Comp: BindingTypes.SETUP_CONST },
189+
})
190+
expect(code).toMatchSnapshot()
191+
expect(code).contains('_createComponent(_ctx.Comp)')
192+
})
193+
194+
test('static props', () => {
195+
const { code, ir } = compileWithElementTransform(
196+
`<Foo id="foo" class="bar" />`,
197+
)
198+
199+
expect(code).toMatchSnapshot()
200+
expect(code).contains('_createComponent(_resolveComponent("Foo"), [{')
201+
expect(code).contains(' id: () => ("foo")')
202+
expect(code).contains(' class: () => ("bar")')
203+
expect(code).contains('}], true)')
204+
205+
expect(ir.block.operation).toMatchObject([
206+
{
207+
type: IRNodeTypes.CREATE_COMPONENT_NODE,
208+
tag: 'Foo',
209+
resolve: true,
210+
root: true,
211+
props: [
212+
[
213+
{
214+
key: {
215+
type: NodeTypes.SIMPLE_EXPRESSION,
216+
content: 'id',
217+
isStatic: true,
218+
},
219+
values: [
220+
{
221+
type: NodeTypes.SIMPLE_EXPRESSION,
222+
content: 'foo',
223+
isStatic: true,
224+
},
225+
],
226+
},
227+
{
228+
key: {
229+
type: NodeTypes.SIMPLE_EXPRESSION,
230+
content: 'class',
231+
isStatic: true,
232+
},
233+
values: [
234+
{
235+
type: NodeTypes.SIMPLE_EXPRESSION,
236+
content: 'bar',
237+
isStatic: true,
238+
},
239+
],
240+
},
241+
],
242+
],
243+
},
244+
])
245+
})
246+
247+
test('v-bind="obj"', () => {
248+
const { code, ir } = compileWithElementTransform(`<Foo v-bind="obj" />`)
249+
expect(code).toMatchSnapshot()
250+
expect(code).contains('[() => (_ctx.obj)]')
251+
expect(ir.block.operation).toMatchObject([
252+
{
253+
type: IRNodeTypes.CREATE_COMPONENT_NODE,
254+
tag: 'Foo',
255+
props: [{ content: 'obj', isStatic: false }],
256+
},
257+
])
258+
})
259+
260+
test('v-bind="obj" after static prop', () => {
261+
const { code, ir } = compileWithElementTransform(
262+
`<Foo id="foo" v-bind="obj" />`,
263+
)
264+
expect(code).toMatchSnapshot()
265+
expect(code).contains('id: () => ("foo")')
266+
expect(code).contains('}, () => (_ctx.obj)]')
267+
expect(ir.block.operation).toMatchObject([
268+
{
269+
type: IRNodeTypes.CREATE_COMPONENT_NODE,
270+
tag: 'Foo',
271+
props: [
272+
[{ key: { content: 'id' }, values: [{ content: 'foo' }] }],
273+
{ content: 'obj' },
274+
],
275+
},
276+
])
277+
})
278+
279+
test('v-bind="obj" before static prop', () => {
280+
const { code, ir } = compileWithElementTransform(
281+
`<Foo v-bind="obj" id="foo" />`,
282+
)
283+
expect(code).toMatchSnapshot()
284+
expect(code).contains('[() => (_ctx.obj), {')
285+
expect(code).contains('id: () => ("foo")')
286+
expect(ir.block.operation).toMatchObject([
287+
{
288+
type: IRNodeTypes.CREATE_COMPONENT_NODE,
289+
tag: 'Foo',
290+
props: [
291+
{ content: 'obj' },
292+
[{ key: { content: 'id' }, values: [{ content: 'foo' }] }],
293+
],
294+
},
295+
])
296+
})
297+
298+
test('v-bind="obj" between static props', () => {
299+
const { code, ir } = compileWithElementTransform(
300+
`<Foo id="foo" v-bind="obj" class="bar" />`,
301+
)
302+
expect(code).toMatchSnapshot()
303+
expect(code).contains('id: () => ("foo")')
304+
expect(code).contains('}, () => (_ctx.obj), {')
305+
expect(code).contains('class: () => ("bar")')
306+
expect(ir.block.operation).toMatchObject([
307+
{
308+
type: IRNodeTypes.CREATE_COMPONENT_NODE,
309+
tag: 'Foo',
310+
props: [
311+
[{ key: { content: 'id' }, values: [{ content: 'foo' }] }],
312+
{ content: 'obj' },
313+
[{ key: { content: 'class' }, values: [{ content: 'bar' }] }],
314+
],
315+
},
316+
])
317+
})
318+
319+
test('props merging: event handlers', () => {
320+
const { code, ir } = compileWithElementTransform(
321+
`<Foo @click.foo="a" @click.bar="b" />`,
322+
)
323+
expect(code).toMatchSnapshot()
324+
expect(code).contains('onClick: () => (_ctx.a)')
325+
expect(ir.block.operation).toMatchObject([
326+
{
327+
type: IRNodeTypes.CREATE_COMPONENT_NODE,
328+
tag: 'Foo',
329+
props: [
330+
[
331+
{
332+
key: { content: 'onClick', isStatic: true },
333+
values: [{ content: 'a' }],
334+
},
335+
],
336+
],
337+
},
338+
])
339+
})
340+
341+
test.todo('props merging: style', () => {
342+
const { code } = compileWithElementTransform(
343+
`<Foo style="color: green" :style="{ color: 'red' }" />`,
344+
)
345+
expect(code).toMatchSnapshot()
346+
})
347+
348+
test.todo('props merging: class', () => {
349+
const { code } = compileWithElementTransform(
350+
`<Foo class="foo" :class="{ bar: isBar }" />`,
351+
)
352+
expect(code).toMatchSnapshot()
353+
})
354+
355+
test.todo('v-on="obj"', () => {
356+
const { code } = compileWithElementTransform(`<Foo v-on="obj" />`)
357+
expect(code).toMatchSnapshot()
358+
})
177359
})
178360

179361
test('static props', () => {

0 commit comments

Comments
 (0)