} from '@vue/reactivity'
import { FOR_ANCHOR_LABEL, isArray, isObject, isString } from '@vue/shared'
import { createComment, createTextNode } from './dom/node'
-import { type Block, insert, remove, remove as removeBlock } from './block'
+import {
+ type Block,
+ insert,
+ normalizeAnchor,
+ remove,
+ remove as removeBlock,
+} from './block'
import { warn } from '@vue/runtime-dom'
-import { currentInstance, isVaporComponent } from './component'
+import { currentInstance } from './component'
import type { DynamicSlot } from './componentSlots'
import { renderEffect } from './renderEffect'
import { VaporVForFlags } from '../../shared/src/vaporFlags'
}
}
-function normalizeAnchor(node: Block): Node | undefined {
- if (node && node instanceof Node) {
- return node
- } else if (isArray(node)) {
- return normalizeAnchor(node[0])
- } else if (isVaporComponent(node)) {
- return normalizeAnchor(node.block!)
- } else {
- return normalizeAnchor(node.nodes!)
- }
-}
-
// runtime helper for rest element destructure
export function getRestElement(val: any, keys: string[]): any {
const res: any = {}
}
}
+export function normalizeAnchor(node: Block): Node | undefined {
+ if (node && node instanceof Node) {
+ return node
+ } else if (isArray(node)) {
+ return normalizeAnchor(node[0])
+ } else if (isVaporComponent(node)) {
+ return normalizeAnchor(node.block!)
+ } else {
+ return normalizeAnchor(node.nodes!)
+ }
+}
+
/**
* dev / test only
*/
applyTransitionLeaveHooks,
} from './components/Transition'
import type { VaporComponentInstance } from './component'
+import { normalizeAnchor } from './block'
export class VaporFragment<T extends Block = Block>
implements TransitionOptions
this.anchor = locateVaporFragmentAnchor(currentHydrationNode!, '')!
} else {
this.anchor = locateVaporFragmentAnchor(currentHydrationNode!, label)!
+ // comment anchors are not included in ssr slot vnode fallback
if (!this.anchor) {
- // comment anchors are not included in ssr slot vnode fallback
if (label === 'slot') {
// fallback to fragment end anchor for
this.anchor = locateVaporFragmentAnchor(currentHydrationNode!, ']')!
} else {
// create anchor
- const { parentNode, nextSibling } = currentHydrationNode!
- parentNode!.insertBefore(
- (this.anchor = __DEV__ ? createComment(label) : createTextNode()),
- nextSibling,
- )
+ if (isFragment(this.nodes) && this.nodes.anchor) {
+ // nested vapor fragment
+ const { parentNode, nextSibling } = this.nodes.anchor
+ parentNode!.insertBefore(
+ (this.anchor = __DEV__ ? createComment(label) : createTextNode()),
+ nextSibling,
+ )
+ } else {
+ const { parentNode, nextSibling } = normalizeAnchor(this.nodes)!
+ parentNode!.insertBefore(
+ (this.anchor = __DEV__ ? createComment(label) : createTextNode()),
+ nextSibling,
+ )
+ }
}
}
}