diff --git a/README.md b/README.md index 3f7569ed3..93bfdc129 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ See the To-do list below or `// TODO` comments in code (`compiler-vapor` and `ru - [ ] `v-if` / `v-else` / `v-else-if` - [ ] `v-for` - [ ] `v-once` - - [ ] `v-html` + - [x] `v-html` - [ ] `v-text` - [ ] `v-show` - [ ] `v-pre` diff --git a/packages/compiler-vapor/__tests__/__snapshots__/basic.test.ts.snap b/packages/compiler-vapor/__tests__/__snapshots__/basic.test.ts.snap index efb1dbb7b..90e3c5a8c 100644 --- a/packages/compiler-vapor/__tests__/__snapshots__/basic.test.ts.snap +++ b/packages/compiler-vapor/__tests__/__snapshots__/basic.test.ts.snap @@ -3,10 +3,11 @@ exports[`basic 1`] = ` "import { defineComponent as _defineComponent } from 'vue' import { watchEffect } from 'vue' -import { template, insert, setText, on } from 'vue/vapor' -const t0 = template(\`
Count:
Double:
\`) +import { template, insert, setText, on, setHtml } from 'vue/vapor' +const t0 = template(\`Count:
Double:
\`) import { ref, computed } from 'vue' +const html = 'HTML' export default /*#__PURE__*/_defineComponent({ setup(__props) { @@ -16,6 +17,7 @@ const double = computed(() => count.value * 2) const increment = () => count.value++ + return (() => { const root = t0() const n1 = document.createTextNode(count.value) @@ -31,6 +33,9 @@ setText(n3, undefined, double.value) watchEffect(() => { on(n4, \\"click\\", increment) }) +watchEffect(() => { +setHtml(n5, undefined, html) +}) return root })(); } diff --git a/packages/compiler-vapor/__tests__/fixtures/counter.vue b/packages/compiler-vapor/__tests__/fixtures/counter.vue index 9415168d7..9ef7a9784 100644 --- a/packages/compiler-vapor/__tests__/fixtures/counter.vue +++ b/packages/compiler-vapor/__tests__/fixtures/counter.vue @@ -5,6 +5,8 @@ const count = ref(0) const double = computed(() => count.value * 2) const increment = () => count.value++ + +const html = 'HTML' @@ -12,4 +14,5 @@ const increment = () => count.value++Count: {{ count }}
Double: {{ double }}
+ diff --git a/packages/compiler-vapor/src/generate.ts b/packages/compiler-vapor/src/generate.ts index 0a64b732d..c24040f72 100644 --- a/packages/compiler-vapor/src/generate.ts +++ b/packages/compiler-vapor/src/generate.ts @@ -1,6 +1,9 @@ import type { CodegenOptions, CodegenResult } from '@vue/compiler-dom' import { type DynamicChildren, type RootIRNode, IRNodeTypes } from './ir' +// remove when stable +function checkNever(x: never): void {} + // IR -> JS codegen export function generate( ir: RootIRNode, @@ -74,6 +77,13 @@ export function generate( vaporHelpers.add('on') break } + case IRNodeTypes.SET_HTML: { + scope += `setHtml(n${effect.element}, undefined, ${expr})\n` + vaporHelpers.add('setHtml') + break + } + default: + checkNever(effect) } } scope += '})\n' diff --git a/packages/compiler-vapor/src/ir.ts b/packages/compiler-vapor/src/ir.ts index c515797b9..9e45b062b 100644 --- a/packages/compiler-vapor/src/ir.ts +++ b/packages/compiler-vapor/src/ir.ts @@ -6,6 +6,7 @@ export const enum IRNodeTypes { SET_PROP, SET_TEXT, SET_EVENT, + SET_HTML, INSERT_NODE, TEXT_NODE, @@ -48,6 +49,17 @@ export interface SetEventIRNode extends IRNode { name: string } +export interface SetHtmlIRNode extends IRNode { + type: IRNodeTypes.SET_HTML + element: number +} + +export type EffectNode = + | SetPropIRNode + | SetTextIRNode + | SetEventIRNode + | SetHtmlIRNode + export interface TextNodeIRNode extends IRNode { type: IRNodeTypes.TEXT_NODE id: number @@ -61,7 +73,6 @@ export interface InsertNodeIRNode extends IRNode { anchor: number | 'first' | 'last' } -export type EffectNode = SetPropIRNode | SetTextIRNode | SetEventIRNode export type OprationNode = TextNodeIRNode | InsertNodeIRNode export interface DynamicChild { diff --git a/packages/compiler-vapor/src/transform.ts b/packages/compiler-vapor/src/transform.ts index e2fe911a5..8436092c7 100644 --- a/packages/compiler-vapor/src/transform.ts +++ b/packages/compiler-vapor/src/transform.ts @@ -134,20 +134,26 @@ export function transform( vaporHelpers: new Set([]), } const ctx = createRootContext(ir, root, options) - transformChildren(ctx) - ctx.registerTemplate() + + // TODO: transform presets, see packages/compiler-core/src/transforms + transformChildren(ctx, true) ir.children = ctx.children return ir } -function transformChildren(ctx: TransformContext