Skip to content

Commit b7aec13

Browse files
committed
test(vapor): block tests
1 parent ec23ab9 commit b7aec13

File tree

8 files changed

+64
-164
lines changed

8 files changed

+64
-164
lines changed

packages/runtime-vapor/__tests__/dom/element.spec.ts renamed to packages/runtime-vapor/__tests__/block.spec.ts

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
1-
import { fragmentKey, normalizeBlock } from '../../src/block'
2-
import { insert, prepend, remove } from '../../src/dom/node'
1+
import { Fragment, insert, normalizeBlock, prepend, remove } from '../src/block'
32

43
const node1 = document.createTextNode('node1')
54
const node2 = document.createTextNode('node2')
65
const node3 = document.createTextNode('node3')
76
const anchor = document.createTextNode('anchor')
87

9-
describe('element', () => {
8+
describe('node ops', () => {
109
test('normalizeBlock', () => {
1110
expect(normalizeBlock([node1, node2, node3])).toEqual([node1, node2, node3])
1211
expect(normalizeBlock([node1, [node2, [node3]]])).toEqual([
1312
node1,
1413
node2,
1514
node3,
1615
])
17-
expect(
18-
normalizeBlock([
19-
node1,
20-
{ nodes: node2, anchor, [fragmentKey]: true },
21-
[node3],
22-
]),
23-
).toEqual([node1, node2, anchor, node3])
16+
const frag = new Fragment(node2)
17+
frag.anchor = anchor
18+
expect(normalizeBlock([node1, frag, [node3]])).toEqual([
19+
node1,
20+
node2,
21+
anchor,
22+
node3,
23+
])
2424
})
2525

2626
test('insert', () => {
@@ -39,15 +39,16 @@ describe('element', () => {
3939
test('prepend', () => {
4040
const container = document.createElement('div')
4141
prepend(container, [node1], node2)
42-
prepend(container, { nodes: node3, [fragmentKey]: true })
42+
prepend(container, new Fragment(node3))
4343
expect(Array.from(container.childNodes)).toEqual([node3, node1, node2])
4444
})
4545

4646
test('remove', () => {
4747
const container = document.createElement('div')
4848
container.append(node1, node2, node3)
49+
const frag = new Fragment(node3)
4950
remove([node1], container)
50-
remove({ nodes: node3, [fragmentKey]: true }, container)
51+
remove(frag, container)
5152
expect(Array.from(container.childNodes)).toEqual([node2])
5253

5354
expect(() => remove(anchor, container)).toThrowError(

packages/runtime-vapor/__tests__/dom/templateRef.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { NodeRef } from 'packages/runtime-vapor/src/dom/templateRef'
1+
import type { NodeRef } from '../../src/dom/templateRef'
22
import {
33
createFor,
44
createIf,

packages/runtime-vapor/__tests__/helpers/resolveAssets.spec.ts

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

packages/runtime-vapor/src/block.ts

Lines changed: 46 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import { isArray } from '@vue/shared'
2-
import { type VaporComponentInstance, isVaporComponent } from './component'
3-
import { createComment, insert, remove } from './dom/node'
2+
import {
3+
type VaporComponentInstance,
4+
isVaporComponent,
5+
mountComponent,
6+
unmountComponent,
7+
} from './component'
8+
import { createComment } from './dom/node'
49
import { EffectScope } from '@vue/reactivity'
510

611
export type Block = Node | Fragment | VaporComponentInstance | Block[]
@@ -84,28 +89,50 @@ export function normalizeBlock(block: Block): Node[] {
8489
return nodes
8590
}
8691

87-
export function findFirstRootElement(
88-
instance: VaporComponentInstance,
89-
): Element | undefined {
90-
const element = getFirstNode(instance.block)
91-
return element instanceof Element ? element : undefined
92+
// TODO optimize
93+
export function isValidBlock(block: Block): boolean {
94+
return (
95+
normalizeBlock(block).filter(node => !(node instanceof Comment)).length > 0
96+
)
9297
}
9398

94-
export function getFirstNode(block: Block | null): Node | undefined {
95-
if (!block || isVaporComponent(block)) return
96-
if (block instanceof Node) return block
97-
if (isArray(block)) {
98-
if (block.length === 1) {
99-
return getFirstNode(block[0])
99+
export function insert(
100+
block: Block,
101+
parent: ParentNode,
102+
anchor: Node | null | 0 = null,
103+
): void {
104+
if (block instanceof Node) {
105+
parent.insertBefore(block, anchor === 0 ? parent.firstChild : anchor)
106+
} else if (isVaporComponent(block)) {
107+
mountComponent(block, parent, anchor)
108+
} else if (isArray(block)) {
109+
for (let i = 0; i < block.length; i++) {
110+
insert(block[i], parent, anchor)
100111
}
101112
} else {
102-
return getFirstNode(block.nodes)
113+
// fragment
114+
insert(block.nodes, parent, anchor)
115+
if (block.anchor) insert(block.anchor, parent, anchor)
103116
}
104117
}
105118

106-
// TODO optimize
107-
export function isValidBlock(block: Block): boolean {
108-
return (
109-
normalizeBlock(block).filter(node => !(node instanceof Comment)).length > 0
110-
)
119+
export function prepend(parent: ParentNode, ...blocks: Block[]): void {
120+
let i = blocks.length
121+
while (i--) insert(blocks[i], parent, 0)
122+
}
123+
124+
export function remove(block: Block, parent: ParentNode): void {
125+
if (block instanceof Node) {
126+
parent.removeChild(block)
127+
} else if (isVaporComponent(block)) {
128+
unmountComponent(block, parent)
129+
} else if (isArray(block)) {
130+
for (let i = 0; i < block.length; i++) {
131+
remove(block[i], parent)
132+
}
133+
} else {
134+
// fragment
135+
remove(block.nodes, parent)
136+
if (block.anchor) remove(block.anchor, parent)
137+
}
111138
}

packages/runtime-vapor/src/component.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919
unregisterHMR,
2020
warn,
2121
} from '@vue/runtime-dom'
22-
import { type Block, isBlock } from './block'
22+
import { type Block, insert, isBlock, remove } from './block'
2323
import { pauseTracking, proxyRefs, resetTracking } from '@vue/reactivity'
2424
import { EMPTY_OBJ, invokeArrayFns, isFunction, isString } from '@vue/shared'
2525
import {
@@ -41,7 +41,6 @@ import {
4141
dynamicSlotsProxyHandlers,
4242
getSlot,
4343
} from './componentSlots'
44-
import { insert, remove } from './dom/node'
4544
import { hmrReload, hmrRerender } from './hmr'
4645

4746
export { currentInstance } from '@vue/runtime-dom'

packages/runtime-vapor/src/dom/node.ts

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,6 @@
11
import { isArray } from '@vue/shared'
22
import { renderEffect } from '../renderEffect'
33
import { setText } from './prop'
4-
import type { Block } from '../block'
5-
import {
6-
isVaporComponent,
7-
mountComponent,
8-
unmountComponent,
9-
} from '../component'
10-
11-
export function insert(
12-
block: Block,
13-
parent: ParentNode,
14-
anchor: Node | null | 0 = null,
15-
): void {
16-
if (block instanceof Node) {
17-
parent.insertBefore(block, anchor === 0 ? parent.firstChild : anchor)
18-
} else if (isVaporComponent(block)) {
19-
mountComponent(block, parent, anchor)
20-
} else if (isArray(block)) {
21-
for (let i = 0; i < block.length; i++) {
22-
insert(block[i], parent, anchor)
23-
}
24-
} else {
25-
// fragment
26-
insert(block.nodes, parent, anchor)
27-
if (block.anchor) insert(block.anchor, parent, anchor)
28-
}
29-
}
30-
31-
export function prepend(parent: ParentNode, ...blocks: Block[]): void {
32-
for (const b of blocks) insert(b, parent, 0)
33-
}
34-
35-
// TODO invoke unmount recursive
36-
export function remove(block: Block, parent: ParentNode): void {
37-
if (block instanceof Node) {
38-
parent.removeChild(block)
39-
} else if (isVaporComponent(block)) {
40-
unmountComponent(block, parent)
41-
} else if (isArray(block)) {
42-
for (let i = 0; i < block.length; i++) {
43-
remove(block[i], parent)
44-
}
45-
} else {
46-
// fragment
47-
remove(block.nodes, parent)
48-
if (block.anchor) remove(block.anchor, parent)
49-
}
50-
}
514

525
export function createTextNode(values?: any[] | (() => any[])): Text {
536
// eslint-disable-next-line no-restricted-globals

packages/runtime-vapor/src/hmr.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
pushWarningContext,
55
simpleSetCurrentInstance,
66
} from '@vue/runtime-core'
7-
import { normalizeBlock } from './block'
7+
import { insert, normalizeBlock, remove } from './block'
88
import {
99
type VaporComponent,
1010
type VaporComponentInstance,
@@ -13,7 +13,6 @@ import {
1313
mountComponent,
1414
unmountComponent,
1515
} from './component'
16-
import { insert, remove } from './dom/node'
1716

1817
export function hmrRerender(instance: VaporComponentInstance): void {
1918
const normalized = normalizeBlock(instance.block)

packages/runtime-vapor/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ export { createVaporApp } from './apiCreateApp'
33
export { defineVaporComponent } from './apiDefineComponent'
44

55
// compiler-use only
6+
export { insert, prepend, remove } from './block'
67
export { createComponent, createComponentWithFallback } from './component'
78
export { renderEffect } from './renderEffect'
89
export { createSlot } from './componentSlots'
910
export { template, children, next } from './dom/template'
10-
export { insert, prepend, remove, createTextNode } from './dom/node'
11+
export { createTextNode } from './dom/node'
1112
export { setStyle } from './dom/style'
1213
export {
1314
setText,

0 commit comments

Comments
 (0)