Skip to content

Commit 419b6f7

Browse files
committed
feat(compiler): support v-html
1 parent e842d62 commit 419b6f7

File tree

12 files changed

+203
-7
lines changed

12 files changed

+203
-7
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[![NPM version](https://img.shields.io/npm/v/unplugin-vue-jsx-vapor?color=a1b858&label=)](https://www.npmjs.com/package/unplugin-vue-jsx-vapor)
44

5-
Convert Vue JSX to Vapor.
5+
Converts Vue JSX to Vapor.
66

77
[Playground](https://stackblitz.com/github/unplugin/unplugin-vue-jsx-vapor?file=playground%2FApp.vue)
88

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "unplugin-vue-jsx-vapor",
33
"version": "1.0.2",
44
"packageManager": "[email protected]",
5-
"description": "Convert JSX to Vapor",
5+
"description": "Converts Vue JSX to Vapor",
66
"type": "module",
77
"keywords": [
88
"unplugin",

playground/App.vue

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import For from './for.vue'
66
import Slot from './slot.vue'
77
import Model from './model.vue'
88
import Show from './show.vue'
9+
import Html from './html.vue'
910
1011
export default defineComponent({
1112
setup() {
@@ -57,6 +58,11 @@ export default defineComponent({
5758
<legend>v-show</legend>
5859
<Show />
5960
</fieldset>
61+
62+
<fieldset>
63+
<legend>v-html</legend>
64+
<Html />
65+
</fieldset>
6066
</>
6167
)
6268
},

playground/for.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ export default defineComponent({
77
88
return (
99
<div>
10-
<input value={count.value} onInput={e => count.value = e.target.value} type="number" />
10+
<input v-model={count.value} type="number" />
1111
12-
{Array.from({length: count.value}).map((item,index) =>{
13-
if(item > 1){
12+
{Array.from({ length: count.value }).map((item, index) => {
13+
if (item > 1) {
1414
return <div>({index}) lg 1</div>
1515
} else {
1616
return <div>({index}) lt 1</div>

playground/html.vue

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<script setup lang="tsx">
2+
import { ref } from 'vue'
3+
4+
let foo = ref('<div style="color: red;">foo</div>')
5+
6+
7+
const Render = (
8+
<>
9+
<input v-model={foo.value} style="width: 100%" />
10+
<div v-html={foo.value} />
11+
</>
12+
)
13+
defineRender(Render)
14+
</script>

src/core/compiler/compile.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import { transformVOn } from './transforms/vOn'
3030
import { transformVSlot } from './transforms/vSlot'
3131
import { transformVModel } from './transforms/vModel'
3232
import { transformVShow } from './transforms/vShow'
33+
import { transformVHtml } from './transforms/vHtml'
3334
import type { JSXElement, JSXFragment, Program } from '@babel/types'
3435

3536
export interface VaporCodegenResult
@@ -137,6 +138,7 @@ export function getBaseTransformPreset(
137138
on: transformVOn,
138139
model: transformVModel,
139140
show: transformVShow,
141+
html: transformVHtml,
140142
},
141143
]
142144
}

src/core/compiler/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ export { transformVOn } from './transforms/vOn'
1515
export { transformVSlot } from './transforms/vSlot'
1616
export { transformVModel } from './transforms/vModel'
1717
export { transformVShow } from './transforms/vShow'
18+
export { transformVHtml } from './transforms/vHtml'

src/core/compiler/transforms/vHtml.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { transformVHtml as _transformVHtml } from '@vue-vapor/compiler-vapor'
2+
import { resolveDirectiveNode, resolveNode } from '../utils'
3+
import type { DirectiveTransform } from '../transform'
4+
5+
export const transformVHtml: DirectiveTransform = (dir, node, context) => {
6+
return _transformVHtml(
7+
resolveDirectiveNode(dir, context),
8+
resolveNode(node, context),
9+
context as any,
10+
)
11+
}

src/core/compiler/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ export function resolveNode(
215215
return {
216216
type: NodeTypes.ELEMENT,
217217
props,
218-
children: [],
218+
children: node.children as any[],
219219
tag,
220220
loc,
221221
ns: Namespaces.HTML,
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2+
3+
exports[`v-html > should convert v-html to innerHTML 1`] = `
4+
"import { renderEffect as _renderEffect, setHtml as _setHtml, template as _template } from 'vue/vapor';
5+
const t0 = _template("<div></div>")
6+
7+
export function render(_ctx) {
8+
const n0 = t0()
9+
_renderEffect(() => _setHtml(n0, _ctx.code))
10+
return n0
11+
}"
12+
`;
13+
14+
exports[`v-html > should raise error and ignore children when v-html is present 1`] = `
15+
"import { renderEffect as _renderEffect, setHtml as _setHtml, template as _template } from 'vue/vapor';
16+
const t0 = _template("<div></div>")
17+
18+
export function render(_ctx) {
19+
const n0 = t0()
20+
_renderEffect(() => _setHtml(n0, _ctx.test))
21+
return n0
22+
}"
23+
`;
24+
25+
exports[`v-html > should raise error if has no expression 1`] = `
26+
"import { setHtml as _setHtml, template as _template } from 'vue/vapor';
27+
const t0 = _template("<div></div>")
28+
29+
export function render(_ctx) {
30+
const n0 = t0()
31+
_setHtml(n0, "")
32+
return n0
33+
}"
34+
`;

0 commit comments

Comments
 (0)