import { hmrReload, hmrRerender } from './hmr'
import { isHydrating, locateHydrationNode } from './dom/hydration'
import { insertionAnchor, insertionParent } from './insertionState'
-import {
- type VaporTeleportImpl,
- instanceToTeleportMap,
- teleportStack,
-} from './components/Teleport'
+import type { VaporTeleportImpl } from './components/Teleport'
export { currentInstance } from '@vue/runtime-dom'
)
if (__DEV__) {
- let teleport = teleportStack[teleportStack.length - 1]
- if (teleport) {
- instanceToTeleportMap.set(instance, teleport)
- }
-
pushWarningContext(instance)
startMeasure(instance, `init`)
} from '@vue/runtime-dom'
import { type Block, type BlockFn, insert, remove } from '../block'
import { createComment, createTextNode, querySelector } from '../dom/node'
-import type {
- LooseRawProps,
- LooseRawSlots,
- VaporComponentInstance,
+import {
+ type LooseRawProps,
+ type LooseRawSlots,
+ type VaporComponentInstance,
+ isVaporComponent,
} from '../component'
import { rawPropsProxyHandlers } from '../componentProps'
import { renderEffect } from '../renderEffect'
import { extend, isArray } from '@vue/shared'
import { VaporFragment } from '../fragment'
-export const teleportStack: TeleportFragment[] = __DEV__
- ? ([] as TeleportFragment[])
- : (undefined as any)
-export const instanceToTeleportMap: WeakMap<
- VaporComponentInstance,
- TeleportFragment
-> = __DEV__ ? new WeakMap() : (undefined as any)
-
-/**
- * dev only
- * when the root child component updates, synchronously update
- * the TeleportFragment's nodes.
- */
-export function handleTeleportRootComponentHmrReload(
- instance: VaporComponentInstance,
- newInstance: VaporComponentInstance,
-): void {
- const teleport = instanceToTeleportMap.get(instance)
- if (teleport) {
- instanceToTeleportMap.set(newInstance, teleport)
- if (teleport.nodes === instance) {
- teleport.nodes = newInstance
- } else if (isArray(teleport.nodes)) {
- const i = teleport.nodes.indexOf(instance)
- if (i !== -1) teleport.nodes[i] = newInstance
- }
- }
-}
+const instanceToTeleportMap: WeakMap<VaporComponentInstance, TeleportFragment> =
+ __DEV__ ? new WeakMap() : (undefined as any)
export const VaporTeleportImpl = {
name: 'VaporTeleport',
? new TeleportFragment('teleport')
: new TeleportFragment()
- const updateChildrenEffect = renderEffect(() => {
- __DEV__ && teleportStack.push(frag)
- frag.updateChildren(slots.default && (slots.default as BlockFn)())
- __DEV__ && teleportStack.pop()
- })
+ const updateChildrenEffect = renderEffect(() =>
+ frag.updateChildren(slots.default && (slots.default as BlockFn)()),
+ )
const updateEffect = renderEffect(() => {
frag.update(
// mount new nodes
insert((this.nodes = children), this.currentParent, this.currentAnchor)
}
+
+ if (__DEV__) {
+ if (isVaporComponent(children)) {
+ instanceToTeleportMap.set(children, this)
+ } else if (isArray(children)) {
+ children.forEach(node => {
+ if (isVaporComponent(node)) {
+ instanceToTeleportMap.set(node, this)
+ }
+ })
+ }
+ }
}
update(props: TeleportProps): void {
}
}
}
+
+/**
+ * dev only
+ * when the root child component updates, synchronously update
+ * the TeleportFragment's nodes.
+ */
+export function handleTeleportRootComponentHmrReload(
+ instance: VaporComponentInstance,
+ newInstance: VaporComponentInstance,
+): void {
+ const teleport = instanceToTeleportMap.get(instance)
+ if (teleport) {
+ instanceToTeleportMap.set(newInstance, teleport)
+ if (teleport.nodes === instance) {
+ teleport.nodes = newInstance
+ } else if (isArray(teleport.nodes)) {
+ const i = teleport.nodes.indexOf(instance)
+ if (i !== -1) teleport.nodes[i] = newInstance
+ }
+ }
+}